VPN接続用に仮想プライベートゲートウェイの下準備をするCloudFormationを作ってみた

VPN接続の作成の為に準備する、仮想プライベートゲートウェイ(VGW)を作成・VPCにアタッチ・ルート伝搬を有効化までを一気にやれるCloudFormationのテンプレートを作成してみました。
2019.07.31

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

突然ですが、久々に髪の毛を染めました。
ようやく、色を抜きまくっていたインナーに青色が綺麗に入る状態になっていたので青色を入れ、前髪に新たに赤色のメッシュを入れました。
先日弊社では四半期報告会があり、めっきり暑くて出社していなかった私のニューヘヤーお披露目の場となったのですが、奇しくもその日「NASA」ロゴのTシャツを着て行ってしまった為、同系色で纏まったせいか皆NASAのアイコンに気を取られて私の髪色に気付かないという現象が起きてしまいました。

▲ 本当にこんな髪色なんです

こんにちは、AWS事業本部のShirotaです。
汗でインナーカラーが落ちる事が一番の悩みです。

さて、今回はVPN接続の設定の為にCloudFormationを用いた話をさせて貰いたいと思います。

VPN接続の準備にCloudFormationを使いたい

VPN接続の設定をする際、作業を正確にかつ効率良く行いたくて、リソースをCloudFormationで作成する事にしました。

VPN接続の設定をする際の、AWS側で実行する事の主なフローは以下のようになっております。

  • 仮想プライベートゲートウェイ(VGW)を作成する

  • VPCにVGWをアタッチする

  • VGWのルート伝搬を有効化する

  • VPN接続を作成する(カスタマーゲートウェイを作成する)

  • Configファイルを生成する

これ以降は、Configファイルをルータに適用して、ルータ側での作業をする事になります。

AWS側の設定で事前に確認しておく事

今回、私は初めてVPN接続の設定をしていたのですが、その際に事前に注意しておいた方が良いなと気付いた事があったので簡単に纏めておきます。

ルーター側の情報を事前に確認しておく

すごく初歩的な事ではあるのですが、普段AWS内で完結するものを構築したり検証する機会ばかりだったので、ルーター側のどの辺りの情報が必要になるのかを把握しきれていませんでした。

上記フローに則り、具体的に説明していくと

  • VPN接続を作成する

この作業では、VPN接続を作成する際に必要となる カスタマーゲートウェイ の作成も同時に発生します。
カスタマーゲートウェイとは、AWS側とユーザ側をVPN接続する際にユーザ側のアンカーとして働く存在です。
AWS側で同様の役割を持っているのは、仮想プライベートゲートウェイ(VGW)となっています。
カスタマーゲートウェイの作成に必要な情報は、

  • ルーティングは静的か動的か
    • (動的なら) BGP(Border Gateway Protocol)で用いるAS番号(ASN)
  • ルーターのグローバルIPアドレス

です。また、

  • Configファイルを生成する

上記作業の際には、以下のルーターの情報が必要となります。

  • ベンダー名
  • プラットフォーム
  • ソフトウェアバージョン

事前の情報収集が出来ていると、手早く作業を進める事が出来ます。

割り当てるASNを考えておく

Direct Connect Gatewayに複数の仮想プライベートゲートウェイ(VGW)をアタッチしたりする事になる場合は特に、Direct Connect GatewayとVGWに割り当てるプライベートASNの考慮が必要です。
例えば、Direct Connect Gatewayには 64512 を割り振り、複数のVGWには 64513 以降を連番で割り当てたりすると明示的で拡張性もあるASNの割り当てが出来ます。

CloudFormationでやってみた事

実際、今回CloudFormationで作ってみた作業範囲は、以下の部分です。

  • 仮想プライベートゲートウェイ(VGW)を作成する

  • VPCにVGWをアタッチする

  • VGWのルート伝搬を有効化する

事前にVPCやルートテーブル等は用意しておきました。

また、今回は試していませんがVPN接続の一連の設定に関する分かりやすいエントリを弊社しばたが執筆しておりましたので、そちらを紹介させて頂きます。

自宅とAWSをVPN接続してみた

CloudFormationのテンプレート

以下が、上記作業を実行してくれるテンプレートです。

    AWSTemplateFormatVersion: '2010-09-09'
    Description: 'prepare: Virtual Private Gateway'

    Parameters:
      AmazonSideAsn:
        Type: Number
        Description: Input AmazonSideASN(64512-65534)
        Default: 64513
      VPCID:
        Type: AWS::EC2::VPC::Id
        Description: Choose VPC-ID
      RouteTableID:
        Type: String
        Description: Input RouteTableID

    Resources:
      VGW:
        Type: AWS::EC2::VPNGateway
        DeletionPolicy: Retain
        Properties: 
          AmazonSideAsn: !Ref 'AmazonSideAsn'
          Type: ipsec.1
          Tags:
            - Key: Name
              Value: test-vgw
      AttachVPNGateway:
        Type: AWS::EC2::VPCGatewayAttachment
        DeletionPolicy: Retain
        Properties:
          VpcId: !Ref 'VPCID'
          VpnGatewayId: !Ref 'VGW'
      EnableVGWPropagation:
        Type: AWS::EC2::VPNGatewayRoutePropagation
        DeletionPolicy: Retain
        DependsOn: AttachVPNGateway
        Properties:
          RouteTableIds:
          - !Ref 'RouteTableID'
          VpnGatewayId: !Ref 'VGW'

上記テンプレートを用いたスタックを作成する際、

  • VGWのASN
  • アタッチするVPC
  • ルートテーブルID

を事前に確認しておく必要があります。

テンプレートを作成してみて感じた事

実際に上記のテンプレートを作成し、使用してみて感じた事を以下に記載します。

ルートテーブルIDを事前に控えておく必要がある所がイケていない

ルートテーブルIDをParametersで指定する際、VPC IDのようにAWS固有のパラメーター型で引っ張ってくる事が出来ません。
上記問題の解決策としては、
ルートテーブルの作成を同一CloudFormationで行い、Refで呼び出せるようにすると一番楽にルートテーブルIDを引っ張ってくる事が出来るのかなと思いました。

ParametersでASNを指定する際のデータ型に気を付ける

CloudFormationのユーザーガイド にある、VGW作成の項目を見ると、以下のようにTypeが指定されています。

AmazonSideAsn
BGP セッションの Amazon 側の自律システム番号 (ASN)。

必須: いいえ

タイプ: Long

更新に伴う要件: 置換

この Long タイプですが、パラメーターのデータ型には存在しません。
Long型は整数型の一種なので、今回は Number を指定しています。

作成されるリソースの依存を"DependsOn"で明示する

今回、テンプレートの検証を行なっていて以下のエラーに出会いました。

▲ エラーメッセージを確認してみます

どうやら、リソースの作成順序が想定と違う動きをしてしまっているようです。

実行して欲しい事は、

VPCにVGWをアタッチ → ルートテーブルの伝搬を有効化する

なのですが、スタックのログを見ると、

ルートテーブルの伝搬を有効化する → VPCにVGWをアタッチ

の順番で実行しようとしてエラーが発生してしまっています。
アタッチしていないものは有効化出来ないので、本来実行して欲しい順番を明示的にします。
この時用いるのが、 DependsOn属性 です。
CloudFormationのユーザーガイドに、概要と用途が記載されているので参考にしてみて下さい。

上記を用いて、「ルートテーブルの伝搬を有効化する」リソースが、「VPCにVGWをアタッチ」が実行された後に実行されるようDependsOn属性を記載しました。
その結果が、以下のようになっています。

▲ 想定通りの動きをしてくれて、無事リソースが作成できました

事前準備はしっかりと

実際にCloudFormationを実行してみて気付く事もあるし、いざ設定をしようとしてAWS側以外に必要となる情報が色々ある事にも気付かされました。
ただ、一回でもつまづいているとこれらは比較的簡単に対処できるし、次からはCloudFormationも用意出来ているので設定自体の時間も短縮出来ると思います。

このような、やってみての「気付き」をもっと共有出来て、もっと多くの人が少しでもVPN接続の設定をする際に楽になれれば嬉しいです!