[Terraform]EC2でホストしている個人ブログをTerraformでコード化してみた

AWSIaCポートフォリオ


・EC2でホストしている個人ブログをTerraformでコード化してみた
・SSL化対応の用途でACMは、CloudFrontやELBのみでしか利用できなかったのでコスト削減のため使用を控えていたが、今回は一時的な構築のため使用する
・Route53の現行のホストゾーンにサブドメインを追加し名前解決させる

0. 現状のリソースの整理

・EC2(Apache、WordPress)
・VPC
・Route53

リソース詳細

◯ EC2 構成
インスタンスID: i-024c4a4d8ba21a910
インスタンスタイプ: t2.micro
AMI: Amazon Linux 2
パブリックIP: 52.192.182.208
プライベートIP: 10.0.1.28
Elastic IP: あり
ボリューム: 8GB (gp3)
セキュリティグループ:
インバウンド
TCP 22(SSH): 自分のIPのみ許可
TCP 80(HTTP): すべて許可
TCP 443(HTTPS): すべて許可
アウトバウンド: すべて許可
IAMロール: なし
監視: CloudWatchメトリクス  無効


◯ Apache / WordPress
Apache バージョン: 2.4.62 (Amazon Linux)
PHP バージョン: 8.3.7
MySQL バージョン: 10.5.25-MariaDB(ローカル)
ドキュメントルート: /var/www/html
SSL証明書: Let’s Encrypt

◯ VPC 構成
VPC ID: vpc-00385ffe1b22280fd
CIDR: 10.0.0.0/16
サブネット: 
パブリックサブネット: 10.0.1.0/24
プライベートサブネット: なし
インターネットゲートウェイ: igw-0c75d6354c5849ab5(アタッチ済み)
NATゲートウェイ: なし
ルートテーブル:
パブリックサブネット: 0.0.0.0/0 → igw-0c75d6354c5849ab5
プライベートサブネット: 10.0.0.0/16 → local

◯ Route 53 構成
ドメイン名: techblog-jin.com 
ホストゾーンID: Z00721822L99PXKNOQXHH
レコード設定:
Aレコード: techblog-jin.com → 52.192.182.208(EC2のEIP)
CNAME: なし
MXレコード: なし
TXTレコード: なし



1. 構成図

〜変更前〜
・EC2(Apache、WordPress)
・VPC
・Route53

〜変更後〜
・EC2(Apache、WordPress)
・VPC
・Route53  ←手動修正
・ACM    ←追加
・CloudWatch ←追加
・ALB    ←追加
・S3     ←追加



2. 手順

2.1. 既存のEC2(個人ブログ)をAMI化
1. 既存のEC2よりAMIを作成
aws ec2 create-image --instance-id i-xxxxxxxxxxxxxxxx --name "My-Blog-EC2-AMI-20250222" --no-reboot
(i-xxxxxxxxxxxxxxxx: 既存のEC2(個人ブログ)

2. AMIのステータス確認
aws ec2 describe-images --image-ids ami-xxxxxxxxxxxxxxxxx

3. AMIを使ったインスタンス作成(動作確認)
結果出力
akira_mba@amba ~ % aws ec2 create-image --instance-id i-024c4a4d8ba21a910 --name "My-Blog-EC2-AMI-20250222" --no-reboot
{
    "ImageId": "ami-076b729e27f068c4b"
}
akira_mba@amba ~ % 


akira_mba@amba ~ % aws ec2 describe-images --image-ids ami-076b729e27f068c4b
{
    "Images": [
        {
            "PlatformDetails": "Linux/UNIX",
            "UsageOperation": "RunInstances",
            "BlockDeviceMappings": [
                {
                    "Ebs": {
                        "DeleteOnTermination": true,
                        "Iops": 3000,
                        "SnapshotId": "snap-027bd1d053dfc1a99",
                        "VolumeSize": 8,
                        "VolumeType": "gp3",
                        "Throughput": 125,
                        "Encrypted": false
                    },
                    "DeviceName": "/dev/xvda"
                }
            ],
            "EnaSupport": true,
            "Hypervisor": "xen",
            "Name": "My-Blog-EC2-AMI-20250222",
            "RootDeviceName": "/dev/xvda",
            "RootDeviceType": "ebs",
            "SriovNetSupport": "simple",
            "VirtualizationType": "hvm",
            "BootMode": "uefi-preferred",
            "ImdsSupport": "v2.0",
            "SourceInstanceId": "i-024c4a4d8ba21a910",
            "DeregistrationProtection": "disabled",
            "SourceImageId": "ami-00c79d83cf718a893",
            "SourceImageRegion": "ap-northeast-1",
            "ImageId": "ami-076b729e27f068c4b",
            "ImageLocation": "338200587558/My-Blog-EC2-AMI-20250222",
            "State": "pending",
            "OwnerId": "338200587558",
            "CreationDate": "2025-02-22T23:56:58.000Z",
            "Public": false,
            "Architecture": "x86_64",
            "ImageType": "machine"
        }
    ]
}


2.2. Terraformでコード化

Terrafromソースコードはこちら

# ディレクト構成

tf-coding-my_blog/
├── main.tf         # ルートモジュール:各サブモジュールを呼び出す
├── variables.tf    # 共通の変数定義
├── outputs.tf      # ルートからの出力値
├── terraform.tfvars
├── .gitignore     
└── modules/
    ├── acm/
    │   ├── main.tf       # ACMのリソース定義
    │   ├── variables.tf  # ACMから出力する値
    ├── cloudwatch/
    │   ├── main.tf       # CloudWatchのリソース定義
    │   ├── variables.tf  # CloudWatch用の入力変数
    │   └── outputs.tf    # CloudWatchから出力する値
    ├── vpc/
    │   ├── main.tf       # VPCのリソース定義
    │   ├── variables.tf  # VPC用の入力変数
    │   └── outputs.tf    # VPCから出力する値
    ├── ec2/
    │   ├── main.tf       # EC2のリソース定義
    │   ├── variables.tf  # EC2用の入力変数
    │   └── outputs.tf    # EC2から出力する値
    ├── alb/
    │   ├── main.tf       # ALBのリソース定義
    │   ├── variables.tf  # ALB用の入力変数
    │   └── outputs.tf    # ALBから出力する値
    └── s3/
        ├── main.tf       # S3のリソース定義
        ├── variables.tf  # S3用の入力変数
        └── outputs.tf    # S3から出力する値
        


2.3. Route53の既存ホストゾーンにサブドメインを追加(マネコンから手動)

2.3.1. 該当のホストゾーンを選択し、「レコードを作成」を選択する


2.3.2. Aレコードを作成

サブドメイン: tf-coding-my-blog →FQDNは「tf-coding-my-blog.techblog-ji.com」
レコードタイプ: A – IPv4 address
トラフィックのルーティング先: 作成したALBを選択
ルーティングポリシー: シンプルルーティング