背景
AWSコンソールでのEC2構築は再現性に課題があるため、CloudFormationでコード化しました。VSCode + AWS CLIで、テンプレート作成からデプロイ、セキュリティグループの絞り込みまでを一通り試した記録です。
1. AMI IDをSSM Parameter Storeから自動取得する
AMI IDを手動で調べてハードコードする代わりに、SSM Parameter Store経由で最新のAmazon Linux 2023 AMIを自動取得できます。
Parameters:
LatestAmiId:
Type: AWS::SSM::Parameter::Value<AWS::EC2::Image::Id>
Default: /aws/service/ami-amazon-linux-latest/al2023-ami-kernel-default-x86_64
Resources側では単に ImageId: !Ref LatestAmiId と参照するだけで、常に最新のAMIが使われます。
2. IAMロールはSSM接続用の最小権限で十分
キーペアなしでもブラウザから接続できるSession Manager用に、マネージドポリシー1つをアタッチするだけです。
EC2Role:
Type: AWS::IAM::Role
Properties:
AssumeRolePolicyDocument:
Version: '2012-10-17'
Statement:
- Effect: Allow
Principal:
Service: ec2.amazonaws.com
Action: 'sts:AssumeRole'
ManagedPolicyArns:
- arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore
3. スタック作成・確認・削除の一連のコマンド
# 作成
aws cloudformation create-stack \
--stack-name ec2-test-stack \
--template-body file://template.yaml \
--region ap-northeast-1 \
--capabilities CAPABILITY_IAM
# 進行状況の確認
aws cloudformation describe-stacks \
--stack-name ec2-test-stack \
--query "Stacks[0].StackStatus" \
--output text
# Outputsの取得
aws cloudformation describe-stacks \
--stack-name ec2-test-stack \
--query "Stacks[0].Outputs" \
--output table
# 削除
aws cloudformation delete-stack --stack-name ec2-test-stack
CAPABILITY_IAMを付け忘れるとIAMロール作成のところでエラーになるので注意です。
4. デプロイ後にセキュリティグループを自分のIPだけに絞る
初期状態は0.0.0.0/0(全公開)なので、動作確認後は自分のIPに制限します。
# 自分のIPを確認
curl https://checkip.amazonaws.com/
# 既存のフルオープンルールを削除
aws ec2 revoke-security-group-ingress \
--group-id $SG_ID \
--ip-permissions IpProtocol=tcp,FromPort=22,ToPort=22,IpRanges='[{CidrIp=0.0.0.0/0}]'
# 自分のIPで許可を追加
aws ec2 authorize-security-group-ingress \
--group-id $SG_ID \
--ip-permissions IpProtocol=tcp,FromPort=22,ToPort=22,IpRanges="[{CidrIp=$MY_IP,Description='My IP only'}]"
5. ハマったポイント
| 症状 | 原因 | 対処 |
|---|---|---|
スタック作成がCREATE_FAILED
|
キーペアが存在しない |
aws ec2 describe-key-pairsで存在確認 |
User is not authorized to perform: iam:CreateRole |
IAM権限不足 | IAM権限を持つユーザーで実行 |
| SSH接続できない | SGに自分のIPが許可されていない |
describe-security-groupsで確認 |
| Webページが表示されない | UserDataのApacheインストールがまだ完了していない |
cloud-init-output.logで進捗確認、通常2〜3分で完了 |
まとめ
CloudFormationでEC2をコード化することで、再現性のある構築・削除が可能になりました。テンプレート全文や、キーペア作成の前提手順を含めた全体の流れはこちらにまとめています。