为什么自定义 CodeBuild 映像需要 aws 配置,但托管映像不需要?

为什么自定义 CodeBuild 映像需要 aws 配置,但托管映像不需要?

我有一个使用 CodeBuild 的构建步骤的 AWS CodePipeline。我之前使用托管映像进行此构建作业,并且能够毫无问题地使用以下命令:

aws ecr get-login --no-include-email --region us-east-1

现在我已切换到自定义映像以缩短构建时间。命令失败,经过一些故障排除后,我意识到自定义映像未安装 AWS CLI。现在安装了 AWS CLI,上面的登录行退出并显示错误代码 127。我相信这是因为我遵循了本 AWS 设置指南, 除了aws configure

我可以进行配置,但这很不方便,因为我需要采取额外的步骤来掩盖秘密等等。

这个问题与那些额外的步骤无关。我只是在问解释机制。在我看来,托管映像会有可用的环境变量,因此登录有效,那么为什么这些环境变量也不允许自定义映像登录?在这两种情况下,我都有相同的构建作业、管道和服务角色,只是图像不同。

我还注意到 CodeBuild 和 CodePipeline 目前不是 ServerFault 中使用的标签,所以如果我更喜欢其他 StackExchange,请告诉我。ServerFault 推荐这篇关于 meta 的文章

答案1

aws configure没有区别。如果所有其他构建因素都已正确配置,则无需使用自定义 CodeBuild 容器。

您描述的问题是由 ECR 配置而不是 CodeBuild 差异解释的。

在托管映像上运行以下命令:

  - echo $AWS_ACCESS_KEY_ID
  - echo $AWS_SECRET_ACCESS_KEY
  - echo $AWS_SESSION_TOKEN

  - cd /
  - ls
  - cd ~
  - ls
  - cd ~/.aws
  - ls

请注意,CodeBuild 已被锁定。它不会回显所需的环境变量,也不会允许您查看物理文件。这可能表明机制存在差异:您正在尝试使用环境变量,但托管映像已配置物理文件,因此托管映像不需要运行aws configure

这似乎表明您也应该使用预配置的 aws 来配置自定义容器,但这意味着您将提交到 ECR 或任何其他带有纯文本 KEY_ID 和 ACCESS_KEY 的地方,除非有非常复杂的解决方法。此外,您无法预先配置 AWS_SESSION_TOKEN,因为它会在一段时间后超时。同样,您可以配置某些系统以给固定会话无限超时,但这是一种反模式,因为会话令牌超时是一种安全功能。

不要做所有这些,只需检查 ECR 权限和 docker 安装:

1 – 转到 ECR 权限并添加新的权限声明。以前您可能遵循官方教程授予 ECR 权限codebuild.amazonaws.com。除此之外,由于您的构建是在管道内进行的,因此codepipeline.amazonaws.com应将添加和所涉及的任何其他 IAM 实体添加到权限的 IAM 实体部分。

2 - 对于 docker,只需检查它是否已安装。您提到自定义映像缺少 aws cli,并且您添加了它,但您的自定义映像也可能缺少 docker,我还没有看到您确认它已安装。作为错误的示例,如果 Ubuntu 上未安装 docker,您提到的行将抛出类似下面的内容:

/codebuild/output/tmp/script.sh: 4: /codebuild/output/tmp/script.sh: docker: not found

如果安装了docker,还要确保它正在运行。

如果您在组织中工作,最后一个问题可能是存在不明显的 AWS 安全策略阻止您。例如,启用通配符权限被认为是不安全的,因此我工作过的一家公司自动回滚了允许通配符访问任何 AWS 服务的 IAM 用户和策略。具有讽刺意味的是,在这种情况下,为 IAM 用户指定特定的 ECR 权限有效,而启用所有权限则失败。

相关内容