terraformを使用して、EC2のキーペアを作成する

terraform

今回はterraformでEC2のキーペアを作成し、それを使用してEC2を作成していきます。

キーペアの作成

まずは、terraformでキーペアを作成していきます。
通常、キーペアを作成するためには、ssh-keygenコマンドを利用しますが、terraformではtlsプロバイダの一つである、tls_private_keyリソースを利用することでキーペアを作成することが可能です。
下記でRSA暗号、4096ビットの秘密鍵/公開鍵のペアを作成します。

resource "tls_private_key" "main" {
    algorithm = "RSA"
    rsa_bits = 4096
}

これで秘密鍵、公開鍵のペアが作成されるため、以下のように利用します。
AWSのキーペアは公開鍵をopenssh形式で登録する必要があるので、3つめを利用します。

# 秘密鍵(PEMフォーマット)
tls_private_key.main.private_key_pem

# 公開鍵(PEMフォーマット)
tls_private_key.main.public_key_pem

# 公開鍵(OPENSSHフォーマット)
tls_private_key.main.public_key_openssh

作成したキーペアをaws_key_pairリソースで、キーペアとして登録します。

resource "aws_key_pair" "main" {
    key_name = "ec2-keypair"
    public_key = tls_private_key.main.public_key_openssh

    tags = {
        Name = "ec2-keypair"
    }
}

キーペアをローカルファイルに保存

ちなみに、キーペアをファイルとして保存したい場合は、localプロバイダを利用することでローカルにファイルとして保存できます。
以下は、modules/ec2配下に秘密鍵、公開鍵を保存する例です。

resource "local_file" "keypair_pem" {
    filename = "${path.module}/keypair.pem"
    sensitive_content = tls_private_key.main.private_key_pem
    file_permission = "0600" # 秘密鍵は権限を0600に変更する。
}

resource "local_file" "keypair_pub" {
    filename = "${path.module}/keypair.pub"
    sensitive_content = tls_private_key.main.public_key_openssh
    file_permission = "0600" # 公開鍵も権限を0600に変更する。(必須ではない。)
}

EC2作成時のキーペア反映

ここまででキーペアを作成したので、あとはEC2インスタンス作成時にキーペアを指定するだけです。
せっかくなので、VPCとサブネットを作成してEC2インスタンスを配置します。
aws_instanceリソースのkey_nameを作成したキーペアを指定してあげればOKです。

resource "aws_vpc" "sample-vpc" {
  cidr_block = "172.16.0.0/16"

  tags = {
    Name = "sample-vpc"
  }
}

resource "aws_subnet" "sample-subnet" {
  vpc_id            = aws_vpc.sample-vpc.id
  cidr_block        = "172.16.10.0/24"
  availability_zone = "ap-northeast-1a"

  tags = {
    Name = "sample-subnet"
  }
}

resource "aws_instance" "main" {
    ami = data.aws_ssm_parameter.amazonlinux.value
    instance_type = "t2.nano"

    key_name = aws_key_pair.main.key_name

    subnet_id = aws_subnet.sample-subnet.id

    tags = {
        Name = "sample-instance"
    }
}

ちなみに最新版のAmazonLinux AMIを取得するためには、以下の通りaws_ssm_parameterのdataとして取得してあげればOKです。

data "aws_ssm_parameter" "amazonlinux" {
  name = "/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2"
}

コメント