はじめに
結構前にCloudFormationがYAML対応しました。
AWS CloudFormation で YAML テンプレートとクロススタックリファレンスをサポート
Linux構築ではAnsible使いたいので、
CloudFormationでYAMLを利用したら見た目が統一できるので作業効率も上がるかなと
とりあえずVPC作成までYAML形式でCloudFormation作成してみました。
#テンプレートファイル
テンプレートは以下のとおり
VPC、ルートテーブル、サブネット、インターネットゲートウェイを作成しています。
サブネットは4つ。パブリックとプライベートのサブネットを各AZごとに、
パラメータは環境とシステム短縮名を入れるだけにしました。
また短縮形を多用してステップ数を減らしてます。
cF_VPCsubnet.template
AWSTemplateFormatVersion: '2010-09-09'
Description:
VPC & subnet create
Parameters:
EnvType:
Description: Environment type.
Default: dev
Type: String
AllowedValues:
- dev
- mnt
- prd
ConstraintDescription: must specify dev or mnt or prd.
ProjectId:
Description: Project name id.
Type: String
MinLength: "3"
MaxLength: "3"
AllowedPattern: "[a-zA-Z0-9]*"
ConstraintDescription: must specify Project id.
Resources:
# Create VPC
MyVPC:
Type: AWS::EC2::VPC
Properties:
CidrBlock: 10.0.0.0/24
EnableDnsSupport: 'true'
EnableDnsHostnames: 'true'
InstanceTenancy: default
Tags:
- Key: Name
Value: !Join [ "-", [ "Ref":"EnvType" , "Ref":"ProjectId" ,"vpc" ] ]
# Create Public RouteTable
PublicRouteTable:
Type: AWS::EC2::RouteTable
Properties:
VpcId: !Ref MyVPC
Tags:
- Key: Name
Value: !Join [ "-", [ "Ref":"EnvType" , "Ref":"ProjectId" ,"pub-route" ] ]
# Create Private RouteTable
PrivateRouteTable:
Type: AWS::EC2::RouteTable
Properties:
VpcId: !Ref MyVPC
Tags:
- Key: Name
Value: !Join [ "-", [ "Ref":"EnvType" , "Ref":"ProjectId" ,"pri-route" ] ]
# Create Public Subnet A
PublicSubnetA:
Type: AWS::EC2::Subnet
Properties:
VpcId: !Ref MyVPC
CidrBlock: 10.0.0.0/27
AvailabilityZone: "ap-northeast-1a"
Tags:
- Key: Name
Value: !Join [ "-", [ "Ref":"EnvType" , "Ref":"ProjectId" ,"PublicSunetA" ] ]
PubSubnetARouteTableAssociation:
Type: AWS::EC2::SubnetRouteTableAssociation
Properties:
SubnetId: !Ref PublicSubnetA
RouteTableId: !Ref PublicRouteTable
# Create Public Subnet C
PublicSubnetC:
Type: AWS::EC2::Subnet
Properties:
VpcId: !Ref MyVPC
CidrBlock: 10.0.0.32/27
AvailabilityZone: "ap-northeast-1c"
Tags:
- Key: Name
Value: !Join [ "-", [ "Ref":"EnvType" , "Ref":"ProjectId" ,"PublicSunetC" ] ]
PubSubnetCRouteTableAssociation:
Type: AWS::EC2::SubnetRouteTableAssociation
Properties:
SubnetId: !Ref PublicSubnetC
RouteTableId: !Ref PublicRouteTable
# Create Private Subnet A
PrivateSubnetA:
Type: AWS::EC2::Subnet
Properties:
VpcId: !Ref MyVPC
CidrBlock: 10.0.0.64/27
AvailabilityZone: "ap-northeast-1a"
Tags:
- Key: Name
Value: !Join [ "-", [ "Ref":"EnvType" , "Ref":"ProjectId" ,"PrivateSubnetA" ] ]
PriSubnetARouteTableAssociation:
Type: AWS::EC2::SubnetRouteTableAssociation
Properties:
SubnetId: !Ref PrivateSubnetA
RouteTableId: !Ref PrivateRouteTable
# Create Private Subnet C
PrivateSubnetC:
Type: AWS::EC2::Subnet
Properties:
VpcId: !Ref MyVPC
CidrBlock: 10.0.0.96/27
AvailabilityZone: "ap-northeast-1c"
Tags:
- Key: Name
Value: !Join [ "-", [ "Ref":"EnvType" , "Ref":"ProjectId" ,"PrivateSubnetC" ] ]
PriSubnetCRouteTableAssociation:
Type: AWS::EC2::SubnetRouteTableAssociation
Properties:
SubnetId: !Ref PrivateSubnetC
RouteTableId: !Ref PrivateRouteTable
# Create InternetGateway
myInternetGateway:
Type: "AWS::EC2::InternetGateway"
Properties:
Tags:
- Key: Name
Value: !Join [ "-", [ "Ref":"EnvType" , "Ref":"ProjectId" ,"igw" ] ]
AttachGateway:
Type: AWS::EC2::VPCGatewayAttachment
Properties:
VpcId: !Ref MyVPC
InternetGatewayId: !Ref myInternetGateway
myRoute:
Type: AWS::EC2::Route
DependsOn: myInternetGateway
Properties:
RouteTableId: !Ref PublicRouteTable
DestinationCidrBlock: 0.0.0.0/0
GatewayId: !Ref myInternetGateway
Outputs:
StackVPC:
Description: The ID of the VPC
Value: !Ref MyVPC
Export:
Name: !Sub "${AWS::StackName}-VPCID"
StackPubSubnetA:
Description: The ID of the VPC Subnet
Value: !Ref PublicSubnetA
Export:
Name: !Sub "${AWS::StackName}-PublicSubnetA"
StackPubSubnetB:
Description: The ID of the VPC Subnet
Value: !Ref PublicSubnetC
Export:
Name: !Sub "${AWS::StackName}-PublicSubnetC"
StackPriSubnetA:
Description: The ID of the VPC Subnet
Value: !Ref PrivateSubnetA
Export:
Name: !Sub "${AWS::StackName}-PrivateSubnetA"
StackPriSubnetB:
Description: The ID of the VPC Subnet
Value: !Ref PrivateSubnetC
Export:
Name: !Sub "${AWS::StackName}-PrivateSubnetC"
まとめ
見やすいですね!
めっちゃ作りやすかったです。
括弧が少ないがすごい助かります。
AWS::EC2::SubnetRouteTableAssociationで
サブネット複数指定できたらもっと行数が短くなるのですが、
やり方がわかりませんでした。
次はクロススタックリファレンス使ってみたいです。