【AWS & Java】JavaでAmazon SQSを操作してみよう

AWS

こんにちは。ECF Techブログ
担当 Michiharu.Tです。

AWSとJavaを連携した内容をお届けいたします。
この記事では、AWS SDK for Java 2.Xを使って、Amazon SQSを操作するサンプルプログラムをご紹介します。

対象読者

下のような読者を想定して記載しています。

  • AWSの基本的な内容について知っている
  • Javaの基礎的な知識を持っている

事前準備

Amazon SQSとは

Amazon SQS(Simple Queue Service)は、メッセージキューのサービスです。メッセージキューは簡単に言えば、メッセージの一時保管領域で、インターネットからメッセージの送受信を行なうことができます。インターネットからの大量の要求を処理する必要がある場合、Webサーバーなどに負荷がかかりすぎないための緩衝材のような役割を果たすことができます。

図中オレンジの「データ有無を問い合わせて、メッセージを取得する」処理はポーリング(polling)と呼ばれています。

Amazon SQSでキューを作成

まずは、Amazon SQSでキューを作成していきましょう。
下記の「キューを作成」から始めます。左メニューの「キュー」→「キューを作成」を選択してもOKです。

下のような画面が表示されます。

設定項目は下のようにしました。

  • 詳細
    • タイプ:標準
    • 名前:JavaTestQueue
  • 設定
    • すべてデフォルトのまま
  • サーバーの暗号化
    • 無効
  • アクセスポリシー
    • すべてデフォルトのまま
  • 許可ポリシーの再実行
    • すべてデフォルトのまま
  • デッドレターキュー
    • 無効
  • タグ
    • デフォルトのまま

最後に「キューを作成」をクリックします。下の画面が表示されれば、キューが作成できています。

プロジェクトの作成

Eclipseでmavenプロジェクトを作成します。プロジェクト作成の手順は下記のリンクをご確認ください。

pom.xmlの依存関係は、下記を追記します。
※全文を記載しています。dependenciesタグの部分が追加されればOKです。

<project xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.e3factory</groupId>
    <artifactId>sqstest</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <dependencies>
        <dependency>
            <groupId>software.amazon.awssdk</groupId>
            <artifactId>sqs</artifactId>
            <version>2.20.43</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.7.28</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-simple</artifactId>
            <version>1.7.28</version>
        </dependency>
    </dependencies>
</project>

キューにメッセージを送信する

最初にJavaのプログラムからキューにメッセージを送信し、AWSのマネジメントコンソールから受信をしてみたいと思います。

Javaのプログラムサンプル

package sqstest;

import software.amazon.awssdk.auth.credentials.AwsBasicCredentials;
import software.amazon.awssdk.auth.credentials.AwsCredentials;
import software.amazon.awssdk.auth.credentials.StaticCredentialsProvider;
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.sqs.SqsClient;
import software.amazon.awssdk.services.sqs.model.SendMessageRequest;

public class SQSTest01 {
    public static void main(String[] args) {
        //認証情報を設定...(1)
        AwsCredentials credentials = AwsBasicCredentials.create(
                "Access ID", "Secret Access Key");
        //SQSクライアントの作成...(2)
        SqsClient sqsClient = SqsClient.builder()
                .region(Region.US_EAST_1)
                .credentialsProvider(StaticCredentialsProvider.create(credentials))
                .build();
        //メッセージ送信メソッドを呼び出し
        sendQueueMessage(sqsClient);
        sqsClient.close();
        System.out.println("メッセージを送信しました。");
    }

    /**
     * キューにメッセージを送信する
     * @param sqsClient
     */
    public static void sendQueueMessage(SqsClient sqsClient) {
        //...(3)
        SendMessageRequest request = SendMessageRequest.builder()
                .queueUrl("Your Queue URL")
                .messageBody("キューメッセージです。")
                .build();
        //...(4)
        sqsClient.sendMessage(request);
    }
}

()つきのコメントについて解説します。

  • (1)Access ID,Secret Access Keyの部分は、IAMユーザーに付与されているアクセスキーの情報を設定します。アクセスキーの情報である「アクセスID」と「シークレットアクセスキー」の情報が必要です。シークレットアクセスキーは作成時しか参照できないため、わからなくなっている場合は再度アクセスキーの作成が必要です。

  • (2)Amazon SQSサービスに接続するためのクライアントを生成しています。regionメソッドの引数は、キューを作成したリージョンに該当する定数を指定します。

  • (3)キューにメッセージを送信するためのリクエスト情報を作成しています。Your Queue URLの部分は、マネジメントコンソールからキューの詳細で確認することができます(下図)。

  • (4)SQSクライアントからメッセージを送信します。

プログラムを実行し、次の実行結果となれば成功です。

メッセージを送信しました。

マネジメントコンソールでの確認

次にマネジメントコンソールで、メッセージが受信できるかを確認します。キューの詳細画面から「メッセージを送受信」をクリックし、下の画面に遷移します。メッセージを受信エリアの「メッセージをポーリング」をクリックします。メッセージの取得にしばらく時間がかかるので待ちます。

キューの詳細画面

メッセージ送受信エリア

ポーリング(polling)とは、キューに対しデータがあるかどうかを問い合わせる動作のことです。キューにメッセージがあれば、メッセージを取得できます。

メッセージが取得できた場合は、下図のように一覧に表示されます。赤枠部分をクリックするとメッセージの内容を確認することができます。

メッセージ内容の確認画面です。完了をクリックするとウィンドウを閉じます。

メッセージが確認できたので、該当のメッセージは削除しておくことにします。

確認画面が表示されますので、削除をクリックします。

キューからメッセージを受信

では次に、キューからメッセージを受信してみたいと思います。

マネジメントコンソールからメッセージを送信

今度はマネジメントコンソールからメッセージを送信してみましょう。メッセージ送受信画面のメッセージ送信エリアを下記のように記述し、「メッセージを送信」をクリックします。

メッセージを送信エリア

送信完了のバーが表示されます。

Javaのプログラムサンプル

メッセージ受信のサンプルプログラムは次のようになります。

package sqstest;

import java.util.List;

import software.amazon.awssdk.auth.credentials.AwsBasicCredentials;
import software.amazon.awssdk.auth.credentials.AwsCredentials;
import software.amazon.awssdk.auth.credentials.StaticCredentialsProvider;
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.sqs.SqsClient;
import software.amazon.awssdk.services.sqs.model.Message;
import software.amazon.awssdk.services.sqs.model.ReceiveMessageRequest;
import software.amazon.awssdk.services.sqs.model.SqsException;

public class SQSTest02 {
    public static void main(String[] args) {
        //認証情報を設定
        AwsCredentials credentials = AwsBasicCredentials.create(
                "Access ID", "Secret Access Key");
        //SQSクライアントの作成
        SqsClient sqsClient = SqsClient.builder()
                .region(Region.US_EAST_1)
                .credentialsProvider(StaticCredentialsProvider.create(credentials))
                .build();
        //メッセージ受信のメソッドを呼び出し
        getQueueMessage(sqsClient);
        sqsClient.close();
    }

    /**
     * キューからメッセージを受信する
     * @param sqsClient
     */
    public static void getQueueMessage(SqsClient sqsClient) {
        try {
            //受信リクエストを作成...(1)
            ReceiveMessageRequest receiveMessageRequest = ReceiveMessageRequest.builder()
                    .queueUrl("Your Queue URL")
                    .maxNumberOfMessages(1)
                    .build();
            //受信リクエストを送信...(2)
            List<Message> messages = sqsClient.receiveMessage(receiveMessageRequest).messages();
            //メッセージを読み出して表示...(3)
            for (Message message : messages) {
                System.out.println(message.body());
            }
        } catch (SqsException e) {
            System.err.println(e.awsErrorDetails().errorMessage());
        }
    }
}

()つきのコメントについて解説します。

  • (1)受信リクエストの作成は専用のbuilderで行います。Your Queue URLはメッセージ送信時と同じ要領で記載します。maxNumberOfMessagesメソッドは何件のメッセージを取得するかを設定できます。最大10件です。
  • (2)受信リクエストを送信します。メッセージ情報のリストが返されます。
  • (3)リストからメッセージを取得します。各メッセージのbodyメソッドを呼び出すことでメッセージを取得できます。

実行し、下のようにキューに送信したメッセージが表示できていれば成功です。

テストメッセージです。

読み出しができたら、メッセージは削除しておきます。

本日は以上とさせていただきます。最後までご覧くださりありがとうございます。本記事は随時、関連する内容を更新していく予定です。少しでも開発ライフのお役に立てれば幸いです。


合同会社イー・シー・エフでは、未経験者向けプログラミングなどの教育講座を実施しています。プログラミング教室の案内や教育教材の情報、また関連するご相談・問い合わせにつきましては下記よりご確認ください。

ECFエデュケーション
タイトルとURLをコピーしました