開発日誌
更新日 (2022/07/27)
CloudFormationによる構築の自動化

はじめに

みなさんは「Cloud Formation」使ったことはありますか?

後に詳しく説明致しますが、どのようなサービスか端的に説明しますと、インフラをコード化し自動的にリソースの作成を行ってくれるサービスです。

「インフラのコード化」、、モダンな響きでかっこいいですよね!

AWSの中でもぜひマスターしたいサービスですので今回はそんな「Cloud Formation」について解説してみたいと思います。

 

目次

1 「Cloud Formation」とは

2「テンプレート」の解説

3   作成されたリソース

4   まとめ

 

1「Cloud Formation」とは

「Cloud Formation」の実行の流れとしましては、

1  「テンプレート」の作成

2  「cloudformation」で「テンプレート」の適用

3  スタックが作成され、リソースが展開される

 

といった流れになっております。「テンプレート」さえ正しく作ることができれば、あとは「Cloud Formation」がリソースを作ってくれます。

何度も同じものを作らなくてはいけない時にミスなく実行することができるので正確に繰り返し作業をする時に便利ですし、リソース名だけ変える等使い回すこともできます。

それでは早速「テンプレート」を作っていきましょう!

2「テンプレート」の作成

「Cloud Formation」の「テンプレート」ファイルは「JSON」または「YAML」形式で記述することができます。本編では「YAML」形式で説明していきます。

 

#AWSTemplateFormatVersion

#cloudformationのテンプレートのバージョンです。テンプレートを書くときに必ず記述します。

AWSTemplateFormatVersion: '2010-09-09'




#Description

#テンプレートに関するコメントを書くことができます。

Description: Create VPC,Public Subnet and EC2 Instance




#parametersセクション

#parametersセクションでは実行時に値を選択する項目を定義するセクションです。以下の場合はインスタンスタイプの選択項目を定義しています。

Parameters:

 InstanceType:

 Type: String

 Default: t3.micro

 AllowedValues:

  - t3.micro

  - t3.small

  - t3.medium

 Description: Select EC2 instance type.

KeyPair:

 Description:Select keypair Name.

 type: AWS::EC2::Keypair::KeyName




#Mappingセクション

#Mappingセクションでは実行う環境によって変わる値を定義するのに用いられます。例えばEC2のインスタンスを作る際はAMIを選択しますがAMIのIDはリージョンによって変わります。その場合次のようにAMI IDを定義します。同じAMIでもリージョンが違うとIDが異なるので注意が必要です。

Mappings:

 RegionMap:

  ap-northeast-1:

  hvm: '任意のAMI ID'




#Resourcesセクション

#Resourcesセクションは構築するAWSリソースの設計図のようなものです。各リソースには論理IDを付ける必要があり下記の場合だと「cfnVpc」になります。この論理IDを使ってリソース間の紐付けを行います。

 Resources:

 cfnvpc:




#続けてリソースの型をTypeで定義します。下記の場合は「'AWS::EC2::VPC'」の部分です。型によって「Properties」で設定できる項目が決まっています。例えばVPCの場合「CiderBlock」・「Tags」といった形です。

  Type: 'AWS::EC2::VPC'

  Properties:

   CiderBlock: '10.0.0.0/16'

   Tags:

    - key: 'Name'

      value: 'cfn-vpc'

 cfnSunbnet:

  Type: 'AWS::EC2::Subnet'

  properties:

   CiderBlock: '10.0.1.0/24'

   MappublicIpOnLanch: true

   tags:

     - key: 'Name'

     value: 'cfn-subnet'

#「!Ref」関数はAWSリソースの値や設定されたパラメータの値を取得する関数です。「parameters」セクションで定義された値を「!Ref」関数を用いて参照します。

  VpcId: !Ref cfnVpc

cfnInternetGateway:

 Type: AWS::EC2::InternetGateway

 Properties:

  Tags:

    - key: 'Name'

    Value: 'cfn-igw'

cfnEC2Instance:

  Type: 'AWS::EC2::Instance'

  Properties:

  #Mappingsセクションの値をfindInMap関数で取得

  InstanceType: !Ref InstanceType

  SubnetId: !Ref cfnSubnet

  BlockDeviceMappings:

    - DeviceName : '/dev/xvda'

  Ebs:

    VolumeType: 'gp2'

    volumeSize: 8

  Tags:

    - key: 'Name'

    - Value: 'cfn-ec2-instance'

  SecurityGroupIds:

    - !Ref cfnSecurityGroup

  KeyName: !Ref keyPair

 

3 作成されたリソース

 

上記のようになります。こちらにルートテーブルやロードバランサー、Route53の設定をすれば最低限環境構築は完了です。

上記以外にも、キーペアの設定・Nameタグの設定・インスタンスタイプの選択機能・EBSストレージの設定ができている形になります。

 

4 まとめ

いかがでしたでしょうか?「Cloud Formation」はインデントがかなり厳しく半角1つずれてもすぐエラーになってしまうので作ることが難しいですが一度作ってしまえばそれ以降作業はかなり楽になると思います。AWSのリソースがミスなく構築できるので業務の効率化につながること間違いなしです。是非使ってみてください!