俺のアウトプット

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

CloudFormationテンプレートのDeletionPolicy属性

Resourcesセクション内のリソース定義時に、DeletionPolicy属性を指定すると、リソースの削除方法を制御できます。

DeletionPolicy属性は、リソースのふるまいや関連性を制御するリソース属性の1つです。

リソース属性

  • CreationPolicy 属性
  • DeletionPolicy 属性 (これ)
  • DependsOn 属性
  • Metadata 属性
  • UpdatePolicy 属性

DeletionPolicy属性のオプション

  • Delete
    • リソースを削除する
  • Retain
    • スタック削除しても、対象のリソースを削除しない
    • 残ったリソースはCloudFormationの管理外
  • Snapshot
    • リソースを削除する前にスナップショット作成
    • 対応リソース
      • AWS::EC2::Volume
      • AWS::ElastiCache::CacheCluster
      • AWS::ElastiCache::ReplicationGroup
      • AWS::RDS::DBInstance
      • AWS::RDS::DBCluster
      • AWS::Redshift::Cluster

デフォルトの動作

DeletionPolicy属性は省略可能です。
省略した場合はリソースが削除されますが、一部のリソースタイプはデフォルトの動作が異なります。

リソースタイプ デフォルトの動作
AWS::RDS::DBCluster Snapshot
AWS::RDS::DBInstance Auroraエンジン用のDBClusterIdentifierプロパティ
・指定する:Delete
・指定しない:Snapshot
それ以外 Delete

サンプルテンプレート

Amazon RDSのDBインスタンスを作成するテンプレートです。 リソースタイプ AWS::RDS::DBInstance の DeletionPolicy属性にRetainを指定しています。

スタック作成時に

AWSTemplateFormatVersion: 2010-09-09
Parameters:
  DBUser:
    NoEcho: true
    Description: The database admin account username
    Type: String
    MinLength: 1
    MaxLength: 16
    AllowedPattern: '[a-zA-Z][a-zA-Z0-9]*'
    ConstraintDescription: must begin with a letter and contain only alphanumeric characters.
  DBPassword:
    NoEcho: true
    Description: The database admin account password
    Type: String
    MinLength: 8
    MaxLength: 41
    AllowedPattern: '[a-zA-Z0-9]*'
    ConstraintDescription: must contain only alphanumeric characters.
Resources:
  MyDB:
    Type: AWS::RDS::DBInstance
    Properties:
      DBName: MyDatabase
      AllocatedStorage: 5
      DBInstanceClass: db.t2.small
      Engine: MySQL
      MasterUsername: !Ref DBUser
      MasterUserPassword: !Ref DBPassword
    DeletionPolicy: Retain
Outputs:
  JDBCConnectionString:
    Description: JDBC connection string for the database
    Value: !Join 
      - ''
      - - 'jdbc:mysql://'
        - !GetAtt 
          - MyDB
          - Endpoint.Address
        - ':'
        - !GetAtt 
          - MyDB
          - Endpoint.Port
        - /MyDatabase

スタックを削除すると、RDSを削除しないため、一瞬で完了します。 (残ったRDSは削除してください)

f:id:kitsugi:20180827075330p:plain

AWS::RDS::DBInstanceの場合、DeletionPolicy属性を削除するとSnapshotとして動作します。 この場合、スナップショットが残っているのが確認できます。

f:id:kitsugi:20180827080149p:plain

参考

T3インスタンスの制限数

2018年8月現在、T3インスタンス(オンデマンド)の制限数を調べました。

リージョン nano micro small medium large xlarge 2xlarge
バージニア北部 10 10 10 7 5 3 3
オハイオ 10 10 6 4 3 2 1
北カリフォルニア 5 5 5 3 3 2 2
オレゴン 10 10 10 10 5 3 3
ムンバイ - - - - - - -
ソウル - - - - - - -
シンガポール 5 5 5 5 3 1 1
シドニー 5 5 5 5 3 2 2
東京 1 1 0 0 0 0 0
カナダ 7 7 5 5 5 3 1
フランクフルト 5 5 5 5 3 1 1
アイルランド 5 5 5 3 3 3 2
ロンドン 5 5 5 5 3 3 1
パリ - - - - - - -
サンパウロ 1 1 0 0 0 0 0

東京リージョンが少ないですね。。。
制限を超える場合は、上限緩和の申請をしましょう。

参考

せっかくだから、俺はこのT3インスタンスを選ぶぜ!

T3インスタンスがリリースされました。

aws.amazon.com

t2.microt3.microを比較してみます。 料金は東京リージョン、オンデマンド、Linux/UNIXの条件です。

t2.micro t3.micro
vCPU 1 2
EBS最適化利用 - はい
ネットワークパフォーマンス 低から中 Up to 5 Gigabit
T2/T3 Unlimited - デフォルトで有効化
1時間あたりに受け取るCPUクレジット 6 12
蓄積可能な最大獲得クレジット 144 288
初期クレジット 30 0
料金(時間) $0.0152 $0.0136
無料利用枠の対象 はい -

t3の方が1時間あたりに受け取るCPUクレジットが倍になっていますが、初期クレジット(CPUCreditBalance)が0です。

f:id:kitsugi:20180823055740p:plain

無料利用枠が関係ないのであれば、積極的にt3を利用したいですね。

リザーブドインスタンス

ちょうど自宅での検証用にリザーブドインスタンスが欲しかったので、t3.microを購入します。

サービス [EC2] - [リザーブドインスタンス] を選択し、[リザーブドインスタンスの購入]ボタンをクリックします。

  • 東京リージョン
  • プラットフォーム: Linux/UNIX
  • テナンシー: デフォルト(共有)
  • 提供クラス: スタンダード
  • 期間: 1年間
  • お支払い方法: 全前払い

インスタンスタイプ t2.microt3.microを比較してみます。(2018年8月現在)

t2.micro

前払い価格: $84.0

f:id:kitsugi:20180823060957p:plain

t3.micro

前払い価格: $76.0

f:id:kitsugi:20180823061007p:plain

1年間で見ると、T3の方が 8ドル ほど安くなっています。お得ですね。

「ポチッとな」

f:id:kitsugi:20180823062427p:plain

無事購入できました。

まとめ

こうして俺は「T3インスタンス」を手に入れた。

参考

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

前回はセキュリティーグループ、ネットワークACLを設定しました。

oreout.hatenablog.com

今回は、作成したネットワーク上にEC2インスタンスを作成し、Webサーバーを構築します。 Webサーバーはnginxデフォルト状態とします。

f:id:kitsugi:20180819161411p:plain

サーバー構築用のテンプレート

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

server.template.yaml

AWSTemplateFormatVersion: 2010-09-09
Parameters:
  ProjectCode:
    Type: String
    Description: Enter your project code
  InstanceType:
    Type: String
    Description: WebServer EC2 instance type
    ConstraintDescription: must be a valid EC2 instance type.
    Default: t2.micro
    AllowedValues:
      - t2.nano
      - t2.micro
      - t2.small
      - t2.medium
      - t2.large
  KeyName:
    Type: AWS::EC2::KeyPair::KeyName
    Description: Name of an existing EC2 KeyPair to enable SSH access to the instance
    ConstraintDescription: must be the name of an existing EC2 KeyPair.
Mappings:
  RegionMap:
    us-east-1:
      AL2: ami-04681a1dbd79675a5
    us-east-2:
      AL2: ami-0cf31d971a3ca20d6
    us-west-1:
      AL2: ami-0782017a917e973e7
    us-west-2:
      AL2: ami-6cd6f714
    ap-northeast-1:
      AL2: ami-08847abae18baa040
    ap-southeast-1:
      AL2: ami-01da99628f381e50a
Resources:
  WebServerInstance:
    Type: AWS::EC2::Instance
    Properties:
      ImageId: !FindInMap [RegionMap, !Ref "AWS::Region", AL2]
      InstanceType: !Ref InstanceType
      KeyName: !Ref KeyName
      NetworkInterfaces:
        - GroupSet:
            - Fn::ImportValue: !Sub ${ProjectCode}-web-sg
          AssociatePublicIpAddress: true
          DeviceIndex: 0
          DeleteOnTermination: true
          SubnetId:
            Fn::ImportValue: !Sub ${ProjectCode}-subnet
      UserData: !Base64 |
        #!/bin/bash
        amazon-linux-extras install nginx1.12 -y
        systemctl start nginx
        systemctl enable nginx
      Tags:
      -
        Key: Name
        Value: !Ref ProjectCode
Outputs:
  WebServerInstance:
    Description: InstanceId of the newly created EC2 instance
    Value: !Ref WebServerInstance

パラメータ

パラメータは3つあります。

パラメータ 説明
ProjectCode プロジェクトコードを指定します。
各リソースの名前とテンプレート連携(クロススタック参照)で利用します。
InstanceType インスタンスタイプを指定します。デフォルトはt2.microです。
(テンプレートを短くするため数を減らしています)
KeyName EC2 のキーペアの名前を指定します。

マッピング

AMIはリージョン単位のサービスです。 各リージョンのAmazon Linux2のAMIをマッピングで用意します。
目的のリージョンがない場合は追加してください。

リソース

ImageId

マッピングから選択リージョンのAMIを取得します。

ImageId: !FindInMap [RegionMap, !Ref "AWS::Region", AL2]

NetworkInterfaces

アタッチされるネットワークインターフェイスを指定します。
組み込み関数Fn::ImportValueを利用して、作成したサブネットID、セキュリティーグループIDをインポートします。

NetworkInterfaces:
    - GroupSet:
        - Fn::ImportValue: !Sub ${ProjectCode}-web-sg
    AssociatePublicIpAddress: true
    DeviceIndex: 0
    DeleteOnTermination: true
    SubnetId:
        Fn::ImportValue: !Sub ${ProjectCode}-subnet

UserData

単純なインストールであれば、ユーザーデータにシェルを書くのが簡単です。 nginxをインストールして起動、自動起動を設定します。

UserData: !Base64 |
    #!/bin/bash
    amazon-linux-extras install nginx1.12 -y
    systemctl start nginx
    systemctl enable nginx

出力

確認用にEC2インスタンスIDを出力します。

スタックの作成

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

スタックの名前、パラメータを指定します。ProjectCodeは前回と同じ値を設定してください。

f:id:kitsugi:20180821055005p:plain

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

f:id:kitsugi:20180821055019p:plain

サービス [EC2] - [インスタンス] を選択し、作成したインスタンスのパブリックIPをブラウザに入力してnginxが起動しているか確認をします。

f:id:kitsugi:20180821055031p:plain

まとめ

ちょっとした目的でもテンプレートは長くなりがちです。 その場合、テンプレートを目的ごとに分割すると、再利用しやすく、管理がしやすくなります。

参考

シンプルなネットワークとサーバーをCloudFormationで構築する 〜2. セキュリティ設定〜

前回はVPC、サブネット、インターネットゲートウェイ、ルートテーブルを作成して、ネットワークを構築しました。

oreout.hatenablog.com

今回はセキュリティを作成・設定します。

セキュリティーグループとネットワークACL

VPCのファイアウォール機能として、セキュリティーグループネットワークACLがあります。
両者は適用するレベル(単位)が異なります。 インスタンス単位で動作する第1層のセキュリティーグループ、サブネット単位で動作する第2層のネットワークACLです。

セキュリティーグループとネットワークACLの大まかな違いは下記になります。

セキュリティーグループ ネットワークACL
適用単位 インスタンス単位 サブネット単位
ルール 許可 許可と拒否
ルールロジック すべてのルールを評価 順番にルールを処理
作成されたデフォルト値 インバウンド: すべて拒否
アウトバウンド:すべて許可
インバウンド: すべて許可
アウトバウンド:すべて許可
特徴 ステートフル
許可された送信の戻りは自動的に許可
ステートレス
許可された送信の戻りもルールチェックされる

ネットワークACLは、VPC作成時にデフォルトのネットワークACLが作成されます。 インバウンド、アウトバウンドともにすべて許可されているので、拒否ルールが不要であればデフォルトを利用します。

セキュリティ設定用のテンプレート

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

security.template.yaml

AWSTemplateFormatVersion: 2010-09-09
Parameters:
  ProjectCode:
    Type: String
    Description: Enter your project code
  SSHLocation:
    Type: String
    Description: The IP address range that can be used to SSH to the EC2 instances
    ConstraintDescription: must be a valid IP CIDR range of the form x.x.x.x/x.
    MinLength: 9
    MaxLength: 18
    Default: 0.0.0.0/0
    AllowedPattern: (\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})/(\d{1,2})
Resources:
  SecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      VpcId:
        Fn::ImportValue: !Sub ${ProjectCode}-vpc
      GroupDescription: Enable SSH access via port 22, 80
      SecurityGroupIngress:
        - IpProtocol: tcp
          FromPort: 22
          ToPort: 22
          CidrIp: !Ref SSHLocation
        - IpProtocol: tcp
          FromPort: 80
          ToPort: 80
          CidrIp: 0.0.0.0/0
      Tags:
      -
        Key: Name
        Value: !Ref ProjectCode
  NetworkAcl:
    Type: AWS::EC2::NetworkAcl
    Properties:
      VpcId:
        Fn::ImportValue: !Sub ${ProjectCode}-vpc
      Tags:
      -
        Key: Name
        Value: !Ref ProjectCode
  InboundHTTPNetworkAclEntry:
    Type: AWS::EC2::NetworkAclEntry
    Properties:
      NetworkAclId: !Ref NetworkAcl
      RuleNumber: 100
      Protocol: 6
      RuleAction: allow
      Egress: false
      CidrBlock: 0.0.0.0/0
      PortRange:
        From: 80
        To: 80
  InboundSSHNetworkAclEntry:
    Type: AWS::EC2::NetworkAclEntry
    Properties:
      NetworkAclId: !Ref NetworkAcl
      RuleNumber: 101
      Protocol: 6
      RuleAction: allow
      Egress: false
      CidrBlock: 0.0.0.0/0
      PortRange:
        From: 22
        To: 22
  InboundResponsePortsNetworkAclEntry:
    Type: AWS::EC2::NetworkAclEntry
    Properties:
      NetworkAclId: !Ref NetworkAcl
      RuleNumber: 102
      Protocol: 6
      RuleAction: allow
      Egress: false
      CidrBlock: 0.0.0.0/0
      PortRange:
        From: 1024
        To: 65535
  OutBoundHTTPNetworkAclEntry:
    Type: AWS::EC2::NetworkAclEntry
    Properties:
      NetworkAclId: !Ref NetworkAcl
      RuleNumber: 100
      Protocol: 6
      RuleAction: allow
      Egress: true
      CidrBlock: 0.0.0.0/0
      PortRange:
        From: 80
        To: 80
  OutBoundHTTPSNetworkAclEntry:
    Type: AWS::EC2::NetworkAclEntry
    Properties:
      NetworkAclId: !Ref NetworkAcl
      RuleNumber: 101
      Protocol: 6
      RuleAction: allow
      Egress: true
      CidrBlock: 0.0.0.0/0
      PortRange:
        From: 443
        To: 443
  OutBoundResponsePortsNetworkAclEntry:
    Type: AWS::EC2::NetworkAclEntry
    Properties:
      NetworkAclId: !Ref NetworkAcl
      RuleNumber: 102
      Protocol: 6
      RuleAction: allow
      Egress: true
      CidrBlock: 0.0.0.0/0
      PortRange:
        From: 1024
        To: 65535
  SubnetNetworkAclAssociation:
    Type: AWS::EC2::SubnetNetworkAclAssociation
    Properties:
      SubnetId:
        Fn::ImportValue: !Sub ${ProjectCode}-subnet
      NetworkAclId: !Ref NetworkAcl
Outputs:
  WebSecurityGroup:
    Description: Id of the newly created Security Group
    Value: !Ref SecurityGroup
    Export:
      Name: !Sub ${ProjectCode}-web-sg

パラメータ

パラメータは2つあります。

パラメータ 説明
ProjectCode プロジェクトコードを指定します。
各リソースの名前とテンプレート連携(クロススタック参照)で利用します。
SSHLocation SSH接続を許可するIPアドレスです。
デフォルトは制限無しの0.0.0.0/0です。

リソース

1. セキュリティーグループ

VPC上にセキュリティーグループを作成します。
組み込み関数Fn::ImportValueを利用して、前回作成したVPC IDをインポートします。

  SecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      VpcId:
        Fn::ImportValue: !Sub ${ProjectCode}-vpc
      GroupDescription: Enable SSH access via port 22, 80
      SecurityGroupIngress:
        - IpProtocol: tcp
          FromPort: 22
          ToPort: 22
          CidrIp: !Ref SSHLocation
        - IpProtocol: tcp
          FromPort: 80
          ToPort: 80
          CidrIp: 0.0.0.0/0

f:id:kitsugi:20180819230325p:plain

この時点では、セキュリティグループに属しているインスタンスはありません。

2. ネットワークACL

ネットワークACLを作成し、サブネットに関連付けをします。
組み込み関数Fn::ImportValueを利用して、前回作成したサブネットIDをインポートします。

  NetworkAcl:
    Type: AWS::EC2::NetworkAcl
    Properties:
      VpcId:
        Fn::ImportValue: !Sub ${ProjectCode}-vpc
  SubnetNetworkAclAssociation:
    Type: AWS::EC2::SubnetNetworkAclAssociation
    Properties:
      SubnetId:
        Fn::ImportValue: !Sub ${ProjectCode}-subnet
      NetworkAclId: !Ref NetworkAcl
ルール設定

ネットワークACLを作成した時点のルールは、インバウンド/アウトバウンドともに、すべて拒否になります。 基本は AWS::EC2::NetworkAclEntryを使用して、許可ルールを設定します。

インバウンド

ルール番号 プロトコル ポート 送信元IP 用途
100 TCP 80 0.0.0.0/0 HTTP
101 TCP 22 0.0.0.0/0 SSH
102 TCP 1024-65535 0.0.0.0/0 サーバー側用一時ポート

アウトバウンド

ルール番号 プロトコル ポート 送信元IP 用途
100 TCP 80 0.0.0.0/0 HTTP
101 TCP 443 0.0.0.0/0 HTTPS
102 TCP 1024-65535 0.0.0.0/0 クライアント側用一時ポート

f:id:kitsugi:20180819230345p:plain

出力

後続のテンプレート用にセキュリティーグループIDをエクスポートします。

パラメータ 説明
WebSecurityGroup セキュリティーグループIDの参照用に、エクスポート名を {プロジェクトコード}-web-sg にします。

スタックの作成

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

スタックの名前、パラメータを指定します。ProjectCodeは前回と同じ値を設定してください。

f:id:kitsugi:20180820062418p:plain

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

f:id:kitsugi:20180820062451p:plain

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

  • ネットワーク ACL
  • セキュリティグループ

参考

シンプルなネットワークとサーバーを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
  • サブネット
  • ルートテーブル
  • インターネットゲートウェイ

参考

サンプルテンプレート(JSON)をCloudFormation DesignerでYAMLに変換する

テンプレートを一から全て作成するのは面倒です。
そのような場合、AWS公式のサンプルテンプレートから目的に近いものをベースに作成すると、手間が省けます。

サンプルテンプレート

サンプルテンプレートは各リージョンごとに用意されています。
今回はAsia Pacific (Tokyo) Regionを選択します。

  • サンプルソリューション
    • SharePoint® Foundation 2010
    • Microsoft Windows Server Active Directory
    • Microsoft Windows Server の役割と機能
    • 基本的な WordPress (単一インスタンス)
    • スケーラブルで耐久性の高い WordPress
    • Chef を使用した WordPress のデプロイ
  • アプリケーションフレームワーク
    • 基本的な LAMP スタック
    • スケーラブルで耐久性の高い LAMP スタック
    • Ruby on Rails の基本
    • スケーラブルで耐久性の高い Ruby on Rails
  • サービス
    • Auto Scaling関連 (3)
    • AWS Config関連 (1)
    • Amazon DynamoDB関連 (2)
    • Amazon EC2関連 (3)
    • Amazon ElastiCache関連 (2)
    • AWS Elastic Beanstalk関連 (3)
    • Elastic Load Balancing関連 (4)
    • AWS Identity and Access Management関連 (1)
    • AWS OpsWorks関連 (2)
    • Amazon Relational Database Service関連 (4)
    • Amazon Redshift関連 (2)
    • Amazon Route 53関連 (3)
    • Amazon Simple Storage Service関連 (2)
    • Amazon Simple Queue Service関連 (2)
    • Amazon Virtual Private Cloud関連 (7)

各サンプルの[表示]リンクをクリックすると、JSON形式のテンプレートがブラウザで表示されます。 YAML形式が欲しい場合、CloudFormation Designerを起動してJSONからYAMLへ変換します。

CloudFormation Designer

各サンプルの[デザイナーで表示]リンクをクリックすると、CloudFormation Designerが起動されます。

f:id:kitsugi:20180816071800p:plain

【重要】Canvasペイン内のコンポーネントは操作しないでください。操作すると、テンプレート内にMetadata情報が追加されます。

  1. テンプレートの言語の選択で YAML を選択
  2. 左上の[ファイル]アイコンをクリック
  3. メニューの[保存]をクリック
    • ローカルファイルを選択、ファイル名を入力して[保存]ボタンをクリック
    • ブラウザによってはダウンロードされずにそのまま表示されます。その場合は、ページをローカルに保存してください。

これをベースに自分だけのテンプレートを作成してください。
断片的な書き方は、テンプレートスニペットが参考になります。

参考