やりたいこと
タイトルの通り、「Lamda」から「Amazon SQS」に「メッセージを送信」すること。
具体的には、こんな感じ。
処理フロー
- S3にファイルをアップロードする。( User )
- ファイルアップロードをトリガーにAmazon SQSにメッセージを送信する。( Lambda )
- Amazon SQS内のキューにメッセージを格納する。( Amazon SQS )
- 5分間隔で、Amazon SQSのキューのメッセージ個数をログ出力する。( Lambda )
実装する前に、ちょっとだけ__Amazon SQS__について紹介します。
What's Amazon SQS !?
そもそもメッセージキューイングって何?
「Message Queueing ( MQ : メッセージキューイング ) 」
アプリケーションソフト間でデータを交換して連携動作させる際に、送信するデータをいったん保管しておき、
相手の処理の完了を待つことなく次の処理を行う方式。
メッセージキューイングの仕組みを活用することにより、
メッセージ送信者は受信側のステータスを気にすることなく、
メッセージを送信し、送信側と受信側間で非同期での処理が可能に。
Amazon SQSは、Pull型のMQサービス
受信側 (Instance) がSQSに問い合わせて、メッセージを取得します。
Amazon SQSは、AWSフルマネージドな分散キュー
フルマネージドとは ?
サービスの利用に必要な機器などの運用や管理、
導入時に必要な機器の設置や設定なども一体として提供するサービスのこと。
- 高い信頼性 : 複数のサーバー/データセンターにメッセージを保持
- スケーラブル : 多数の送信者/受信者に対応
- 高スループット : メッセージが増加しても高スループットを出し続ける
- 低コスト : 毎月の無料枠 + 使った分だけの従量課金
動作検証
(1) Lambda関数作成
※ 作成手順の詳細は、下記記事を参考にしていただければと思います。
「Lambda関数を作成する方法 ~S3へのファイルアップロードをトリガーにログ出力編~」
ここでは、特に重要な部分のみ抜粋しています。
1.トリガーの設定
ここでは、トリガーの対象となるS3のバケット名とイベント(今回は、「オブジェクトの作成」)の指定を行います。
また、作成後すぐに検証が行えるように、「トリガーの有効化」にチェックを入れておきます。
2.関数コードの編集
続いて、関数コードの編集を行います。ここでは、トリガーの対象となるイベント発生時に
どのような処理をおこなうのかを記述していきます。(Node.js 6.10)
今回は、下記のAmazon SQSへの操作を実装していきます。
(1) Amazon SQSに、新しいキューを作成 (AWS Console上で作成)
Amazon SQSのページを開き、「新しいキューの作成」ボタンを押下します。
任意の「キュー名」を付けます。
「キューの作成」を押下すると、新しくキューが作成され、一覧に表示されます。
続いて、作成したキューにメッセージを送信します。
(2) (1)で作成したキューに、メッセージを送信
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
});
};
- sendMessage (公式サイト)
※ちなみに、対象キューのURLは、Amazon Console画面上から確認することができます。(SDKでも可。) [下図、赤色部分]
これで、S3にファイルをアップロードすると、Messageが送信されると思います。
と、その前に、Lambda上で、sendMessageをするためには、
実行ロールにAmazon SQSへの書き込み権限、ポリシーのアタッチをする必要があります。
3.アクセスポリシーのアタッチ
実行RoleにSQSアクセスポリシーをアタッチ
「AmazonSQSFullAccess」のポリシーを実行ロールにアタッチします。
これですべての準備が整いました。
S3にファイルをアップロードしてみましょう。
(2) S3へファイルアップロード
上記で作成したLambda関数が動作をしているか実際に検証してみます。
適当なファイルを対象のバケット内にアップロード
Lamda関数が実行されていれば、Amazon SQSにメッセージが届いているはずです。
利用可能なメッセージが1になりました。もう1つS3にファイルをアップロードしてみると、、。
しっかりと、利用可能なメッセージが2に増えていますね。
終わりに
ひとまず、[S3へファイルアップロード] → [Lambda関数実行] → [Amazon SQSにメッセージ追加] までの
一連の流れが動くという検証ができました。
次回記事で、キュー内のメッセージ個数を確認する[Lambda関数]を作成したいと思います。
最後までお読みいただきありがとうございました。