Server

AWS LambdaとSQSでキューを処理する

投稿日:

はじめに

前回の記事ではLambdaとAPI Gatewayを組み合わせる方法を紹介しました。今回の記事では、引き続きLambdaの掘り下げで、Amazon SQSと組み合わせてキューを処理する方法を紹介します。

今回紹介する内容

今回の記事では以下の内容について紹介します。

  • Amazon SQSでキューを作成する
  • Lambda関数でキューにメッセージを送る
  • キューの受信をトリガーにLambda関数を実行する
  • IAM周り

Amazon SQSとは

Amazon SQSはフルマネージドなメッセージキューイングサービスです。自分でサーバやミドルウェアなどを準備することなくすぐに使い始めることができ、他のAWSサービスとの連携が容易に行えるなどのメリットがあります。

Amazon SQSについてより詳しく知りたい方は、こちらなどをご覧ください。

実際に動かしてみる

それでは、AWS上に環境を構築してキューにメッセージを送ってみましょう。

SQSでキューを作成する

まず初めに、SQSにキューを作成します。

マネジメントコンソールのAmazon SQSのページを開き、「キューを作成」をクリックします。

キューの作成では、最初にキューのタイプを選択します。キューには、「標準」と「FIFO」の2種類のタイプがあります。

簡単に説明すると、「FIFO」タイプではメッセージの順番が保証され、メッセージの配信も厳密に1回のみ行われます。それに比べて、標準タイプではこのあたりが保証されませんが、スループットや料金面で優れています。

今回は順番などに制限はありませんので、標準を選択します。

「設定」の項目では、キューの制御について様々な設定を行います。

  • 可視性タイムアウト:メッセージを取得してから再度同じメッセージを取得できるようになるまでの時間
  • 配信遅延:コンシューマ(メッセージの受信者)の処理が完了する前にメッセージがキューに入った場合に配信を遅延させる時間
  • メッセージ受信待機時間:0の場合はショートポーリング、1以上の場合はロングポーリング

SQSのメッセージはデフォルトで暗号化されます。

アクセスポリシーでは、キューへのアクセス権限を設定します。

「許可ポリシーの再実行」と「デッドレターキュー」では、デッドレターキューに関する設定を行います。

デッドレターキューは、メッセージの配信が失敗し処理に失敗した場合にそのメッセージを再利用するために使用されます。

今回は特に設定は行いません。

これでキューの設定は完了です。「キューを作成」を押して作成します。

LambdaでMessage送信関数を作成する

今回は2種類のLambda関数を作成します。

1つ目の関数では、先ほど作成したキューにメッセージを送ります。

2つ目の関数では、キューにメッセージが送られるのをトリガーに起動し、そのメッセージをログに出力します。

sendMessage関数を作成する

関数の作成については、前回紹介したため割愛します。

関数のコードは以下のとおりです。

環境変数に設定したキューのURLに向けて SendMessage() 関数でメッセージを送ります。

このコードをビルドしてZIP化したものをLambda(sendMessage)にアップロードします。

IAMを修正する

このままだとキューにアクセスする権限がないので関数がエラーになります。そこで、Lambda関数作成時に作られるIAMロールにキューへのアクセス権限を追加します。

追加する権限は以下のとおりです。

権限修正後にテスト実行すると、先程作ったキューにメッセージが送られます。

LambdaでMessage受信関数を作成する

2つ目のLambdaを作成し、キューにLambda関数トリガーを設定します。

getMessage関数を作成する

関数のコードは以下のとおりです。

ハンドラの引数として SQSEvent型 を指定します。

SQSEvent.Records が送信したメッセージにあたり(今回は1件のみ)、それぞれ ID と Body を持ちます。

こちらもLambda(getMessage)にアップロードします。

IAMを修正する

sendMessage関数と同様に、キューへのアクセス権限を付与する必要があります。この関数にアタッチされているIAMロールに以下の権限を追加します。

キューにLambda関数トリガーを設定する

このままだとキューにメッセージが送られてもgetMessage関数が実行されません。そこで、キューにLambda関数トリガーを設定します。

作成したキューのページを開いて、「Lambdaトリガー」のタブにある「Lambdaトリガーを設定」を押します。

「Lambda関数」getMessage関数を選択して「保存」を押します。

これでキューごgetMessage関数が関連付けれられるので、getMessage関数のページに戻ってトリガーを確認します。以下のようになっているはずです。

これ以降、sendMessage関数を実行すると、キューにメッセージが送られてそれをトリガーにgetMessage関数が実行されます。

CloudWatchでログを見てみると、このようなログが表示されるはずです。

さいごに

前回に引き続きLambdaについて深掘りして、Amazon SQSと連携させる方法を紹介しました。

おすすめ書籍

エバンジェリストの知識と経験を1冊にまとめた AWS開発を《成功》させる技術 AWSで実現するモダンアプリケーション入門 〜サーバーレス、コンテナ、マイクロサービスで何ができるのか AWSコスト最適化ガイドブック

blog-page_footer_336




blog-page_footer_336




-Server
-,

執筆者:

免責事項

このブログは、記事上部に記載のある投稿日時点の一般的な情報を提供するものであり、投資等の勧誘・法的・税務上の助言を提供するものではありません。仮想通貨の投資・損益計算は複雑であり、個々の取引状況や法律の変更によって異なる可能性があります。ブログに記載された情報は参考程度のものであり、特定の状況に基づいた行動の決定には専門家の助言を求めることをお勧めします。当ブログの情報に基づいた行動に関連して生じた損失やリスクについて、筆者は責任を負いかねます。最新の法律や税務情報を確認し、必要に応じて専門家に相談することをお勧めします。


comment

メールアドレスが公開されることはありません。 ※ が付いている欄は必須項目です

CAPTCHA


関連記事

DockerでRuby2.5、Rails5.2betaの環境をつくる【Compose file v3】

はじめに 明けましておめでとうございます。 年末年始休みに、少しRuby 2.5.0、Rails 5.2 beta2を触りました。 その際にDockerを使って環境を作成したので、そちらに関して記載し ...

単体のORMライブラリとしてEloquentを使う

はじめに こんにちは。先日から、今となっては珍しい(多分)、フレームワーク無しのPure PHPで構築されているプロジェクトに関わっています。 フレームワークを使うことが絶対正しいというわけではないの ...

aws

Amazon ECSでGoアプリケーションのデプロイとALB設定をやる

はじめに 前回、前々回とAmazon ECSについて紹介してきました。今回はその応用として、以下の内容について書きたいと思います。 ALBからECSタスクにリクエストを流す ALBに独自ドメインを紐付 ...

CentOS6のLAMP環境でTLS1.2対応

はじめに ものすごくひさしぶりにLAMP環境のSSL設定周りを見直す機会があり、その時の調査・作業メモになります。 個人運用のサービスで利用している決済代行会社から、TLS1.2未満が近々利用停止とな ...

CircleCIを使ってみた(RailsのRSpecとデプロイのサンプル)

はじめに 個人的に作成しているアプリケーションのCIツールとして、CircleCIを使用しています。 1コンテナであれば無料で使えるようなので、個人制作でCIにあまり時間が使えない場合は重宝します。 ...

フォロー

blog-page_side_responsive

2023年8月
日 月 火 水 木 金 土
 12345
6789101112
13141516171819
20212223242526
2728293031  

アプリ情報

私たちは無料アプリもリリースしています、ぜひご覧ください。 下記のアイコンから無料でダウンロードできます。