【问题标题】:Can AWS CloudFormation resources call !GetAtt on themselves?AWS CloudFormation 资源可以自己调用 !GetAtt 吗?
【发布时间】: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


【解决方案1】:

AWS CloudFormation 资源能否自行调用 !GetAtt?

很遗憾,没有,因为 !GetAtt 用于引用堆栈中的其他资源,如您所经历的(其他已创建的具体资源中的其他资源)。


但是,在您的情况下,考虑到您知道存储桶名称,您可以直接construct the bucket ARN yourself

格式:

arn:aws:s3:::bucket_name

例如如果名称是test,则可以使用arn:aws:s3:::test

Destination:
    BucketAccountId: !Ref AWS::AccountId
    BucketArn: 'arn:aws:s3:::test'

【讨论】:

  • 感谢您的回答。不幸的是,在这种情况下,我没有在存储桶上明确设置BucketName,因为这会阻止需要替换存储桶资源的更新。因此,我在设计时实际上并不知道存储桶的名称。听起来我只需要使用单独的存储桶来存放库存......
  • 你想如何识别桶?您一定有某种方法来识别它吗?
  • 如果您自己没有明确设置名称,CloudFormation 将为存储桶生成一个随机名称。因此,在这种情况下,您不能自己制作 ARN。
  • 虽然在实践中可能结果是一样的,但我怀疑限制不是 GetAtt 只能引用堆栈中的 other 资源,而是它只能引用具体的、具体化的资源(即实际存在的,而本场景中的 S3 存储桶实际上还不存在,并且由于自引用问题而无法创建)。
猜你喜欢
  • 2016-12-23
  • 2018-05-09
  • 2017-03-01
  • 2018-10-25
  • 2020-02-13
  • 2020-06-13
  • 2017-05-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多