【问题标题】:How to import existing S3 bucket from another stack in CloudFormation?如何从 CloudFormation 中的另一个堆栈导入现有的 S3 存储桶?
【发布时间】:2021-02-21 13:54:02
【问题描述】:

我想导入在另一个堆栈中创建的现有 S3 存储桶。我尝试使用下面的两个 CF 模板来执行此操作,但是当我尝试创建使用者堆栈时,它会导致 CREATE_FAILED 事件并显示“已存在”错误消息。

生产者模板:

"AWSTemplateFormatVersion": "2010-09-09",
"Description": "Main stack that creates S3 bucket.",
"Resources": {
"myS3Bucket" : {
      "Type" : "AWS::S3::Bucket",
      "DeletionPolicy" : "Retain",
      "Properties": {"BucketName": "bucket-name" }
    }
},
"Outputs": {
    "BucketId": {
        "Description": "Bucket ID",
        "Value": { "Ref": "myS3Bucket" },
        "Export": { "Name": { "Fn::Sub": "${AWS::StackName}-BUCKETID" }}
        }
    }
} 

这是一个消费者堆栈模板:

{
    "AWSTemplateFormatVersion": "2010-09-09",
    "Description": "AWS CloudFormation Sample Template.",
    "Resources" : { 
        "S3ImportedBucket" : {  
            "Type" : "AWS::S3::Bucket",
            "Properties" : {
                "BucketName" : { "Fn::ImportValue" : "main-BUCKETID"} 
            }
        }
    }
}

应该在模板中进行哪些更改才能使其正常工作?

【问题讨论】:

  • 这是一个非常糟糕的主意,我什至不确定是否可以让两个堆栈管理相同的资源。你想达到什么目标?也许有更好的方法?
  • @Marcin 基本上是尝试使用另一个堆栈中的存储桶来执行诸如策略分配之类的事情(以便消费者堆栈中的服务可以访问该存储桶)等等。
  • 遗憾的是,您无法按照您尝试的方式执行此操作。相反,就像发布的答案一样,您从一个堆栈导出输出,然后使用 ImportValue 引用它。
  • 是的,CF中资源导入的限制太多了。
  • @Cybex 你解决了吗?我有同样的问题。

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


【解决方案1】:

tl;博士outputs 的概念是对的,但是你用错了

解释 在 cloudformation 模板中,您正在发布

两者都创建具有相同名称的 s3 存储桶类型的资源,因此无论先运行什么都会创建 s3 存储桶

您可以查看here 以供参考

但是,输出可以用作其他模板中的参考,例如如果您从 lambda 上传内容,那么您可以将该存储桶设置为 env var 并在 lambda 中使用它(只是一个示例)

【讨论】:

  • 我明白为什么会收到此错误消息。我正在寻找允许我将现有存储桶导入另一个堆栈(跨堆栈引用)的修复程序。可用的教程没有合适的例子(大多数都有一些非常简单的东西,比如获取文本值)。
  • 检查 cloudformation 的输出,这是跨堆栈引用资源的方式
  • 另外,当您在其他地方使用存储桶作为参考时,请检查其他地方想要什么资源名称或资源 ARN,并基于该编辑您的输出
  • 好的,我去看看 Outputs 文档。谢谢!
猜你喜欢
  • 2020-09-15
  • 2020-04-03
  • 2021-05-06
  • 1970-01-01
  • 2020-07-23
  • 1970-01-01
  • 1970-01-01
  • 2019-10-24
  • 2020-05-29
相关资源
最近更新 更多