簡體   English   中英

資源之間的循環依賴 AWS::S3/LAMBDA

[英]Circular dependency between resources AWS::S3/LAMBDA

說明:當將 AWS::Serverless::Function 定義為 AWS::S3::Bucket 的觸發器時,目前無法使用受限訪問的 SAM 預定義策略。

例如,讓我們看看以下模板:

Resources:

  BlobsBucket:
    Type: AWS::S3::Bucket
    Properties:
      BucketName: !Sub "blobs-${AWS::AccountId}-${AWS::Region}"


  ProcessBlobFunction:
    Type: AWS::Serverless::Function # More info about Function Resource: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlessfunction
    Properties:
      CodeUri: blobsprjct/
      Handler: processBlob.lambda_handler
      Runtime: python3.8
      Policies:
        - S3ReadPolicy:
            BucketName: !Sub "blobs-${AWS::AccountId}-${AWS::Region}"
        - AmazonRekognitionFullAccess
      Events:
        BlobsBucket:
          Type: S3
          Properties:
            Bucket: !Ref BlobsBucket
            Events: s3:ObjectCreated:*

這將失敗:

錯誤:無法為堆棧創建變更集:blob,例如:Water ChangeSetCreateComplete 失敗:Water 遇到終端故障狀態:對於表達式“Status”,我們匹配了預期路徑:“FAILED”狀態:FAILED。 原因:資源之間的循環依賴:[ProcessBlobFunction, ProcessBlobFunctionBlobsBucketPermission, BlobsBucket]

所有資源都說要設置 BucketName - 我已經有了它,我還添加了權限(不確定是否需要,導致錯誤保持更大 1 分)

  AllowS3ToCallLambdaPermission:
    Type: AWS::Lambda::Permission
    Properties:
      Action: 'lambda:InvokeFunction'
      FunctionName: !Ref ProcessBlobFunction
      Principal: s3.amazonaws.com
      SourceArn: !GetAtt BlobsBucket.Arn

這將失敗:

錯誤:無法為堆棧創建變更集:blob,例如:Water ChangeSetCreateComplete 失敗:Water 遇到終端故障狀態:對於表達式“Status”,我們匹配了預期路徑:“FAILED”狀態:FAILED。 原因:資源之間的循環依賴:[ProcessBlobFunction, ProcessBlobFunctionBlobsBucketPermission, AllowS3ToCallLambdaPermission, BlobsBucket]

我被卡住了,很長一段時間都找不到解決方案。

不要在您的函數中使用!Ref BlobsBucket 您的存儲桶具有固定和預定義的名稱。 所以改用這個名字:

Bucket: !Sub "blobs-${AWS::AccountId}-${AWS::Region}"

權限中的存儲桶 ARN 也是如此。 此外,您可以添加DependsOn以強制資源創建的正確順序。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM