解决只写属性问题 - AWS CloudFormation

解决只写属性问题

使用 CloudFormation IaC 生成器,您可以使用账户中已预置但尚未由 CloudFormation 管理的资源生成模板。但是,某些资源属性被指定为只写,这意味着 CloudFormation 可以写入但不能读取这些属性,例如数据库密码。

利用现有资源生成 CloudFormation 模板时,只写属性会带来挑战。通常,CloudFormation 会在生成的模板中将这些属性转换为参数。这允许您在导入操作期间输入属性作为参数值。但在某些情况下无法实现这种转换,而且 CloudFormation 对这些情况的处理方式有所不同。

互斥属性

一些资源有多组互斥属性,其中至少有一些是只写属性。对于这些情况,IaC 生成器无法确定在创建期间对资源应用了哪组互斥属性。例如,您可以使用其中一组属性提供 AWS::Lambda::Function 代码。

  • Code/S3BucketCode/S3Key 以及可选的 Code/S3ObjectVersion

  • Code/ImageUri

  • Code/ZipFile

所有这些属性均为只写属性。IaC 生成器会选择其中一组独占属性并将其添加到生成的模板中。为每个只写属性添加参数。参数名称包括 OneOf,参数说明表示相应的属性可以替换为其他独占属性。IaC 生成器为包含的属性设置的警告类型为 MUTUALLY_EXCLUSIVE_PROPERTIES

互斥类型

在某些情况下,只写属性可以为多种数据类型。例如,AWS::ApiGateway::RestApiBody 属性可以是 objectstring。遇到这种情况时,IaC 生成器会使用 string 类型在生成的模板中包含该属性,并将警告类型设置为 MUTUALLY_EXCLUSIVE_TYPES

Array 属性

如果只写属性的类型为 array,则 IaC 生成器无法将其包含在生成的模板中,因为参数只能是标量值。在这种情况下,模板中会忽略该属性,并设置 UNSUPPORTED_PROPERTIES 警告类型。

可选属性

对于可选的只写属性,IaC 生成器无法检测在设置资源时是否使用过该属性。在这种情况下,生成的模板中会忽略该属性,并设置 UNSUPPORTED_PROPERTIES 警告类型。

警告和后续步骤

要确定哪些属性为只写属性,您必须查看 IaC 生成器控制台返回的警告。AWS 资源和属性类型参考 文档并未指示某个属性是否为只写属性,也未指示其是否支持多种类型。

您也可从资源提供程序架构中查看哪些属性为只写属性。要下载资源提供程序架构,请参阅 CloudFormation 资源提供程序架构。有关更多信息,请参阅《CloudFormation 命令行界面用户指南》中的 Resource provider schema

解决只写属性问题
  1. 打开 CloudFormation 控制台的 IaC 生成器页面

  2. 在屏幕顶部的导航栏中,选择模板所在的 AWS 区域。

  3. 选择模板选项卡,然后选择您创建的模板的名称。

  4. 模板定义选项卡中,当生成的模板包含具有只写属性的资源时,IaC 生成器控制台会显示一条警告,其中包含问题类型的摘要。例如:

    IaC 生成器控制台关于生成的模板中包含只写属性的警告
  5. 选择查看警告详细信息以了解更多详情。具有只写属性的资源由生成的模板中使用的逻辑 ID 和资源类型标识。

    使用警告列表来识别具有只写属性的资源,并查看每个资源以确定需要对生成的模板进行哪些更改(如果有)。

    IaC 生成器控制台关于生成的模板中包含只写属性的详细警告
  6. 如果必须更新模板才能解决只写属性问题,请执行以下操作:

    1. 选择下载以下载模板的副本。

    2. 编辑模板。

    3. 完成更改后,您可以选择导入已编辑的模板按钮以继续完成导入过程。