我有一个使用 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 权限有效,而启用所有权限则失败。