何をするか?
ここでは Lambda 関数の実装例として、SNS トピックから S3 バケットの PutObject イベント通知を受けて、アップロードされたファイルを読み込む例を示します。
S3 バケット、および SNS トピックの作成と、S3 → SNS の通知設定は完了していると想定します。
Lambda 関数の実装
AWS SDK のインストール
ここでは、Node.js 用の AWS SDK ver.2 を使っているので、先にインストールしておく必要があります。
AWS 側の Lambda 実行環境には標準でインストールされているので、--save-dev
(開発用)でインストールしておけば OK です。
ついでに TypeScript 用の型定義もインストールしておくと、Lambda ハンドラのパラメータを any
型ではなく、SNSEvent
型などで参照できて便利です。
Lambda ハンドラの実装
先に、S3 バケット内のオブジェクトの内容を取得するユーティリティ関数を用意しておきます(AWS SDK ver.2 を使用しています)。
エクスポートされた getS3Object
関数を使う想定ですが、このコードを直接実行したときには末尾のテスト関数を実行するようにしてあります。
次の Lambda 関数実装では、第一引数で受け取った SNSEvent
オブジェクトから S3 バケット名とオブジェクト名を取り出して、そのオブジェクトの内容を S3 API(上記で定義したユーティリティ関数)を使って取得しています。
解説
Lambda 関数の第一引数 (event
) で渡されるオブジェクト (このケースでは SNSEvent
型) の Records[0].Sns.Message
プロパティを参照すると、次のような JSON テキストを取得できます(オブジェクトではなく JSON 形式のテキストです)。
この JSON テキストをオブジェクト化すれば、次のような情報を参照できます。
Records[0].eventName
→ S3 のイベント名 (ObjectCreated:Put
)Records[0].s3.bucket.name
→ S3 バケット名 (bucket-123456789012-sample
)Records[0].s3.object.key
→ S3 バケットに格納されたオブジェクト名 (sample.txt
)
あとは、この情報を使って、S3 バケットに格納されたオブジェクト(ファイル)の内容を取得すれば OK です。
必要な情報は Lambda 関数の引数で受け取れるので、環境変数などで S3 バケットの情報を渡さずに済みます。
デプロイ用の情報
ここでは CloudFormation (SAM) テンプレートを使って、Lambda 関数のリソースを生成します。
Lambda 関数リソースを生成するときに、S3 バケットへのアクセス権限と、SNS トピックへのサブスクリプション設定を行う必要があるので、これらの情報を入力パラメーター (Parameters
) として定義しています。
- S3 バケット名:
bucket-123456789012-sample
- SNS トピックの ARN:
arn:aws:sns:ap-northeast-1:123456789012:mytopic
このテンプレートを使って実際に CloudFormation スタックを生成する方法をここで説明すると長くなってしまうので、そのあたりは下記の記事を参照してください。
package.json
参考までに package.json
の一例を載せておきます。
TypeScript で実装した Lambda 関数を ZIP 化する方法に関しては、以下の記事を参考にしてください。
関連記事