mcpField
A
aws-cloudformation-ec2

aws-cloudformation-ec2

github.com/giuseppe-trisciuoglioクラウド・DevOps36565 回インストール7 週間前に更新
リポジトリ

aws-cloudformation-ec2 について

AWS CloudFormation で EC2 インフラを定義するスキルです。クラウドエンジニア向けに、インスタンス、セキュリティグループ、IAM ロール、ロードバランサー、再利用可能なスタックテンプレートを扱います。

主な機能

  1. 01EC2 インスタンスと SPOT の設定
  2. 02セキュリティグループと IAM ロール
  3. 03ALB、ターゲットグループ、リスナー
  4. 04パラメーター、条件、スタック間参照
  5. 05テンプレート検証と変更セット

活用シーン

  1. 01CloudFormation で EC2 スタックを作成
  2. 02インスタンスにセキュリティグループと IAM 権限を設定
  3. 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.md
constraints.md
ec2-instances.md
examples.md
load-balancers.md
reference.md
security-iam.md
template-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 を参照してください。

コメント