web-dev-qa-db-ja.com

サーバーレスフレームワークを使用してAWSLambda関数にS3トリガーイベントを追加するにはどうすればよいですか?

既存のバケットのLambda関数にトリガーイベントを追加したいので、以下の構成を使用しています:

 events:
      - s3:
          bucket: serverlesstest
          event: s3:ObjectCreated:*
          rules:
            - prefix: uploads/
            - suffix: .pdf

ここで、バケットserverlesstestはS3にすでに存在します。

この構成はエラーをスローしています:

スタックのプロビジョニング中にエラーが発生しました:S3BucketServerlesstest-serverlesstestはすでに存在します。

サーバーレスフレームワークを使用してこのエラーを解決するにはどうすればよいですか?

7
Ronit kadwane

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コマンドを使用してイベントを添付できます。

機能提案

将来的に追加される予定です。

https://github.com/serverless/serverless/issues/4241

9
yabaiwebyasan

残念ながら、サーバーレスフレームワーク*はクラウドフォーメーションを使用して既存のインフラストラクチャを変更できないため、既存のS3バケットを指定してLambda関数をトリガーすることはできません。この構成では、newバケットを作成する必要があります。

詳細については、GitHubで公開されていた次の問題をご覧ください。

* ServerelssFrameworkの代わりにAWSコンソールまたはSDKを使用してこのトリガーを設定しようとしました。

4
Zanon

これは、サーバーレスバージョン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リソースをバックアップします。

3
Ulad Kasach

バケットがスタックの他の場所でサーバーレスを使用して作成された場合は、- s3: Bucket: { Ref: serverlesstest }を使用できます。それ以外の場合は、名前またはARNを自分で作成する必要があります。

1
Trent Bartlem