CDK部署偶现AWS CodeDeploy无IAM角色权限问题求助
解决CDK销毁后重新部署CodeDeploy角色权限问题
执行cdk destroy后再次运行cdk deploy时,常遇到如下错误:
AWS CodeDeploy does not have the permissions required to assume the role <ARN_OF_CODEDEPLOY_ROLE>
确认对应的IAM角色已被正常删除,但问题依然出现。相关CDK代码如下:
const codedeployApplication = new codedeploy.ServerApplication ( this, "CodeDeployApplication", { applicationName: "applicationName" } ); const codedeployRole = new iam.Role ( this, "CodeDeployRole", { roleName: "roleName", assumedBy: new iam.ServicePrincipal("codedeploy.amazonaws.com"), managedPolicies: [ iam.ManagedPolicy.fromAwsManagedPolicyName("service-role/AWSCodeDeployRole") ], inlinePolicies: { assumeRolePolicy: new iam.PolicyDocument ({ statements: [ new iam.PolicyStatement ( { effect: iam.Effect.ALLOW, actions: [ "sts:AssumeRole" ], resources: [ "*" ] } ) ] }) } } ); const deploymentGroup = new codedeploy.ServerDeploymentGroup ( this, "DeploymentGroup", { application: codedeployApplication, deploymentGroupName: "codedeploy-dg", role: codedeployRole, installAgent: true, ec2InstanceTags: new codedeploy.InstanceTagSet ( { "Name": ["EC2_NAME"] } ), deploymentConfig: codedeploy.ServerDeploymentConfig.ALL_AT_ONCE } );
问题原因
- AWS服务最终一致性:角色销毁后,CodeDeploy服务端的缓存未及时更新,重新创建同名角色时,CodeDeploy仍尝试使用旧的缓存信息进行权限校验,导致失败。
- 冗余的信任策略配置:代码中手动添加的
inlinePolicies.assumeRolePolicy会覆盖assumedBy自动生成的信任策略,可能导致信任关系配置冲突或无效。
解决思路
1. 清理冗余的信任策略配置
assumedBy: new iam.ServicePrincipal("codedeploy.amazonaws.com")已经会自动生成正确的信任策略,无需手动添加inlinePolicies。修改后的角色代码:
const codedeployRole = new iam.Role ( this, "CodeDeployRole", { roleName: "roleName", assumedBy: new iam.ServicePrincipal("codedeploy.amazonaws.com"), managedPolicies: [ iam.ManagedPolicy.fromAwsManagedPolicyName("service-role/AWSCodeDeployRole") ] } );
2. 避免使用固定角色名称
固定roleName会导致销毁后重新创建的角色ARN相同,触发服务端缓存冲突。建议:
- 移除
roleName参数,让CDK自动生成唯一的角色名称; - 或者在名称中加入栈标识符,比如
${this.stackName}-CodeDeployRole,确保每次部署的角色都是全新的。
3. 等待缓存过期后重试
如果必须使用固定名称,执行cdk destroy后等待5-10分钟,给AWS服务足够的时间同步角色销毁状态,再执行cdk deploy。
4. 手动同步信任策略
若等待后问题仍存在,可手动进入IAM控制台:
- 找到重新创建的CodeDeploy角色;
- 进入"信任关系"页面,点击"编辑信任策略";
- 无需修改内容,直接点击"更新策略",强制同步服务端缓存。
内容的提问来源于stack exchange,提问作者Jordan
相关产品推荐
相关产品推荐

