我应该如何将敏感环境变量传递给 Amazon ECS 任务?

How should I pass sensitive environment variables to Amazon ECS tasks?

传递敏感环境变量的推荐方法是什么,例如密码,但是Amazon ECS tasks? With Docker Compose, I can use key-only environment variables, which results in the values being read from the OS environment. I can't see any corresponding method for ECS task definitions

在您发布的任务定义 link 中,有一个 "environment" 部分允许您执行此操作。它们成为容器内的环境变量。

如果您的意思是您希望将信息保留在任务定义之外并且该任务可以引用它,那么您不能。在这种情况下,您最好的选择是让您的容器从外部来源提取该信息,而不是让 ECS 任务配置尝试引用它。

编辑:我在这一点上被否决了,因为参数存储现在是执行此操作的正确方法。当时这个答案是最正确的方法,但现在其他使用 SSM 的解决方案是正确的方法。

提到的从 S3 中拉取环境变量的实现:

https://www.promptworks.com/blog/handling-environment-secrets-in-docker-on-the-aws-container-service

方法一:

您可以使用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

例子

Docker文件:

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 运行 命令:

docker run -e parameter_store_key=db_password -e REGION=us-east-1 <docker_image>

方法二:

最近 AWS 宣布了对 ECS 的 ContainerDefinition 的秘密支持 Using Secrets in ECS

如果您使用环境变量,您可以在登录 AWS 控制台时看到它们。 AWS 编写了一份指南,介绍如何使用正确的 "secrets" 来隐藏您的敏感数据。 容器在启动时将这些加载到基于内存的环境变量中。 这是一个指南:https://aws.amazon.com/blogs/security/how-to-manage-secrets-for-amazon-ec2-container-service-based-applications-by-using-amazon-s3-and-docker/

参数存储是可行的方法,它存储使用 KMS 密钥加密的变量。

Amazon 刚刚 announced 支持在任务定义中指定机密。引用SSM中的参数值和环境变量来设置任务。

{
        ....
        "secrets": [
            {
                "name": "environment_variable_name",
                "valueFrom": "arn:aws:ssm:region:aws_account_id:parameter/parameter_name"
            }
        ]
    }

查看官方文档here

还有一个名为chamber的项目可以从SSM中的给定路径加载所有参数并将它们设置为环境变量。

如果 AWS 在秘密环境中烘焙不是一个选项, 您还可以使用 docker 入口点在容器运行时注入秘密,如 https://medium.com/@zdk/simple-and-secure-way-to-pass-secrets-and-credentials-into-docker-containers-c2f66175b0a4