俺のアウトプット

調べたこと、試したことを書きます

シンプルなネットワークとサーバーをCloudFormationで構築する 〜1. ネットワーク構築〜

新規にVPCを作成して、Webサーバーを公開するテンプレートを作成します。
今回は、パブリックサブネット内に1つのWebサーバーを立てる、シンプルな構成とします。(APサーバー、DBサーバーは無し)

f:id:kitsugi:20180819161411p:plain

テンプレートを目的ごとに分けます。

  1. ネットワーク構築
  2. セキュリティ設定
  3. サーバー構築

今回は、ネットワーク構築についてです。

ネットワーク構築用のテンプレート

作成したテンプレートは以下になります。

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

f:id:kitsugi:20180819161535p:plain

2. サブネットの作成

作成したVPC内にサブネットを作成します。 パラメータのサブネット CIDRブロックを指定します。
この時、デフォルトのルートテーブルが作成されます。 デフォルトのルートテーブルは、宛先がVPC内のみで、それ以外のパケットは破棄されます。

  Subnet:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId: !Ref VPC
      CidrBlock: !Ref SubnetCidr

f:id:kitsugi:20180819170840p:plain

3. インターネットゲートウェイの作成と割り当て

VPCがインターネットとやり取りできるように、まずはインターネットゲートウェイを作成し、VPCに割り当てます。

  InternetGateway:
    Type: AWS::EC2::InternetGateway
  AttachGateway:
    Type: AWS::EC2::VPCGatewayAttachment
    Properties:
      VpcId: !Ref VPC
      InternetGatewayId: !Ref InternetGateway

f:id:kitsugi:20180819170858p:plain

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

f:id:kitsugi:20180819170922p:plain

出力

後続のテンプレート用にリソースIDをエクスポートします。

パラメータ 説明
VPC VPC IDの参照用に、エクスポート名を {プロジェクトコード}-vpc にします。
Subnet サブネットIDの参照用に、エクスポート名を {プロジェクトコード}-subnet にします。

スタック間の連携については、下記のエントリを参照してください。 oreout.hatenablog.com

スタックの作成

ではスタックを作成してみましょう。

スタックの名前、パラメータを指定します。

f:id:kitsugi:20180819173734p:plain

スタック作成完了後に、出力を確認します。

f:id:kitsugi:20180819174229p:plain

サービス [ネットワーキング & コンテンツ配信] - [VPC] を選択し、各リソースが作成されていることを確認します。

  • VPC
  • サブネット
  • ルートテーブル
  • インターネットゲートウェイ

参考