シンプルなネットワークとサーバーをCloudFormationで構築する 〜1. ネットワーク構築〜
新規にVPCを作成して、Webサーバーを公開するテンプレートを作成します。
今回は、パブリックサブネット内に1つのWebサーバーを立てる、シンプルな構成とします。(APサーバー、DBサーバーは無し)
テンプレートを目的ごとに分けます。
- ネットワーク構築
- セキュリティ設定
- サーバー構築
今回は、ネットワーク構築についてです。
ネットワーク構築用のテンプレート
作成したテンプレートは以下になります。
network.template.yaml
AWSTemplateFormatVersion: 2010-09-09 Parameters: ProjectCode: Type: String Description: Enter your project code VPCCidr: Type: String Description: IP Address range for the VPN connected VPC ConstraintDescription: must be a valid IP CIDR range of the form x.x.x.x/x. MinLength: 9 MaxLength: 18 Default: 10.0.0.0/16 AllowedPattern: (\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})/(\d{1,2}) SubnetCidr: Type: String Description: IP Address range for the VPN connected Subnet ConstraintDescription: must be a valid IP CIDR range of the form x.x.x.x/x. MinLength: 9 MaxLength: 18 Default: 10.0.1.0/24 AllowedPattern: (\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})/(\d{1,2}) Resources: VPC: Type: AWS::EC2::VPC Properties: CidrBlock: !Ref VPCCidr Tags: - Key: Name Value: !Ref ProjectCode Subnet: Type: AWS::EC2::Subnet Properties: VpcId: !Ref VPC CidrBlock: !Ref SubnetCidr Tags: - Key: Name Value: !Ref ProjectCode InternetGateway: Type: AWS::EC2::InternetGateway Properties: Tags: - Key: Name Value: !Ref ProjectCode AttachGateway: Type: AWS::EC2::VPCGatewayAttachment Properties: VpcId: !Ref VPC InternetGatewayId: !Ref InternetGateway RouteTable: Type: AWS::EC2::RouteTable Properties: VpcId: !Ref VPC Tags: - Key: Name Value: !Ref ProjectCode Route: Type: AWS::EC2::Route DependsOn: AttachGateway Properties: RouteTableId: !Ref RouteTable DestinationCidrBlock: 0.0.0.0/0 GatewayId: !Ref InternetGateway SubnetRouteTableAssociation: Type: AWS::EC2::SubnetRouteTableAssociation Properties: SubnetId: !Ref Subnet RouteTableId: !Ref RouteTable Outputs: VPC: Description: VPCId of the newly created VPC Value: !Ref VPC Export: Name: !Sub ${ProjectCode}-vpc Subnet: Description: SubnetId of the VPN connected subnet Value: !Ref Subnet Export: Name: !Sub ${ProjectCode}-subnet
パラメータ
パラメータを3つ用意しました。
パラメータ | 説明 |
---|---|
ProjectCode | プロジェクトコードを指定します。 各リソースの名前とテンプレート連携(クロススタック参照)で利用します。 |
VPCCidr | VPC用のCIDRブロックを指定します。 デフォルトは 10.0.0.0/16 です。 |
SubnetCidr | サブネット用のCIDRブロックを指定します。 デフォルトは 10.0.1.0/24 です。 |
リソース
リソースのプロパティは最低限に留めています。オプション項目は公式ドキュメントを参照してください。
1. VPCの作成
選択しているリージョンに、新しいVirtual Private Cloud (VPC) を作成します。 パラメータのVPC CIDRブロックを指定します。
VPC: Type: AWS::EC2::VPC Properties: CidrBlock: !Ref VPCCidr
2. サブネットの作成
作成したVPC内にサブネットを作成します。
パラメータのサブネット CIDRブロックを指定します。
この時、デフォルトのルートテーブルが作成されます。
デフォルトのルートテーブルは、宛先がVPC内のみで、それ以外のパケットは破棄されます。
Subnet: Type: AWS::EC2::Subnet Properties: VpcId: !Ref VPC CidrBlock: !Ref SubnetCidr
3. インターネットゲートウェイの作成と割り当て
VPCがインターネットとやり取りできるように、まずはインターネットゲートウェイを作成し、VPCに割り当てます。
InternetGateway: Type: AWS::EC2::InternetGateway AttachGateway: Type: AWS::EC2::VPCGatewayAttachment Properties: VpcId: !Ref VPC InternetGatewayId: !Ref InternetGateway
4. ルートテーブルの作成と設定、割り当て
インターネットと接続するためには、ルートテーブルに宛先にインターネットゲートウェイを追加する必要があります。 デフォルトのルートテーブルに追加すると他に影響が出る場合があるため、新規にルートテーブルを作成・設定し、サブネットに割り当てます。
RouteTable: Type: AWS::EC2::RouteTable Properties: VpcId: !Ref VPC Route: Type: AWS::EC2::Route DependsOn: AttachGateway Properties: RouteTableId: !Ref RouteTable DestinationCidrBlock: 0.0.0.0/0 GatewayId: !Ref InternetGateway SubnetRouteTableAssociation: Type: AWS::EC2::SubnetRouteTableAssociation Properties: SubnetId: !Ref Subnet RouteTableId: !Ref RouteTable
出力
後続のテンプレート用にリソースIDをエクスポートします。
パラメータ | 説明 |
---|---|
VPC | VPC IDの参照用に、エクスポート名を {プロジェクトコード}-vpc にします。 |
Subnet | サブネットIDの参照用に、エクスポート名を {プロジェクトコード}-subnet にします。 |
スタック間の連携については、下記のエントリを参照してください。 oreout.hatenablog.com
スタックの作成
ではスタックを作成してみましょう。
スタックの名前、パラメータを指定します。
スタック作成完了後に、出力を確認します。
サービス [ネットワーキング & コンテンツ配信] - [VPC] を選択し、各リソースが作成されていることを確認します。
- VPC
- サブネット
- ルートテーブル
- インターネットゲートウェイ