EC2上的Docker无法连接到S3

时间:2017-08-24 06:43:24

标签: amazon-web-services docker amazon-s3 amazon-ec2

我想提高部署的安全性,将秘密密钥存放在安全的地方。

所以我遵循了本教程:How to Manage Secrets for Amazon EC2 Container Service–Based Applications by Using Amazon S3 and Docker 但是没有CloudWatch模板(我已经有了VPC,集群和其他实例) 我正在使用我自己的项目(一个Flask应用程序可以正常使用任务定义中的秘密)

我设置了S3存储桶,VPC端点,一切正常。 但是当我的docker容器启动时,我收到了一个错误:

download failed: s3://[my-bucket]/[my-secrets].txt to - An error occurred (403) when calling the HeadObject operation: Forbidden

当入口点脚本运行命令

时,基本上会发生这种情况
aws s3 cp s3://${SECRETS_BUCKET_NAME}/secrets.txt -

注意:我在任务定义中定义了SECRETS_BUCKET_NAME,以及其他不需要保密的变量。

首先我认为我的实例没有正确的角色,因此出于调试目的,我将其附加了AdministratorAccess策略,但没有成功。

其次,我读到Docker容器共享主机的凭据(EC2实例),因此我直接在实例上安装了aws-cli包,并为具有AdministratorAccess策略的用户设置凭据。

现在我可以在我的实例登录命令

时手动运行
aws s3 cp s3://${SECRETS_BUCKET_NAME}/secrets.txt -

它工作正常,但我的容器仍然出现403错误。

我的EC2实例是amzn-ami-2017.03.c-amazon-ecs优化图像(奇怪的是,不包括aws-cli)

如果有人知道我做错了什么......

2 个答案:

答案 0 :(得分:0)

解决!

我将AMI更新为更新的AMI,重新制作了适当的角色并且有效。

我注意到一个奇怪的事情:ECS优化亚马逊的AMI不包括aws-cli。

答案 1 :(得分:0)

还有一个潜在的问题可能会导致 AWS CLI 在容器中运行时拒绝访问,而直接在主机上运行完美无缺。

如果您切换到 IMDS v2 并设置策略来拒绝使用 IMDS v1 凭证的操作,它可能会阻止所有 AWS CLI 调用,因为:

  • 默认的 ECS 启动配置设置将 instance-metadata-options' w http-put-response-hop-limit 设置为 1,

  • docker 为网络连接引入了一个额外的层,因此需要 2 跳才能到达元数据,

  • 因此,AWS CLI 无法从元数据中获取令牌,因此切换到 IMDS v1,然后被上述策略阻止。

解决方法是将 http-put-response-hop-limit 设置为 2。