【发布时间】:2021-12-20 00:32:18
【问题描述】:
我正在尝试使用 CloudFormation 为 S3 存储桶设置清单配置。我想在一个子文件夹中获取每日数据清单,并将清单写入同一存储桶中的不同子文件夹。我已将存储桶定义如下:
S3Bucket:
Type: AWS::S3::Bucket
Properties:
# ...other properties...
InventoryConfigurations:
- Id: runs
Enabled: true
Destination:
BucketAccountId: !Ref AWS::AccountId
BucketArn: !GetAtt S3Bucket.Arn
Format: CSV
Prefix: inventory/runs/
IncludedObjectVersions: Current
OptionalFields: [ETag, Size, BucketKeyStatus]
Prefix: runs/
ScheduleFrequency: Daily
不幸的是,!GetAtt S3Bucket.Arn 行似乎失败了,导致出现类似“错误:无法为堆栈创建变更集:,例如:服务员 ChangeSetCreateComplete 失败:服务员遇到终端故障状态:表达式“状态”我们匹配了预期的路径:“失败”状态:失败。原因:资源之间的循环依赖”。如果我使用存储桶的实际 ARN 代替 !GetAtt S3Bucket.Arn(它已经存在于堆栈的先前版本中),则部署成功,因此我知道存储桶可以将 Inventories 写入自己。
所以我想我的问题是,有没有办法让 Cfn 资源自己调用 !GetAtt,所以我不必在 InventoryConfigurations 中硬编码存储桶 ARN?提前致谢!
【问题讨论】:
-
这是因为 AWS 不希望您将存储桶清单发布到存储桶本身。递归的阴影。
-
@jarmod 我之前已经将库存的目标存储桶设置为同一个存储桶 - 我不知道这种限制;你有文档吗?
-
我并不是说这是一种限制或它不起作用。我是说我怀疑 AWS 没想到有人会想要这样做,所以他们没有将库存配置作为一个独特的 CloudFormation 资源类型,然后您可以独立于 S3 存储桶创建它(因此使用 GetAtt) .
-
@jarmod 好吧,奇怪的是他们没有,因为它受支持
-
是的,我考虑了参数化存储桶名称方法。真正卖给我自动生成名称的是它们允许必须替换存储桶的堆栈更新。这可能没有实际意义,因为更换存储桶需要删除现有的存储桶,而 Cfn 只有在存储桶为空时才能这样做......
标签: amazon-web-services amazon-s3 amazon-cloudformation