对 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的主要内容,如果未能解决你的问题,请参考以下文章
AWS cloudformation 嵌套堆栈因模板 URL 失败
在 AWS cloudformation 上理解 Apigateway 和嵌套堆栈时出错
AWS CloudFormation CodePipeline、ParameterOverrides、将列表传递给嵌套堆栈