mcpField
A
aws-cloudformation-vpc

aws-cloudformation-vpc

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

aws-cloudformation-vpc について

CloudFormation で VPC 基盤を構築するためのスキルです。サブネットやルーティング、公私の接続を設計し、後続スタック向けに安定した出力を用意できます。

主な機能

  1. 01VPC とサブネットの CIDR 計画
  2. 02インターネットゲートウェイと NAT の設定
  3. 03ルートとサブネット関連付けの設定
  4. 04AWS サービス向け VPC エンドポイントの追加
  5. 05他のスタック向けネットワーク識別子の出力

活用シーン

  1. 01アプリケーションまたは共有基盤の VPC 作成
  2. 02パブリック/プライベートサブネットのルーティング設定
  3. 03AWS サービスへのプライベートアクセス設定
  4. 04他のスタックへのサブネット識別子提供

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/giuseppe-trisciuoglio/developer-kit --skill aws-cloudformation-vpc

インストール後、Claude Code で/aws-cloudformation-vpcを入力して読み込まれたか確認します。

同梱ファイルreferences/examples.mdreferences/reference.md

詳細

AWS CloudFormation VPC インフラストラクチャ

概要

読みやすく、再利用可能で、安全に進化させられる CloudFormation の VPC 基盤を構築します。パブリックおよびプライベートのワークロード向けに、予測可能な接続性を備えた明確なサブネットとルーティングのモデルを提供します。また、下流のスタックがネットワークロジックを重複させずに利用できる出力も提供します。

大規模なテンプレートやサービスの組み合わせについては、references/ ファイルを使用してください。

使用する場面

  • アプリケーションまたは共有プラットフォーム用の新しい VPC スタックを作成する場合
  • 1 つ以上のアベイラビリティーゾーンにパブリックおよびプライベートのサブネットを追加する場合
  • インターネットアクセス、NAT によるアウトバウンド通信、またはプライベートエンドポイントを設定する場合
  • 他のスタック向けに、VPC、サブネット、ルートテーブル、およびセキュリティグループ関連の識別子をエクスポートする場合
  • ECS、EKS、Lambda、EC2、または RDS のスタック向けに再利用可能なインフラストラクチャを準備する場合

手順

1. アドレス計画から始める

リソースを記述する前に、次の項目を定義します。

  • VPC の CIDR 範囲
  • アベイラビリティーゾーンの数
  • パブリック、プライベート、分離サブネットの範囲
  • インターネットからのインバウンド通信、NAT によるアウトバウンド通信、またはプライベートな AWS サービスアクセスのみを必要とするワークロード

これにより、ルートテーブルの増殖や、後々のサブネット置換に伴う困難を防げます。

2. コアネットワークリソースを段階的に構築する

次の順序でスタックを作成します。

  1. VPC とサブネット
  2. パブリックのインバウンドおよびアウトバウンド通信用のインターネットゲートウェイ
  3. プライベートサブネットでアウトバウンドのインターネットアクセスが必要な場合は NAT ゲートウェイ
  4. ルートテーブルとサブネットの関連付け
  5. AWS サービスへのプライベートアクセス用のオプションの VPC エンドポイント

テンプレート内で各段階を簡単に確認できるようにし、関連のないアプリケーションリソースを同じスタックに混在させないでください。

3. 環境によって変わる値だけをパラメーター化する

有用なパラメーターの例:

  • 環境名
  • VPC CIDR とサブネット CIDR
  • AZ の数、またはネストされたスタックを使用する場合は明示的なサブネット ID
  • オプションのエンドポイントや NAT の構成に関するフラグ

環境間で大きく変わらない限り、すべてのルートやタグをパラメーター化しないでください。

4. 利用側が本当に必要とするものだけをエクスポートする

一般的な出力:

  • VPC ID
  • パブリック、プライベート、分離サブネットの ID
  • 下流のスタックでルートを関連付ける必要がある場合はルートテーブル ID
  • 他のスタックで使用する場合に限り、セキュリティ境界またはプレフィックスリストへの参照

安定した出力により、アプリケーションスタックの構成や移行が容易になります。

5. デプロイ前に検証する

テンプレートを検証し、ルーティングを確認するには、次のコマンドを実行します。

# Validate CloudFormation template syntax
aws cloudformation validate-template --template-body file://vpc.yaml

# Review change set before applying
aws cloudformation create-change-set \
  --stack-name my-vpc \
  --template-body file://vpc.yaml \
  --change-set-type CREATE

# Verify route table associations
aws ec2 describe-route-tables \
  --filters "Name=vpc-id,Values=<vpc-id>"

# Check subnet to route table mappings
aws ec2 describe-route-tables \
  --filters "Name=association.subnet-id,Values=<subnet-id>"

# Verify internet gateway attachment
aws ec2 describe-internet-gateways \
  --filters "Name=attachment.vpc-id,Values=<vpc-id>"

例

例 1:ルーティングを備えた完全な 2 層 VPC

このテンプレートは、パブリックおよびプライベートサブネット、インターネットゲートウェイ、NAT ゲートウェイ、および適切に設定されたルートテーブルを備えた VPC を作成します。

AWSTemplateFormatVersion: "2010-09-09"
Description: "Two-tier VPC with public and private subnets"

Resources:
  # VPC
  MainVpc:
    Type: AWS::EC2::VPC
    Properties:
      CidrBlock: 10.0.0.0/16
      EnableDnsHostnames: true
      EnableDnsSupport: true
      Tags:
        - Key: Name
          Value: !Sub "${AWS::StackName}-main"

  # Internet Gateway
  InternetGateway:
    Type: AWS::EC2::InternetGateway
    Properties:
      Tags:
        - Key: Name
          Value: !Sub "${AWS::StackName}-igw"

  # Attach IGW to VPC
  GatewayToInternet:
    Type: AWS::EC2::VPCGatewayAttachment
    Properties:
      VpcId: !Ref MainVpc
      InternetGatewayId: !Ref InternetGateway

  # Public Subnet (AZ 1)
  PublicSubnetA:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId: !Ref MainVpc
      CidrBlock: 10.0.1.0/24
      AvailabilityZone: !Select [0, !GetAZs ""]
      MapPublicIpOnLaunch: true
      Tags:
        - Key: Name
          Value: !Sub "${AWS::StackName}-public-a"

  # Private Subnet (AZ 1)
  PrivateSubnetA:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId: !Ref MainVpc
      CidrBlock: 10.0.11.0/24
      AvailabilityZone: !Select [0, !GetAZs ""]
      Tags:
        - Key: Name
          Value: !Sub "${AWS::StackName}-private-a"

  # Elastic IP for NAT Gateway
  NatEip:
    Type: AWS::EC2::EIP
    DependsOn: GatewayToInternet
    Properties:
      Domain: vpc

  # NAT Gateway
  NatGateway:
    Type: AWS::EC2::NatGateway
    Properties:
      SubnetId: !Ref PublicSubnetA
      AllocationId: !GetAtt NatEip.AllocationId

  # Public Route Table
  PublicRouteTable:
    Type: AWS::EC2::RouteTable
    Properties:
      VpcId: !Ref MainVpc
      Tags:
        - Key: Name
          Value: !Sub "${AWS::StackName}-public-rt"

  # Default route to IGW
  PublicDefaultRoute:
    Type: AWS::EC2::Route
    DependsOn: GatewayToInternet
    Properties:
      RouteTableId: !Ref PublicRouteTable
      DestinationCidrBlock: 0.0.0.0/0
      GatewayId: !Ref InternetGateway

  # Associate public subnet
  PublicSubnetARouteTableAssociation:
    Type: AWS::EC2::SubnetRouteTableAssociation
    Properties:
      SubnetId: !Ref PublicSubnetA
      RouteTableId: !Ref PublicRouteTable

  # Private Route Table
  PrivateRouteTable:
    Type: AWS::EC2::RouteTable
    Properties:
      VpcId: !Ref MainVpc
      Tags:
        - Key: Name
          Value: !Sub "${AWS::StackName}-private-rt"

  # Default route via NAT Gateway
  PrivateDefaultRoute:
    Type: AWS::EC2::Route
    Properties:
      RouteTableId: !Ref PrivateRouteTable
      DestinationCidrBlock: 0.0.0.0/0
      NatGatewayId: !Ref NatGateway

  # Associate private subnet
  PrivateSubnetARouteTableAssociation:
    Type: AWS::EC2::SubnetRouteTableAssociation
    Properties:
      SubnetId: !Ref PrivateSubnetA
      RouteTableId: !Ref PrivateRouteTable

Outputs:
  VpcId:
    Description: VPC ID
    Value: !Ref MainVpc
    Export:
      Name: !Sub "${AWS::StackName}-VpcId"

  PublicSubnetA:
    Description: Public subnet AZ1
    Value: !Ref PublicSubnetA
    Export:
      Name: !Sub "${AWS::StackName}-PublicSubnetA"

  PrivateSubnetA:
    Description: Private subnet AZ1
    Value: !Ref PrivateSubnetA
    Export:
      Name: !Sub "${AWS::StackName}-PrivateSubnetA"

  PublicRouteTableId:
    Description: Public route table ID
    Value: !Ref PublicRouteTable
    Export:
      Name: !Sub "${AWS::StackName}-PublicRouteTableId"

  PrivateRouteTableId:
    Description: Private route table ID
    Value: !Ref PrivateRouteTable
    Export:
      Name: !Sub "${AWS::StackName}-PrivateRouteTableId"
例 2:S3 へのプライベートアクセス用 VPC エンドポイント
Resources:
  # S3 VPC Endpoint
  S3Endpoint:
    Type: AWS::EC2::VPCEndpoint
    Properties:
      VpcId: !Ref MainVpc
      ServiceName: !Sub "com.amazonaws.${AWS::Region}.s3"
      RouteTableIds:
        - !Ref PrivateRouteTable
      VpcEndpointType: Gateway

ベストプラクティス

  • パブリック、プライベート、分離サブネットの用途を、名前とタグで明示する
  • 予算が許す場合は、本番環境の耐障害性を高めるために AZ ごとに 1 つの NAT ゲートウェイを使用する
  • AWS サービスへのアクセスに不要な NAT トラフィックを減らすため、VPC エンドポイントを使用する
  • 他の場所でネットワークに関する前提を再作成せずに済むよう、ネットワークスタックから VPC とサブネットの識別子をエクスポートする
  • ルートやサブネットの変更は広範囲に影響する可能性があるため、依存するスタックとともにネットワークの変更を確認する
  • ルートスキルは主要な内容に絞り、大規模なネットワーク構成は references/examples.md に移す

制約事項と警告

  • NAT ゲートウェイには時間単位の料金とデータ転送料金がかかります。AWS サービスへのアクセスには VPC エンドポイントを検討してください
  • CIDR の重複があると、ピアリング、トランジット、将来的なネットワーク拡張が妨げられます
  • テンプレートが有効でも、ルートテーブルやサブネットの置換によってトラフィックが中断する場合があります
  • エンドポイントのクォータ、AZ の利用可否、サービス固有のサブネット要件はリージョンによって異なります
  • アベイラビリティーゾーンをハードコードすると、アカウントやリージョン間の移植性が低下する可能性があります

参考資料

  • references/examples.md
  • references/reference.md

コメント