CloudFormationでVPC環境を作ってみよう(テンプレートファイルの書き方編)


皆さんこんにちは
システムソリューション部SREチーム所属の岡崎です。

以前からAWSでの構築に携わることが多く、その中で触れる機会が多かった「CloudFormation」の簡単な使い方を紹介したいと思います。
今回はCloudFormationの実行に必要なテンプレートファイルの記入の仕方を記入します。

CloudFormationとは??

AWSが提供しているAWSクラウド環境内のリソースをyml, json形式のファイルで管理・構築できるサービスとなります。
AWSリソースの起動、停止、削除をそれぞれのコンソールからではなく単一のコンソールからスタックという単位で管理することができます。
CloudFormationで構築されたEC2インスタンスなどに費用は発生しますが、CloudFormation自体に追加料金は発生しません。

VPC周りを構築する

では早速以下のymlファイルを元にCloudFormationを使って、VPCを作ってみましょう

vpc.yml

---
AWSTemplateFormatVersion: '2010-09-09'
 
# パラメータセッティング
Parameters:
  # それぞれの識別子を入力
  ProjectCode:
    Type: String
    Default: test
    Description: Project Code
 # VPCのCIDRを入力
  VPCCidr:
    Type: String
    Default: 10.31.0.0/16
    Description: VPCCidr
  # SubnetのCIDRを入力
  PublicSubnetCidr:
    Type: String
    Default: 10.31.0.0/24
    Description: PublicSubnetCidr

Resources:
# VPC周り
  #VPCの設定
  VPC:
    Type: AWS::EC2::VPC
    Properties:
      CidrBlock: !Ref VPCCidr
      Tags:
        - Key: Name
          Value: !Join [ "-", [ !Ref ProjectCode, vpc ] ]

  # インターネットゲートウェイの設定
  InternetGateway:
    Type: AWS::EC2::InternetGateway
    Properties:
      Tags:
        - Key: Name
          Value: !Join [ "-", [ !Ref ProjectCode, igw ] ]
  AttachGateway:
    Type: AWS::EC2::VPCGatewayAttachment
    Properties:
      VpcId: !Ref VPC
      InternetGatewayId: !Ref InternetGateway
  PublicRouteTableIGW:
    Type: AWS::EC2::RouteTable
    DependsOn: AttachGateway
    Properties:
      VpcId: !Ref VPC
      Tags:
        - Key: Name
          Value: !Join [ "-", [ !Ref ProjectCode, public-route-table-igw ] ]
  PublicRouteIGW:
    Type: AWS::EC2::Route
    DependsOn: AttachGateway
    Properties:
      RouteTableId: !Ref PublicRouteTableIGW
      DestinationCidrBlock: 0.0.0.0/0
      GatewayId: !Ref InternetGateway

  # サブネットの設定
  PublicSubnet:
    Type: AWS::EC2::Subnet
    DependsOn: AttachGateway
    Properties:
      VpcId: !Ref VPC
      AvailabilityZone: ap-northeast-1a
      CidrBlock: !Ref PublicSubnetCidr
      Tags:
        - Key: Name
          Value: !Join [ "-", [ !Ref ProjectCode, public-subnet ] ]

項目ごとの解説

では上記のymlファイルの解説をいたします。

---
AWSTemplateFormatVersion: '2010-09-09'

CloudFormationテンプレートのフォーマットバージョンを記入しています。
現在最新のテンプレートのフォーマットバージョンは2010-09-09であり、
こちらが2019年3月21日時点では唯一有効な値となっております。

# パラメータセッティング
Parameters:
  # それぞれの識別子を入力
  ProjectCode:
    Type: String
    Default: test
    Description: Project Code
 # VPCのCIDRを入力
  VPCCidr:
    Type: String
    Default: 10.31.0.0/16
    Description: VPCCider
  # SubnetのCIDRを入力
  PublicSubnetCidr:
    Type: String
    Default: 10.31.0.0/24
    Description: PublicSubnetCider

それぞれのリソースを作成したいとき、毎回決まった値を作成する場合はいいのですが、
運用しやすいように値を変えたい場合があると思います。
CloudFormationではそれら自由に値を変更したいときに「Parameters」というセクションで設定できます。
サンプルファイルではリソースごとに共通する識別子をProjectCodeとして設定し、
初期値をtestとしていますが、スタックとに自由に入力できるようにしております。
VPCのCidrやSubnetのCidrも初期値として設定していますが、同じようにスタック単位で値を設定できるようにしております。

Resources:
# VPC周り
  #VPCの設定
  VPC:
    Type: AWS::EC2::VPC
    Properties:
      CidrBlock: !Ref VPCCidr
      Tags:
        - Key: Name
          Value: !Join [ "-", [ !Ref ProjectCode, vpc ] ]

AWSのリソースを管理する部分が上記の「Resources」というセクションになります。
VPCの部分は論理IDと言われ、任意のものを設定可能で、他のリソースから呼び出したりも可能です。
しかし、それぞれが一意でないと実行時にエラーが発生してしまいます。
Type:~の部分が実際のAWSリソースを定義する部分になります。
Properties配下がVPC自体の設定の部分になり、さきほどのVPCCidrのパラメーターをRefという関数で呼び出し事前に定義したCIDRを呼び出しCidrBlockに挿入しております。
今回VPCで設定するのはCidrBlockのみになりますが、詳細な設定はAWS公式にありますのでまた確認いただければと思います。
AWS公式「AWS::EC2::VPC」について

また、Tags部分にてわかりやすいようにNameタグを付けております。
こちらもValueの部分を識別子-vpcというタグが付くようにJoinという関数を利用して結合しております。

  AttachGateway:
    Type: AWS::EC2::VPCGatewayAttachment
    Properties:
      VpcId: !Ref VPC
      InternetGatewayId: !Ref InternetGateway
  PublicRouteTableIGW:
    Type: AWS::EC2::RouteTable
    DependsOn: AttachGateway
    Properties:
      VpcId: !Ref VPC
      Tags:
        - Key: Name
          Value: !Join [ "-", [ !Ref ProjectCode, public-route-table-igw ] ]
  PublicRouteIGW:
    Type: AWS::EC2::Route
    DependsOn: AttachGateway
    Properties:
      RouteTableId: !Ref PublicRouteTableIGW
      DestinationCidrBlock: 0.0.0.0/0
      GatewayId: !Ref InternetGateway

  # サブネットの設定
  PublicSubnet:
    Type: AWS::EC2::Subnet
    DependsOn: AttachGateway
    Properties:
      VpcId: !Ref VPC
      AvailabilityZone: ap-northeast-1a
      CidrBlock: !Ref PublicSubnetCidr
      Tags:
        - Key: Name
          Value: !Join [ "-", [ !Ref ProjectCode, public-subnet ] ]

その他のリソースも同じようにType:~でそれぞれのリソースを宣言しPropertiesにて細かい設定を行い、Nameタグを紐づけております。

まとめ

今回はCloudFormationでVPCを構築するために必要なテンプレートファイルの書き方を記入しましたが、
実際の実行部分は長くなってしまうので次回にまた記入したいと思います。
日々手動でAWSリソースを立ち上げることがあると思いますが、こういったツールを使うことで
少しでも工数を減らすことができると思いますので、AWSを利用することが多い方は
利用自体は無料なのでぜひとも利用してほしいとおもいます。


この記事をかいた人

About the author