CFnを使ってVPCを作ってみる

はじめに

はじめまして。
サーバサイドエンジニアのkdmです。
Node.jsでサーバサイドアプリケーションの開発をやってます。

普段はAWS周りのメンテナンスや開発はメインの担当ではないのですが、
担当している案件でCloudFormation(以下CFn)を利用することになり、
現在ゴリゴリのゴリラでCFnを触っています。

本記事では自身の頭の中をまとめる意味も含め、簡単ではありますがCFnについて紹介します。

目次

  • CFnについて
  • CFnを使ってVPCを作ってみる

CFnについて

とりあえず 公式ドキュメント です。

まぁあれですね、Infrastructure as Codeってやつですね。

AWSで利用するEC2やVPCなどのインフラをコードでビルドできるわけです。
単なるコードですので、

  • バージョン管理が可能になり
  • 冪等性を担保したデプロイが可能になる

上記のようなメリットがあるという認識です。

コードとしてメンテナンスをし続けることで、
「○○さんしか作業方法を知らない」という職人芸を排除できそうです。

しかし、コードの管理が職人芸になってしまったら悲しみですな!

CFnを使ってVPCを作ってみる

序章

こういったものはとりあえず手を動かしてみましょう。理解が早いと思います。
今回はとりあえずVPCを作ってみましょう。

CFnにはテンプレートという概念が存在しており、
JSON or YAML形式のテキストファイルとしてコードを記述していきます。

テンプレートを元にして、AWSのCloudFormation上にスタックというものができあがります。
スタックはリソース(EC2とかVPCなど)の変更点を1まとめにしたものです。

cd /path/to/workspace
touch vpc.yaml

本記事ではYAMLを採用します。
I Love JSON な方には申し訳ないです😇

こちらはCFnのVPCリファレンスです。

AWSTemplateFormatVersionはテンプレートの形式バージョンを指しています。
任意の項目ですので、なくてもよいです。
現在最新で唯一のバージョンは 2010-09-09 です。

Resources以下に定義を記述していくのですが、そのほかにDescriptionやParametersも定義が可能です。

ここまでの内容をまとめると以下のようなYAMLになります。

AWSTemplateFormatVersion: "2010-09-09"
Description: >
  This is template of VPC.

Parameters:
  Hoge:
    Type: String
    Description: >
      sample param.

Resources:
    ・
    ・
    ・

こんな感じです。
パラメータにもdescriptionを定義できます。

ここからは具体的なVPCの定義(Resourcesの記述)をしていきましょう!

第1章 VPCの作成

まずはリファレンスのサンプルを参考に記述をします。

AWSTemplateFormatVersion: "2010-09-09"
Description: >
  This is template of VPC.

Parameters:
  VpcCIDR:
    Type: String
    Description: >
      sample param.

Resources:
  VPC:
    Type: AWS::EC2::VPC
    Properties:
      CidrBlock: !Ref VpcCIDR
      EnableDnsSupport: false
      EnableDnsHostnames: false
      InstanceTenancy: dedicated
      Tags:
        - Key: hoge
          Value: fuga

こんな感じですね。
!Ref ってやつがいきなり出てきましたが、これはCFnの組み込み関数です(ドキュメント)。
本記事ではパラメータ(VpcCIDRという名前で定義されています)の論理名を指定し、その値を利用するようにしました。
いったんこの状態でAWSにデプロイしてみましょう。
AWS CLIでデプロイをします。

stackname='test-vpc-stack'
VpcCIDR='10.0.0.0/16'
aws cloudformation deploy --stack-name ${stackname} \
  --template-file vpc.yaml \
  --parameter-overrides \
    VpcCIDR=${VpcCIDR}

こんな感じでスタック名やテンプレートファイルを指定してデプロイします。

stackname='test-vpc-stack'
VpcCIDR='10.0.0.0/16'
aws cloudformation deploy --stack-name ${stackname} \
  --template-file vpc.yaml \
  --parameter-overrides \
    VpcCIDR=${VpcCIDR}
Waiting for changeset to be created..
Waiting for stack create/update to complete
Successfully created/updated stack - test-vpc-stack

スタックの作成が完了しました。
AWSコンソールで確認します。

----------2018-09-06-11.04.56

こちらはCFnの画面にて、スタック名で絞り込んだ状態のスクショです。
スタックが作成されていますね。

スタック名のリンクをクリックして詳細を見てみましょう。

----------2018-09-06-11.05.52

画面の一部を切り取ったスクショです。
CREATE_COMPLETEしています。
VPCが作られていますね(リソースのセクションに注目)。

VPCの画面を開いて、作成されたVPCの物理IDで検索をしてみます。

----------2018-09-06-11.06.54

どん!
VPCが作られていますね。
こんな感じのノリでAWSリソースを作成できます。

作成されることが確認できたので削除します。

aws cloudformation delete-stack --stack-name test-vpc-stack

CFnの画面に戻ります。

----------2018-09-06-11.27.07

削除されました。
DELETE_COMPLETEです。

VPCの画面を開きます。

----------2018-09-06-11.27.29

先ほど作成したVPCの物理IDで検索をすると、表示されなくなりました。

終章

今回はVPCのみを作成するシンプルなものでしたが、
複雑にテンプレートを作り込めば一度にさまざまなリソースを作成できます。

使い方に慣れてくれば便利な気配がするので、頑張って覚えようと思います。

みなさんもぜひ、利用する機会があればCFnを使ってみてください。

Author image
About kdm
expand_less