はじめに
- 謎の Lambda 関数 *-custom-resource-existing-s3 というのが作られていた
- 調査した内容を備忘の為記載します
- 「S3 イベント通知による Lambda 実行」の設定手順も含みます
- PowerShell による AWS CLI 操作を想定
調査
- 先述のとおり、作った覚えのない Lambda が存在していました
- 画面上の「こちらをクリックしてください」のリンクを辿ると、Serverless Framework で作成したアプリケーションに含まれていました
原因
- Serverless Framework にて、既存 S3 の Event を設定した際に自動で作成される関数
- https://forum.serverless.com/t/function-s3-trigger-with-existing-true-generates-another-lambda-called-custom-resources/9440
原因に至る背景
- Serverles Framework を使用して環境デプロイしていました
- S3 イベントトリガーで Lambda を起動する必要あり
- Serverles Framework 内で S3 作成することもできるが、環境の更改などでコマンド「sls remove」実行した際等、S3 上のデータも消えてしまうことを懸念
- S3 バケットは Serverless Framework 外で管理とした
- この S3 イベント通知を設定する為、「existing: true」オプションを指定
→ 今回の事象に至った
https://www.serverless.com/framework/docs/providers/aws/events/s3/#using-existing-buckets
対応
検討案
- 自動で Lambda が作成されることを許容する ←お奨め
- 許容できない場合
- S3 を Serverles Framework 管理対象とする ←嫌
- 管理対象としない場合
- 環境デプロイ後に手動で S3 イベントトリガーを追加する
結果
- なんやかんやで「環境デプロイ後に手動で S3 イベントトリガーを追加する」ことに
- Serverless Framework の対象 yaml 上からは、関連する events 設定をすべて削除
- イベント通知したい各 S3、Lambda にて、以下の作業手順で設定
- Windows PowerShell からの AWS CLI 操作例です
作業手順
1.S3イベント通知の詳細を記載した JSON ファイルを作成
- 以下の例では、S3上に拡張子「.txt」のファイルが作成された任意のケースを想定
- ファイル名 s3.json としてローカルに保存
{
"LambdaFunctionConfigurations": [
{
"Id": "任意のイベント名",
"LambdaFunctionArn": "実行したいLambda関数ARN",
"Events": [
"s3:ObjectCreated:*"
],
"Filter": {
"Key": {
"FilterRules": [
{
"Name": "suffix",
"Value": ".txt"
}
]
}
}
}
]
}
2.Lambda側:S3トリガーを許可
aws lambda add-permission `
--profile "AWS CLI で操作可能なプロファイルを指定" `
--function-name "実行したいLambda関数名" `
--statement-id "s3-put-event" `
--action "lambda:InvokeFunction" `
--principal "s3.amazonaws.com" `
--source-arn "S3バケットARN"
3.S3側:イベント通知設定
aws s3api put-bucket-notification-configuration `
--profile "AWS CLI で操作可能なプロファイルを指定" `
--bucket "S3バケット名" `
--notification-configuration file://ローカル端末上のファイルs3.jsonへのパス