将敏感环境变量(例如密码)传递给Amazon ECS任务的推荐方法是什么?使用 Docker Compose,我可以使用仅键环境变量,这会导致从操作系统环境中读取值。但是,我看不到ECS 任务定义的任何相应方法。
6 回答
方法一:
您可以使用Parameter Store来存储变量。如果将它们存储为SecureString
,则这些值将被加密。
您可以在任务定义中将它们作为环境变量引用。
您需要在容器启动脚本中检索它们
value_from_parameter_store =`aws ssm get-parameter --name $parameter_store_key --with-decryption --output text --query Parameter.Value --region $REGION `
您也可以parameter_store_key
将其作为环境变量提及。这样你就可以使用$parameter_store_key
例子
Dockerfile:
FROM ubuntu
//some other steps
CMD ["sh","/startup.sh"]
启动脚本:
#! /bin/bash
export db_password =`aws ssm get-parameter --name $parameter_store_key --with-decryption --output text --query Parameter.Value --region $REGION `
// Please note that above line has `(backtick)
// Do other stuff and use this password
将参数放入 SSM:
aws ssm put-parameter --name 'db_password' --type "SecureString" --value 'P@ssW%rd#1'
码头工人运行命令:
docker run -e parameter_store_key=db_password -e REGION=us-east-1 <docker_image>
方法二:
最近 AWS 宣布在 ECS 的 ContainerDefinition 中 使用 Secrets in ECS 中的 Secrets 支持
参数存储是要走的路,它存储使用 KMS 密钥加密的变量。
亚马逊刚刚宣布支持在任务定义中指定机密。从 SSM 和环境变量中引用参数值以随任务设置。
{
....
"secrets": [
{
"name": "environment_variable_name",
"valueFrom": "arn:aws:ssm:region:aws_account_id:parameter/parameter_name"
}
]
}
请参阅此处的官方文档。
还有一个名为Chamber的项目,它可以从 SSM 中的给定路径加载所有参数并将它们设置为环境变量。
在您发布的任务定义链接中,有一个“环境”部分允许您执行此操作。它们成为容器内的环境变量。
如果您的意思是您希望将信息保留在任务定义之外并且该任务可以引用它,那么您不能。在这种情况下,您最好的选择是让您的容器从外部来源提取该信息,而不是让 ECS 任务配置尝试引用它。
编辑:此时我被否决了,因为参数存储现在是正确的方法。当时这个答案是最正确的方法,但现在使用 SSM 的其他解决方案是正确的方法。
如果您使用环境变量,您可以在登录 AWS 控制台时看到它们。AWS 编写了一份关于使用适当的“秘密”来隐藏敏感数据的指南。容器在启动时将这些加载到基于内存的环境变量中。这是一个指南:https ://aws.amazon.com/blogs/security/how-to-manage-secrets-for-amazon-ec2-container-service-based-applications-by-using-amazon-s3-and-码头工人/
Marc Young提到的从 S3 中提取环境变量的实现:
https://www.promptworks.com/blog/handling-environment-secrets-in-docker-on-the-aws-container-service
如果 AWS 在秘密环境中烘焙不是一个选项,您还可以使用 docker 入口点在容器运行时注入秘密,例如https://medium.com/@zdk/simple-and-secure-way-to-pass-secrets- and-credentials-into-docker-containers-c2f66175b0a4