CodePipeline带有CodeBuild错误,用于跨帐户ECR登录并推送生成的Docker映像

问题描述 投票:0回答:1

嘿云大师:)我需要你的帮助!

很长时间以来,我一直在尝试将AWS CodePipeline从源代码设置为在管道位于另一个容器中的Docker容器上构建到ECR到ECS部署帐户。其实我有多次部署帐户:开发人员,测试人员和生产人员,但是,现在我只是打算将其部署到开发人员

((在我的设置中,我在所有三个部署帐户中也都有ECR存储库-与可能的一个ECR回购相比,这是推荐的方法吗?与管道相同的帐户?)

[所有人都在使用CloudFormation模板,包括AWS下文以及管道。

问题

我目前在CodeBuild推送到ECR存储库时遇到权限问题在另一个帐户中,称为CodeBuild及其服务角色。

概述

[管道帐户]的管道分为两个阶段:来源和构建采用CodeCommit中的代码,然后CodeBuild来构建容器。第一阶段工作正常,但在buildspec.yml无法登录ECR的情况下无法工作我喜欢这样的回购:

pre_build:
  commands:
    - $(aws ecr get-login --no-include-email --region eu-west-1 --registry-ids DEV_ACCOUNT_ID)

此操作失败,出现明确的预期错误:

An error occurred (AccessDeniedException) when calling the GetAuthorizationToken
operation: User: arn:aws:sts::PIPELINE_ACCOUNT_ID:assumed-role/delivery-pipeline-foundation-BuildProjectRole-AAGTGRD1TAPI/AWSCodeBuild-25244ee4-e337-4617-b203-d1687a6a116e
is not authorized to perform: ecr:GetAuthorizationToken on resource: * 

CodeBuild项目服务角色没有交叉帐户的权限访问ECR。我知道,但还没有解决的方法。

AFAIK,CodePipeline需要在同一帐户中担任服务角色。构建项目服务角色还必须在同一帐户中并提供权限到CodeBuild,工件存储和KMS。

我试图让CodeBuild项目在Dev帐户中起作用,但出现错误:

Failed to call UpdateProject, reason: Invalid service role: Service role account
ID does not match caller's account (Service: AWSCodeBuild; Status Code: 400;
Error Code: InvalidInputException; Request ID: 123458e0-f5d4-4ac9-1060-067e70123249)

总而言之,管道需要管道帐户中的角色,对于CodeBuild项目。所有这些都有意义,因为那些人​​在那里奔跑,还需要访问文物S3存储桶和相关的KMS。

因此,如何以及在何处以及在何处提供角色/权限来登录ECR以及以后推送到特定的存储库中,以便docker命令可以在buildspec.yml中文件?

我计划在构建阶段工作后使用CodeDeploy ECS进行部署。

是建议跨帐户部署的整体方法和/或还有其他方法吗?

[大多数在线示例很多simpler with a single accountthis related issue或只是general cross-account without ECR(我在工作)。

在此先感谢您的帮助!

amazon-web-services amazon-iam aws-codepipeline aws-codebuild
1个回答
0
投票

您可以在另一个拥有ECR存储库的帐户中创建一个用户,并将其访问密钥和秘密密钥作为环境变量提供给您的CodeBuild项目。

© www.soinside.com 2019 - 2024. All rights reserved.