You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

跨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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 05:59:53