【问题标题】:Circular dependency between resources AWS::S3/LAMBDA资源 AWS::S3/LAMBDA 之间的循环依赖
【发布时间】:2021-09-27 13:23:49
【问题描述】:

说明: 在将 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,例如:Waiter ChangeSetCreateComplete failed: Waiter 遇到终端故障 状态:对于表达式“状态”,我们匹配预期路径:“失败” 状态:失败。原因:资源之间的循环依赖: [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,例如:Waiter ChangeSetCreateComplete failed: Waiter 遇到终端故障 状态:对于表达式“状态”,我们匹配预期路径:“失败” 状态:失败。原因:资源之间的循环依赖: [ProcessBlobFunction, ProcessBlobFunctionBlobsBucketPermission, AllowS3ToCallLambdaPermission, BlobsBucket]

我被卡住了,很长时间都找不到解决办法。

【问题讨论】:

    标签: amazon-web-services amazon-s3 aws-lambda amazon-cloudformation


    【解决方案1】:

    不要在你的函数中使用!Ref BlobsBucket。您的存储桶具有固定和预定义名称。所以改用这个名字:

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

    权限中的存储桶 ARN 也是如此。另外,您可以添加DependsOn来强制资源创建的正确顺序。

    【讨论】:

    • 无服务器应用程序规范文档无效。发现的错误数:1. id 为 [ProcessBlobFunction] 的资源无效。 ID 为 [BlobsBucket] 的事件无效。 S3 事件必须引用同一模板中的 S3 存储桶。
    • 我遇到了类似的问题。有人解决了吗?
    猜你喜欢
    • 2021-04-16
    • 1970-01-01
    • 2017-12-12
    • 2020-11-08
    • 2018-08-19
    • 2019-12-04
    • 1970-01-01
    • 2022-01-08
    • 1970-01-01
    相关资源
    最近更新 更多