インフラ構築自動化してみた！

# はじめに

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

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

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

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

*参考著書

https://nokonokonetwork.com/aws_associate/recommend_textbooks_for_aws_associate.html#mokuji4




## 目次

1 「Cloud Formation」とは

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

3  作成されたリソース

4   まとめ




## １「Cloud Formation」とは

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

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

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

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




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

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

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

## ２「テンプレート」の作成

「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セクションでは実行う環境によって変わる値を定義するのに用いられます。例えばEC２のインスタンスを作る際は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 作成されたリソース
![記事用.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1686037/0e9ad7b3-05b2-6d82-b515-c0a0b4068c43.png)




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

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




## 4　まとめ

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