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


今回は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_parameterdataとして取得してあげればOKです。

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