LoginSignup
12
11

More than 5 years have passed since last update.

SQS+BeanstalkでSpringBootのworkerアプリを構築する

Last updated at Posted at 2016-06-28

キューを使ったシステムというのを自分で実装したことがなかったので、社内AWS勉強会のネタもかねて、SQSに挑戦してみました。

全体構成

AWSが提供するメッセージキューサービスである「SQS」にデータを登録すると、AWS ElasticBeanstalkで構築したworkerアプリ(SpringBoot製)がキューを処理していくという作りです。

workerについてはこちらを参考に。
http://dev.classmethod.jp/cloud/aws/aws-job-worker-beanstalk/

このWorker tierが実によくできているんです。この環境で提供されるEC2の中ではaws-sqsdというデーモンが動いており、指定したキューのメッセージをポーリングしてくれます。メッセージが配信されてくると、aws-sqsdは、そのメッセージをlocalhostに対して、HTTP POSTしてくれる、という仕組みです。

バッチを作ってキューのメッセージを取得しているのが通常だと思うのですが、そこの作りこみがしなくてもいいのが素晴らしいですね。既存アプリにキューを挟みたい場合の手間も軽減されます。

実際動かしてみる

キューを取得して、Chatworkに通知するworkerアプリを動かしてみます

workerアプリのビルド

サンプルアプリをGitHubから取ってきて、ビルドします。

git clone https://github.com/nyasba/awssqs-sample.git
cd ./awssqs-sample/aws-sqs-consumer
./gradlew clean build

./build/libs/aws-sqs-consumer-1.0.jar が作られたと思います。
これはメッセージ情報を受け取り、Chatworkへ通知するだけの簡単なアプリです。

Dockerfileのカスタマイズ

今回、ElasticBeanstalkのプラットフォームとしてDockerを利用しますので、Dockerfileを用意します。 先ほどcloneしたeb 配下にaws-sqs-consumer-1.0.jarをコピーし、Dockerfileの設定値を書き換えます。

# Java8のDockerイメージを利用
FROM java:8

# workerアプリケーションをローカルからコンテナ側に追加する
ADD aws-sqs-consumer-1.0.jar aws-sqs-consumer-1.0.jar

# コンテナ側の8080ポートを外部に公開する
EXPOSE 8080

# SpringBootの起動コマンド
CMD ["java", "-Droomid=<ROOM_ID>", "-Dapitoken=<API_TOKEN>", "-jar", "./aws-sqs-consumer-1.0.jar"]

以下の2点は書き換える必要があります

  • ROOM_ID : 通知対象のChatworkのROOM_ID
  • API_TOKEN: ChatworkのAPI_TOKEN

Dockerfileとaws-sqs-consumer-1.0.jarをzipで固めてソースバンドルを作成します。このとき、上位ディレクトリごとzip化するのではないことに注意です。

詳細はこちら。
http://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/using-features.deployment.source.html

ElasticBeanstalkのアプリケーション作成

先ほど作成したソースバンドルをElasticBeanstalkのアプリケーションとして作成します。

AWSのマネジメントコンソールからElasticBeanstalkを選択し、「新しいアプリケーションの作成」を選択します。

  1. アプリケーション名を入力
    eb1.JPG

  2. ワーカー環境を選択
    eb2.JPG

  3. 環境タイプはDockerで、単一にする
    eb3.JPG

  4. ソースバンドルをアップロード
    eb4.JPG

  5. 環境タグまではデフォルトのまま「次へ」

  6. ワーカーアプリケーションのエンドポイントを設定
    eb7.JPG

  7. 自分のIAMロールの権限を選択する

  8. 起動!

数分待つと立ち上がります。

SQSにメッセージを送信してみる

  1. SQSのメニューを選択
  2. 自動生成されたキュー※をチェックして、「キュー操作」から「メッセージの送信」
      ※AWSEBWorkerQueueと含まれているもの
  3. メッセージ本文に { "message" : "きゅー!"}と入力し、送信

しばらくすると、Chatwork側にメッセージが投稿されるのがわかると思います。

よくわからなかったこと

DockerfileでEXPOSEしたポートはWorkerのセットアップ時に指定しなかったが、どこで指定しているのか。

12
11
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
11