CloudFormationデザイナーをはじめよう

AWS CloudFormation

はじめに

こんにちは。 くコ:彡がトレードマークの阿部です。

AWS CloudFormation(以下、CFn)は、AWSインフラをJSONテンプレートとして構築管理出来る機能です。
AWSリソースをテンプレートとして扱える事により、EC2やVPCの構成をソフトウェアのようにバージョン管理する事が可能です。
また一度テンプレート化してしまえば、環境複製を手軽に行う事が出来ます。
今回は初心者の方を対象にCFnデザイナーを使った環境構築について、ご紹介します。

CFnテンプレートの基本

デザイナーの前に、テンプレートについておさらいしておきましょう。
テンプレートはAWSTemplateFormatVersionDescriptionなど複数のセクションから構成されます。
メインとなるのはResourcesセクションです。
ResourcesセクションにVPCやEC2等の情報を記載します。

{
  "AWSTemplateFormatVersion" : "フォーマットバージョン",

  "Description" : "説明文",

  "Metadata" : {
    テンプレートのメタデータ
  },

  "Parameters" : {
    スタック起動時にテンプレート渡す値
  },

  "Mappings" : {
    キーと名前付きの値を対応付け
  },

  "Conditions" : {
    入力パラメータによって評価される条件
  },

  "Resources" : {
    テンプレート化するAWSリソース(VPC,EC2など)を記載
  },

  "Outputs" : {
    リソースを追加、変更、削除する変更時に出力する内容
  }
}

テンプレートによって管理(作成、更新、削除)されるリソースをスタックと言います。
デザイナーでテンプレートを記述し、スタックを作成するところまでをご説明します。

CFnデザイナーとは

テンプレートはJSON形式のため、テキストを扱えるエディタであれば読み書きする事が出来ます。
AWSではCFnデザイナーというグラフィックツールが用意されています。
これからCFnを初めるかたは、まずデザイナーを試して見ると良いでしょう。

この構成を作ってみる

デザイナーでテンプレート化する構成を図にしました。
1台のEC2にEIPをアタッチします。VPCとサブネットのCIDRは図の通りにします。

cacoo

デザイナーの起動

AWSコンソールから、CFn画面を開きます。
[Design template]を選択すると、デザイナーが起動します。

1

キャンバスペインにEC2やVPCを追加し、下部のエディタで詳細設定を行います。
リソースをキャンバスペインに追加すると、テンプレート(JSON テキストエディタ)に追加されます。
初期状態ではフォーマットバージョンが記載されています。

2

VPCを設定する

リソースのドロップ

左メニュー:EC2 -> VPCを選択し、キャンバスペインにドロップします。
エディタを見ると、TypeAWS::EC2::VPCのリソースが追加された事がわかります。
「EC2VPC2MTRK」という名前が付きました。

3

自動で付けられた名前のままだと、分かりづらいですね。変更しましょう。
鉛筆マークを選択しVPCと入力します。
更新ボタンを選択すると、キャンバスペインが更新されます。
Componentsタブは1度別のタブを選択するなど表示を更新すると、反映されます。

4

以降もDesigner is out of date,hit refreshと表示された時は、更新ボタンを選択します。

Propertiesの追加

今回作成するVPCは「192.168.10.0/24」です。
リソースの詳細設定はPropertiesに記載します。追加前は空の状態です。

5

VPCリソースのPropertiesに設定可能な情報は、テンプレートリファレンスにまとめられています。
今回は最低限の項目のみを記載し、以下の通りにしました。

{
  "Resources": {
    "VPC": {
      "Type": "AWS::EC2::VPC",
      "Properties": {
        "CidrBlock": "192.168.10.0/24"
      }
    }
  }
}

ここまでの作業をまとめてみます。
他のリソースについても同じように対応します。

  • VPCリソースをキャンバスペインにドロップ(リソースの追加)
  • 分かりやすい名前に変更
  • PropertiesにCIDRを記載

サブネットを設定する

リソースのドロップ

左メニュー:EC2 -> Subnetを選択し、先ほど作成したVPC内にドロップします。
VPC内にドロップする事で、サブネットリソースのPropertiesにVPCとの紐付けが記載されます。
名前をPublicSubnetに変更します。

6-2

Propertiesの追加

サブネットのCIDRは「192.168.10.0/26」でした。
テンプレートリファレンスを確認して、Propertiesを記載します。

せっかくなので、デザイナーの補完機能を使ってみます。
Macの場合、Option+Spaceを選択します。
Windowsの場合やその他のショートカットについては【小ネタ】MacOSでCloudFormation Designerでショートカットが効かない際の解決策をご覧下さい。

7

完成系はこちらです。
慣れてしまえば、リファレンスを読まずともある程度は補完機能で書けそうですね。

{
  "Resources": {
    "PublicSubnet": {
      "Type": "AWS::EC2::Subnet",
      "Properties": {
        "VpcId": {
          "Ref": "VPC"
        },
        "CidrBlock": "192.168.10.0/26"
      }
    }
  }
}

インターネットゲートウェイを設定する

リソースのドロップ

左メニュー:EC2 -> InternetGatewayを選択し、VPCの外にドロップします。
名前はIGWとしました。

紐付け

インターネットゲートウェイ(以下、IGW)とVPCの紐付けを行います。
IGWの紫色の丸を選択すると、矢印が表示されます。
矢印でVPCを選択すると、IGWとVPCの紐付けが行われます。

8

矢印自体もVPCGatewayAttachmentというリソースという扱いです。
矢印を選択すると、エディタ部に情報が表示されます。

9

ルートテーブルとルートを設定する

リソースのドロップ

左メニュー:EC2 -> RouteTableを選択し、VPCの中にドロップします。
Propertiesに、VPCとの紐付けが記載されます。
名前はRouteTableとしました。

インターネット宛てのルーティングが出来るようにします。
左メニュー:EC2 -> Routeを選択し、RouteTableの中にドロップします。
Propertiesに、RouteTableとの紐付けが記載されます。
名前はIGWRouteとしました。

10

Propertiesの追加

ルーティング情報はRouteリソースに記載します。
Routeリソースのリファレンスを確認すると、DestinationCidrBlockGatewayIdを記載出来る事がわかります。
GatewayIdには、igw-abcd123といったIDを指定します。
IDはIGWが作成される際に自動で付けられます。つまり、テンプレートを記載している時点ではわかりません。
このような場合、組み込み関数Refを使用します。

"DestinationCidrBlock": "0.0.0.0/0",
"GatewayId": { "Ref": "IGW" }

Refの詳細はこちらをご覧下さい。

サブネットとの紐付け

RouteTableの紫色の丸SubnetRouteTableAssociationを選択すると、矢印が表示されます。
矢印でサブネットを選択する事で、RouteTableとサブネットの紐付けが行われます。

11

RouteTableとRouteのテンプレートは以下の通りになります。
キャンバスペインで行った紐付けがテンプレートに反映されている事がわかります。

{
  "Resources": {
    "RouteTable": {
      "Type": "AWS::EC2::RouteTable",
      "Properties": {
        "VpcId": {
          "Ref": "VPC"
        }
      }
    }
  }
}
{
  "Resources": {
    "IGWRoute": {
      "Type": "AWS::EC2::Route",
      "Properties": {
        "DestinationCidrBlock": "0.0.0.0/0",
        "GatewayId": {
          "Ref": "IGW"
        },
        "RouteTableId": {
          "Ref": "RouteTable"
        }
      }
    }
  }
}

セキュリティグループを設定する

左メニュー:EC2 -> SecurityGroupを選択し、VPC内にドロップします。
VPC内にドロップする事でPropertiesにVPCとの紐付けが記載されます。

特定拠点からのSSHを許可する場合、以下のようになります。
テンプレートの書き方がわからない場合、リファレンスを参照しましょう。
書式だけでなく、例が記載されていますので参考になるはずです。

{
  "Resources": {
    "SecurityGroup": {
      "Type": "AWS::EC2::SecurityGroup",
      "Properties": {
        "GroupDescription": "Allow SSH",
        "SecurityGroupIngress": [
          {
            "IpProtocol": "tcp",
            "FromPort": "22",
            "ToPort": "22",
            "CidrIp": "○○.○○.○○.○○/32"
          }
        ],
        "VpcId": {
          "Ref": "VPC"
        }
      }
    }
  }
}

EC2を設定する

リソースのドロップ

左メニュー:EC2 -> Instanceを選択し、サブネットの中にドロップします。
名前はWebServerとしました。

セキュリティグループとの紐付け

インスタンスの紫色の丸SecurityGroupを選択すると、矢印が表示されます。
矢印でセキュリティグループを選択する事で、インスタンスとセキュリティグループの紐付けが行われます。

13

Propertiesの追加

リファレンスを参照すると、Propertiesで設定可能な項目がたくさんある事がわかります。
インスタンスタイプやAMI等、必要最低限の設定を行いました。

{
  "Resources": {
    "WebServer": {
      "Type": "AWS::EC2::Instance",
      "Properties": {
        "InstanceType": "t2.nano",
        "KeyName": "キー名",
        "SubnetId": {
          "Ref": "PublicSubnet"
        },
        "ImageId": "ami-29160d47",
        "SecurityGroupIds": [
          {
            "Ref": "SecurityGroup"
          }
        ]
      }
    }
  }
}

EIPを設定する

左メニュー:EC2 -> EIPを選択し、VPCの外にドロップします。
名前はEIPとしました。

EIPとインスタンスの紐付けを行います。
EIPの紫色の丸Property:InstanceIdを選択すると、矢印が表示されます。
矢印でインスタンスを選択すると、EIPとインスタンスの紐付けが行われます。

ここまでの作業でキャンバスペインには以下のような図が表示されます。
テンプレートの内容を図で確認出来る点は、デザイナーを使う大きなメリットです。

14

テンプレートの検証

CFnツールバーのValidate template(チェックボックスマーク)を選択すると、構文エラーが無いか確認する事が出来ます。
テンプレート作成中は小まめに実行すると良さそうです。

スタックの作成

ツールバーのCreate Stack(雲マーク)を選択すると、スタックの作成画面が起動します。

16

Stack nameをTestStackとし、後はデフォルト値のまま作成します。
スタックがCREATE_COMPLETEになるまで待ちます。
AWSマネジメントコンソールからEC2やVPCを確認すると、リソースが作成されています。

18

注意

今回は最低限のPropertyを設定しました。
設定しなかった項目については、デフォルト値が採用されます。
テンプレートに記載しなかった事で、ディスクサイズやAZなどが意図しない形でプロビジョニングされないよう気をつけましょう。

次のステップ

CloudFormationの基本を押さえたい

AWSが公開しているスライド資料がわかりやすいです。

もっと試したい

AWSが公開しているウォークスルーがあります。
指示通りに試せば、CFnとデザイナーの基本を押さえる事が出来ます。

おわりに

CFnの概要とデザイナーについて、ご紹介しました。
Resourcesセクションを中心にご説明しましたが、他のセクションと組み合わせる事でCFnの実力を発揮する事が出来ます。
AWSのウォークスルーでは他のセクションについても簡単に試す事が出来ます。

CFnデザイナーは2015年10月に発表された機能です。
デザイナーが発表される前はAWS Toolkit for Eclipseやテキストエディタをカスタマイズするケースが多かったかと思います。
お好みの環境が一番ですが、まずはデザイナーを試して頂くと良いと思います。

では、また。