IaCっていいですよね。
ということで今回はCloudFormationを触ってみます。
記事目安...15分
事前知識
CloudFormationとは
AWSリソースやサードパーティ製アプリケーションリソースをコードのように定義して作成するサービス。
IaCを実現するうえで欠かせないサービス。
AWSリソースを構築する場合、利用料金は無料です。
ゴール
今回は前編・後編に分けてやっていきます。
前編では以下のリソースのテンプレートファイルを作成することに注力し、 後編では実際にデプロイしてみようと思います。
Resource | Number |
---|---|
VPC | 1 |
PublicSubnet | 1 |
InternetGW | 1 |
RouteTable | 1 |
最終的に出来上がる構成図イメージは以下です。
作業
前提として、CloudFormationテンプレートファイルは色々なセクションに分かれています。
今回は以下2セクションを扱います。
Key | Value |
---|---|
Parameters | ユーザ定義パラメータを定義するセクション |
Resources | AWSリソースを定義するセクション |
Parameters: Resources:
※作成過程をわかりやすくするためにあえてこのように書いてます。これだけではYamlシンタックスとしては誤りなので注意してください。
VPCの定義
まず、VPCを定義していきます。
以下ページに載っているVPCを定義するのに必要な項目を確認して、貼り付けましょう。 なお、値には許容される型が記述されています。
なお、各Resourceには論理IDと呼ばれる一意の名前を付けることができます。 ここではMyVPCとしました。
参考: AWS::EC2::VPC
Parameters: Resources: MyVPC: Type: AWS::EC2::VPC Properties: CidrBlock: String EnableDnsHostnames: Boolean EnableDnsSupport: Boolean InstanceTenancy: String Tags: - Tag
続いて各項目を編集します。
各項目の詳細については先ほどのAWS公式ページを見ていただくといいと思います。
僕は以下のように書きました。
Parameters: Resources: MyVPC: Type: AWS::EC2::VPC Properties: CidrBlock: !Ref VpcCidrBlock EnableDnsHostnames: true EnableDnsSupport: true InstanceTenancy: default Tags: - Key: Name Value: !Ref VpcName
突然でてきた "!Ref" に皆さん困惑されたのではないでしょうか。
Ref関数と呼ばれるもので、ユーザ定義パラメータや疑似パラメータ(AWSで事前定義されたパラメータ)を参照する関数です。
余談ですが "!Ref" とは "Ref: xxx" の短縮系です。
参考: 擬似パラメーター参照
※CloudFormationにはたくさんの関数が用意されているので、気になった人は確認してみてください。
参考: 組み込み関数リファレンス
Ref関数を定義したことにより、参照先を定義する必要があります。
今回、定義した値はすべてオリジナルの値のため、Parameterセクションで定義します。
Key | Value |
---|---|
Description | パラメータについて説明を記述する |
Type | パラメータの型を記述する。 |
Default | デフォルトで入力されるパラメータを定義する |
参考: パラメータ
Parameters: VpcCidrBlock: Description: Input a VPC IPv4 CidrBlock. ex) 192.168.2.0/24 Type: String VpcName: Description: Input a VPC name. This Parameter will be a Name tag. Type: String Default: "" Resources: MyVPC: Type: AWS::EC2::VPC Properties: CidrBlock: !Ref VpcCidrBlock EnableDnsHostnames: true EnableDnsSupport: true InstanceTenancy: default Tags: - Key: Name Value: !Ref VpcName
これでVPCが完成しました。
Public Subnetの定義
続いてPublic Subnetを定義します。
以下ページを確認しながら進めてください。
今回は論理IDをMyPublicSubnetで定義します。
Parameters: ~省略~ Resources: ~省略~ MyPublicSubnet: Type: AWS::EC2::Subnet Properties: AssignIpv6AddressOnCreation: Boolean AvailabilityZone: String CidrBlock: String Ipv6CidrBlock: String MapPublicIpOnLaunch: Boolean Tags: - Tag VpcId: String
続いて各項目を編集します。
Parameters: ~省略~ Resources: ~省略~ MyPublicSubnet: Type: AWS::EC2::Subnet Properties: AvailabilityZone: !Ref AZ CidrBlock: !Ref PublicSubnetCidrBlock MapPublicIpOnLaunch: true Tags: - Key: Name Value: !Ref PublicSubnetName VpcId: !Ref MyVPC
最後にParametersセクションも変更します。
ここでは2つ新しいことをやっています。
- AWS::EC2::AvailabilityZone::Name
Parameters.AZ.Type の部分で AWS::EC2::AvailabilityZone::Name と宣言しています。
これはAWS 固有のパラメータータイプです。
今回だと、記述することでマネコンの現在のリージョンをもとにアベイラビリティゾーンの一覧を選択することができます。
参考: AWS 固有のパラメーター型 - !Ref <論理ID>
最終行で "!Ref MyVPC" と記述していますが、Ref関数に論理IDを渡すとリソースごとに決まった値を返してくれます。 VPCの場合、該当するVPCリソースのVPC IDを返してくれます。
参考: Ref
Parameters: ~省略~ AZ: Description: Input a AZ where Public Subnet will be created. Type: AWS::EC2::AvailabilityZone::Name PublicSubnetCidrBlock: Description: Input a Public Subnet IPv4 CidrBlock. ex) 192.168.2.0/25 Type: String PublicSubnetName: Description: Input a Public Subnet name. This Parameter will be a Name tag. Type: String Default: "" Resources: ~省略~ MyPublicSubnet: Type: AWS::EC2::Subnet Properties: AvailabilityZone: !Ref AZ CidrBlock: !Ref PublicSubnetCidrBlock MapPublicIpOnLaunch: true Tags: - Key: Name Value: !Ref PublicSubnetName VpcId: !Ref MyVPC
これでサブネットの定義も完了しました。
InternetGatewayの定義
InternetGWを定義します。
Parameters: ~省略~ InternetGwName: Description: Input a IntenetGW name. This Parameter will be a Name tag. Type: String Default: "" Resources: ~省略~ MyInternetGW: Type: AWS::EC2::InternetGateway Properties: Tags: - Key: Name Value: !Ref InternetGwName
InternetGWを作成したのでVPCと関連付けます。
参考: AWS::EC2::VPCGatewayAttachment
Parameters: ~省略~ Resources: ~省略~ MyVPCGatewayAttachment: Type: AWS::EC2::VPCGatewayAttachment Properties: InternetGatewayId: !Ref MyInternetGW VpcId: !Ref MyVPC
これでInternetGWの定義は完了です。
RouteTableの定義
RouteTableを定義します。
Parameters: ~省略~ RouteTableName: Description: Input a RouteTable name. This Parameter will be a Name tag. Type: String Default: "" Resources: ~省略~ MyRouteTable: Type: AWS::EC2::RouteTable Properties: Tags: - Key: Name Value: !Ref RouteTableName VpcId: !Ref MyVPC
次にルートテーブルのルーティングを設定します。
※localターゲットへのルーティングは定義しなくても自動でつきます。
参考: AWS::EC2::Route
~省略~ Resources: ~省略~ MyPublicRoute: Type: AWS::EC2::Route Properties: DestinationCidrBlock: 0.0.0.0/0 GatewayId: !Ref MyInternetGW RouteTableId: !Ref MyRouteTable
さらにRouteTableとSubnetを関連付けます。
参考: AWS::EC2::SubnetRouteTableAssociation
~省略~ Resources: ~省略~ MySubnetRouteTableAssociation: Type: AWS::EC2::SubnetRouteTableAssociation Properties: RouteTableId: !Ref MyRouteTable SubnetId: !Ref MyPublicSubnet
これでRouteTableの定義も完了です。
確認
ということでテンプレートファイルができました。 こちらが完成版となります。
まとめ
前編ではCloudFormationで使うテンプレートファイルの書き方についてまとめました。
基本はAWSドキュメントの見方さえわかってしまえば記述自体はすぐできそうですが、RouteTableのように複数にリソースに分割して定義するのはちょっと大変だなあという印象です。
後半では、実際に作ったテンプレート流していきます。
【初心者向け】VPC+PublicSubnetをCloudFormationを使って構築する 後編
ご覧いただきありがとうございました。