CloudFormationとは
AWSリソースをコード化できるマネージドサービスです。
YAML, JSON, XMLなどで書いたコードをCloudFormationに読み込ませることで、AWSサービスを自動作成することができます。
CloudFormationを使うにはVSCodeがおすすめ
VSCodeには、CloudFormation
という拡張機能があるのでそちらをダウンロードします。
YAMLを使う場合は以下の修正が必要です
Settings.json内に以下の追記をしてください。
Settings.json
"yaml.schemas": {
"https://d33vqc0rt9ld30.cloudfront.net/latest/gzip/CloudFormationResourceSpecification.json": [
"*.cf.yaml",
"*.cf.yml",
"*.cfn/*.yaml",
"*.cfn/*.yml",
"cloud*formation/*.yaml",
"cloud*formation/*.yml"
]
},
"yaml.customTags": [
"!Ref",
"!Sub scalar",
"!Sub sequence",
"!Join sequence",
"!FindInMap sequence",
"!GetAtt scalar",
"!GetAtt sequence",
"!Base64 mapping",
"!GetAZs",
"!Select scalar",
"!Select sequence",
"!Split sequence",
"!ImportValue",
"!Condition",
"!Equals sequence",
"!And",
"!If",
"!Not",
"!Or"
],
それではVPCを作ってみましょう
Yamlを作成
「start」+[Tab]でテンプレートが表示されます。
test.yml
AWSTemplateFormatVersion: 2010-09-09
Description: ---
Resources:
myVPC1:
Type: AWS::EC2::VPC
Properties:
CidrBlock: 10.0.0.0/21
EnableDnsSupport: true
Tags:
- Key: Name
Value: myVPC-1
CloudFormationを開き設定をする
作成されているか確認しましょう
作成されていました!
OKです
次にサブネットを作成しましょう
Yamlを更新する
test.yml
AWSTemplateFormatVersion: 2010-09-09
Description: ---
Resources:
myVPC1:
Type: AWS::EC2::VPC
Properties:
CidrBlock: 10.0.0.0/21
EnableDnsSupport: true
Tags:
- Key: Name
Value: myVPC-1
subnetName:
Type: AWS::EC2::Subnet
Properties:
AvailabilityZone: 'ap-northeast-1a'
VpcId: !Ref myVPC1
CidrBlock: 10.0.0.0/24
Tags:
- Key: Name
Value: Public-1
ここで大切なのは、!Ref
です。
これは組み込み関数と呼ばれるもので、同一テンプレート内で作成されたものの値を返す役割があります。
上記の例で言うと、VpcId
は、myVPC1と同じ値にしてくださいと命令していることになります。
CloudFormationを更新
次にセキュリティグループを作成しましょう
Yamlを更新する
test.yml
AWSTemplateFormatVersion: 2010-09-09
Description: ---
Resources:
myVPC1:
Type: AWS::EC2::VPC
Properties:
CidrBlock: 10.0.0.0/21
EnableDnsSupport: true
Tags:
- Key: Name
Value: myVPC-1
subnetName:
Type: AWS::EC2::Subnet
Properties:
AvailabilityZone: 'ap-northeast-1a'
VpcId: !Ref myVPC1
CidrBlock: 10.0.0.0/24
Tags:
- Key: Name
Value: Public-1
secGroupName:
Type: AWS::EC2::SecurityGroup
Properties:
GroupName: WEB-SG
GroupDescription: WEB-SG
VpcId: !Ref myVPC1
# インバウンド(ポート番号22のすべてからアクセスを受け付ける)
SecurityGroupIngress:
- IpProtocol: tcp
FromPort: 22
ToPort: 22
CidrIp: 0.0.0.0/0
Tags:
- Key: Name
Value: WEB-SG
次にSubnet内にEC2を作ろう
ここからは新しいテンプレートファイルを作ります。
新しいテンプレートを作成したテンプレートに紐付けるクロススタックに関して学んでいきましょう。
なぜ分けるべきなのか?
ブラックベルトで紹介されている通り、様々なリソースを1つのファイルにまとめてしまうと可読性が著しく落ちてしまうためレイヤーごとに分けるのがスマートです。
Yamlを作成する
test.yml
AWSTemplateFormatVersion: 2010-09-09
Description: ---
Resources:
myVPC1:
Type: AWS::EC2::VPC
Properties:
CidrBlock: 10.0.0.0/21
EnableDnsSupport: true
Tags:
- Key: Name
Value: myVPC-1
subnetName:
Type: AWS::EC2::Subnet
Properties:
AvailabilityZone: 'ap-northeast-1a'
VpcId: !Ref myVPC1
CidrBlock: 10.0.0.0/24
Tags:
- Key: Name
Value: Public-1
secGroupName:
Type: AWS::EC2::SecurityGroup
Properties:
GroupName: WEB-SG
GroupDescription: WEB-SG
VpcId: !Ref myVPC1
# インバウンド(ポート番号22のすべてからアクセスを受け付ける)
SecurityGroupIngress:
- IpProtocol: tcp
FromPort: 22
ToPort: 22
CidrIp: 0.0.0.0/0
Tags:
- Key: Name
Value: WEB-SG
# 外部でも値を使えるようにする
Outputs:
Public1: # 適当な名前をつける
Value: !Ref subnetName # どの値を参照するか
Export:
Name: Public-Subnet1 # 外部で呼び出す時の名前
SG1:
Value: !Ref secGroupName
Export:
Name: WEB-SG1
ec2.yml
AWSTemplateFormatVersion: 2010-09-09
Resources:
myEC2Instance:
Type: AWS::EC2::Instance
Properties:
KeyName: Keypair
ImageId: ami-0ca38c7440de1749a # インスタンスのID(今回はAmazon Linux 2 AMI (HVM), SSD Volume Type)
InstanceType: t2.micro
Monitoring: false
SecurityGroupIds:
- !ImportValue WEB-SG1
SubnetId: !ImportValue Public-Subnet1
Tags:
- Key: Name
Value: Frontend