Terraform講座：実際にリソースを作ってみよう②EC2編

## 今回の記事について
今回は、[前回講座](https://qiita.com/aaaaa_326/items/a82ee52b6d2dd7274c6e)の続きです！Terraformを使って前回作ったサブネット上にEC2を構築します！

## 本ハンズオンで作る環境
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3942158/ddbe7383-3e56-4116-99ee-30acf2a0e1cd.png)

画像のようにVPC、パブリックサブネットを作成し、この中にEC2を作成します。
また、この時、EC2は自分のPCからSSHでアクセスが出来るように設定します。

そして、本記事では、EC2の作成を行います。
EC2は、自分のPCからログインできるようにし、それ以外からのアクセスは禁止します。
ということで、前回と同じく、その設計をしていきましょう！

## 設計
設計項目は、今回の場合
- どのサブネットに構築するか
- Amazon Machine Image (AMI) は何を使用するか
- インスタンスタイプ
- セキュリティグループ

があります。1つ1つ見ていきましょう。

サブネットは、前回構築したものを使用しましょう。

AMIは、EC2の起動に使用するテンプレートのことで、TerraformはAMIをもとにEC2を構築します。今回は、Amazon公式のLinuxで広く使われている[Amazon Linux 2023](https://docs.aws.amazon.com/ja_jp/linux/al2023/ug/what-is-amazon-linux.html)の最新版をTerraformから獲得します。
また、自分でEC2にいろいろな機能を詰め込んだうえで、それをAMIとして保存することも出来ます！詳細はここでは語りませんが、気になる向けに記事は載せておきます！ (↓)

https://qiita.com/free-honda/items/a2eb7f57787b93436a3b

インスタンスタイプは、今回はデフォルトの`t2.micro`を使用します。詳細なタイプについて知りたい方は[こちら](https://qiita.com/KT0/items/dae0d3b89a24272226a4)をご覧ください (ちなみに、AWSの認定試験：SAAでかなりこの記事はお世話になりました)。

セキュリティグループは、リソース単位のファイアウォールで、ステートフルなので基本インバウンドを考えれば問題ないです。今回は、自分のPCからのSSH (ポート番号22) を許可するインバウンドを作ります。


### 設計まとめ
| 設計項目 | 値 |
| ---- | ---- |
| サブネット | 前回構築したサブネット |
| AMI | 公式から最新版を取得 |
| インスタンスタイプ | `t2.micro` |
| セキュリティグループ (インバウンドルール) | 自分のPCからのSSHを許可 |
| セキュリティグループ (アウトバウンドルール) | なし |

では、コーディングに移ります。


## EC2のコーディング
まず、前回のフォルダ構成のおさらいから行きましょう
### フォルダ構成
```
root
  ├─ backend.tf
  ├─ main.tf
  ├─ provider.tf
  ├─ .terraform-version
  ├─ version.tf
  └─ modules
       ├─ vpc.tf  
       ├─ subnet.tf
       ├─ route_table.tf
       ├─ igw.tf
       └─ ec2.tf
```
この時、セキュリティグループやこの先登場するSSHのキーペアは、**EC2専属のリソース**にあたるので、全て`ec2.tf`に書いておくと後で楽になります。

### SSHをするための準備 (SSHキーペアの作成)
では、まずSSHのキーペアの作成から説明します。これは、EC2にアクセスする際に使用する資格情報です。もう少し説明すると、EC2に公開鍵を登録しておき、ログイン時は秘密鍵を使ってアクセスすることでEC2がユーザを認証する仕組みが整えられています。

作成方法はマネージメントコンソールからの方法が最も簡単なのですが、今回は自分のPCからのログインすることも考慮し、ローカル上で作ります。
```
ssh-keygen -t RSA
Enter file in which to save the key (/Users/user_name/.ssh/id_rsa): # 鍵の名前  
Enter passphrase (empty for no passphrase): # パスフレーズ
Enter same passphrase again: # パスフレーズ (再入力)
Your identification has been saved in 鍵の名前
Your public key has been saved in 鍵の名前.pub
...
```
を打ち、鍵の名前とパスフレーズを入力します (パスフレーズは空にすることも可能です) 。

キーペアは、パスを指定しない場合、ワーキングディレクトリ上に作成されます。そして、Macの場合、おそらく公開鍵として`.pub`ファイル、秘密鍵として拡張子のないファイルが作成される想定で話を進めます。

### いざEC2のコーディング！
設計書とキーペアを用いて、コーディングしていきます。
```ec2.tf
# キーペアの作成
resource "aws_key_pair" "test_key" {
    key_name   = "test_key_ssh"
    public_key = # 公開鍵の保存場所を記載
}

# AMIの取得
# data型は、既にAWS上に存在し、terraform側で管理していないリソースを使用したい場合に用います。
data "aws_ami" "test_ec2" {
    most_recent = true
    owners      = ["amazon"]

    filter {
        name   = "name"
        values = ["al2023-ami-2023.*-x86_64"]
    }
}

# インスタンスの作成
resource "aws_instance" "test_ec2" {
    ami                         = data.aws_ami.test_ec2.id
    instance_type               = "t2.micro"
    subnet_id                   = aws_subnet.test_public.id
    associate_public_ip_address = true

    key_name = aws_key_pair.test_key.name

    tags = {
        Name = # 好きな名前を入れてください！
    }
}

# セキュリティグループの外枠の作成
resource "aws_security_group" "test_sg" {
    name        = # 好きな名前を入れてください！
    description = "security group for hands-on"
    vpc_id      = aws_vpc.test_vpc.id

    tags = {
        Name = # 好きな名前を入れてください！
    }
}

# セキュリティグループ (インバウンドルール) 作成
# 自分のPCのIPアドレスの確認方法：https://www.cman.jp/network/support/go_access.cgi
resource "aws_vpc_security_group_ingress_rule" "test_ec2_from_mypc" {
    security_group_id = aws_security_group.test_sg.id
    from_port         = 22
    to_port           = 22
    ip_protocol       = "tcp"
    cidr_block        = # 確認した自分のIPアドレス (cidrなので/32を忘れずに！)

    tags = {
        Name = # 好きな名前を入れてください！
    }
}
```

いや、ハンズオンにしては長いコーディングですね。。。笑
これでかなりTerraformの書き方には慣れてきたのではないでしょうか？
他にどんな設定項目があるのか気になった方は、ぜひ、[公式 (例としてEC2のページ)](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/instance)のドキュメントを読んでください！とても勉強になります！

## EC2構築とアクセスのテスト！
前回の記事と同様、重要な確認ポイントに絞って手順を書きます。

### EC2の構築
まず、Plan結果が次と一致していることを確認してください。(同時に何が作られるのかもここでも確認しておきましょう！)
```
Plan: 4 to add, 0 to change, 0 to destroy
```

確認したらapplyをして、EC2が作成されていることを確認します。

### 動作確認
作成したあとは、所望のリソースが出来上がっているか確認しましょう。
今回は、「**SSHで自分のPCからEC2にアクセスできること**」です！
その前にやることがあります。ローカルで作成したキーのままでログインすると、`Permissions are too open.`と怒られてしまうので、パーミッションを狭めます。
```
chmod 600 [自分が保存した秘密鍵のパス]
```
そして、EC2のIPアドレスは、マネージメントコンソールから、秘密鍵の指定は、`ssh`コマンドの`-i`オプションで行います。
```
ssh -i [自分が保存した秘密鍵のパス] ec2-user@[ec2のIPアドレス]
# 最初は接続するかの確認があるので、yesと答える
   ,     #_
   ~\_  ####_        Amazon Linux 2023
  ~~  \_#####\
  ~~     \###|
  ~~       \#/ ___   https://aws.amazon.com/linux/amazon-linux-2023
   ~~       V~' '->
    ~~~         /
      ~~._.   _/
         _/ _/
       _/m/'
[ec2-user@[ec2のIPアドレス] ~]$
```
この画面が出ていれば、動作確認も完了です。
長かったハンズオンもこれで終わりです！お疲れ様でした。

## まとめ
これであなたもTerraform界隈の仲間入りです！ようこそ(￣▽￣)
と言いつつ、自分もまだTerraformをｔ始めて半年なので、一緒に勉強していきましょう！
ここまで全5回お付き合いいただきありがとうございました！
[次回](https://qiita.com/aaaaa_326/items/21fd00fd93867d5be380)は今までの講座についてのまとめページを作る予定です！