terraformでec2サーバーのキーペアを設定して起動する

# 概要
過去にterraformによりAWSのec2インスタンスを作成した

https://qiita.com/kazato110tm/items/59d4a780d2262ab96aaa

しかし、これではssh接続の際のキーペアが設定されていないため、terraformでec2にキーペアを設定する方法をまとめる

terraformのためには認証キーの登録が必要なため別途以下で対応

https://qiita.com/kazato110tm/items/3a581f156f51fd257f76

# キーペアなしでEC2インスタンスを構築
## EC2を起動する

EC2をterraformで起動するための最低限のスクリプトは以下の通り
リージョンとAMI, インスタンスタイプを`main.tf`に記載する
今回はAmazon Linuxを使用

```main.tf
provider "aws" {
  region     = "ap-northeast-1"
}

resource "aws_instance" "default" {
    ami = "ami-09ebacdc178ae23b7" # Amazon Linux 2 AMI (HVM), SSD Volume Type(64 ビット x86)
    instance_type = "t2.micro"
}
```

```
$ ls
main.tf
# 初回のみ実行
$ terraform init
# 内容確認
$ terraform plan
# 環境適用
$ terraform apply
```

## 起動確認

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/717281/a0425378-d4e2-f99d-7f89-6c58dcc4d156.png)

EC2を落とす

```
$ terraform destroy
```

# 公開鍵を設定したEC2インスタンスを構築

## キーペアを作成する

```
# キーペアを作成する
$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/`user_name`/.ssh/id_rsa): `file_path`/ec2_access_key
Enter passphrase (empty for no passphrase): #今回はパスワードなしEnter
Enter same passphrase again: #今回はパスワードなしEnter

$ ls
ec2_access_key    ec2_access_key.pub    main.tf
# 秘密鍵を.ssh配下に移動
$ mv ./ec2_access_key ~/.ssh/ec2_access_key
$ ls
ec2_access_key.pub    main.tf
```

main.tfファイルで公開鍵の情報を追加
ついでにec2のタグでインスタンスに名前をつける

```main.tf
provider "aws" {
  region     = "ap-northeast-1"
}

resource "aws_key_pair" "default" {
  key_name   = "ec2_access_key"
  public_key = file("./ec2_access_key.pub")
}

resource "aws_instance" "default" {
    ami = "ami-09ebacdc178ae23b7" # Amazon Linux 2 AMI (HVM), SSD Volume Type(64 ビット x86)
    instance_type = "t2.micro"

    key_name = aws_key_pair.default.key_name
    tags = {
        Name = "test-server"
    }
}
```

ec2インスタンスを起動する

```
$ terraform plan
$ terraform apply
```

## 起動確認

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/717281/5e009fcc-80c7-2f72-5cfe-a1a4c48d4bfc.png)


## ssh接続を検証

構築したec2に対して暗号鍵を用いてssh接続してみる

```
$ ssh -i ~/.ssh/ec2_access_key ec2-user@`public_ip`
ssh: connect to host `public_ip` port 22: Operation timed out
```

接続できないとのこと
ポート周りの設定をしていなかったためと思われる

## ec2のport 22を解放する

`main.tf`にセキュリティグループの情報を追加する

```main.tf
provider "aws" {
  region = "ap-northeast-1"
}

resource "aws_key_pair" "default" {
  key_name = "ec2_access_key"
  public_key = file("./ec2_access_key.pub")
}

resource "aws_security_group" "default" {
  name = "ssh_connection"
  ingress {
    cidr_blocks = ["0.0.0.0/0"]
    protocol = "tcp"
    from_port = 22
    to_port = 22
  }
}

resource "aws_instance" "default" {
    ami = "ami-09ebacdc178ae23b7" # Amazon Linux 2 AMI (HVM), SSD Volume Type(64 ビット x86)
    instance_type = "t2.micro"
    # port
    vpc_security_group_ids = [aws_security_group.default.id]
    # key
    key_name = aws_key_pair.default.key_name
    # name
    tags = {
        Name = "test-server"
    }
}

```

設定を反映させる

```
$ terraform plan
$ terraform apply
```

ssh接続を検証してみる

```
$ ssh -i ~/.ssh/ec2_access_key ec2-user@`public_ip`
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
       __|  __|_  )
       _|  (     /   Amazon Linux 2 AMI
      ___|\___|___|

https://aws.amazon.com/amazon-linux-2/
4 package(s) needed for security, out of 16 available
Run "sudo yum update" to apply all updates.
[ec2-user@ip-`private_ip` ~]$
```

無事に接続を確認