如何通过AWS CodePipeline跨账号部署项目至EC2实例
跨AWS账号从CodePipeline部署至EC2实例(无需CloudFormation)
核心实现逻辑
通过IAM跨账号角色信任打通权限,结合CodePipeline的脚本执行能力或CodeDeploy服务,直接完成跨账号部署,全程无需CloudFormation。
分步操作指南
1. 在Account B配置跨账号信任角色
- 登录Account B的IAM控制台,创建新角色:
- 信任实体选择「另一个AWS账户」,填入Account A的账号ID
- 为角色附加最小权限:比如允许访问目标EC2的
AmazonEC2ReadOnlyAccess、读取Account A部署包S3桶的AmazonS3ReadOnlyAccess(限定具体桶路径)、以及SSM命令执行权限AmazonSSMFullAccess(若用SSM部署) - 记录角色ARN,格式为
arn:aws:iam::ACCOUNT_B_ID:role/AccountADeployPermission
2. 在Account A配置CodePipeline部署环节
方案一:用CodeBuild执行跨账号部署脚本
- 在Account A创建CodeBuild项目,配置环境变量存储Account B账号ID、目标EC2实例ID、步骤1的角色ARN
- 编写
buildspec.yml核心脚本:phases: build: commands: # 跨账号获取临时凭证 ASSUME_ROLE_OUTPUT=$(aws sts assume-role --role-arn "arn:aws:iam::ACCOUNT_B_ID:role/AccountADeployPermission" --role-session-name "CrossAccountDeploy") # 导出临时凭证到环境变量 export AWS_ACCESS_KEY_ID=$(echo $ASSUME_ROLE_OUTPUT | jq -r '.Credentials.AccessKeyId') export AWS_SECRET_ACCESS_KEY=$(echo $ASSUME_ROLE_OUTPUT | jq -r '.Credentials.SecretAccessKey') export AWS_SESSION_TOKEN=$(echo $ASSUME_ROLE_OUTPUT | jq -r '.Credentials.SessionToken') export AWS_DEFAULT_REGION="你的AWS区域" # 通过SSM执行部署命令(无需开放SSH端口) aws ssm send-command --instance-ids "TARGET_EC2_ID" --document-name "AWS-RunShellScript" --parameters commands=" aws s3 cp s3://account-a-deploy-bucket/latest-code.zip /tmp/ unzip /tmp/latest-code.zip -d /var/app/current systemctl restart your-service " - 在CodePipeline中添加「Build」阶段,关联该CodeBuild项目作为部署执行单元
方案二:用CodeDeploy完成部署(无需CloudFormation配置)
- 在Account B的目标EC2上安装CodeDeploy代理,给EC2绑定带
AWSCodeDeployRole权限的IAM角色 - 在Account B提前创建CodeDeploy应用和部署组(手动创建,不用CloudFormation)
- 在Account A的CodePipeline中添加「Deploy」阶段:
- 选择CodeDeploy作为提供商,配置跨账号权限:给CodePipeline服务角色添加
sts:AssumeRole权限,允许访问Account B的CodeDeploy部署角色 - 指定Account B的CodeDeploy应用和部署组,部署包存储在Account A的S3桶中,确保Account B的CodeDeploy角色有权限读取该桶
- 选择CodeDeploy作为提供商,配置跨账号权限:给CodePipeline服务角色添加
3. 验证部署流程
- 触发CodePipeline运行,检查CodeBuild日志或CodeDeploy部署记录
- 登录Account B的EC2实例,确认代码已部署、服务正常运行
关键注意事项
- 权限最小化:严格限定IAM角色的资源范围(比如指定具体S3桶、EC2实例ID),避免过度授权
- 安全优先:优先用SSM Session Manager替代SCP/SSH,无需开放公网端口
- 有效期控制:STS临时凭证默认有效期1小时,确保部署流程在时效内完成
内容的提问来源于stack exchange,提问作者Argha Paul
相关产品推荐
相关产品推荐

