对 CloudFormation 上的嵌套堆栈使用 CAPABILITY_AUTO_EXPAND

Posted

技术标签:

【中文标题】对 CloudFormation 上的嵌套堆栈使用 CAPABILITY_AUTO_EXPAND【英文标题】:Use CAPABILITY_AUTO_EXPAND for nested stacks on CloudFormation 【发布时间】:2019-05-01 18:35:33 【问题描述】:

我正在尝试使用嵌套堆栈,当我的 ChangeSet 正在执行时,我收到了这个错误:

Requires capabilities : [CAPABILITY_AUTO_EXPAND]

我用 cloudformation 创建了一个管道。

这可用于创建管道:

Configuration:
  ActionMode: CHANGE_SET_REPLACE
  ChangeSetName: changeset
  RoleArn: ??
  Capabilities: CAPABILITY_IAM
  StackName: appsync-graphql
  TemplatePath: BuildArtifact::output.yaml

这不能:

Configuration:
  ActionMode: CHANGE_SET_REPLACE
  ChangeSetName: changeset
  RoleArn: ??
  Capabilities: 
    - CAPABILITY_IAM
    - CAPABILITY_AUTO_EXPAND
  StackName: appsync-graphql
  TemplatePath: BuildArtifact::output.yaml

错误是:“属性配置的值必须是具有字符串(或简单类型)属性的对象”

这是我找到的最接近的文档:https://docs.aws.amazon.com/AWSCloudFormation/latest/APIReference/API_UpdateStack.html

上面写着:Type: Array of strings for capabilites,aws cli 文档也有类似的说法,但没有给出示例。

所以我没有什么想法可以尝试拥有 CAPABILITY_AUTO_EXPAND 功能。

【问题讨论】:

在我的代码管道模板中: 1. capabilities: - CAPABILITY_AUTO_EXPAND - CAPABILITY_IAM => 我无法部署管道。错误:“属性配置的值必须是具有字符串(或简单类型)属性的对象” 2. capabilities: 'CAPABILITY_AUTO_EXPAND CAPABILITY_IAM' 我可以部署管道,但是当它创建变更集时,出现错误:JobFailed 检测到 1 个验证错误:“功能”处的值“[CAPABILITY_IAM CAPABILITY_AUTO_EXPAND]”未能满足约束:成员必须满足约束:[成员必须满足枚举值集:[CAPABILITY_AUTO_EXPAND,CAPABILITY_NAMED_IAM,CAPABILITY_IAM]](服务:AmazonCloudFormation;状态代码:400;错误代码:ValidationError;) 我有同样的问题,我被卡住了。感谢您报告您的结果。 【参考方案1】:

我尝试了另一种变体,它成功了!

Configuration:
  ..
  Capabilities: CAPABILITY_IAM,CAPABILITY_AUTO_EXPAND
  ...

【讨论】:

Pipeline GUI 似乎不提供此选项。当我还在尝试使用 Pipeline 时,我只需要快速修复,所以我运行 aws codepipeline get-pipeline --name my-pipeline > tmp.json,编辑 tmp.json,从底部删除版本和元数据,设置 "Capabilities": "CAPABILITY_IAM,CAPABILITY_AUTO_EXPAND" 并重新提交:aws codepipeline update-pipeline --cli-input-json file://tmp.json 行得通,谢谢。有关信息,请确保 CAPABILITY_IAM,CAPABILITY_AUTO_EXPAND 之间没有空格,就像上面的示例一样【参考方案2】:

我从 Keeton Hodgson 那里得到了答案,这个 cli 命令有效:

sam deploy --template-file output.yaml --stack-name <AppName> --capabilities CAPABILITY_IAM CAPABILITY_AUTO_EXPAND

注意没有逗号。

我仍然不知道如何更改管道模板以使其正常工作。

【讨论】:

这对我的 AWS CLI 脚本有所帮助。谢谢。【参考方案3】:

我尝试了上述解决方案,今天(2020 年 6 月)使用更高级别的 sam 对我有用的是在列出的功能之间添加一个空格。在这个文本文件解释中没有弹性是完全疯狂的。 SAM 的 cli 是开源的,所以我想我可以把我的代码放在嘴边并提交 PR。反正。

samconfig.toml:

...
capabilities = "CAPABILITY_IAM CAPABILITY_AUTO_EXPAND"
...

然后:

sam deploy

输出:

...
Capabilities               : ["CAPABILITY_IAM", "CAPABILITY_AUTO_EXPAND"]
...

【讨论】:

【参考方案4】:

像这样把capabilities属性放在最后

aws cloud formation deploy COMMAND --capabilities CAPABILITY_NAMED_IAM

更改顺序

Configuration:
  ActionMode: CHANGE_SET_REPLACE
  ChangeSetName: changeset
  RoleArn: ??
  StackName: appsync-graphql
  TemplatePath: BuildArtifact::output.yaml
  Capabilities: 
    - CAPABILITY_IAM
    - CAPABILITY_AUTO_EXPAND

【讨论】:

以上是关于对 CloudFormation 上的嵌套堆栈使用 CAPABILITY_AUTO_EXPAND的主要内容,如果未能解决你的问题,请参考以下文章

yaml中的Cloudformation嵌套堆栈输出

CloudFormation 嵌套堆栈名称

AWS cloudformation 嵌套堆栈因模板 URL 失败

在 AWS cloudformation 上理解 Apigateway 和嵌套堆栈时出错

AWS CloudFormation CodePipeline、ParameterOverrides、将列表传递给嵌套堆栈

CloudFormation 的超时配置