背景
EC2上にApacheを構築するハンズオンをコンソールで実施しました。キーペア・IAMロール・セキュリティグループ・EC2インスタンスという4リソースには依存関係があり、順番を間違えると詰まります。
1. 依存関係の順序
① キーペア作成(EC2起動時に指定するため先に必要)
② IAMロール作成(EC2起動時にインスタンスプロファイルとして指定)
③ EC2起動(②までのリソースを組み合わせて起動)
EC2インスタンスの起動画面で、キーペアとIAMロールを選択する項目があるため、この2つは先に作成しておく必要があります。逆に言えば、この順序さえ守れば残りはEC2起動画面内でセキュリティグループ・UserDataも含めて一括設定できます。
2. UserDataは初回起動時のみ実行されるシェルスクリプト
#!/bin/bash
yum update -y
yum install -y httpd
systemctl start httpd
systemctl enable httpd
echo "<h1>Hello from Amazon Linux 2023!</h1>" > /var/www/html/index.html
echo "<p>Instance ID: $(ec2-metadata --instance-id | cut -d ' ' -f 2)</p>" >> /var/www/html/index.html
「高度な詳細」の一番下にあるUserData欄にこのスクリプトを貼り付けるだけで、EC2起動と同時にApacheのインストール・起動・自動起動設定までが自動化されます。ec2-metadataコマンドでインスタンスIDやAZを取得し、動的にHTMLへ埋め込んでいる点もポイントです。
3. セキュリティグループは/32で自分のIPだけに絞る
ソース: 203.0.113.1/32
/32は「このIPアドレス1つだけ」を意味するCIDR表記です。0.0.0.0/0(全世界に開放)はハンズオンであっても避け、SSH・HTTPともに自分のIPだけに制限するのが基本です。
4. 接続元IPが一致しない場合は$SSH_CLIENTで真のIPを確認する
# 一時的にSSHを0.0.0.0/0に開放してから接続し
echo $SSH_CLIENT
# 出力例: 203.0.113.1 17508 22 → 先頭の値が真の接続元IP
curl https://checkip.amazonaws.comで確認したIPと実際の接続元IPが、ISPやプロキシの経路によって一致しないケースがあります。この場合、一時的にSGを全開放してSSH接続し、EC2内から$SSH_CLIENT環境変数を見ることで「本当に接続してきているIP」を特定できます。確認後は必ずSGを/32に戻します。
5. 削除順序も依存関係の逆順
① EC2インスタンスを終了 → ② セキュリティグループ削除 → ③ IAMロール削除
セキュリティグループはEC2が使用中の間は削除できないため、必ずインスタンスの「終了済み」状態を待ってから削除する必要があります。
まとめ
キーペア→IAMロール→EC2起動という作成順序と、UserDataによる初期化自動化、この2点がEC2ハンズオンの基本パターンでした。CloudFormation版との作業時間比較(15-20分 vs 5分)は元記事にまとめています。