Transit GatewayのVPC間通信を利用して別VPCにあるインスタンスをALBのターゲットに指定する

2022.01.13

こんにちは、岩城です。

昨年、以下のエントリを書きました。

この派生として、Transit GatewayのVPC間通信の場合にどうなるかを確認しました。

結論

  • Transit GatewayのVPC間通信でも、ALBのターゲットに別VPCのインスタンスを指定できる
  • VPCピアリングとは違い、セキュリティグループIDの相互参照がサポートされていないので注意する

やってみた

以下のような構成で試してみました。

前提

本エントリの前提は以下のとおりです。

  • VPC、サブネットを始めとする基本的なネットワークリソースを作成済み

Transit Gateway

Transit Gatewayを作成します。リソース名のCIDRを設定するだけで、あとはデフォルトのままとしました。

CIDRを指定する際は、VPCとの重複がないようにしてください。

次にそれぞれのVPCのサブネットに作成するTransit Gatewayアタッチメントを作成します。

アタッチメントタイプにVPCを選択し、アタッチメントが起動するサブネットを選択して作成します。

Transit Gatewayのベストプラクティスに、アタッチメント個別のサブネットを使用するとあり、それに倣っています。

トランジットゲートウェイ設計のベストプラクティス

各トランジットゲートウェイ VPC アタッチメントに個別のサブネットを使用します。各サブネットに対して、小さな CIDR (/28 など) を使用して、EC2 リソースのアドレスが増えるようにします。

同様に片方のVPCに対するアタッチメントを作成します。

ルートテーブル

対向のVPCに通信するため、Transit Gatewayアタッチメントをターゲットにするルートを追加します。

まずは、ALBが起動するパブリックサブネットのルートテーブルに対し、VPC2のCIDRを宛先とし、ターゲットにアタッチメントを指定するルートを追加します。

次にEC2インスタンスが起動するプライベートルートテーブルに対しても同様のルートを追加します。

VPCエンドポイント

今回、EC2インスタンスが起動するネットワーク構成をインターネットへのルートなしとしたため、Session ManagerとAmazon Linux AMIのリポジトリを利用するため、以下のVPCエンドポイントを作成しました。

Systems ManagerのVPCエンドポイント利用については、以下にまとめられています。

Systems Manager を使用してインターネットアクセスなしでプライベート EC2 インスタンスを管理できるように、VPC エンドポイントを作成するにはどうすればよいですか?

Amazon Linux AMIのリポジトリは、各リージョン内のS3にあるため、VPCエンドポイントを介してS3にアクセスできれば問題なく、S3のVPCエンドポイントを作成しました。

Amazon Linux AMI に関するよくある質問

Amazon Linux AMI リポジトリは、各リージョン内の S3 バケットです。

EC2インスタンス

EC2インスタンスの起動時の注意点は以下の2つです。

  • Session Managerの利用を許可するIAMポリシーAmazonSSMManagedInstanceCoreを含むIAMロールをアタッチする
  • ALBからのアクセスを許可するようにセキュリティグループを設定する

セキュリティグループについては、本エントリ冒頭にも記載したとおり、VPCピアリングではセキュリティグループの相互参照が可能でしたが、Transit Gatewayの場合はサポートされていません。

AWS Transit Gateway よくある質問

Q: 初回のリリースでサポートされない Amazon VPC の機能はどれですか?

A: Amazon VPC でのセキュリティグループの参照は、リリース時にはサポートされません。スポーク型の Amazon VPC では、同一の AWS Transit Gateway に接続されている他のスポーク内のセキュリティグループは参照できません。

このため、ALBが起動するサブネットのCIDRか、VPCのCIDRをソースとするようにセキュリティグループを設定する点には注意してください。

次に、以下のコマンドを実行し、nginxをインストールした後、起動しておきます。

# nginxをインストールする
$ sudo amazon-linux-extras install nginx1
# nginxを起動する
$ sudo systemctl start nginx
# nginxが起動したことを確認する
$ sudo systemctl status nginx
# nginxデフォルトのindex.htmlが返ってくることを確認する
$ curl http://localhost

ALB

最後にALBを作成しますが、こちらも特別なことはしていないので省略します。

ターゲットグループにおいて、ターゲットとなるインスタンスを指定する際、ネットワークをその他のプライベートIPアドレスとし、EC2インスタンスのプライベートIPを設定してください。以上で準備完了です。

動作確認

ALBのDNS名でアクセスして以下のようなnginxのページが表示されれば、Transit GatewayのVPC間通信を利用してALBからインスタンスにアクセスできたことになります。

おわりに

普段Transit Gatewayを利用することが少ないので、いい勉強になりました。

本エントリがどなたかのお役に立てれば幸いです。