Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

やりたいこと

タイトルの通り、「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関数]を作成したいと思います。

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

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away