AWS CloudFormation 堆栈更新错误:需要功能:[CAPABILITY_IAM]

93

在使用CloudFormation创建堆栈时,我遇到了如下错误:

堆栈更新错误:需要以下能力:[CAPABILITY_IAM]

我找不到将 CAPABILITIES_IAM 添加到CloudFormation配置的模板。

解决 CAPABILITIES_IAM 错误的选项有哪些?

7个回答

146

事实证明,在堆栈创建的最后一个屏幕上需要勾选一个框。如果您使用控制台,则在“创建堆栈”按钮上方有一个框,询问您是否要承认要允许Cloudformation修改IAM内容。当然,您也可以创建不需要确认的堆栈,这将导致堆栈失败并显示CAPABILITY_IAM错误(或者如果需要其他功能,则可能会显示其他错误)。

在CodePipeline CloudFormation中,您可以像这样添加它以允许在部署操作中执行创建的change_set:

Configuration:
        StackName: !Ref GitHubRepository
        ActionMode: CHANGE_SET_REPLACE
        Capabilities: CAPABILITY_NAMED_IAM
        RoleArn: arn:aws:iam::818272543125:role/events-list-codepiplinerole
        ChangeSetName: !Join ["",[!Ref GitHubRepository, "-changeset"]]
        TemplatePath: MyAppBuild::sam_post.yaml

在AWS CLI中追加

--capabilities CAPABILITY_IAM
或者 (or)
--capabilities CAPABILITY_NAMED_IAM

像这样输入您的指令:

aws cloudformation create-stack --stack-name message-store --template-body file://bucket_with_keys.yaml --parameters file://cfg_bucket_with_keys.json --capabilities CAPABILITY_NAMED_IAM

这不适用于cloudformation --validate-template,因为它实际上并未创建资源。


1
对于新的 AWS CLI 版本,应该是 --capabilities CAPABILITY_NAMED_IAM - Chau Giang
更多信息请参见https://docs.aws.amazon.com/AWSCloudFormation/latest/APIReference/API_CreateStack.html - Edward Moffett

12
如果您正在使用AWS CLI,您可以向aws cloudformation create-stack命令添加一个额外的参数,明确表示您需要提供这些功能。
(这是在此处勾选复选框的CLI等效方法)。
该参数是--capabilities CAPABILITY_IAM,因此您的命令将如下所示: aws cloudformation create-stack --stack-name $STACK_NAME --capabilities CAPABILITY_IAM 希望能对您有所帮助。

感谢您提醒CLI参数的问题。已将其添加并在上方提供了完整的代码示例。 - Eric Nord
1
我错了还是 validate-template 不能用?我的完整命令:aws cloudformation validate-template --template-body file://sqs-template.yml --capabilities CAPABILITY_IAM - Michael M
2
我来这里也是想问同样的问题。如果你看到 "error" "CapabilitiesReason": "The following resource(s) require capabilities: [AWS::IAM::Role]",那就意味着你的模板是有效的,你需要在创建堆栈时指定返回能力。来源 - Matt Klein
模板将在没有命令的情况下进行验证 - 只有在创建堆栈时才需要它。 - Eric Nord
3
这个 GitHub 问题讨论了这个话题:https://github.com/awslabs/serverless-application-model/issues/51。 - Keeton Hodgson

9
在创建堆栈按钮的上方,打开控制台中的确认选项。 enter image description here

3

如果有人从谷歌(就像我一样)来到这里,并且正在使用 Terraform,请确保添加 capabilities 参数:

resource "aws_cloudformation_stack" "cloudformation_stack" {
  # ...
  capabilities = [ "CAPABILITY_IAM" ]
}

1

你的回答可以通过提供更多支持信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人可以确认你的答案是正确的。您可以在帮助中心找到有关如何编写良好答案的更多信息。 - Community

1

如果有人在使用 SAM 进行部署时遇到相同的问题,只需要添加 --capabilities 标志即可:

sam deploy --guided --capabilities CAPABILITY_NAMED_IAM

使用IAM功能


0
在使用SAM的情况下,
可能性1:使用"sam deploy --guided"并在提示符中:
"SAM需要权限来创建角色以连接到模板中的资源 允许SAM CLI创建IAM角色"
回答是。 但是,如果您需要"CAPABILITY_NAMED_IAM",它将无法工作。
可能性2:将其作为命令行参数传递。
sam deploy --capabilities CAPABILITY_IAM

或者

sam deploy --capabilities CAPABILITY_NAMED_IAM

或者两者都可以:
sam deploy --capabilities CAPABILITY_IAM CAPABILITY_NAMED_IAM

可能性3:以以下方式编辑`samconfig.toml`文件(或者您命名的配置文件):
capabilities = "CAPABILITY_IAM CAPABILITY_NAMED_IAM"

这使您每次使用`sam deploy`时都无需参数。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接