【Udemy】Terraformで実現するAWS×IaC

## はじめに

はじめまして、シラカワです。

仕事でIaC(Infrastructure as Code)に初挑戦した際、非常に参考になったUdemy講座があります。
他にもいくつかの講座を受講しましたが、初心者向けとしては本講座が特におすすめです。
**IaCに挑戦したい方や、AWSで活用できるスキルを習得したい方は、ぜひこちらの講座を受講してみてください！**

:::note info
IaCだけでなくAWSハンズオンの入門編としてもおすすめです
:::

### このUdemy講座を受講することで得られるメリット
* IaCの特徴やメリットを自分の言葉で説明できるようになる
* IaC関連ツールの中でのTerraformの特徴を理解できる
* Terraformの基本的なコマンドと構文を習得できる
* AWSの各種サービスを組み合わせて、Terraformを使ったインフラ構築を自力で行えるようになる
* ハンズオンを通じて、コード作成・インフラ構築の楽しさと達成感を得ることができる

これらのメリットを活かして、この機会にIaCを使いこなせるエンジニアへと成長しましょう！

## Udemy講座の紹介

https://www.udemy.com/course/awsterraforminfrastructure-as-code/?srsltid=AfmBOorLUVGVl9vUwE8uJz8zdJa1MdsI9U37zXoE-gwCuyQ8yuXcBs_-&couponCode=NVDPROD20

**講師**：[Shota Fukuyama](https://www.udemy.com/user/fu-tian-sheng-tai/)さん
**評価**：4.5★(211件の評価)
**受講生**：1,603人
**最終更新日**：2024/11
 (2024/12/06現在)
### 講座の内容
セクションの数: 6 • レクチャーの数: 29 • 総時間: 4時間53分
![koz.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3935746/3aee4b61-fab4-b12f-cf9a-ca1305d90316.png)

### 要件
ネットワークの基礎知識（HTTP、SSH等）
AWSの基礎知識（Amazon VPC、EC2関連の基本用語等）

:::note info
非常に丁寧な解説があるため、前提知識がなくても問題ないです
:::

### ハンズオンで構築する各種AWSサービス
**アーキテクチャ図**
![ark.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3935746/16e97e9e-f2ea-848a-7ba8-c580adfef218.png)
（私が作成したものなので、間違ってたら教えてください。）
* **VPC**
  * **インターネットゲートウェイ**
  * **ルートテーブル**
  * **パブリックサブネット**
* **EC2**
  * **Elastic Network Interface(ENI)**
  * **Elastic IP アドレス**
  * **セキュリティーグループ**

※各種AWSサービスについて詳しく知りたい方は、本記事の最下部にある参考情報をご覧ください。

### ハンズオンで作成するIaC(Terraformファイル)
**※ネタバレ注意**
<details><summary>こんなコードが書けるようになります！</summary>

```Terraform:iac.tf
# Configure the AWS Provider
provider "aws" {
  region = "ap-northeast-1"
  access_key = var.aws_accesskey
  secret_key = var.aws_secretkey
  token = var.aws_token
}

variable "aws_accesskey" {
  description = "access key for the aws"
  type = string
}

variable "aws_secretkey" {
  description = "secret access key for the aws"
  type = string
}

variable "aws_token" {
  description = "access token for the aws"
  type = string
}

variable "subnet_prefix" {
  description = "cidr block for the subnet"
  # default = "10.0.1.0/24"
  # type = string
}

#1 VPC作成
resource "aws_vpc" "iac-vpc" {
  cidr_block = "10.0.0.0/16"
  tags = {
    Name = "iac-vpc"
  }
}

#2 インターネットゲートウェイ作成
resource "aws_internet_gateway" "iac-gateway" {
  vpc_id = aws_vpc.iac-vpc.id
  tags = {
    Name = "iac-gateway"
  }
}

#3 ルートテーブル作成
resource "aws_route_table" "iac-route-table" {
  vpc_id = aws_vpc.iac-vpc.id
  route {
    cidr_block = "0.0.0.0/0"
    gateway_id = aws_internet_gateway.iac-gateway.id
  }
  route {
    ipv6_cidr_block = "::/0"
    gateway_id = aws_internet_gateway.iac-gateway.id
  }
  tags = {
    Name = "iac-route-table"
  }
}

#4-1 サブネット作成
resource "aws_subnet" "iac-subnet" {
  vpc_id = aws_vpc.iac-vpc.id
  cidr_block = var.subnet_prefix[0].cidr_block
  availability_zone = "ap-northeast-1a"
  tags = {
    Name = var.subnet_prefix[0].name
  }
}

#4-2 サブネット作成
resource "aws_subnet" "iac-subnet2" {
  vpc_id = aws_vpc.iac-vpc.id
  cidr_block = var.subnet_prefix[1].cidr_block
  availability_zone = "ap-northeast-1a"
  tags = {
    Name = var.subnet_prefix[1].name
  }
}

#5 サブネットとルートテーブルの紐付け
resource "aws_route_table_association" "iac-association" {
  subnet_id = aws_subnet.iac-subnet.id
  route_table_id = aws_route_table.iac-route-table.id
}

#6 セキュリティグループ作成（ポート22,80,443許可）
resource "aws_security_group" "iac-security-group" {
  name        = "iac-security-group"
  description = "Allow web inbound traffic"
  vpc_id      = aws_vpc.iac-vpc.id

  ingress {
    description      = "HTTPS"
    from_port        = 443
    to_port          = 443
    protocol         = "tcp"
    cidr_blocks      = ["0.0.0.0/0"]
  }
  ingress {
    description      = "HTTP"
    from_port        = 80
    to_port          = 80
    protocol         = "tcp"
    cidr_blocks      = ["0.0.0.0/0"]
  }
  ingress {
    description      = "SSH"
    from_port        = 22
    to_port          = 22
    protocol         = "tcp"
    cidr_blocks      = ["0.0.0.0/0"]
  }
  egress {
    from_port        = 0
    to_port          = 0
    protocol         = "-1"
    cidr_blocks      = ["0.0.0.0/0"]
  }
  tags = {
    Name = "iac-security-group"
  }
}

#7 ENI（Elastic Network Interface）作成（サブネット、セキュリティグループ等を１つにまとめる）
resource "aws_network_interface" "iac-nw-interface" {
  subnet_id       = aws_subnet.iac-subnet.id
  private_ips     = ["10.0.1.50"]
  security_groups = [aws_security_group.iac-security-group.id]
}

#8 EIP（Elastic IP）作成、ENIに紐付け
resource "aws_eip" "iac-eip" {
  domain                    = "vpc"
  network_interface         = aws_network_interface.iac-nw-interface.id
  associate_with_private_ip = "10.0.1.50"
  depends_on = [aws_internet_gateway.iac-gateway, aws_instance.iac-instance]
}

output "eip_public_ip" {
  value = aws_eip.iac-eip.public_ip
}

#9 Webサーバー構築（Linuxサーバー構築、Apacheインストール、index.html作成）
resource "aws_instance" "iac-instance" {
  ami = "ami-0037237888be2fe22"
  instance_type = "t2.micro"
  availability_zone = "ap-northeast-1a"
  key_name = "iac-key"

  network_interface {
    device_index = 0
    network_interface_id = aws_network_interface.iac-nw-interface.id
  }

  user_data = <<-EOF
              #!/bin/bash
              sudo yum -y install httpd
              sudo systemctl start httpd.service
              sudo bash -c 'echo AWSで学ぶ！Infrastructure as Code入門講座へようこそ！ > /var/www/html/index.html'
              EOF
  tags = {
    Name = "iac-instance"
  }
}

output "instance_private_ip" {
  value = aws_instance.iac-instance.private_ip
}

output "instance_id" {
  value = aws_instance.iac-instance.id
}

```
</details>

:::note warn
公開用に認証情報を変数に置き換えているため、実際のコードとは異なります
:::

## このUdemy講座のおすすめポイント
講座の概要を紹介した上で、あらためてこの講座をおすすめする理由を挙げます！

- **初心者でも理解しやすい構成**
  - 初心者にも理解しやすいように、内容と解説の順序が工夫されている
  - 手動でEC2を構築した後にIaCでEC2を構築するプロセスを体験することで、IaCのメリットを実感できるようになっている

:::note info
手動で構築したEC2は構築後利用しないため、講座の最後にある「AWS構築環境削除」の前に停止もしくは削除しておくと、AWS利用料金を節約できます
:::

* **適度な内容量で取り組みやすい**
  * 5時間の動画で構成されているため、1日で完了することができる
  * 不要なサービスを長時間稼働させる必要がないため、AWSの利用料金を節約しやすい
  * その結果、初心者でも気軽に取り組めるハンズオンとなっている

私が実際にIaCハンズオン（実践編）に取り組んだ際の所要時間を以下に共有します。

| セクション | 経過時間 | 合計時間 |
| ---- | --- | --- |
| 事前準備編 | 0:08:06 | 0:08:06 |
| 基礎知識編 | 1:38:17 | 1:46:23 |
| 応用知識編 | 0:49:28 | 2:35:51 |

全体の流れや各セクションにかかる時間の目安としてご活用ください。

※動画自体は2倍速で視聴し、必要に応じて一時停止をしながら進めました。
※料金についてはAWS無料利用枠を利用しましたが、所要時間が短いため、費用は数ドル程度だと思います。
（実際に試した方は、どれくらい費用がかかったかコメントで教えていただけると嬉しいです！）

* **最新の情報にアップグレードされている**
  * AWSも日々更新しており、IaCの記法などが変わることがあるが、本講座の内容は最新(2024/12/06現在)のAWS上でも基本的には問題なく動作した
  * 最終更新日が2024年11月と適宜メンテナンスが行われているため、今後もQ＆Aの回答やバージョンアップへの対応が期待できる

類似のUdemy講座の中には、公開から時間が経過しており、ほとんどのコードを修正する必要があるものもあります。
その点、本講座は最新の内容で更新されているため、コードの修正や調査を頻繁に行う必要がなく、ストレスフリーで受講できます！

:::note warn
1箇所だけwarningを出すところがありますが、生成AIなどにエラー内容をコピペするとすぐに修正方法が分かります
:::

## まとめ
**本講座は、IaCに挑戦したい方やAWSで活用できるスキルを習得したい方に最適です！**

初心者にも理解しやすい解説と、実際にAWS環境でインフラ構築を行うハンズオンを通じて、IaCをコンパクトかつ体系的に学べます。また、最新のAWS環境に対応した内容で更新されているため、コード修正や調査の手間が少なく、ストレスフリーで学習できる点も大きな魅力です。

**この講座で学習した内容を活かして、IaCを使いこなせるエンジニアへと成長しましょう！**

## 参考情報
本講座のハンズオンで構築した各種AWSサービスについて詳しく知りたい方は、こちらをご参照ください。
**全てAWSドキュメントから引用しています。**

1. [Amazon VPC とは?](https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/what-is-amazon-vpc.html)
2. [インターネットゲートウェイを使用して VPC インターネットアクセスを有効にする](https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/VPC_Internet_Gateway.html)
3. [ルートテーブルを設定する](https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/VPC_Route_Tables.html)
4. [VPC のサブネット](https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/configure-subnets.html)
5. [Amazon EC2 とは](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/concepts.html)
6. [Elastic Network Interface](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/using-eni.html)
7. [Elastic IP アドレス](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/elastic-ip-addresses-eip.html)
8. [EC2 インスタンスの Amazon EC2 セキュリティグループ](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/ec2-security-groups.html)