无法通过CloudFormation更新IAM策略,返回状态码500求助
CloudFormation更新IAM RolePolicy触发500错误的原因分析
原始的IAM RolePolicy定义
AllowSchedulerToExecuteCodePolicy: Type: AWS::IAM::RolePolicy Properties: PolicyDocument: { "Version": "2012-10-17", "Statement": [ { "Sid": "ExecuteLambdaFunctions", "Effect": "Allow", "Action": [ "lambda:InvokeFunction" ], "Resource": [ "Fn::GetAtt": "Lambda1.Arn", "Fn::GetAtt": "Lambda2.Arn" ] }, { "Sid": "ExecuteECSTask", "Effect": "Allow", "Action": [ "ecs:StartTask", "ecs:StopTask", ], "Resource": [ "Fn::GetAtt": "ECSCluster1.Arn" ] } ] } PolicyName: !Sub Invoke-Code-${Environment} RoleName: !Ref EventBridgeSchedulerExecutionRole
问题情况
删掉策略里Lambda2.Arn的引用后,更新CloudFormation栈时碰到了这个错误:
Resource handler returned message: "null (Service: Iam, Status Code: 500, Request ID: d2b80ce2-5289-4509-8967-3a65409f8282)" (RequestToken: 06927047-00b6-378d-78c9-65105e880242, HandlerErrorCode: GeneralServiceException)
之后尝试回滚也报同样的错,栈现在处于异常状态。
大概率的原因
- JSON语法有问题:原始策略里
ecs:StopTask后面多了个逗号,属于无效JSON。有些时候CloudFormation创建时解析比较宽松能过,但更新时校验变严格,直接触发了IAM服务端的500错误。 - IAM服务临时故障:500状态码基本是AWS内部服务的问题,可能是IAM当时刚好有临时故障,没法处理你的策略更新请求。
- 资源引用冲突:如果
Lambda2已经被删掉,或者它的ARN在当前环境里不存在了,更新时处理这个引用就可能引发服务端错误。 - 角色本身异常:
EventBridgeSchedulerExecutionRole这个角色如果被其他资源锁定,或者本身权限配置有冲突,也可能导致更新时出问题。
排查步骤
- 先把PolicyDocument里的语法错误修好,删掉
ecs:StopTask后面的多余逗号,确保JSON完全合法。 - 等十几分钟再重试更新或回滚,排除IAM临时故障的可能。
- 检查
EventBridgeSchedulerExecutionRole的状态,确认它没被删除、也没被其他进程占用。 - 试试手动在IAM控制台直接更新这个策略,如果能成功,那问题大概率出在CloudFormation的处理逻辑上;如果也失败,那就是IAM服务本身的问题或者策略还有其他隐藏问题。
内容的提问来源于stack exchange,提问作者Roland
相关产品推荐
相关产品推荐

