続・Terraform少しだけ入門してみた

# はじめに

随分前にTerraformの記事を出したのですが、やっと続きをする気が起きて再度入門（？）してみました！

https://qiita.com/keke21/items/6daaa8a5b9b360ad2369

今回は前回より少し頑張って下記の構成をTerraformで作成することに挑戦しました！
※EC2は通常、private subnetに置く方がセキュアですが、今回はNATゲートウェイの設定を次回に持ち越すためpublic subnetに配置しています。
```
                  +-------------------------------------+
                  |               Route 53              |
                  +-------------------------------------+
                                    |
                                    |
                      +------------------------------+
                      |           ALB (ACM)          |
                      +------------------------------+
                                    |
                                    |
                             +--------------+
                             |     VPC      |
                             +--------------+
                                    |
                                    |
                  +-----------------+-----------------+
                  |                                   |
        +--------------------+            +----------------------+
        |    Public Subnet   |            |   Private Subnet     |
        | (Availability Zone)|            | (Availability Zone)  |
        +--------------------+            +----------------------+
                  |                                  |
        +--------------------+            +----------------------+
        |    EC2 Instance    |            |     RDS Instance     |
        |   (Web Server)     |            |   (Database Server)  |            
        +--------------------+            +----------------------+

```

# なぜIaCなのか
「インフラ関連初心者にはハードル高いよ・・・」「IaCって上級者向けでしょ・・・？」と僕自身も最初は思っていましたし、そう思う人も少なからずいるのではないでしょうか。

でも初心者だからこそIaCに挑戦してみるのも良いと思います！


## IaCを学ぶことで理解がより深まる
- 構築したいサービスに必要なリソースが分かる
- 各リソースに必要な設定が分かる
- リソースごとの依存関係が分かる
という観点で学びが多いのではないかなと感じました！

詳しくは解説しないのですが、
具体的にはEC2は、ami,subnet,vpcとの関連を明記しないとダメなんだな〜とか、書いていく中で理解が深まるように思えます！
```tf
# ========================================== #
# EC2 Instance
# ========================================== #
resource "aws_instance" "app_server" {
  ami                         = data.aws_ami.app.id
  instance_type               = "t2.micro"
  subnet_id                   = aws_subnet.public_subnets["public-1a"].id
  associate_public_ip_address = true
  vpc_security_group_ids = [
    aws_security_group.web_sg.id
  ]
  key_name = aws_key_pair.keypair.key_name

  tags = {
    Name    = "${var.project}-${var.environment}-app-server"
    Project = var.project
    Env     = var.environment
    Type    = "app"
  }
}
```
Terraformの場合、宣言的な書き方となっているので、必要な設定が可視化される、つまりコードを書く中で何となくではなく、リソースや依存関係についてしっかり分かるようになるのではないかなと思っています！


## AIの力を借りやすい
GUIでポチポチしている場合、どこかで躓いてもどこで良くないのか発見まで苦労した経験はないでしょうか・・・。（僕は何度もあります><）

IaCの場合、基本的にはコードで簡潔するので、例えば自動補完などを活用すればリソースごとの必要な設定の導線となり、GUIよりも躓きにくい・・・かもしれないです！少なくとも学習しやすいのかなと思います！

## 躓いたところ
DNSとSSLに関する部分はずっと苦戦していました。
特にRoute53やALB,ACM周りは結局手動でGUIポチポチする必要がありそうでした。。。

恐らく改善の余地がいっぱいあると思っているので、より良い方法があれば是非教えていただけると嬉しいです！

## おわりに
そこそこ大変だったのですが、改めてAWSについて少しだけ詳しくなれるような良い機会だったなと思います。また、chatGPTなどAIの力をたくさん借りることが出来る時代なので、躓いても何とか形にすることが出来ました！

具体的な予定はまだありませんが、次はPulumiにも挑戦してみたいと思います！

https://www.pulumi.com/

最後にこっそりと今回のソースを載せておきます・・・！

https://github.com/keeee21/terraform-app