How do I create an SSH key in Terraform?

后端 未结 1 745
别那么骄傲
别那么骄傲 2020-12-23 09:21

I need to spin up a bunch of EC2 boxes for different users. Each user should be sandboxed from all the others, so each EC2 box needs its own SSH key.

What\'s the bes

相关标签:
1条回答
  • 2020-12-23 10:04

    Terraform can generate SSL/SSH private keys using the tls_private_key resource.

    So if you wanted to generate SSH keys on the fly you could do something like this:

    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-trusty-14.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"
      }
    }
    

    This will create an SSH key pair that lives in the Terraform state (it is not written to disk in files other than what might be done for the Terraform state itself when not using remote state), creates an AWS key pair based on the public key and then creates an Ubuntu 14.04 instance where the ubuntu user is accessible with the private key that was generated.

    You would then have to extract the private key from the state file and provide that to the users. You could use an output to spit this straight out to stdout when Terraform is applied.

    Security caveats

    I should point out here that passing private keys around is generally a bad idea and you'd be much better having developers create their own key pairs and provide you with the public key that you (or them) can use to generate an AWS key pair (potentially using the aws_key_pair resource as used in the above example) that can then be specified when creating instances.

    In general I would only use something like the above way of generating SSH keys for very temporary dev environments that you are controlling so you don't need to pass private keys to anyone. If you do need to pass private keys to people you will need to make sure that you do this in a secure channel and that you make sure the Terraform state (which contains the private key in plain text) is also secured appropriately.

    0 讨论(0)
提交回复
热议问题