既存のバケットのLambda関数にトリガーイベントを追加したいので、以下の構成を使用しています:
events:
- s3:
bucket: serverlesstest
event: s3:ObjectCreated:*
rules:
- prefix: uploads/
- suffix: .pdf
ここで、バケットserverlesstest
はS3にすでに存在します。
この構成はエラーをスローしています:
スタックのプロビジョニング中にエラーが発生しました:S3BucketServerlesstest-serverlesstestはすでに存在します。
サーバーレスフレームワークを使用してこのエラーを解決するにはどうすればよいですか?
CloudFormationの動作のため、現在コアフレームワークでは使用できません。多分。
ただし、このプラグインは使用できます。
https://github.com/matt-filion/serverless-external-s3-event
npm install serverless-plugin-existing-s3
によってserverless-plugin-existing-s3をインストールした後。
そして、serverless.ymlにプラグインを追加します
plugins:
serverless-plugin-existing-s3
バケットにアクセスするためのデプロイ権限を付与します。
provider:
name: aws
runtime: nodejs4.3
iamRoleStatements:
...
- Effect: "Allow"
Action:
- "s3:PutBucketNotification"
Resource:
Fn::Join:
- ""
- - "arn:aws:s3:::BUCKET_NAME or *"
そして、existingS3
イベントを使用します。それはs3
だけではありません。
functions:
someFunction:
handler: index.handler
events:
- existingS3:
bucket: BUCKET_NAME
events:
- s3:ObjectCreated:*
rules:
- prefix: images/
- suffix: .jpg
sls deploy
コマンドの後に、sls s3deploy
コマンドを使用してイベントを添付できます。
将来的に追加される予定です。
残念ながら、サーバーレスフレームワーク*はクラウドフォーメーションを使用して既存のインフラストラクチャを変更できないため、既存のS3バケットを指定してLambda関数をトリガーすることはできません。この構成では、newバケットを作成する必要があります。
詳細については、GitHubで公開されていた次の問題をご覧ください。
* ServerelssFrameworkの代わりにAWSコンソールまたはSDKを使用してこのトリガーを設定しようとしました。
これは、サーバーレスバージョンv1.47.0以降、イベント設定にexisting: true
フラグを追加することで可能になります: https://serverless.com/framework/docs/providers/aws/events/s3/
ソースからの例:
functions:
users:
handler: users.handler
events:
- s3:
bucket: legacy-photos
event: s3:ObjectCreated:*
rules:
- prefix: uploads/
- suffix: .jpg
existing: true # <- this makes it work with existing objects
ソースは次の警告を提供します:
重要:関数ごとに接続できる既存のS3バケットは1つだけです。
注:既存の設定を使用すると、追加のLambda関数とIAMロールがスタックに追加されます。 Lambda関数は、既存のS3バケットをサポートするために使用されるカスタムS3リソースをバックアップします。
バケットがスタックの他の場所でサーバーレスを使用して作成された場合は、- s3: Bucket: { Ref: serverlesstest }
を使用できます。それ以外の場合は、名前またはARNを自分で作成する必要があります。