0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

CloudFormationでEC2 + Apacheを構築して、SGを自分のIPに絞るまで

0
Last updated at Posted at 2026-08-08

背景

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をコード化することで、再現性のある構築・削除が可能になりました。テンプレート全文や、キーペア作成の前提手順を含めた全体の流れはこちらにまとめています。

VSCodeとCloudFormationで学ぶAWS EC2構築(ブログ)

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?