Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Amazon web services 向Docker容器传递AWS凭据的最佳方式是什么?_Amazon Web Services_Docker_Docker Compose - Fatal编程技术网

Amazon web services 向Docker容器传递AWS凭据的最佳方式是什么?

Amazon web services 向Docker容器传递AWS凭据的最佳方式是什么?,amazon-web-services,docker,docker-compose,Amazon Web Services,Docker,Docker Compose,我正在AmazonEC2上运行docker容器。目前,我已将AWS凭据添加到Dockerfile。您能告诉我执行此操作的最佳方法吗?最好的方法是使用IAM角色,而不处理任何凭据。(见附件) 可以从http://169.254.169.254.....由于这是一个专用ip地址,因此只能从EC2实例访问 所有现代AWS客户端库都“知道”如何从那里获取、刷新和使用凭据。所以在大多数情况下,你甚至不需要知道它。只要使用正确的IAM角色运行ec2,您就可以开始了 作为一个选项,您可以在运行时将它们作为环境

我正在AmazonEC2上运行docker容器。目前,我已将AWS凭据添加到Dockerfile。您能告诉我执行此操作的最佳方法吗?

最好的方法是使用IAM角色,而不处理任何凭据。(见附件)

可以从
http://169.254.169.254.....
由于这是一个专用ip地址,因此只能从EC2实例访问

所有现代AWS客户端库都“知道”如何从那里获取、刷新和使用凭据。所以在大多数情况下,你甚至不需要知道它。只要使用正确的IAM角色运行ec2,您就可以开始了

作为一个选项,您可以在运行时将它们作为环境变量传递(即
docker run-e AWS\u ACCESS\u KEY\u ID=xyz-e AWS\u SECRET\u ACCESS\u KEY=aaa myimage


您可以通过在终端运行printenv来访问这些环境变量。

另一种方法是将密钥从主机传递到docker容器。您可以将以下行添加到
docker compose
文件中

服务:
网状物:
生成:。
环境:
-AWS\u访问\u密钥\u ID=${AWS\u访问\u密钥\u ID}
-AWS_SECRET_ACCESS_KEY=${AWS_SECRET_ACCESS_KEY}
-AWS_DEFAULT_REGION=${AWS_DEFAULT_REGION}

另一种方法是在docker-compose.yaml中创建临时只读卷。AWS CLI和SDK(如boto3或AWS SDK for Java等)正在
~/.AWS/credentials
文件中查找
default
配置文件

如果要使用其他配置文件,只需在运行
docker compose
命令之前导出AWS_配置文件变量即可

export AWS\u PROFILE=some\u other\u PROFILE\u name

版本:“3”
服务:
服务名称:
图像:docker图像名称:最新
环境:
-AWS_PROFILE=${AWS_PROFILE}
卷数:
-~/.aws/:/root/.aws:ro
在本例中,我使用docker上的root用户。如果您正在使用其他用户,只需将
/root/.aws
更改为用户主目录

:ro
-表示只读docker卷


当您在
~/.aws/credentials
文件中有多个配置文件并且您也在使用MFA时,它非常有用。在将docker容器部署到具有IAM角色但在本地没有的ECS上之前,如果您想在本地测试docker容器,那么这也很有帮助。

自从提出这个问题以来,docker中发生了很多变化,因此这里尝试更新答案

首先,特别是对于已经在云中运行的容器上的AWS凭据,使用IAM角色是一个非常好的选择。如果你能做到这一点,那么在他的答案中再加上一加一,跳过剩下的部分


一旦你开始在云之外运行东西,或者拥有不同类型的秘密,我建议你不要在两个关键位置存储秘密:

  • 环境变量:当这些变量在容器上定义时,容器内的每个进程都可以访问它们,它们通过/proc可见,应用程序可能会将其环境转储到存储在日志中的标准输出,最重要的是,当您检查容器时,它们会以明文显示

  • 在映像本身中:映像通常被推送到注册中心,在注册中心许多用户都有拉取访问权限,有时拉取映像不需要任何凭据。即使从一个层中删除机密,也可以使用常见的Linux实用程序(如
    tar
    )对图像进行反汇编,并且可以从第一次将机密添加到图像的步骤中找到该机密


  • 那么,对于Docker容器中的机密,还有哪些其他选择呢

    选项A:如果您仅在生成映像期间需要此机密,无法在生成开始之前使用此机密,并且尚未访问BuildKit,则A是最好的坏选项。您可以将秘密添加到构建的初始阶段,在那里使用它,然后将该阶段的输出(不带秘密)复制到发布阶段,并且只将该发布阶段推送到注册表服务器。这个秘密仍然存在于构建服务器上的映像缓存中,因此我倾向于将其作为最后手段

    选项B:同样在构建期间,如果您可以使用18.09中发布的BuildKit,则当前允许将机密注入作为单个运行线路的卷装载。该装载不会写入映像层,因此您可以在构建期间访问该机密,而不用担心它会被推送到公共注册表服务器。生成的Dockerfile如下所示:

    # syntax = docker/dockerfile:experimental
    FROM python:3
    RUN pip install awscli
    RUN --mount=type=secret,id=aws,target=/root/.aws/credentials aws s3 cp s3://... ...
    
    您可以使用18.09或更新版本中的命令进行构建,如:

    DOCKER\u BUILDKIT=1 DOCKER build-t您的\u映像--secret id=aws,src=$HOME/.aws/credentials。
    
    选项C:在单个节点上运行时,无需Swarm模式或其他编排,您可以将凭据装载为只读卷。访问此凭据需要与docker外部对同一凭据文件具有相同的访问权限,因此与没有docker的情况相比,这并不好也不坏。最重要的是,当您检查容器、查看日志或将映像推送到注册表服务器时,此文件的内容不应可见,因为在任何情况下,卷都不在该范围内。这确实需要在docker主机上复制凭据,与容器的部署分开。(注意,任何能够在该主机上运行容器的人都可以查看您的凭据,因为对docker API的访问权限是主机上的root用户,root用户可以查看任何用户的文件。如果您不信任主机上具有root用户的用户,则不要授予他们docker API访问权限。)

    对于
    docker运行
    ,如下所示:

    # syntax = docker/dockerfile:experimental
    FROM python:3
    RUN pip install awscli
    RUN --mount=type=secret,id=aws,target=/root/.aws/credentials aws s3 cp s3://... ...
    
    docker run-v$HOME/.aws/credentials:/HOME/app/.aws/credentials:ro你的图片
    
    或者对于撰写文件,您需要:

    版本:“3”
    服务:
    应用程序:
    图片:你的_
    
    $ docker run -v$HOME/.aws:/root/.aws:ro \
                -e AWS_ACCESS_KEY_ID \
                -e AWS_CA_BUNDLE \
                -e AWS_CLI_FILE_ENCODING \
                -e AWS_CONFIG_FILE \
                -e AWS_DEFAULT_OUTPUT \
                -e AWS_DEFAULT_REGION \
                -e AWS_PAGER \
                -e AWS_PROFILE \
                -e AWS_ROLE_SESSION_NAME \
                -e AWS_SECRET_ACCESS_KEY \
                -e AWS_SESSION_TOKEN \
                -e AWS_SHARED_CREDENTIALS_FILE \
                -e AWS_STS_REGIONAL_ENDPOINTS \
                amazon/aws-cli s3 ls 
    
    docker run --env-file ./env.list -e AWS_ACCESS_KEY_ID=ABCD -e AWS_SECRET_ACCES_KEY=PQRST IMAGE_NAME:v1.0.1