ドメイン名の件、会社で相談して方針を決めるというのは完璧な判断(ベストプラクティス)です。
インフラのアーキテクチャは技術面だけでなく、会社のポリシーやコスト管理(クレジットカードの請求先など)と密接に絡むため、チームで握っておくのが一番安全です。
それでは、いよいよご自宅のPC(Kali Linuxなど)から、Terraformを使った「IaC(Infrastructure as Code)の魔法」を体感してみましょう!
今回は、GPEN/GCIHホルダーのあなたに刺さる「自分のPCのグローバルIPを自動で取得して、セキュリティグループの許可リストに動的にねじ込む」というプロの技を盛り込んだコードを用意しました。
まずはECS(コンテナ)を入れず、「EC2 + Apache + 鉄壁のSG」というシンプルな構成で `init -> plan -> apply` の流れを体験するのが一番感動できると思います。
---
### ステップ1:手元PCの準備(AWSとの通信経路作り)
Terraformがあなたの代わりにAWSをポチポチ操作するためには、プログラム用の「アクセスキー(認証情報)」が必要です。
1. **アクセスキーの発行(AWS画面)**
* AWSマネジメントコンソールの右上、アカウント名から「**セキュリティ認証情報**」を開きます。
* 「**アクセスキー**」のセクションで「アクセスキーを作成」をクリック。
* ユースケースは「CLI」を選び、作成された `アクセスキーID` と `シークレットアクセスキー` をコピーします。(※絶対にGitなどにアップしないでくださいね!)
2. **AWS CLIのインストールと設定(手元のPC)**
* 手元のPCに [AWS CLI](https://aws.amazon.com/jp/cli/) と [Terraform](https://developer.hashicorp.com/terraform/install) をインストールします。
* ターミナルで `aws configure` を実行し、先ほどコピーしたキーを入力します。
* Region: `ap-northeast-1` (東京)
* Output format: `json`
### ステップ2:初めてのTerraformコードを書く
作業用の空のディレクトリ(例: `mkdir ~/ctf-terraform && cd ~/ctf-terraform`)を作り、そこに `main.tf` というファイルを作成して、以下のコードを丸ごと貼り付けてください。
```hcl
terraform {
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 5.0"
}
}
}
provider "aws" {
region = "ap-northeast-1"
}
# 💡プロの技:実行したPCのグローバルIPを外部APIから自動取得する
data "http" "myip" {
url = "https://ipv4.icanhazip.com"
}
# デフォルトVPCの取得(今回は簡略化のためデフォルトを使用)
data "aws_vpc" "default" {
default = true
}
# 🛡️セキュリティグループ(マイIPからのみHTTPとSSHを許可)
resource "aws_security_group" "ctf_sg" {
name = "ctf-poc-sg"
description = "Allow my IP only"
vpc_id = data.aws_vpc.default.id
ingress {
from_port = 80
to_port = 80
protocol = "tcp"
# 取得したマイIPを動的にCIDR(/32)として設定
cidr_blocks = ["${chomp(data.http.myip.response_body)}/32"]
}
ingress {
from_port = 22
to_port = 22
protocol = "tcp"
cidr_blocks = ["${chomp(data.http.myip.response_body)}/32"]
}
egress {
from_port = 0
to_port = 0
protocol = "-1"
cidr_blocks = ["0.0.0.0/0"]
}
}
# 最新のUbuntu 24.04 AMIを自動検索
data "aws_ami" "ubuntu" {
most_recent = true
owners = ["099720109477"] # Canonical公式
filter {
name = "name"
values = ["ubuntu/images/hvm-ssd-gp3/ubuntu-noble-24.04-amd64-server-*"]
}
}
# 💻EC2インスタンス(起動時にApacheを自動インストール)
resource "aws_instance" "web" {
ami = data.aws_ami.ubuntu.id
instance_type = "t3.micro"
vpc_security_group_ids = [aws_security_group.ctf_sg.id]
# OS起動時に流し込むスクリプト(Ansibleの簡易版のようなもの)
user_data = <<-EOF
#!/bin/bash
apt-get update
apt-get install -y apache2
systemctl start apache2
systemctl enable apache2
echo "Hello from Terraform! Your IP is protected.
" > /var/www/html/index.html
EOF
tags = {
Name = "terraform-ctf-web"
}
}
# 🚀構築完了後に、アクセス先のグローバルIPをターミナルに表示する
output "ec2_public_ip" {
value = aws_instance.web.public_ip
description = "Access this IP in your browser"
}
```
### ステップ3:魔法の3コマンドを実行する
ターミナルで以下の順番にコマンドを叩きます。
1. **`terraform init`**
* (裏側の準備。AWSと通信するためのプラグインをダウンロードします)
2. **`terraform plan`**
* (ドライラン。「今からEC2とSGを作るよ」という差分が緑色の `+` マークで表示されます。この安心感がIaCの強みです)
3. **`terraform apply`**
* (本当に実行します。`yes` と入力してエンターを押すと、約1分で構築が完了します)
完了すると、ターミナルの最後に `ec2_public_ip = "XXX.XXX.XXX.XXX"` と表示されます。
ブラウザでそのIPにアクセスして「Hello from Terraform!」が出れば成功です。スマホの回線など、許可されていない別のIPからアクセスすると絶対に繋がらない(Dropされる)ことも確認してみてください。
---
この感動を味わった後、「じゃあここにECS(コンテナ)を追加しよう」となった時に、コードを書き足して再度 `terraform apply` を叩くだけで、**既存のEC2は壊さずにECSだけがスッと追加される**のがTerraformの真骨頂です。
手元のPCへの「AWS CLI」と「Terraform」のインストールはスムーズにできそうでしょうか?もしOSごとのコマンド等で不明点があればサポートします!