今回は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"}