frp_configuration_and_commands

TOML / Bash

ドメイン名の件、会社で相談して方針を決めるというのは完璧な判断(ベストプラクティス)です。
インフラのアーキテクチャは技術面だけでなく、会社のポリシーやコスト管理(クレジットカードの請求先など)と密接に絡むため、チームで握っておくのが一番安全です。

それでは、いよいよご自宅の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ごとのコマンド等で不明点があればサポートします!