【初心者向け】AWS CloudFormation で VPC を構築する

CloudFormation

フェイス・ソリューション・テクノロジーズ株式会社 IS 本部 OS ユニットの Saki@猫好き です。AWS 活用していますか?

今日は、AWS CloudFormation を利用して、Amazon VPC を構築する方法について書いてみたいと思います。

はじめに

AWS の利用を開始したばかりの初心者にありがちなのが、VPC を指定せずに EC2 インスタンスを立ち上げる、というものです。私も、AWS アカウントを作成したての頃は、Amazon VPC の有用性を理解することなくいきなり EC2 インスタンスを立ち上げて、中身の構築を行っていました。

Amazon VPC がどういうものか、については、弊社ブログで OS ユニットのメンバー Toshi が書いていますので、そちらをご確認ください。

現在は、マネジメントコンソールから VPC の構築を行うと、随分と簡単に出来てしまいます。こちらについても、弊社ブログで OS ユニットのメンバー Toshi が書いていますので、そちらをご確認ください。

少し序の文が長くなりますが、私個人の VPC の分割についての考え方を紹介させてください。

VPC を分ける必要はあるのか?

「VPC を分ける必要はあるのか?」よく聞かれる内容です。

環境を分散(開発、テスト、本番)させたり、プロジェクト内で別要件が発生して新たに EC2 インスタンスを立ち上げたりする際に、わざわざ新しく VPC を構築しなくてもよくね? って感じです。

確かに、以前のマネジメントコンソールからの VPC の構築でしたら、ルートテーブルを作成したり IGW 設定したりサブネットを複数用意したりと、面倒な作業でした。

ルートテーブルや IGW、要件によっては NAT ゲートウェイなど、多少、インフラが理解できていないと手を付けるのは難しいという印象でした。

しかし、最近はマネジメントコンソールからの作成で簡単に VPC が作成できます。インフラの知識はほとんど不要で VPC が作成されます(実際に使っていくうえではこういった知識が絶対に必要です。勉強した方が良いと思います)。

そこで、このブロックの見出しにある質問「VPC を分ける必要はあるのか?」です。

私の考えとしては、用途ごとにアカウントを分けて利用するのが良い、と思っています。

VPC ごとに環境を分けておけば、VPC ごとの接続可否設定を IAM ポリシーで作成し、それをユーザーにアタッチすることで、最小権限のルールを達成することが可能である。

ソリューションアーキテクトの試験でもよく問われる内容です。私としては、これをアカウントレベルに引き上げることで、更に管理がしやすくなるのではないかと考えています。

1 アカウント 1 リソースに限定すれば、複雑なリソース単位の IAM ポリシーを作成する必要はないですし。AWS Organizations とスイッチロールを利用すれば、ユーザー管理を簡単に行うことができます。

AWS Organizations やスイッチロールについては、私が以前書いた記事をご参照いただけますと幸いです。

もちろん、アカウントを分けて利用すると、クロスアカウントによるログ管理や監視設定など、新たな知識が必要となってきます。

もし、お悩みごとがございましたら、弊社にご相談くださいませ。

結局、なんで CloudFormation を利用して VPC を構築するのか

ここまで読んでくださった方であれば、マネジメントコンソールから簡単に VPC が構築できるのなら、CloudFormation を利用する必要ないんじゃない? って思われる方もいらっしゃるかもしれません。

確かに、各ユーザーがきちんと自分の作成したリソースを管理してくれるのであれば、各ユーザーに任せてもいいかもしれないです。もちろん、大手の会社様であれば、リソースの作成管理まで情シス部で行っていて、各ユーザーが自由にリソースを作れないようになっていたりするのでしょうけれど。

弊社くらいの規模であれば、各ユーザーにリソースの作成権限があります。そうなるとですね「開発環境の構築のためのテスト」で作成を試したとみられるリソースが残されたままになっていたりするのです。皆様ご存じの通り、VPC はリージョン内でデフォルトで 5 つしか作成できません。何度もテストで作成を繰り返し、手順を確定して、いざ本構築、となった瞬間。

出鼻を挫かれるとはこういうことだ!

もちろん、他にもいろいろなリソースの残骸を目撃してきましたし、中には「お金かかるじゃん!」ってこともありました。

AWS CloudFormation を利用していれば、スタックの削除だけで済むのにね。

そこで、ようやく本題です。今回は、VPC の作成を AWS CloudFormation を利用して行ってみたいと思います。

作成してみる

今回作成するのはこんな構成

ごくごくありふれた VPC の構成となっています。

Availability Zone をまたいで VPC を設定し、それぞれの Availability Zone に Public Subnet と Private Subnet を設置する。AZ 障害に強い、マルチ AZ 構成をとるための VPC の構成です。

CloudFormation テンプレート

テンプレートは、次のようなものになります(私は、vpc-test.yml という名前で保存しました)。

VPC の Cidr を 10.0.0.0/16 としています。
Public Subnet、Private Subnet に、10.0.0.0/24 ~ 10.0.0.3/24 を設定しています。
Availability Zone については、組み込み関数を利用して、利用可能な AZ の 0 番目と 1番目を取得して利用します。
IGW をアタッチし、Route Table で 0.0.0.0/0 で Public Subnet に接続可能としています。

AWSTemplateFormatVersion: 2010-09-09
Description: Template for VPC

Resources:
  CFnVPC:
    Type: AWS::EC2::VPC
    Properties:
      CidrBlock: 10.0.0.0/16
      InstanceTenancy: default
      EnableDnsSupport: true
      EnableDnsHostnames: true
      Tags:
        - Key: Name
          Value: cfn-test

  PublicSubnet1:
    Type: AWS::EC2::Subnet
    Properties:
      CidrBlock: 10.0.0.0/24
      VpcId: !Ref CFnVPC
      AvailabilityZone: !Select [ 0, !GetAZs ]
      MapPublicIpOnLaunch: true
      Tags:
        - Key: Name
          Value: PublicSubnet1

  PublicSubnet2:
    Type: AWS::EC2::Subnet
    Properties:
      CidrBlock: 10.0.1.0/24
      VpcId: !Ref CFnVPC
      AvailabilityZone: !Select [ 1, !GetAZs ]
      MapPublicIpOnLaunch: true
      Tags:
        - Key: Name
          Value: PublicSubnet2

  PrivateSubnet1:
    Type: AWS::EC2::Subnet
    Properties:
      CidrBlock: 10.0.2.0/24
      VpcId: !Ref CFnVPC
      AvailabilityZone: !Select [ 0, !GetAZs ]
      Tags:
        - Key: Name
          Value: PrivateSubnet1

  PrivateSubnet2:
    Type: AWS::EC2::Subnet
    Properties:
      CidrBlock: 10.0.3.0/24
      VpcId: !Ref CFnVPC
      AvailabilityZone: !Select [ 1, !GetAZs ]
      Tags:
        - Key: Name
          Value: PrivateSubnet2

  CFnVPCIGW:
    Type: AWS::EC2::InternetGateway
    Properties: 
      Tags:
        - Key: Name
          Value: cfn-test

  CFnVPCIGWAttach:
    Type: AWS::EC2::VPCGatewayAttachment
    Properties: 
      InternetGatewayId: !Ref CFnVPCIGW
      VpcId: !Ref CFnVPC

  PublicRouteTable:
    Type: AWS::EC2::RouteTable
    Properties:
      VpcId: !Ref CFnVPC
      Tags:
        - Key: Name
          Value: Public Route

  PublicRoute:
    Type: AWS::EC2::Route
    DependsOn: CFnVPCIGW
    Properties:
      RouteTableId: !Ref PublicRouteTable
      DestinationCidrBlock: 0.0.0.0/0
      GatewayId: !Ref CFnVPCIGW

  PublicSubnet1Association:
    Type: AWS::EC2::SubnetRouteTableAssociation
    Properties:
      SubnetId: !Ref PublicSubnet1
      RouteTableId: !Ref PublicRouteTable

  PublicSubnet2Association:
    Type: AWS::EC2::SubnetRouteTableAssociation
    Properties:
      SubnetId: !Ref PublicSubnet2
      RouteTableId: !Ref PublicRouteTable

CloudFormation で起動する

CloudFormation のマネジメントコンソールから、テンプレート yaml ファイルをアップロードする

スタックの名前はわかりやすいものを!

以降は、デフォルトで進め、最後「送信」をクリックします

しばらく待って、「CREATE_COMPLETE」となれば成功です
(なかなか変わらない場合は、「スタック」の文字の右にある更新ボタンを押してみてください)

Amazon VPC のマネジメントコンソールを確認します

問題なく VPC が作成されているようです。

スタックの削除

リソースの消し忘れ問題も、スタックの削除で解消できます。

CloudFormation マネジメントコンソールから削除するスタックを選択し、「削除」をクリックします。

※簡単に削除されてしまいますので十分に注意して、必要なリソースを誤って削除しないようにしてください!

Amazon VPC のマネジメントコンソールを確認します

完全に消えているのが確認できます。

おまけ

VPC がリージョン内で 5 つ作成されている状態で、CloudFormation を走らせた場合のエラー。

手動で作成したときと同様のエラーが表示されるようです。

最後に

今回はいろいろと考えることがあって、文章が長くなってしまいました。

私としては、すべてのリソースをアカウントごとに分けた方が良いのでは、と考えているだけで、管理上の問題、クロスアカウントの設定など、クリアしなければならない問題が多く存在しているのは事実です。解決方法については、是非、弊社にご相談ください。

今回作成した VPC 設定は画一的なもので、パラメータセクションを追加して Cidr ブロックの設定、ルートテーブルの設定、タグの設定を行ったり、Output セクションを追加して他のリソースでこの VPC を利用できるようにしたりすれば、複数の環境を柔軟に用意できるようになります。

それを、複数のアカウントで利用するか、1 つのアカウント内で利用するか、については、様々議論がると思いますのでまたの機会に。

CloudFormation を上手に利用して、簡単管理な楽しい AWS ライフをお送りください。

引き続き、よろしくお願いいたします!

プロフィール
この記事を書いた人
saki@猫好き

フェイス・ソリューション・テクノロジーズ株式会社オペレーションサービスユニットのユニット長。
とにかく猫が好き。そして、キャンプが好き。休みの日は結構な割合でキャンプ場に出没します。
AWS 6 冠達成しています。
ITパスポート、基本情報技術者、応用情報技術者、取得済み。

saki@猫好きをフォローする
フェイスでは一緒に働く仲間を募集しています

フェイス・ソリューション・テクノロジーズ株式会社では、一緒に働いてくれる仲間を募集しています。
いろいろな案件があるので、いろいろなことに挑戦できる会社です。
「面白いこと」に積極的なので、あなたの「面白そうなことだからやってみたい」を形にできるチャンスがあります!

CloudFormation
フェイススタッフブログ

コメント

タイトルとURLをコピーしました