【问题标题】:How to conditionally create s3 bucket in cloudformation?如何在 cloudformation 中有条件地创建 s3 存储桶?
【发布时间】:2021-09-17 23:21:06
【问题描述】:

我们有一个云形成堆栈,其中包含 RDS、S3 等数据存储资源。即使堆栈被删除或升级堆栈时,我们也希望保留它们,很少有参数可以导致服务重新创建。所以我们将删除策略设置为retain。现在,当我重新运行堆栈时,它无法创建资源,因为存在同名资源。

我想通过检查资源是否存在来创建资源。云的形成是否有可能自己进行这个检查。我也意识到保留的资源已经变成了胭脂资源,因为它们现在不属于这个云的形成。

绕过此解决方案的最佳方法是什么?

【问题讨论】:

  • 我面临着完全相同的问题。你是如何实现这个要求的?你有什么解决办法吗?谢谢。

标签: amazon-web-services amazon-s3 amazon-cloudformation infrastructure infrastructure-as-code


【解决方案1】:

我认为是的,您可以通过在您的 CFN 中添加条件来做到这一点,无论是 JSON/YAML

{
"AWSTemplateFormatVersion": "2010-09-09",
"Transform": "AWS::Serverless-2016-10-31",
"Description": "",
"Parameters": {
    "ShouldCreateBucketInputParameter": {
      "Type": "String",
      "AllowedValues": [
        "true",
        "false"
      ],
      "Description": "If true then the S3 bucket that will be proxied will be created with the CloudFormation stack."
    }
},
"Conditions": {
  "CreateS3Bucket": {
    "Fn::Equals": [
      {
        "Ref": "ShouldCreateBucketInputParameter"
      },
      "true"
    ]
  }
},
"Resources": {
    "SerialNumberBucketResource": {
        "Type": "AWS::S3::Bucket",
        "Condition": "CreateS3Bucket",
        "Properties": {
            "AccessControl": "Private"
        }
    }
  }   
}

然后使用 CLI 你只需要设置“true”或“false”

aws cloudformation deploy --template ./s3BucketWithCondition.json --stack-name bucket-stack --parameter-overrides ShouldCreateBucketInputParameter="true"

【讨论】:

    【解决方案2】:

    一般来说,这是一个复杂的问题,如果不了解您的设置和特定的 CF 模板,很难给出具体的建议。我将讨论一些一般性观点和建议的行动。

    1. “当我重新运行堆栈时,由于存在同名资源,因此无法创建资源” - 这是命名资源的常见问题。作为一般指导,避免静态命名那些没有人工操作员将与之交互的资源。如果您有严格的命名约定,请始终为名称添加随机后缀,这将使它们在该堆栈中是唯一的。

    2. 如果您有存储资源,即 S3 存储桶和 DB,则考虑将它们放入单独的 CF 堆栈中,并将相关属性(如 DB 端点地址)公开为 CF exports。您可以使用Fn::ImportValue 在其他堆栈中引用它们。通过这种方式,您可以将“稳定”资源与“易失”资源分开,并且仍然可以享受 CF 带来的好处。

    3. 您可以import some existing resources 进入 CF 堆栈。它们将作为堆栈的合法部分。但并不是所有的资源都可以这样导入。

    【讨论】:

      【解决方案3】:

      你必须import这些桶回到你的堆栈。

      遗憾的是,CFN 没有检查是否存在某些内容的功能,并且无法自行自动执行导入。因此,您必须使用 AWS 控制台手动完成,或者使用 SDK 或 CLI 以编程方式完成。

      【讨论】:

        猜你喜欢
        • 2022-01-17
        • 2016-08-23
        • 2020-07-29
        • 1970-01-01
        • 2016-12-09
        • 2020-09-07
        • 2020-02-08
        • 1970-01-01
        • 2018-04-01
        相关资源
        最近更新 更多