Amazon ECS - 在 Docker 入口点上使用 IAM 角色时权限被拒绝
Amazon ECS - Permission denied when using IAM role on Docker entrypoint
我正在寻找一种将 secrets/certificates 注入 Amazon ECS 容器的方法。就我而言,它是一个简单的 nginx 容器。
我一直在关注这个 post,使用 AWS Parameter Store:
https://aws.amazon.com/blogs/compute/managing-secrets-for-amazon-ecs-applications-using-parameter-store-and-iam-roles-for-tasks/
基本要点如下:
- 在我的 Dockerfile 上,我在 入口点 上附加了一个脚本,它安装 AWS 客户端并从 AWS 参数存储中获取密钥。
Dockerfile
FROM nginx:1.16.0
...
ENTRYPOINT ["/var/run/fetch.sh", "nginx", "-g", "daemon off;"]
fetch.sh
aws ssm get-parameter \
--name ${key} \
--with-decryption \
--region us-east-1 \
--output text \
--query Parameter.Value
- 任务定义承担了一个 IAM 角色,该角色可以访问所需的服务(kms + 参数存储)。我可以验证这是否有效,因为如果我通过 ssh 连接到服务器并 运行 容器上的脚本,我就能够从 Parameter Store 获取密钥。
{
"portMappings": [
{
"hostPort": 0,
"protocol": "tcp",
"containerPort": 443
}
],
"cpu": 0,
"environment": [],
"mountPoints": [],
"memoryReservation": 256,
"memory": 512,
"volumesFrom": [],
"image": "url/some_image:latest",
"essential": true,
"name": "my-container"
}
- 当 ECS 运行执行此任务时,它应该到达 入口点,它从参数存储中获取密钥并保存它们。
我可以通过 docker exec 手动 运行ning 来获取 运行ning 任务的密钥,但是我无法在启动任务时获取它们任务(特别是当我像上面的代码一样将脚本附加到入口点时)。
ECS 任务是否可以访问入口点的 IAM 角色?它什么时候真正担任 IAM 角色?
您现在可以使用任务定义 containerDefinitions
中的 secrets
轻松地从 SSM 或 Secrets Manager 注入机密。使用此解决方案,您不再需要 run/manage 您的自定义脚本来获取您的秘密。
看起来像这样:
{
"containerDefinitions": [{
"secrets": [{
"name": "environment_variable_name",
"valueFrom": "arn:aws:secretsmanager:region:aws_account_id:secret:secret_name-AbCdEf"
}]
}]
}
{
"containerDefinitions": [{
"secrets": [{
"name": "environment_variable_name",
"valueFrom": "arn:aws:ssm:region:aws_account_id:parameter/parameter_name"
}]
}]
}
看看AWS Launches Secrets Support for Amazon Elastic Container Service and Specifying Sensitive Data。
您必须具有任务执行角色并在您的任务定义中引用它。政策示例:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"ssm:GetParameters",
"secretsmanager:GetSecretValue",
"kms:Decrypt"
],
"Resource": [
"arn:aws:ssm:<region>:<aws_account_id>:parameter/parameter_name",
"arn:aws:secretsmanager:<region>:<aws_account_id>:secret:secret_name",
"arn:aws:kms:<region>:<aws_account_id>:key/key_id"
]
}
]
}
我正在寻找一种将 secrets/certificates 注入 Amazon ECS 容器的方法。就我而言,它是一个简单的 nginx 容器。
我一直在关注这个 post,使用 AWS Parameter Store: https://aws.amazon.com/blogs/compute/managing-secrets-for-amazon-ecs-applications-using-parameter-store-and-iam-roles-for-tasks/
基本要点如下:
- 在我的 Dockerfile 上,我在 入口点 上附加了一个脚本,它安装 AWS 客户端并从 AWS 参数存储中获取密钥。
Dockerfile
FROM nginx:1.16.0
...
ENTRYPOINT ["/var/run/fetch.sh", "nginx", "-g", "daemon off;"]
fetch.sh
aws ssm get-parameter \
--name ${key} \
--with-decryption \
--region us-east-1 \
--output text \
--query Parameter.Value
- 任务定义承担了一个 IAM 角色,该角色可以访问所需的服务(kms + 参数存储)。我可以验证这是否有效,因为如果我通过 ssh 连接到服务器并 运行 容器上的脚本,我就能够从 Parameter Store 获取密钥。
{
"portMappings": [
{
"hostPort": 0,
"protocol": "tcp",
"containerPort": 443
}
],
"cpu": 0,
"environment": [],
"mountPoints": [],
"memoryReservation": 256,
"memory": 512,
"volumesFrom": [],
"image": "url/some_image:latest",
"essential": true,
"name": "my-container"
}
- 当 ECS 运行执行此任务时,它应该到达 入口点,它从参数存储中获取密钥并保存它们。
我可以通过 docker exec 手动 运行ning 来获取 运行ning 任务的密钥,但是我无法在启动任务时获取它们任务(特别是当我像上面的代码一样将脚本附加到入口点时)。
ECS 任务是否可以访问入口点的 IAM 角色?它什么时候真正担任 IAM 角色?
您现在可以使用任务定义 containerDefinitions
中的 secrets
轻松地从 SSM 或 Secrets Manager 注入机密。使用此解决方案,您不再需要 run/manage 您的自定义脚本来获取您的秘密。
看起来像这样:
{
"containerDefinitions": [{
"secrets": [{
"name": "environment_variable_name",
"valueFrom": "arn:aws:secretsmanager:region:aws_account_id:secret:secret_name-AbCdEf"
}]
}]
}
{
"containerDefinitions": [{
"secrets": [{
"name": "environment_variable_name",
"valueFrom": "arn:aws:ssm:region:aws_account_id:parameter/parameter_name"
}]
}]
}
看看AWS Launches Secrets Support for Amazon Elastic Container Service and Specifying Sensitive Data。
您必须具有任务执行角色并在您的任务定义中引用它。政策示例:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"ssm:GetParameters",
"secretsmanager:GetSecretValue",
"kms:Decrypt"
],
"Resource": [
"arn:aws:ssm:<region>:<aws_account_id>:parameter/parameter_name",
"arn:aws:secretsmanager:<region>:<aws_account_id>:secret:secret_name",
"arn:aws:kms:<region>:<aws_account_id>:key/key_id"
]
}
]
}