AWS
sqs
aws-sdk
queue

【 AWS 】S3 → Lambda → SQS にメッセージを投げるまでの構築手順!

やりたいこと

タイトルの通り、「Lamda」から「Amazon SQS」に「メッセージを送信」すること。

All.jpg

具体的には、こんな感じ。

処理フロー

  1. S3にファイルをアップロードする。( User )
  2. ファイルアップロードをトリガーにAmazon SQSにメッセージを送信する。( Lambda )
  3. Amazon SQS内のキューにメッセージを格納する。( Amazon SQS )
  4. 5分間隔で、Amazon SQSのキューのメッセージ個数をログ出力する。( Lambda )

実装する前に、ちょっとだけAmazon SQSについて紹介します。

What's Amazon SQS !?

SQS.jpg

そもそもメッセージキューイングって何?

Message Queueing ( MQ : メッセージキューイング )

アプリケーションソフト間でデータを交換して連携動作させる際に、送信するデータをいったん保管しておき、
相手の処理の完了を待つことなく次の処理を行う方式。

メッセージキューイングの仕組みを活用することにより、
メッセージ送信者は受信側のステータスを気にすることなく、
メッセージを送信し、送信側と受信側間で非同期での処理が可能に。

Amazon SQSは、Pull型のMQサービス

MQ.jpg

受信側 (Instance) がSQSに問い合わせて、メッセージを取得します。

Amazon SQSは、AWSフルマネージドな分散キュー

フルマネージドとは ?

サービスの利用に必要な機器などの運用や管理、
導入時に必要な機器の設置や設定なども一体として提供するサービスのこと。

  • 高い信頼性 : 複数のサーバー/データセンターにメッセージを保持
  • スケーラブル : 多数の送信者/受信者に対応
  • 高スループット : メッセージが増加しても高スループットを出し続ける
  • 低コスト : 毎月の無料枠 + 使った分だけの従量課金

動作検証

(1) Lambda関数作成

※ 作成手順の詳細は、下記記事を参考にしていただければと思います。
Lambda関数を作成する方法 ~S3へのファイルアップロードをトリガーにログ出力編~

ここでは、特に重要な部分のみ抜粋しています。

1.トリガーの設定


ここでは、トリガーの対象となるS3のバケット名とイベント(今回は、「オブジェクトの作成」)の指定を行います。
また、作成後すぐに検証が行えるように、「トリガーの有効化」にチェックを入れておきます。

image.png

2.関数コードの編集


続いて、関数コードの編集を行います。ここでは、トリガーの対象となるイベント発生時に
どのような処理をおこなうのかを記述していきます。(Node.js 6.10)

今回は、下記のAmazon SQSへの操作を実装していきます。

(1) Amazon SQSに、新しいキューを作成 (AWS Console上で作成)

Amazon SQSのページを開き、「新しいキューの作成」ボタンを押下します。

image.png

任意の「キュー名」を付けます。

image.png

キューの作成」を押下すると、新しくキューが作成され、一覧に表示されます。

image.png

続いて、作成したキューにメッセージを送信します。

(2) (1)で作成したキューに、メッセージを送信

image.png

sendMessage.js
console.log('Loading function');

const AWS = require('aws-sdk');
const SQS = new AWS.SQS({apiVersion: '2012-11-05'});
/* 宛先QueueのURL */
const QUEUE_URL = 'https://sqs.ap-northeast-1.amazonaws.com/<アカウントID>/<キューの名前>';

exports.handler = function(event, context) {

    // Get Upload FilePath
    var Bucket = event.Records[0].s3.bucket.name;
    var ObjKey = event.Records[0].s3.object.key;
    var FilePath = Bucket + '/' + ObjKey;

    // SendMessage
    var params = {
        MessageBody: FilePath, /* required */
        QueueUrl: QUEUE_URL,   /* required */
        DelaySeconds: 0
    };

    SQS.sendMessage(params, function(err, data) {
        if (err) console.log(err, err.stack); // an error occurred
        else     console.log(data);           // successful response
    });

};

※ちなみに、対象キューのURLは、Amazon Console画面上から確認することができます。(SDKでも可。) [下図、赤色部分]

image.png

これで、S3にファイルをアップロードすると、Messageが送信されると思います。

と、その前に、Lambda上で、sendMessageをするためには、
実行ロールにAmazon SQSへの書き込み権限、ポリシーのアタッチをする必要があります。

3.アクセスポリシーのアタッチ


実行RoleにSQSアクセスポリシーをアタッチ

image.png

AmazonSQSFullAccess」のポリシーを実行ロールにアタッチします。

image.png

これですべての準備が整いました。
S3にファイルをアップロードしてみましょう。

(2) S3へファイルアップロード

上記で作成したLambda関数が動作をしているか実際に検証してみます。

適当なファイルを対象のバケット内にアップロード

image.png

Lamda関数が実行されていれば、Amazon SQSにメッセージが届いているはずです。

image.png

利用可能なメッセージが1になりました。もう1つS3にファイルをアップロードしてみると、、。

image.png

しっかりと、利用可能なメッセージが2に増えていますね。

終わりに

ひとまず、[S3へファイルアップロード][Lambda関数実行][Amazon SQSにメッセージ追加] までの
一連の流れが動くという検証ができました。

次回記事で、キュー内のメッセージ個数を確認する[Lambda関数]を作成したいと思います。

最後までお読みいただきありがとうございました。