【AWS】如果在CodeBuild中发生“no basic auth credentials”错误,原因和解决方法如下:- 原因:此错误通常发生在未正确配置或提供AWS基本身份验证凭据时。- 解决方法:您可以尝试以下解决方法来解决此问题: – 确保您提供了正确的Access Key ID和Secret Access Key。 – 检查您的AWS访问权限,确保您具有执行所需操作的权限。 – 确保您的AWS CLI或SDK已正确配置以与AWS服务进行通信。 – 验证您的网络连接是否正常以确保能够访问AWS服务。- 如果问题仍然存在,请参考AWS文档或联系AWS支持获取更多帮助

总结

AWS Codebuildでno basic auth credentialsというエラーに遭遇しました。
本記事ではその原因と解決方法を記載します。

错误的内容

AWS Codebuildで使うbuildspec.ymlにおいて、以下の内容でビルドしました。

version: 0.2
phases:
  pre_build:
    commands:
      - echo Logging in to Amazon ECR...
      - aws --version
      - aws ecr get-login-password --region ap-northeast-1
  build:
    commands:
      - echo Build started on `date`
      - echo Logging in to Docker Hub...
      - docker login -u $USER_DOCKER -p $DOCKER_KEY
      - echo Building the Docker image...
      - docker build -t $REPOSITORY_URI:latest .
## 以後省略

然后,在Codebuild的日志中显示了以下错误,并且失败了。

no basic auth credentials

原因和解决方法

我找到了一篇关于相同现象的文章。无法将图像推送到Amazon ECR,提示“没有基本身份验证凭据”。

正如您在那里所述,

- $(aws ecr get-login --no-include-email --region $AWS_DEFAULT_REGION)

当我更改了表示方式后,这个错误消失了,构建成功了。

之所以能够在这个问题上找到解决办法,是因为…

最初的方法是获取针对 ECR 的 Docker 认证令牌,然后将其直接显示在标准输出中(没有将输出提供给 Docker)。

修正後の方法では、
・AWS CLIコマンドにより、サブシェル内でECRの認証情報を取得し、その結果を実行中のシェルに埋め込む
・Docker Hubへのログインに必要なECRの認証情報が提供され、Dockerはそのトークンを使用して正常にDocker Hubにログイン
ということが行われています。

也就是说,通过使用$(…)将命令的执行结果存储在变量中,然后可以将该变量传递给另一个命令(通过管道),这似乎是一种常见的传递认证信息的方法。

关于aws ecr get-login命令的相关信息。

aws ecr get-login命令是用于获取登录到Amazon ECR所需的认证信息的命令。执行此命令将输出包含docker login命令所需认证信息的内容,以便Docker客户端使用。
通过执行此docker login命令,将提供用于登录到Docker Hub的认证信息。

然而,如果Docker客户端没有正确的身份验证信息与Docker Hub连接,将会出现“no basic auth credentials”错误。

警告!通过命令行界面使用–password是不安全的。

使用上述方法可能导致Docker显示安全警告。这些警告是由于Docker CLI直接接收命令行参数作为密码(即以明文形式传递密码)而带来的安全风险。以下是构建日志中显示的内容。

WARNING! Using --password via the CLI is insecure. Use --password-stdin.

メッセージにある通り、docker loginコマンドには–password-stdinオプションを使用することが推奨されています。これにより、パスワードは標準入力から受け取られ、セキュリティ的なリスクが軽減されます。

- aws ecr get-login-password --region $AWS_DEFAULT_REGION | docker login --username AWS --password-stdin $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com

可以说,通过这样做,密码不是通过命令行参数提供,而是通过标准输入提供,从而可以提高安全性。

同样,如果将构建时的登录命令设置如下,则更加安全。

 - echo $DOCKER_KEY | docker login -u $USER_DOCKER --password-stdin

–password-stdin选项的详细信息

Docker Hubなどのコンテナレジストリに対して安全に認証情報(通常はパスワード)を提供するためのDockerコマンドのオプションです。

docker loginコマンドでは、ユーザー名とパスワードをコマンドライン引数として指定します。しかし、パスワードがコマンドラインに平文で表示され、シェルの履歴やプロセスリストに含まれるとセキュリティ的によろしくないです。
ということで、このオプションが導入されたんですね。

基本用法如下。

echo $PASSWORD | docker login -u $USERNAME --password-stdin

可以使用echo命令将密码($PASSWORD)发送到标准输出,然后docker login命令会从标准输入中读取该密码。该方法可以安全地处理密码,并且不会将认证信息显示在命令行中。

bannerAds