首页 > 解决方案 > 从 Jenkins CI/CD 推送到存在于不同 AWS 账户中的 ECR

问题描述

我有 Jenkins Slave 节点作为 EC2 实例,我在其中运行我的 CI/CD 并将图像推送到 AWS ECR。

 stage('Push Image to ECR'){
        steps{
              withAWS(region: 'us-east-1', roleAccount: shared_services_account, role: 
                             'Role-Name') {

             sh 'eval \$(aws ecr get-login --no-include-email --region us-east-1)'
             sh 'docker tag test-image 5722XXXXXX.dkr.ecr.us-east- 
                 1.amazonaws.com/Dev/DC/DCservice:latest'
             sh 'sudo docker push 572205XXXX.dkr.ecr.us-east- 
                  1.amazonaws.com/Dev/DC/DCservice:latest'
           }

现在我的 EC2 Jenkins 从节点和 ECR 在同一个帐户中。

但是对于生产,如果想使用相同的 Jenkins EC2 从节点并将其推送到生产 AWS 账户的 ECR。

我相信下面的代码不起作用,因为它会推送到同一 AWS 账户的 ECR?

   sh 'eval \$(aws ecr get-login --no-include-email --region us-east-1'

请建议我如何使用相同的 EC2 从节点推送到产品 AWS 账户的 ECR。

标签: amazon-web-servicesdockerjenkinsjenkins-pluginsaws-ecr

解决方案


要回答您的直接问题,您需要registry_idget-login命令中指定(相关文档

sh 'eval \$(aws ecr get-login --registry-ids 012345678910 --no-include-email --region us-east-1'

但是,还有其他一些值得检查的事情。

假设您可以通过 Internet 推送到 ECR,您需要以下内容:

附加到您的 Jenkins EC2 实例的 IAM 实例配置文件,其角色策略允许您将 ECR 推送到“其他”账户中,请参阅此以获取策略结构示例

您的 Jenkins EC2 实例需要一个允许 HTTPS 出站访问 Internet 的安全组规则

您在“其他”账户中的 ECR 策略需要允许来自 Jenkins 实例配置文件的写入,请参阅此处以获取 ECR 策略示例

(这样的事情应该有效)

{
  "Version": "2008-10-17",
  "Statement": [
    {
      "Sid": "AllowPushPull",
      "Effect": "Allow",
      "Principal": {
        "AWS": [
          "arn:aws:iam::123456789012:instance-profile/jenkins_ec2"
        ]
      },
      "Action": [
        "ecr:GetDownloadUrlForLayer",
        "ecr:BatchGetImage",
        "ecr:BatchCheckLayerAvailability",
        "ecr:PutImage",
        "ecr:InitiateLayerUpload",
        "ecr:UploadLayerPart",
        "ecr:CompleteLayerUpload"
      ]
    }
  ]
}

如果您不想通过 Internet 推送,可以使用最近发布的 ECR 端点,请参阅此了解更多信息


推荐阅读