如何用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
相关产品推荐
相关产品推荐

