mysql - CloudFormation 更改集显示替换,尽管没有更改

标签 mysql postgresql amazon-web-services aws-cloudformation infrastructure-as-code

AWS::RDS::DBInstance 类型的资源已部署。即使我没有在模板中指定它,数据库也会自动使用标准端口 3306。这很好,也是预期的。

但是,现在我想通过添加 that property 在模板中显式指定端口号:端口:“3306”

问题是,当我将其添加到模板时,CloudFormation 更改集告诉我这是一个将导致数据库替换的修改。这是更改集:

[
  {
    "resourceChange": {
      "logicalResourceId": "RDSDBInstanceA",
      "action": "Modify",
      "physicalResourceId": "awesome-db",
      "resourceType": "AWS::RDS::DBInstance",
      "replacement": "True",
      "moduleInfo": null,
      "details": [
        {
          "target": {
            "name": "Port",
            "requiresRecreation": "Always",
            "attribute": "Properties"
          },
          "causingEntity": null,
          "evaluation": "Static",
          "changeSource": "DirectModification"
        }
      ],
      "changeSetId": null,
      "scope": [
        "Properties"
      ]
    },
    "hookInvocationCount": null,
    "type": "Resource"
  }
]

预期行为

我希望 CloudFormation 说:未检测到任何更改。因为数据库已经使用端口 3306,所以实际上没有任何变化。

如果它已经在使用我想要的端口,我为什么还要尝试解决这个问题?

这样我就可以重复使用 Postgres 的 MySQL 模板,有条件地将端口号更改为标准 5432。奇怪的是,当我部署 Postgres 数据库而不指定端口号时,它使用了 3306 ——这是一个问题我,因为我想要标准端口 5432。

我尝试过的事情:

  • 在 MySQL 部署时,使用 AWS::NoValue 作为 Port 属性的值,欺骗 CloudFormation 认为没有任何变化:
Port: !If [IsMySQL, AWS::NoValue, "5432"]

结果相同。

如果这是 Terraform...

它会检查状态,发现端口已经是 3306,然后说“没有变化”。

我的问题

如何避免替换数据库,同时仍将此属性添加到模板?

最佳答案

CloudFormation 不会查看已部署的资源来识别更改,它只是将当前部署的堆栈与新堆栈进行比较。因此,在这种情况下,您有一个堆栈,以前不包含值,现在包含它,CF 认为这是一个更改。我有点惊讶 AWS::NoValue 选项不起作用。

解决这个问题的一个选择是利用堆栈导入。步骤如下:

  1. 通过将当前 RDS 实例的 DeletionPolicy 设置为 RETAIN(如果尚未设置)来更新当前堆栈。
  2. 更新当前堆栈,删除 RDS 实例。 RDS实例仍然存在,但不再受CF控制。
  3. 将 RDS 添加回您的模板中,按照您想要的方式进行配置,然后使用 CF 中的“将资源导入堆栈”选项。这应该允许您将 RDS 实例添加回您的堆栈中,并按照您想要的方式进行配置。

请记住,当您将某些内容导入堆栈 CF 时,仅假设模板中的配置与导入的资源匹配。

关于mysql - CloudFormation 更改集显示替换,尽管没有更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68182626/

相关文章:

python-3.x - 如何获取amazon sagemaker笔记本实例的公网ip?是否可以?

amazon-web-services - AWS Cloudwatch 指标上的数学表达式没有给出预期的输出

mysql - "new ephemeral certificate expires too soon: current time:"米

php - 无法创建迁移 phinx

mysql - 如何在sequelize ORM中使用从时间戳中选择和提取日期到月份和年份?

javascript - 从 Node.JS (JavaScript) 中删除 AWS/S3 对象

MySQL错误: You can't specify target table 'users_words' for update in FROM clause

mysql - 预定mysql修复的弊端?

c# - npgsql中的日期类型是什么?

optimization - 当 Postgres 的 work_mem 达到最大值时会发生什么?