(第1回)CloudFormationで環境構築を効率化

(第1回)CloudFormationで環境構築を効率化

目次

はじめに
デザイナーでYAMLの書き方を確認
ネットワーク系コンポーネントを定義
次回予告

はじめに


AWSはそもそもマネジメントコンソールがとても優秀だし、わざわざ「Infrastructure as Code」(IaC)なるものを学習しなくてものらりくらり何とかなるのでは?
結局マネジメントコンソールでポチポチ作れればゴールは同じな訳だけだし…
と今までCloudFormationから逃げていたあなた!(というか私)そろそろ年貢の納め時です。

この記事の目標

  • CloudFormationの使い方の基礎が理解できる
  • VPC・サブネット等のAWS構築で必ず通るであろうネットワーク系のテンプレートを作ることができる

デザイナーでYAMLの書き方を確認

CloudFormationの良いところの1つは、AWSのサービスとして提供されているところです。
つまり手元に開発環境を用意しなくても、AWSマネジメントコンソール上でテンプレートのコーディングが開始できます。(ただし少し癖はありそう)
慣れてくれば直接YAMLを作成していきたいと思いますが、まずはデザイナーを使用して書き方を確認していきましょう。

「スタックの作成」から「デザイナーでテンプレートを作成」を選択します。

CloudFormation「スタックの作成ウィザード」

デザイナー左部リソースタイプ一覧よりVPC(EC2カテゴリの中にあります)をドラッグ&ドロップします。

CloudFormation「デザイナー画面」

下部タブのテンプレートを表示すると、「AWSTemplateFormatVersion」、「Metadata」と「Resources」の2つが書かれてました。また、JSON形式、YAML形式と表示を切替が可能でした。

VPCを配置した状態のテンプレート(YAML形式)

AWSTemplateFormatVersion: 2010-09-09
Metadata:
  'AWS::CloudFormation::Designer':
    06f2c027-d7fe-4b31-af98-152c4be9849d:
      size:
        width: 190
        height: 140
      position:
        x: 100
        'y': 110
        z: 0
Resources:
  EC2VPC39T3H:
    Type: 'AWS::EC2::VPC'
    Properties: {}
    Metadata:
      'AWS::CloudFormation::Designer':
        id: 06f2c027-d7fe-4b31-af98-152c4be9849d

1行目の「AWSTemplateFormatVersion」 セクションはテンプレートの機能を識別します。最新のテンプレートの形式バージョンは2010-09-09であり現時点で唯一の有効な値のようです。
Resources」セクションのハイライトした部分がどうやら重要なようです。デザイナーを使うとグラフィカルにリソースが表示されるため、便利ですが特にプロパティなどの入力補完がある訳では無さそうですので、自分でYAMLを定義していった方が最終的には分かりやすそうだと思いました。
また、ここには無いですが「Mappings」や「Conditions」といった様々なセクションが用意されています。今回のネットワーク用のテンプレートでは使用せずシンプルにいきたいと思います。

ネットワーク系コンポーネントを定義

ということでYAMLで書いていきたいと思います。書き方を理解するために構成はシンプルに以下の形でネットワークを定義します。書いた順番は以下の通りです。

  • VPC(1つ)
  • インターネットゲートウェイ
  • インターネットゲートウェイをVPCにアタッチ
  • パブリックサブネット(1つ)
  • ルートテーブル(1つ)
  • ルートテーブルにインターネットゲートウェイへの経路を定義
  • サブネットにルートテーブルをアソシエイト
AWSTemplateFormatVersion: "2010-09-09"
Description: "Itport AWS VPC Networks"
Resources:
  
  # VPC Create
  ItportVPC:
    Type: "AWS::EC2::VPC"
    Properties:
      CidrBlock: 10.0.0.0/16
      EnableDnsSupport: "true"
      EnableDnsHostnames: "true"
      InstanceTenancy: default
      Tags:
      - Key: "Name"
        Value: "ItportVPC"

  # IGW Create
  ItportIGW:
    Type: "AWS::EC2::InternetGateway"
    Properties:
      Tags:
      - Key: "Name"
        Value: "ItportIGW"

  # Attach IGW to VPC
  ItportIGWAttachVPC:
    Type: "AWS::EC2::VPCGatewayAttachment"
    Properties:
      InternetGatewayId: !Ref ItportIGW
      VpcId: !Ref ItportVPC

  # Subnet(1a) Create
  ItportSubnet1a:
    Type: "AWS::EC2::Subnet"
    Properties:
      VpcId: !Ref ItportVPC
      AvailabilityZone: ap-northeast-1a
      CidrBlock: 10.0.0.0/24
      MapPublicIpOnLaunch: true
      Tags:
      - Key: "Name"
        Value: "ItportSubnet1a"

  # RouteTable Create
  ItportRouteTable:
    Type: "AWS::EC2::RouteTable"
    Properties:
      VpcId: !Ref ItportVPC
      Tags:
      - Key: "Name"
        Value: "ItportRouteTable"

  # Internet Route Create
  ItportInternetRoute:
    Type: "AWS::EC2::Route"
    Properties:
      DestinationCidrBlock: "0.0.0.0/0"
      GatewayId: !Ref ItportIGW
      RouteTableId: !Ref ItportRouteTable
  
  # Associate Route Table To Subnet
  AssociateItportSubnet1aToItportRouteTable:
    Type: "AWS::EC2::SubnetRouteTableAssociation"
    Properties:
      RouteTableId: !Ref ItportRouteTable
      SubnetId: !Ref ItportSubnet1a

Outputs:
  ItportVPC:
    Value: !Ref ItportVPC
    Export:
      Name: ItportVPC
  
  ITPortSubnet1a:
    Value: !Ref ItportSubnet1a
    Export:
      Name: ItportSubnet1a

ここで注目したいのが、各リソースに論理名を付けていることと「!Ref」で論理名を指定していることと「Outputs:」で他スタックからVPCとサブネットのIDを参照できるようにしていることです。

VpcId: !Ref ItportVPC

といったように関連リソースの紐付けをする際には、「!Ref」で論理名で紐付をします。
そして、作成したテンプレートをCloudFormation上にアップロードするとデザイナーでは以下のような図で表現されました。

ItportVPCNetwork構成図

このまま「スタックの作成」ウィザードを進めていけば定義した通りにAWS上にネットワークが作成できました。

CloudFormation「スタックの作成」完了画面

次回予告

今回はここまでとなります。今まではAWSマネジメントコンソール上でVPCを作成してサブネットを切りルートテーブルを作って…と毎回ポチポチ作ってきましたが、CloudFormationを一度書いてしまえば楽ですね。

ただし「Infrastructure as CodeIaC)」を利用するには心構えが必要なようでして、よく耳にするのは「一度、コードで管理をしたら最後までコードで管理すること」ということです。
CloudFormationで管理しているインフラ部分をマネジメントコンソール等で直接変更してしまうとコードと差異が発生します。そうなるとアーキテクチャを変更する際におもわぬトラブルを招きそうなのは、なんとなく想像がつきます。
CloudFormationを導入する際は、しっかり管理するメンバー間で運用方法の事前確認をした方が良さそうですね。
次回は、作成したネットワークにEC2インスタンスを起動していきたいと思います。