以下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
答案 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()