aws-cloudformation-ec2 について
AWS CloudFormation で EC2 インフラを定義するスキルです。クラウドエンジニア向けに、インスタンス、セキュリティグループ、IAM ロール、ロードバランサー、再利用可能なスタックテンプレートを扱います。
主な機能
- 01EC2 インスタンスと SPOT の設定
- 02セキュリティグループと IAM ロール
- 03ALB、ターゲットグループ、リスナー
- 04パラメーター、条件、スタック間参照
- 05テンプレート検証と変更セット
活用シーン
- 01CloudFormation で EC2 スタックを作成
- 02インスタンスにセキュリティグループと IAM 権限を設定
- 03ALB でアプリケーションのトラフィックを分配
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ giuseppe-trisciuoglio/ developer-kit --skill aws-cloudformation-ec2インストール後、Claude Code で/aws-cloudformation-ec2を入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
references/best-practices.mdconstraints.mdec2-instances.mdexamples.mdload-balancers.mdreference.mdsecurity-iam.mdtemplate-structure.md詳細
AWS CloudFormation EC2 インフラストラクチャ
概要
AWS CloudFormation テンプレートを使用して、本番環境に対応した EC2 インフラストラクチャを作成します。EC2 インスタンス(オンデマンドおよび SPOT)、セキュリティグループ、IAM ロール、Application Load Balancer(ALB)、テンプレート構造、パラメーター、出力、スタック間参照を扱います。
使用する場面
- セキュリティグループと IAM ロールを使用して EC2 インスタンス(オンデマンドまたは SPOT)を作成する場合
- ターゲットグループを使用して Application Load Balancer を設定する場合
- テンプレートの Parameters、Mappings、Conditions、スタック間参照を実装する場合
手順
ステップ 1 — テンプレートパラメーターを定義する
AWS 固有のパラメータータイプを使用して、検証とコンソールのドロップダウンに対応します。
Parameters:
LatestAmiId:
Type: AWS::SSM::Parameter::Value<AWS::EC2::Image::Id>
Default: /aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2
InstanceType:
Type: AWS::EC2::InstanceType
Default: t3.micro
AllowedValues: [t3.micro, t3.small, t3.medium]
KeyName:
Type: AWS::EC2::KeyPair::KeyName
高度なパラメーターパターン、マッピング、条件、スタック間参照については、template-structure.md を参照してください。
ステップ 2 — セキュリティグループを作成する
ネットワークアクセスのインバウンド/アウトバウンドルールを定義します。
InstanceSecurityGroup:
Type: AWS::EC2::SecurityGroup
Properties:
GroupDescription: Security group for EC2 instance
VpcId: !Ref VpcId
SecurityGroupIngress:
- IpProtocol: tcp
FromPort: 80
ToPort: 80
CidrIp: 0.0.0.0/0
- IpProtocol: tcp
FromPort: 22
ToPort: 22
CidrIp: 10.0.0.0/16
高度なセキュリティグループパターン、自己参照、IAM ロールについては、security-iam.md を参照してください。
ステップ 3 — IAM ロールを設定する
最小権限のアクセス許可を持つインスタンスプロファイルを定義します。
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
Ec2InstanceProfile:
Type: AWS::IAM::InstanceProfile
Properties:
Roles: [!Ref Ec2Role]
最小権限ポリシー、SSM ロール、信頼ポリシーについては、security-iam.md を参照してください。
ステップ 4 — EC2 インスタンスを起動する
セキュリティグループ、IAM ロール、ユーザーデータを使用してインスタンスを設定します。
Ec2Instance:
Type: AWS::EC2::Instance
Properties:
ImageId: !Ref LatestAmiId
InstanceType: !Ref InstanceType
KeyName: !Ref KeyName
SecurityGroupIds: [!Ref InstanceSecurityGroup]
IamInstanceProfile: !Ref Ec2InstanceProfile
SubnetId: !Ref SubnetId
UserData:
Fn::Base64: |
#!/bin/bash
yum update -y
yum install -y httpd
systemctl start httpd
Tags:
- Key: Name
Value: !Sub ${AWS::StackName}-instance
複数ボリュームの構成、詳細なモニタリング、SPOT インスタンス、スタック全体の例については、ec2-instances.md を参照してください。
テンプレートを検証します: aws cloudformation validate-template --template-body file://template.yaml
ステップ 5 — Application Load Balancer を追加する
トラフィックを分散するため、ターゲットグループとリスナーを備えた ALB を作成します。
ApplicationLoadBalancer:
Type: AWS::ElasticLoadBalancingV2::LoadBalancer
Properties:
Name: !Sub ${AWS::StackName}-alb
Scheme: internet-facing
SecurityGroups: [!Ref AlbSecurityGroup]
Subnets: [!Ref PublicSubnet1, !Ref PublicSubnet2]
ApplicationTargetGroup:
Type: AWS::ElasticLoadBalancingV2::TargetGroup
Properties:
Port: 80
Protocol: HTTP
VpcId: !Ref VpcId
HealthCheckPath: /health
ApplicationListener:
Type: AWS::ElasticLoadBalancingV2::Listener
Properties:
DefaultActions:
- Type: forward
TargetGroupArn: !Ref ApplicationTargetGroup
LoadBalancerArn: !Ref ApplicationLoadBalancer
Port: 80
Protocol: HTTP
HTTPS の設定、パスベースのルーティング、ホストベースのルーティング、リスナールール、ALB 属性については、load-balancers.md を参照してください。
ステップ 6 — 出力を定義する
スタック間参照用の値をエクスポートします。
Outputs:
InstanceId:
Description: EC2 Instance ID
Value: !Ref Ec2Instance
Export:
Name: !Sub ${AWS::StackName}-InstanceId
SecurityGroupId:
Description: Security Group ID
Value: !Ref InstanceSecurityGroup
Export:
Name: !Sub ${AWS::StackName}-SecurityGroupId
LoadBalancerDnsName:
Description: ALB DNS Name
Value: !GetAtt ApplicationLoadBalancer.DNSName
スタック間参照のパターンとインポート/エクスポートの方法については、template-structure.md を参照してください。
例
ALB を使用した最小構成の EC2 テンプレート
AWSTemplateFormatVersion: "2010-09-09"
Description: EC2 instance with ALB
Parameters:
LatestAmiId:
Type: AWS::SSM::Parameter::Value<AWS::EC2::Image::Id>
Default: /aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2
InstanceType:
Type: AWS::EC2::InstanceType
Default: t3.micro
Resources:
InstanceSecurityGroup:
Type: AWS::EC2::SecurityGroup
Properties:
GroupDescription: Enable HTTP and SSH
SecurityGroupIngress:
- IpProtocol: tcp
FromPort: 80
ToPort: 80
CidrIp: 0.0.0.0/0
Ec2Instance:
Type: AWS::EC2::Instance
Properties:
ImageId: !Ref LatestAmiId
InstanceType: !Ref InstanceType
SecurityGroupIds: [!Ref InstanceSecurityGroup]
LoadBalancer:
Type: AWS::ElasticLoadBalancingV2::LoadBalancer
Properties:
Scheme: internet-facing
SecurityGroups: [!Ref InstanceSecurityGroup]
Subnets: [subnet-12345678, subnet-87654321]
Outputs:
InstanceId:
Value: !Ref Ec2Instance
LoadBalancerDns:
Value: !GetAtt LoadBalancer.DNSName
変更セットを使用してデプロイする
# Create change set
aws cloudformation create-change-set \
--stack-name my-ec2-stack \
--template-body file://template.yaml \
--change-set-type CREATE
# Execute after review
aws cloudformation execute-change-set \
--change-set-name <change-set-name>
本番環境に対応したテンプレート全体の例については、examples.md を参照してください。
ベストプラクティス
テンプレート構造
- AWS 固有のパラメータータイプを使用します(
AWS::EC2::VPC::Id、AWS::EC2::InstanceType)検証に活用できます - ライフサイクルごとに整理します - ネットワーク、セキュリティ、アプリケーションのスタックを分けます
- 意味のある名前を使用します
AWS::StackNameのプレフィックスを付けます - 本番環境のスタックでは終了保護を有効にします
セキュリティ
- IAM ロールに最小権限を適用します - 必要最小限のアクセス許可を付与します
- 可能な場合は IP アドレスの代わりにセキュリティグループ参照を使用します
- すべての EC2 インスタンスで IMDSv2 を有効にします
- セキュリティグループのルールを特定の CIDR ブロックに制限します
コストと可用性
- 障害に強く、中断可能なワークロードには SPOT インスタンスを使用します
- 高可用性を実現するため、複数の AZ にデプロイします
- CPU とステータスチェックの CloudWatch アラームを設定します
- コスト効率の高いストレージには EBS gp3 ボリュームを使用します
運用
- 本番環境のスタックを更新する際は、必ず変更セットを使用します
- テンプレートへの準拠を維持するため、ドリフト検出を有効にします
- 重要なリソースを保護するため、スタックポリシーを適用します
- デプロイ前に
aws cloudformation validate-templateでテンプレートを検証します
スタックポリシー、終了保護、ドリフト検出、変更セットの自動化、検証スクリプトに関する詳しいガイダンスは、best-practices.md を参照してください。
参考資料
コア設定
- template-structure.md — テンプレートのセクション、パラメーター、マッピング、条件、出力、スタック間の参照
- ec2-instances.md — EC2 インスタンス、スポットフリート、複数ボリューム構成、スタック全体の例
- security-iam.md — セキュリティグループ、IAM ロール、インスタンスプロファイル、最小権限ポリシー
- load-balancers.md — ALB の設定、ターゲットグループ、リスナー、パスベースのルーティング、HTTPS
運用ガイド
- best-practices.md — スタックポリシー、削除保護、ドリフト検出、変更セット、検証
- constraints.md — リソース制限、インスタンスの制約、コストに関する考慮事項、一般的な問題、モニタリング
その他のリソース
- examples.md — 本番環境ですぐに使える完全な例とユースケース
- reference.md — CloudFormation EC2 リソースのリファレンスドキュメント
制約と警告
リソース制限
- CloudFormation スタックあたりのリソース数は最大 500 個です
- VPC あたりのセキュリティグループ数は最大 500 個です
- インスタンスタイプの提供状況は、リージョンや AZ によって異なります
コストに関する考慮事項
- EC2 インスタンスは実行中に料金が発生します
- EBS ボリュームはアタッチされていない場合でも、GB 月単位で料金が発生します
- ALB には時間単位の料金と LCU データ処理料金が発生します
- アタッチされていない Elastic IP には時間単位の料金が発生します
セキュリティに関する考慮事項
- キーペアを紛失すると復元できません
- インスタンスプロファイルのロールは作成後に変更できません
- IMDSv1 にはセキュリティ上の脆弱性があるため、IMDSv2 を使用してください
- スポットインスタンスは 2 分前の通知で終了される場合があります
制約、トラブルシューティングガイド、モニタリングの設定について詳しくは、constraints.md を参照してください。