EC2 1台のフェイルオーバー構成をCloudFormationで構築する(前編)

  • 2020.02.22
  • AWS
EC2 1台のフェイルオーバー構成をCloudFormationで構築する(前編)

概要

仕事でCloudFormationを使ってシステム構築する機会があるので事前に勉強。今回構築するのは、以下のような要望に対応する構成。

  • 普段は1台のみEC2インスタンスを起動しておきたい
  • インスタンスがフェイルした場合は別AZで自動的に復旧したい

イメージは以下。ELBでヘルスチェックを行い、異常時はAutoScalingを使って、現状空になっているサブネットにEC2を構築。今回は、VPCとサブネットを構築するところまで。次回、ELBとAutoScalingを使ってフェイルオーバー構成を構築する箇所を紹介します。

VPC、サブネットを構築

以下、CloudFormationのコード。

AWSTemplateFormatVersion: '2010-09-09'
Description: VPC.
Parameters:
  EnvName:
    Type: String
    Description: Name of an environment. 'dev', 'prod' and any name.
    AllowedPattern: ^.*[^0-9]$
    ConstraintDescription: Must end with non numberic character.
Outputs:
  VPC:
    Description: VPC.
    Value:
      Ref: VPC
    Export:
      Name:
        Fn::Sub: ${EnvName}-VPC
  PublicSubnet1:
    Description: Public Subnet1
    Value:
      Ref: PublicSubnet1
    Export:
      Name:
        Fn::Sub: ${EnvName}-PublicSubnet1
  PublicSubnet2:
    Description: Public Subnet2
    Value:
      Ref: PublicSubnet2
    Export:
      Name:
        Fn::Sub: ${EnvName}-PublicSubnet2
Resources:
  VPC:
    Type: AWS::EC2::VPC
    Properties:
      CidrBlock: 10.0.0.0/16
      EnableDnsHostnames: "true"
      EnableDnsSupport: "true"
      Tags:
        - Key: Name
          Value:
            Fn::Sub: ${EnvName}-vpc
  InternetGateway:
    Type: AWS::EC2::InternetGateway
    Properties:
      Tags:
        - Key: Name
          Value:
            Fn::Sub: ${EnvName}-igw
  InternetGatewayAttach:
    Type: AWS::EC2::VPCGatewayAttachment
    Properties:
      InternetGatewayId:
        Ref: InternetGateway
      VpcId:
        Ref: VPC
  PublicSubnet1:
    Type: AWS::EC2::Subnet
    Properties:
      CidrBlock: 10.0.10.0/24
      MapPublicIpOnLaunch: false
      Tags:
        - Key: Name
          Value:
            Fn::Sub: ${EnvName}-pub1
      VpcId:
        Ref: VPC
      AvailabilityZone: !Select
        - 0
        - Fn::GetAZs: !Ref AWS::Region
  PublicSubnet2:
    Type: AWS::EC2::Subnet
    Properties:
      CidrBlock: 10.0.11.0/24
      MapPublicIpOnLaunch: false
      Tags:
        - Key: Name
          Value:
            Fn::Sub: ${EnvName}-pub2
      VpcId:
        Ref: VPC
      AvailabilityZone: !Select
        - 1
        - Fn::GetAZs: !Ref AWS::Region
  InternetGatewayRouteTable:
    Type: AWS::EC2::RouteTable
    Properties:
      Tags:
        - Key: Name
          Value:
            Fn::Sub: ${EnvName}-igw
      VpcId:
        Ref: VPC
  InternetGatewayRoute:
    Type: AWS::EC2::Route
    Properties:
      DestinationCidrBlock: 0.0.0.0/0
      GatewayId:
        Ref: InternetGateway
      RouteTableId:
        Ref: InternetGatewayRouteTable
  PublicSubnet1RouteTableAssociation:
    Type: AWS::EC2::SubnetRouteTableAssociation
    Properties:
      RouteTableId:
        Ref: InternetGatewayRouteTable
      SubnetId:
        Ref: PublicSubnet1
  PublicSubnet2RouteTableAssociation:
    Type: AWS::EC2::SubnetRouteTableAssociation
    Properties:
      RouteTableId:
        Ref: InternetGatewayRouteTable
      SubnetId:
        Ref: PublicSubnet2

VPC、各サブネットのIDはELB、AutoScalingを作成する際に必要なのでOutputsで出力しておきます。また、PublicSubnet1、PublicSubnet2それぞれのAvailabilityZoneを指定することで、2つのAZにサブネットを構築しています。

本当はもう少し解説しようと思っていましたが、遅い時間なのでまた別の機会に^^