この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
はじめに
こんにちは。 くコ:彡がトレードマークの阿部です。
AWS CloudFormation(以下、CFn)は、AWSインフラをJSONテンプレートとして構築管理出来る機能です。 AWSリソースをテンプレートとして扱える事により、EC2やVPCの構成をソフトウェアのようにバージョン管理する事が可能です。 また一度テンプレート化してしまえば、環境複製を手軽に行う事が出来ます。 今回は初心者の方を対象にCFnデザイナーを使った環境構築について、ご紹介します。
CFnテンプレートの基本
デザイナーの前に、テンプレートについておさらいしておきましょう。
テンプレートはAWSTemplateFormatVersion
やDescription
など複数のセクションから構成されます。
メインとなるのは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は図の通りにします。
デザイナーの起動
AWSコンソールから、CFn画面を開きます。 [Design template]を選択すると、デザイナーが起動します。
キャンバスペインにEC2やVPCを追加し、下部のエディタで詳細設定を行います。 リソースをキャンバスペインに追加すると、テンプレート(JSON テキストエディタ)に追加されます。 初期状態ではフォーマットバージョンが記載されています。
VPCを設定する
リソースのドロップ
左メニュー:EC2 -> VPCを選択し、キャンバスペインにドロップします。
エディタを見ると、TypeAWS::EC2::VPC
のリソースが追加された事がわかります。
「EC2VPC2MTRK」という名前が付きました。
自動で付けられた名前のままだと、分かりづらいですね。変更しましょう。
鉛筆マークを選択しVPC
と入力します。
更新ボタンを選択すると、キャンバスペインが更新されます。
Componentsタブは1度別のタブを選択するなど表示を更新すると、反映されます。
以降もDesigner is out of date,hit refresh
と表示された時は、更新ボタンを選択します。
Propertiesの追加
今回作成するVPCは「192.168.10.0/24」です。
リソースの詳細設定はProperties
に記載します。追加前は空の状態です。
VPCリソースのProperties
に設定可能な情報は、テンプレートリファレンスにまとめられています。
今回は最低限の項目のみを記載し、以下の通りにしました。
VPCリソース
{
"Resources": {
"VPC": {
"Type": "AWS::EC2::VPC",
"Properties": {
"CidrBlock": "192.168.10.0/24"
}
}
}
}
ここまでの作業をまとめてみます。 他のリソースについても同じように対応します。
- VPCリソースをキャンバスペインにドロップ(リソースの追加)
- 分かりやすい名前に変更
- PropertiesにCIDRを記載
サブネットを設定する
リソースのドロップ
左メニュー:EC2 -> Subnetを選択し、先ほど作成したVPC内にドロップします。
VPC内にドロップする事で、サブネットリソースのProperties
にVPCとの紐付けが記載されます。
名前をPublicSubnet
に変更します。
Propertiesの追加
サブネットのCIDRは「192.168.10.0/26」でした。
テンプレートリファレンスを確認して、Properties
を記載します。
せっかくなので、デザイナーの補完機能を使ってみます。 Macの場合、Option+Spaceを選択します。 Windowsの場合やその他のショートカットについては【小ネタ】MacOSでCloudFormation Designerでショートカットが効かない際の解決策をご覧下さい。
完成系はこちらです。 慣れてしまえば、リファレンスを読まずともある程度は補完機能で書けそうですね。
サブネットリソース
{
"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の紐付けが行われます。
矢印自体もVPCGatewayAttachment
というリソースという扱いです。
矢印を選択すると、エディタ部に情報が表示されます。
ルートテーブルとルートを設定する
リソースのドロップ
左メニュー:EC2 -> RouteTableを選択し、VPCの中にドロップします。
Properties
に、VPCとの紐付けが記載されます。
名前はRouteTable
としました。
インターネット宛てのルーティングが出来るようにします。
左メニュー:EC2 -> Routeを選択し、RouteTableの中にドロップします。
Properties
に、RouteTableとの紐付けが記載されます。
名前はIGWRoute
としました。
Propertiesの追加
ルーティング情報はRoute
リソースに記載します。
Route
リソースのリファレンスを確認すると、DestinationCidrBlock
とGatewayId
を記載出来る事がわかります。
GatewayId
には、igw-abcd123といったIDを指定します。
IDはIGWが作成される際に自動で付けられます。つまり、テンプレートを記載している時点ではわかりません。
このような場合、組み込み関数Ref
を使用します。
インターネット宛てのルート
"DestinationCidrBlock": "0.0.0.0/0",
"GatewayId": { "Ref": "IGW" }
Ref
の詳細はこちらをご覧下さい。
サブネットとの紐付け
RouteTableの紫色の丸SubnetRouteTableAssociation
を選択すると、矢印が表示されます。
矢印でサブネットを選択する事で、RouteTableとサブネットの紐付けが行われます。
RouteTableとRouteのテンプレートは以下の通りになります。 キャンバスペインで行った紐付けがテンプレートに反映されている事がわかります。
RouteTable
{
"Resources": {
"RouteTable": {
"Type": "AWS::EC2::RouteTable",
"Properties": {
"VpcId": {
"Ref": "VPC"
}
}
}
}
}
Route
{
"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
を選択すると、矢印が表示されます。
矢印でセキュリティグループを選択する事で、インスタンスとセキュリティグループの紐付けが行われます。
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とインスタンスの紐付けが行われます。
ここまでの作業でキャンバスペインには以下のような図が表示されます。 テンプレートの内容を図で確認出来る点は、デザイナーを使う大きなメリットです。
テンプレートの検証
CFnツールバーのValidate template(チェックボックスマーク)を選択すると、構文エラーが無いか確認する事が出来ます。 テンプレート作成中は小まめに実行すると良さそうです。
スタックの作成
ツールバーのCreate Stack(雲マーク)を選択すると、スタックの作成画面が起動します。
Stack nameをTestStack
とし、後はデフォルト値のまま作成します。
スタックがCREATE_COMPLETE
になるまで待ちます。
AWSマネジメントコンソールからEC2やVPCを確認すると、リソースが作成されています。
注意
今回は最低限のProperty
を設定しました。
設定しなかった項目については、デフォルト値が採用されます。
テンプレートに記載しなかった事で、ディスクサイズやAZなどが意図しない形でプロビジョニングされないよう気をつけましょう。
次のステップ
CloudFormationの基本を押さえたい
AWSが公開しているスライド資料がわかりやすいです。
もっと試したい
AWSが公開しているウォークスルーがあります。 指示通りに試せば、CFnとデザイナーの基本を押さえる事が出来ます。
おわりに
CFnの概要とデザイナーについて、ご紹介しました。
Resources
セクションを中心にご説明しましたが、他のセクションと組み合わせる事でCFnの実力を発揮する事が出来ます。
AWSのウォークスルーでは他のセクションについても簡単に試す事が出来ます。
CFnデザイナーは2015年10月に発表された機能です。 デザイナーが発表される前はAWS Toolkit for Eclipseやテキストエディタをカスタマイズするケースが多かったかと思います。 お好みの環境が一番ですが、まずはデザイナーを試して頂くと良いと思います。
では、また。