在Terraform中创建EC2实例时如何使用AWS Secrets Manager的SSH密钥
问题解决:Terraform引用Secrets Manager SSH密钥报错修正
错误原因
- 数据源名称不匹配:你在EC2实例配置中引用了
data.aws_secretsmanager_secret_version.ssh_key,但实际定义的数据源名称是current,导致Terraform找不到该数据源。 - 未解析密钥键值对:你的SSH密钥以键值对
ssh-key存储在Secrets Manager中,但当前代码未从返回的secret_string中提取对应的值。 - EC2
key_name参数要求:该参数需要的是AWS EC2密钥对的名称,而非私钥内容,请确保Secrets Manager中ssh-key字段存储的是已创建的EC2密钥对名称。
修正后的代码
resource "aws_security_group" "wordpress_sg" { name = "wordpress-sg" description = "Security group for the WordPress instance" ingress { from_port = 22 to_port = 22 protocol = "tcp" cidr_blocks = ["0.0.0.0/0"] // 允许所有IP的SSH访问 } ingress { from_port = 80 to_port = 80 protocol = "tcp" cidr_blocks = ["0.0.0.0/0"] // 允许所有IP的HTTP访问 } ingress { from_port = 443 to_port = 443 protocol = "tcp" cidr_blocks = ["0.0.0.0/0"] // 允许所有IP的HTTPS访问 } egress { from_port = 0 to_port = 0 protocol = "-1" cidr_blocks = ["0.0.0.0/0"] } } # 获取Secrets Manager中的密钥元数据 data "aws_secretsmanager_secret" "secrets" { arn = "arn:aws:secretsmanager:us-east-1:xxxx:secret:mysecret-xxxx" } # 获取密钥的当前版本内容 data "aws_secretsmanager_secret_version" "current" { secret_id = data.aws_secretsmanager_secret.secrets.id } resource "aws_instance" "example" { ami = var.ami_id instance_type = var.instance_type # 解析JSON格式的密钥内容,提取ssh-key字段对应的值作为EC2密钥对名称 key_name = jsondecode(data.aws_secretsmanager_secret_version.current.secret_string)["ssh-key"] security_groups = [aws_security_group.wordpress_sg.name] } output "instance_public_ip" { value = aws_instance.example.public_ip }
关键修正点说明
- 将EC2实例的
key_name参数修改为jsondecode(data.aws_secretsmanager_secret_version.current.secret_string)["ssh-key"]:通过jsondecode解析Secrets Manager返回的JSON格式密钥内容,提取ssh-key字段的值。 - 确保数据源引用名称与定义的一致:使用
data.aws_secretsmanager_secret_version.current而非不存在的ssh-key。
内容的提问来源于stack exchange,提问作者megha
相关产品推荐
相关产品推荐

