如何将AWS Secrets Manager密钥映射为ECS容器环境变量?
将AWS Secrets Manager密钥配置到ECS容器的方案
下面提供两种实现方式,帮你把Secrets Manager中的密钥映射为ECS容器的环境变量:
一、Terraform代码示例
1. 修正Secrets Manager权限策略
首先确保你的Secrets Manager密钥允许ECS任务执行角色访问,替换原策略中的Principal为ECS任务执行角色的ARN:
resource "aws_secretsmanager_secret_policy" "secret_access_policy" { secret_arn = aws_secretsmanager_secret.my_secret.arn policy = jsonencode({ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowECSTaskExecutionRoleAccess", "Effect": "Allow", "Principal": { "AWS": aws_iam_role.ecs_task_execution_role.arn # 引用你的ECS任务执行角色ARN }, "Action": ["secretsmanager:GetSecretValue"], "Resource": "*" } ] }) }
2. 创建/配置ECS任务执行角色
如果还没有ECS任务执行角色,需要创建并赋予访问Secrets的权限:
# ECS任务执行角色 resource "aws_iam_role" "ecs_task_execution_role" { name = "ecs-task-execution-role" assume_role_policy = jsonencode({ Version = "2012-10-17" Statement = [ { Action = "sts:AssumeRole" Effect = "Allow" Principal = { Service = "ecs-tasks.amazonaws.com" } } ] }) } # 附加ECS任务执行基础权限 resource "aws_iam_role_policy_attachment" "ecs_task_execution_role_policy" { role = aws_iam_role.ecs_task_execution_role.name policy_arn = "arn:aws:iam::aws:policy/service-role/AmazonECSTaskExecutionRolePolicy" } # 附加访问目标Secret的权限 resource "aws_iam_role_policy" "secrets_access_policy" { name = "ecs-secrets-access" role = aws_iam_role.ecs_task_execution_role.id policy = jsonencode({ Version = "2012-10-17" Statement = [ { Effect = "Allow" Action = "secretsmanager:GetSecretValue" Resource = aws_secretsmanager_secret.my_secret.arn } ] }) }
3. 定义ECS任务(关联Secret到环境变量)
在任务定义的容器配置中,通过secrets字段将Secret中的密钥映射为容器环境变量:
resource "aws_ecs_task_definition" "app_task" { family = "app-task" network_mode = "awsvpc" requires_compatibilities = ["FARGATE"] cpu = "256" memory = "512" execution_role_arn = aws_iam_role.ecs_task_execution_role.arn task_role_arn = aws_iam_role.ecs_task_execution_role.arn # 若需独立应用角色可单独配置 container_definitions = jsonencode([ { name = "app-container" image = "your-app-image:latest" essential = true # 映射Secret到环境变量 secrets = [ { name = "DB_DIALECT" # 容器内的环境变量名 valueFrom = "${aws_secretsmanager_secret.my_secret.arn}:DB_DIALECT::" # 格式:SecretARN:密钥字段名:: } ] # 其他容器配置示例 portMappings = [ { containerPort = 80 hostPort = 80 } ] logConfiguration = { logDriver = "awslogs" options = { awslogs-group = "/ecs/app-task" awslogs-region = "us-east-1" awslogs-stream-prefix = "ecs" } } } ]) }
二、AWS控制台操作步骤
1. 配置权限
- 进入IAM控制台,找到你的ECS任务执行角色,附加权限策略:允许
secretsmanager:GetSecretValue操作,资源指定为ecs-auth-secret的ARN。 - 进入Secrets Manager控制台,打开
ecs-auth-secret的"权限"标签页,编辑策略添加允许该任务执行角色访问的语句。
2. 编辑ECS任务定义
- 进入ECS控制台,打开目标任务定义,点击"创建新版本"。
- 在容器配置的"环境"区域,点击"添加环境变量",选择"从 Secrets Manager 或参数存储获取值"。
- 填写:
- 名称:容器内要使用的环境变量名(如
DB_DIALECT) - 值来源:选择"Secrets Manager",搜索并选中
ecs-auth-secret,指定密钥字段为DB_DIALECT。
- 名称:容器内要使用的环境变量名(如
- 保存任务定义新版本。
3. 应用配置
- 若为运行中的服务,进入服务详情页点击"更新",选择新任务定义版本完成更新。
- 若为一次性任务,直接使用新任务定义版本启动任务即可。
内容的提问来源于stack exchange,提问作者Jorge Luis Güiza Granobles
相关产品推荐
相关产品推荐

