You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 19:07:40