aws-cloudformation-vpc について
CloudFormation で VPC 基盤を構築するためのスキルです。サブネットやルーティング、公私の接続を設計し、後続スタック向けに安定した出力を用意できます。
主な機能
- 01VPC とサブネットの CIDR 計画
- 02インターネットゲートウェイと NAT の設定
- 03ルートとサブネット関連付けの設定
- 04AWS サービス向け VPC エンドポイントの追加
- 05他のスタック向けネットワーク識別子の出力
活用シーン
- 01アプリケーションまたは共有基盤の VPC 作成
- 02パブリック/プライベートサブネットのルーティング設定
- 03AWS サービスへのプライベートアクセス設定
- 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. コアネットワークリソースを段階的に構築する
次の順序でスタックを作成します。
- VPC とサブネット
- パブリックのインバウンドおよびアウトバウンド通信用のインターネットゲートウェイ
- プライベートサブネットでアウトバウンドのインターネットアクセスが必要な場合は NAT ゲートウェイ
- ルートテーブルとサブネットの関連付け
- 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.mdreferences/reference.md