如何在Terraform中为EC2实例关联多个密钥对?
为AWS EC2实例配置多个密钥对的Terraform实现方法
AWS的aws_instance资源原生仅支持通过key_name关联单个密钥对,重复设置该参数会触发参数重复定义的报错。要为实例配置多个密钥对,可通过以下两种常用方式实现:
方法一:通过用户数据(User Data)追加公钥
在实例启动时,利用用户数据脚本将额外密钥的公钥内容直接追加到实例的authorized_keys文件中,无需额外的连接操作。
示例代码:
resource "aws_instance" "example" { ami = "ami-0c55b159cbfafe1f0" # 替换为你的目标AMI ID instance_type = "t2.micro" key_name = "primary-deployment-key" # 主密钥对 # 用户数据脚本:追加额外公钥到authorized_keys user_data = <<-EOF #!/bin/bash # 替换为实际的公钥内容 echo "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQD..." >> /home/ec2-user/.ssh/authorized_keys echo "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC..." >> /home/ec2-user/.ssh/authorized_keys # 修复文件权限(可选但建议) chmod 600 /home/ec2-user/.ssh/authorized_keys chown ec2-user:ec2-user /home/ec2-user/.ssh/authorized_keys EOF }
注意:
- 若使用Ubuntu等其他发行版的AMI,需将用户目录从
/home/ec2-user改为/home/ubuntu - 公钥内容需完整复制,确保无格式错误
方法二:通过Remote-Exec Provisioner追加公钥
利用Terraform的remote-exec provisioner,在实例创建完成后,通过SSH连接(依赖主密钥对)将额外公钥写入实例。
示例代码:
resource "aws_instance" "example" { ami = "ami-0c55b159cbfafe1f0" instance_type = "t2.micro" key_name = "primary-deployment-key" provisioner "remote-exec" { inline = [ "echo 'ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQD...' >> /home/ec2-user/.ssh/authorized_keys", "echo 'ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC...' >> /home/ec2-user/.ssh/authorized_keys", "chmod 600 /home/ec2-user/.ssh/authorized_keys", "chown ec2-user:ec2-user /home/ec2-user/.ssh/authorized_keys" ] # SSH连接配置:依赖主密钥对的私钥 connection { type = "ssh" user = "ec2-user" private_key = file("~/.ssh/primary-deployment-key.pem") # 本地主密钥私钥路径 host = self.public_ip } } }
注意:
- 需确保实例所在安全组开放了SSH(22端口)权限,允许Terraform所在机器访问
- 本地私钥文件需有正确的权限(如600),避免SSH连接报错
额外优化方案
如果需要频繁使用多密钥对的实例,可预先制作包含所有所需公钥的自定义AMI,后续创建实例时直接使用该AMI,无需每次配置用户数据或provisioner。
内容的提问来源于stack exchange,提问作者Bastian
相关产品推荐
相关产品推荐

