【问题标题】:How do you specify AWS credentials when running AWS CLI from a Dockerfile in an AWS SAM pipeline?从 AWS SAM 管道中的 Dockerfile 运行 AWS CLI 时,如何指定 AWS 凭证?
【发布时间】:2022-01-15 12:04:39
【问题描述】:

我有一个应用程序正在使用:

  • SAM
  • AWS S3
  • 基于 Docker 的 AWS Lambda
  • AWS SAM 管道
  • Github 功能

在我的 Dockerfile 中:

RUN aws s3 cp s3://mylambda/distilBERT distilBERT.tar.gz

导致错误信息:

Step 6/8 : RUN aws s3 cp s3://mylambda/distilBERT distilBERT.tar.gz
 ---> Running in 786873b916db
fatal error: Unable to locate credentials
Error: InferenceFunction failed to build: The command '/bin/sh -c aws s3 cp s3://mylambda/distilBERT distilBERT.tar.gz' returned a non-zero code: 1

我需要找到一种以安全方式存储凭据的方法。是否有可能与 GitHub 机密或其他东西有关?

谢谢

【问题讨论】:

    标签: amazon-web-services docker amazon-s3 aws-lambda github-secret


    【解决方案1】:

    我的解决方案可能会更长一些,但我觉得它可以解决您的问题,并且

    1. 不会泄露任何秘密
    2. 不需要任何人工操作
    3. 如果需要,以后可以轻松更改您的 AWS 密钥。

    步骤:

    1. 您可以在 Github 操作中添加环境变量(因为您已经提到了 Github 操作)作为机密。

    2. 在您的 Github CI/CD 流程中,当您构建 Dockerfile 时,您可以创建一个 aws 凭证文件。

          - name: Configure AWS credentials
            echo "
            [default]
            aws_access_key_id = $ACCESS_KEY
            aws_secret_access_key = $SECRET_ACCESS_KEY
            " > credentials
            with:
              ACCESS_KEY: ${{ secrets.AWS_ACCESS_KEY_ID }}
              SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
    
    
    1. 在您的 Dockerfile 中,您可以添加说明以复制此凭据文件并存储它
    COPY credentials credentials
    RUN mkdir ~/.aws
    RUN mv credentials ~/.aws/credentials
    

    更改您的凭据只需要更改您的 github 操作。

    【讨论】:

      【解决方案2】:

      Docker 默认无权访问主机上运行的.aws 文件夹。您可以将 AWS 凭证作为环境变量传递给 Docker 映像:

      ENV AWS_ACCESS_KEY_ID=AKIAIOSFODNN7EXAMPLE
      ENV AWS_SECRET_ACCESS_KEY=...
      

      请记住,在 Dockerfile 中硬编码 AWS 凭证是一种不好的做法。为了避免这种情况,您可以在运行时使用docker run -e MYVAR1docker run --env MYVAR2=foo 参数传递环境变量。其他解决方案是使用 .env 文件作为环境变量。

      更复杂的解决方案是从 Docker 映像中的主机映射~/.aws 文件夹的卷。

      【讨论】:

      • 由于 AWS 凭证现在暴露在 dockerfile 中,这不是一个不好的做法吗?而且以后更改它们也会很痛苦(如果需要)?
      • 在 Dockerfile 中硬编码它们是一个不好的做法。您可以在运行时传递环境变量docker run -e MYVAR1 --env MYVAR2=foo。或者您可以使用env-file。此外,您可以扮演一个角色并传递这些秘密。
      • 事实上,我认为用这些来更新我的答案很重要,因为从安全角度来看它们很重要。谢谢@SanilKhurana
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-08-22
      • 1970-01-01
      • 2019-04-18
      • 2019-09-06
      • 1970-01-01
      • 2021-03-08
      • 1970-01-01
      相关资源
      最近更新 更多