在AWS CloudFormation中解决循环依赖问题

时间:2018-05-03 15:19:18

标签: amazon-web-services aws-lambda amazon-cloudformation serverless-framework serverless

以下AWS CloudFormation给出了循环依赖性错误。我的理解是依赖关系如下:rawUploads -> generatePreview -> previewPipeline -> rawUploads。虽然rawUploads似乎不依赖generatePreview,但我想CF需要知道在创建存储桶时要触发什么lambda,即使触发器是在CloudFormation模板的lambda部分中定义的。

我在网上发现了一些谈论类似问题的资源,但它似乎并不适用于此。 https://aws.amazon.com/premiumsupport/knowledge-center/unable-validate-circular-dependency-cloudformation/

打破这个循环依赖关系链有哪些选择?可编写脚本的解决方案是可行的,但是手动更改的多个部署不适用于我的用例。

AWSTemplateFormatVersion: '2010-09-09'
Transform: 'AWS::Serverless-2016-10-31'
Resources:
  rawUploads:
    Type: 'AWS::S3::Bucket'
  previewAudioFiles:
    Type: 'AWS::S3::Bucket'

  generatePreview:
    Type: AWS::Serverless::Function
    Properties:
      Handler: generatePreview.handler
      Runtime: nodejs6.10
      CodeUri: .
      Environment:
        Variables:
          PipelineId: !Ref previewPipeline
      Events:
        BucketrawUploads:
          Type: S3
          Properties:
            Bucket: !Ref rawUploads
            Events: 's3:ObjectCreated:*'

  previewPipeline:
    Type: Custom::ElasticTranscoderPipeline
    Version: '1.0'
    Properties:
      ServiceToken:
        Fn::Join:
        - ":"
        - - arn:aws:lambda
          - Ref: AWS::Region
          - Ref: AWS::AccountId
          - function
          - aws-cloudformation-elastic-transcoder-pipeline-1-0-0
      Name: transcoderPipeline
      InputBucket:
        Ref: rawUploads
      OutputBucket:
        Ref: previewAudioFiles

2 个答案:

答案 0 :(得分:1)

一种方法是为S3桶提供显式名称,以便以后可以简单地使用存储桶名称,而不是依赖Ref: bucketname。如果您想要自动生成的存储桶名称,那么这显然有问题,在这种情况下,从一些前缀加上(唯一的)堆栈名称生成存储桶名称是谨慎的,例如:

InputBucket: !Join ["-", ['rawuploads', Ref: 'AWS::StackName']]

另一种选择是使用单个CloudFormation模板,但分为两个阶段 - 第一阶段创建基本资源(以及任何refs不是循环的),然后将剩余的refs添加到模板并执行堆栈更新。显然不太理想,所以我更喜欢第一种方法。

您还可以在需要引用ARN的情况下使用第一种技术,例如:

!Join ['/', ['arn:aws:s3:::logsbucket', 'AWSLogs', Ref: 'AWS:AccountId', '*']]

使用此技术时,您可能还需要考虑使用DependsOn,因为您已删除了有时会导致问题的隐式依赖项。

答案 1 :(得分:1)

这篇文章最终帮助了我:https://aws.amazon.com/premiumsupport/knowledge-center/unable-validate-destination-s3/

我最终在CloudFormation中配置了一个SNS主题。存储桶会推送有关此主题的事件,Lambda函数会侦听此主题。这种方式依赖图如下:

no(i.e address)

有些事情(省略了一些政策)

malloc()