目次
はじめに
デザイナーでYAMLの書き方を確認
ネットワーク系コンポーネントを定義
次回予告
はじめに
AWSはそもそもマネジメントコンソールがとても優秀だし、わざわざ「Infrastructure as Code」(IaC)なるものを学習しなくてものらりくらり何とかなるのでは?
結局マネジメントコンソールでポチポチ作れればゴールは同じな訳だけだし…
と今までCloudFormationから逃げていたあなた!(というか私)そろそろ年貢の納め時です。
この記事の目標
- CloudFormationの使い方の基礎が理解できる
- VPC・サブネット等のAWS構築で必ず通るであろうネットワーク系のテンプレートを作ることができる
デザイナーでYAMLの書き方を確認
CloudFormationの良いところの1つは、AWSのサービスとして提供されているところです。
つまり手元に開発環境を用意しなくても、AWSマネジメントコンソール上でテンプレートのコーディングが開始できます。(ただし少し癖はありそう)
慣れてくれば直接YAMLを作成していきたいと思いますが、まずはデザイナーを使用して書き方を確認していきましょう。
「スタックの作成」から「デザイナーでテンプレートを作成」を選択します。
デザイナー左部リソースタイプ一覧よりVPC(EC2カテゴリの中にあります)をドラッグ&ドロップします。
下部タブのテンプレートを表示すると、「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上にアップロードするとデザイナーでは以下のような図で表現されました。
このまま「スタックの作成」ウィザードを進めていけば定義した通りにAWS上にネットワークが作成できました。
次回予告
今回はここまでとなります。今まではAWSマネジメントコンソール上でVPCを作成してサブネットを切りルートテーブルを作って…と毎回ポチポチ作ってきましたが、CloudFormationを一度書いてしまえば楽ですね。
ただし「Infrastructure as Code(IaC)」を利用するには心構えが必要なようでして、よく耳にするのは「一度、コードで管理をしたら最後までコードで管理すること」ということです。
CloudFormationで管理しているインフラ部分をマネジメントコンソール等で直接変更してしまうとコードと差異が発生します。そうなるとアーキテクチャを変更する際におもわぬトラブルを招きそうなのは、なんとなく想像がつきます。
CloudFormationを導入する際は、しっかり管理するメンバー間で運用方法の事前確認をした方が良さそうですね。
次回は、作成したネットワークにEC2インスタンスを起動していきたいと思います。