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

如何用Terraform通过实例配置文件角色为EC2实例授权Secrets Manager访问

给EC2实例授予Secrets Manager访问权限(通过实例配置文件角色)

嘿,作为Terraform新手,这个需求其实挺典型的,我来一步步带你实现,保证清晰易懂~

步骤1:创建允许EC2扮演的IAM角色

首先得建一个IAM角色,让EC2服务能承担这个角色——毕竟实例本身不能直接拥有权限,得通过角色来获取。我们需要给角色加上信任策略,明确允许ec2.amazonaws.com来扮演它:

resource "aws_iam_role" "ec2_secrets_manager_role" {
  name = "EC2-Secrets-Manager-Access-Role"

  # 信任策略:允许EC2服务扮演这个角色
  assume_role_policy = jsonencode({
    Version = "2012-10-17"
    Statement = [
      {
        Action = "sts:AssumeRole"
        Effect = "Allow"
        Principal = {
          Service = "ec2.amazonaws.com"
        }
      }
    ]
  })
}

步骤2:创建Secrets Manager权限策略

接下来要给这个角色加上具体的Secrets Manager访问权限。比如如果你的Ansible只需要读取特定密钥,就限制资源范围;如果需要多个密钥,可以用通配符(生产环境建议尽量缩小范围,更安全):

resource "aws_iam_policy" "secrets_manager_read_access" {
  name        = "Secrets-Manager-Read-Access-Policy"
  description = "Allow read access to AWS Secrets Manager secrets"

  policy = jsonencode({
    Version = "2012-10-17"
    Statement = [
      {
        Action = [
          "secretsmanager:GetSecretValue",
          "secretsmanager:DescribeSecret"
        ]
        Effect   = "Allow"
        Resource = "arn:aws:secretsmanager:${var.region}:${var.account_id}:secret:your-secret-name-*"
        # 如果你需要访问所有密钥,可以把Resource改成"*",但生产环境不推荐
      }
    ]
  })
}

# 把权限策略附加到之前创建的IAM角色上
resource "aws_iam_role_policy_attachment" "secrets_manager_attach" {
  role       = aws_iam_role.ec2_secrets_manager_role.name
  policy_arn = aws_iam_policy.secrets_manager_read_access.arn
}

步骤3:创建实例配置文件并关联到EC2实例

IAM实例配置文件是给EC2实例用的“容器”,它会关联我们的IAM角色。创建后,把它附加到你的EC2实例资源上:

# 创建实例配置文件
resource "aws_iam_instance_profile" "ec2_secrets_manager_profile" {
  name = "EC2-Secrets-Manager-Profile"
  role = aws_iam_role.ec2_secrets_manager_role.name
}

# 修改你的EC2实例资源,添加iam_instance_profile参数
resource "aws_instance" "myinstance" { 
  ami = data.aws_ami.awsami.id 
  instance_type = "t2.small" 
  key_name = aws_key_pair.my_key.key_name 
  vpc_security_group_ids = [module.security.my_sg_id, module.security.my_security_group_id] 
  subnet_id = element(module.network.public_subnets,1) 
  # 新增:关联实例配置文件
  iam_instance_profile = aws_iam_instance_profile.ec2_secrets_manager_profile.name

  tags { 
    Name = "My instance" 
  } 
}

步骤4:Ansible那边怎么用?

因为实例已经有了这个角色,Ansible在实例上运行时,会自动通过实例元数据获取临时AWS凭证,不需要在Ansible里配置access key/secret key。比如你可以用Ansible的aws_secret模块来读取密钥:

- name: Retrieve secret from Secrets Manager
  amazon.aws.aws_secret:
    name: "your-secret-name"
    region: "{{ aws_region }}"
  register: secret_data

- name: Use the secret value
  debug:
    msg: "The secret value is {{ secret_data.secret_string }}"

小提示

  • 记得替换代码里的your-secret-name、var.region、var.account_id为你实际的信息
  • 生产环境中,一定要限制权限策略的Resource范围,不要用*,遵循最小权限原则哦~
  • 如果实例已经创建了,修改Terraform加上iam_instance_profile后,执行terraform apply会自动给实例关联配置文件,不需要重建实例

内容的提问来源于stack exchange,提问作者Evan Gertis

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 09:22:40