跨AWS账号:从账号A Jenkins更新账号B ECS服务的权限与命令验证
问题解答
一、你提供的AWS CLI命令是否可行?
这个命令可以实现强制更新ECS服务拉取最新镜像的需求,但有几点需要注意:
- 命令会遍历指定集群下的所有ECS服务并执行强制部署,如果集群中存在不需要更新的服务,建议通过
grep等命令过滤出目标服务,避免误更新。 - 命令必须在账号B的权限上下文下执行(或通过角色切换获取账号B的权限),因为ECS服务归属账号B。
--force-new-deployment参数会触发ECS启动新任务,由于镜像使用latest标签,新任务会重新拉取该标签对应的最新镜像,完全匹配你的需求。
如果仅需更新特定服务,可简化命令为:
aws ecs update-service --service "TARGET_SERVICE_NAME" --force-new-deployment --cluster "ECS_CLUSTER_NAME" --region "ECS_CLUSTER_REGION"
二、Jenkins角色的最小权限配置
Jenkins在账号A,需完成「推送镜像到账号A的ECR」和「切换到账号B的角色执行ECS更新」两个核心操作,以下是最小权限配置:
1. 账号A的Jenkins角色(示例名称:Jenkins-ECR-Push-Role)
配置权限策略,资源限定为目标ECR仓库ARN:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "ecr:GetAuthorizationToken", "ecr:BatchCheckLayerAvailability", "ecr:GetDownloadUrlForLayer", "ecr:BatchGetImage", "ecr:InitiateLayerUpload", "ecr:UploadLayerPart", "ecr:CompleteLayerUpload", "ecr:PutImage" ], "Resource": "arn:aws:ecr:REGION:ACCOUNT_A_ID:repository/YOUR_ECR_REPO_NAME" }, { "Effect": "Allow", "Action": "sts:AssumeRole", "Resource": "arn:aws:iam::ACCOUNT_B_ID:role/ECS-Service-Update-Role" } ] }
2. 账号B的ECS更新角色(示例名称:ECS-Service-Update-Role)
配置权限策略,资源限定为目标ECR集群和服务ARN(若仅需更新特定服务,可替换为对应服务ARN):
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "ecs:ListServices", "Resource": "arn:aws:ecs:REGION:ACCOUNT_B_ID:cluster/ECS_CLUSTER_NAME" }, { "Effect": "Allow", "Action": "ecs:UpdateService", "Resource": [ "arn:aws:ecs:REGION:ACCOUNT_B_ID:cluster/ECS_CLUSTER_NAME", "arn:aws:ecs:REGION:ACCOUNT_B_ID:service/ECS_CLUSTER_NAME/TARGET_SERVICE_NAME" ] } ] }
3. 账号B角色的信任策略
允许账号A的Jenkins角色扮演该角色,配置如下:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::ACCOUNT_A_ID:role/Jenkins-ECR-Push-Role" }, "Action": "sts:AssumeRole" } ] }
4. Jenkins中执行命令的权限切换方式
在Jenkins执行ECS更新命令前,需先获取账号B的临时凭证:
# 获取账号B临时凭证 CREDS=$(aws sts assume-role --role-arn "arn:aws:iam::ACCOUNT_B_ID:role/ECS-Service-Update-Role" --role-session-name "jenkins-ecs-update-session") # 导出临时凭证环境变量 export AWS_ACCESS_KEY_ID=$(echo $CREDS | jq -r '.Credentials.AccessKeyId') export AWS_SECRET_ACCESS_KEY=$(echo $CREDS | jq -r '.Credentials.SecretAccessKey') export AWS_SESSION_TOKEN=$(echo $CREDS | jq -r '.Credentials.SessionToken') # 执行ECS服务更新命令 aws ecs list-services --cluster "ECS_CLUSTER_NAME" --output text | awk '{print $2}' | while read line ; do aws ecs update-service --service "$line" --force-new-deployment --cluster "ECS_CLUSTER_NAME" --region "ECS_CLUSTER_REGION" ; done # 清理环境变量(可选) unset AWS_ACCESS_KEY_ID AWS_SECRET_ACCESS_KEY AWS_SESSION_TOKEN
内容的提问来源于stack exchange,提问作者Vikas Palakkat
相关产品推荐
相关产品推荐

