tls_private_key
Terraform 可以使用资源生成 SSL/SSH 私钥。
因此,如果您想即时生成 SSH 密钥,您可以执行以下操作:
variable "key_name" {}
resource "tls_private_key" "example" {
algorithm = "RSA"
rsa_bits = 4096
}
resource "aws_key_pair" "generated_key" {
key_name = var.key_name
public_key = tls_private_key.example.public_key_openssh
}
data "aws_ami" "ubuntu" {
most_recent = true
filter {
name = "name"
values = ["ubuntu/images/hvm-ssd/ubuntu-focal-20.04-amd64-server-*"]
}
filter {
name = "virtualization-type"
values = ["hvm"]
}
owners = ["099720109477"] # Canonical
}
resource "aws_instance" "web" {
ami = data.aws_ami.ubuntu.id
instance_type = "t2.micro"
key_name = aws_key_pair.generated_key.key_name
tags {
Name = "HelloWorld"
}
}
这将创建一个处于 Terraform 状态的 SSH 密钥对(它不会在文件中写入磁盘,而不是在不使用远程状态时对 Terraform 状态本身执行的操作),基于公钥创建一个 AWS 密钥对然后创建一个 Ubuntu 14.04 实例,ubuntu
用户可以使用生成的私钥访问该实例。
然后,您必须从状态文件中提取私钥并将其提供给用户。应用 Terraform 时,您可以使用 anoutput
直接将其吐出到标准输出。
安全警告
我应该在这里指出,传递私钥通常是一个坏主意,最好让开发人员创建他们自己的密钥对并为您提供您(或他们)可以用来生成 AWS 密钥对的公钥(可能使用上面示例中使用的aws_key_pair
资源)然后可以在创建实例时指定。
一般来说,我只会使用类似上述方式为您正在控制的非常临时的开发环境生成 SSH 密钥,因此您不需要将私钥传递给任何人。如果确实需要将私钥传递给人们,则需要确保在安全通道中执行此操作,并确保 Terraform 状态(包含纯文本私钥)也得到适当保护。