VPCピアリング越しのRDSエンドポイント接続についての考察
はじめに
こんにちは、yokatsukiです。 案件でVPCピアリングを使って、AWSアカウントが異なるの2つのVPCを接続しました。VPCピアリングに関する情報は数ありますが、RDSとの接続のように、IPではなくエンドポイント名での接続に関しては意外に情報がありませんでした。そこで、VPCピアリング越しにRDS接続した際の挙動について確認してみました。
前置き:VPCピアリングとは
VPCピアリング(VPC Peering、VPCピア接続)とは、一言で言うと、2つのVPC間のL3ネットワーク通信を提供し、外部ネットワークなしでVPC間の相互接続を実現する機能になります。アカウント間でローカル接続が可能になるので、インターネット経由の通信と比較して、通信の高速化が期待できます。ただし、送受信1GBあたり、$0.01がかかります(2015/6/17現在)のでご注意ください。
概要はこちらのエントリをご覧ください。
マニュアルはこちらです。
具体的なVPCピアリングの設定方法については、吉田さんのエントリが参考になりました。
(2015/7/8追記)弊社鈴木さんが改めて設定方法のエントリを書きましたので、紹介致します。
料金についてはこちらです。
- 料金 - Amazon EC2 (ページ内を"ピアリング"で検索してください。)
また、弊社大瀧さんがVPCピアリングの機能的考察を行っています。
ネットワーク性能に関しては、maedaさんのエントリが参考になると思います。
さらに、弊社佐々木さんが、CloudFormationでVPCピアリングを構成する方法について解説しています。
検証環境
さて、前置きがすんだところで、今回検証に使用したVPCピアリング接続の環境の紹介です。異なるアカウントA、BでそれぞれVPCを作成し、以下図のVPCピアリング設定を行いました。
また、アカウントAにMySQLクライアントに相当するEC2インスタンスを立ち上げ、アカウントBにMySQLを立ち上げました。図のように、EC2インスタンスからどのような名前であればRDSインスタンスに接続できるかを確認しました。
検証結果
色々試した結果、VPCピアリング越しのRDS接続は、RDSのPublicly Accessibleの設定によって異なることが解りました。
Publicly Accessibleが No の場合
RDSをPublicly Accessible=Noの設定で起動します。これを便宜上RDS 1と名付けます。RDS 1に対してはグローバルIPアドレスが割り当てられず、インターネットから直接アクセスすることはできません。
任意の場所からのRDSエンドポイント名の名前解決結果がプライベートIP アドレスとなる為、どのVPCからも同じ方法でアクセスすることになります。
$ dig public-no.c9oclc29ciyb.ap-northeast-1.rds.amazonaws.com ; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.30.rc1.36.amzn1 <<>> public-no.c9oclc29ciyb.ap-northeast-1.rds.amazonaws.com ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 7401 ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0 ;; QUESTION SECTION: ;public-no.c9oclc29ciyb.ap-northeast-1.rds.amazonaws.com. IN A ;; ANSWER SECTION: public-no.c9oclc29ciyb.ap-northeast-1.rds.amazonaws.com. 5 IN A 10.0.1.202 ;; Query time: 5 msec ;; SERVER: 172.31.0.2#53(172.31.0.2) ;; WHEN: Wed Jun 17 01:45:11 2015 ;; MSG SIZE rcvd: 89
Publicly Accessible が Yes の場合
RDS 1は削除し、新たなRDSをPublicly Accessible=Yesの設定で起動します(RDS 2)。この場合はグローバルIPアドレスが割り当てられるので、インターネットからRDS 2にアクセスすることができるようになります。(もちろんセキュリティグループの設定は必要です)
この場合、RDSが存在するVPC以外から名前解決を行った場合にはグローバルIPアドレスが返されます。
$ dig public-yes.c9oclc29ciyb.ap-northeast-1.rds.amazonaws.com ; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.30.rc1.36.amzn1 <<>> public-yes.c9oclc29ciyb.ap-northeast-1.rds.amazonaws.com ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 4471 ;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 0 ;; QUESTION SECTION: ;public-yes.c9oclc29ciyb.ap-northeast-1.rds.amazonaws.com. IN A ;; ANSWER SECTION: public-yes.c9oclc29ciyb.ap-northeast-1.rds.amazonaws.com. 5 IN CNAME ec2-52-69-97-144.ap-northeast-1.compute.amazonaws.com. ec2-52-69-97-144.ap-northeast-1.compute.amazonaws.com. 60 IN A 52.69.97.144 ;; Query time: 21 msec ;; SERVER: 172.31.0.2#53(172.31.0.2) ;; WHEN: Wed Jun 17 02:17:00 2015 ;; MSG SIZE rcvd: 144
このため接続にエンドポイント名を利用した場合にはインターネット経由のアクセスとなります。以下にピアリング越しにエンドポイント名で接続した時の接続状態を示します。
$ netstat Active Internet connections (w/o servers) Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 0 ip-172-31-1-235.ap-no:46932 ec2-52-69-97-144.ap-n:mysql ESTABLISHED
ちなみにRDSと同じVPC内からPublicly AccessibleがYesのRDSにアクセスを試みると、ローカルIPアドレスが返ってきます。
$ dig public-yes.c9oclc29ciyb.ap-northeast-1.rds.amazonaws.com ; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.30.rc1.36.amzn1 <<>> public-yes.c9oclc29ciyb.ap-northeast-1.rds.amazonaws.com ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 37605 ;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 0 ;; QUESTION SECTION: ;public-yes.c9oclc29ciyb.ap-northeast-1.rds.amazonaws.com. IN A ;; ANSWER SECTION: public-yes.c9oclc29ciyb.ap-northeast-1.rds.amazonaws.com. 5 IN CNAME ec2-52-69-97-144.ap-northeast-1.compute.amazonaws.com. ec2-52-69-97-144.ap-northeast-1.compute.amazonaws.com. 60 IN A 10.0.2.145 ;; Query time: 23 msec ;; SERVER: 10.0.0.2#53(10.0.0.2) ;; WHEN: Wed Jun 17 02:16:48 2015 ;; MSG SIZE rcvd: 144
ここで得られたPublicly AccessibleがYesのRDSに、プライベートIPアドレスを使って、VPCピアリング越しのログインを試みます。
$ mysql -h 10.0.2.145 -u master -p Enter password: Welcome to the MySQL monitor. Commands end with ; or g. Your MySQL connection id is 22 Server version: 5.6.22-log MySQL Community Server (GPL) Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or 'h' for help. Type 'c' to clear the current input statement. mysql>
成功しました。
接続状況を見てみましょう。以下が、ピアリング越しにローカルIPで接続した時の接続状態です。
$ netstat Active Internet connections (w/o servers) Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 0 ip-172-31-1-235.ap-no:44724 ip-10-0-2-145.ap-nort:mysql ESTABLISHED
確かにローカルIPアドレスで接続しています。
まとめ
VPCピアリング越しにエンドポイント名でRDS接続する際の挙動は以下です。
- Publicly AccessibleがNoの場合はローカルIPで接続
- Publicly AccessibleがYesの場合はグローバルIPでインターネット経由で接続される
- Publicly AccessibleがYesの場合でも、IPアドレス直指定でローカルIPを使用したVPCピアリング接続は可能
今回の検証ではRDSにMySQLを使用しましたが、Redshiftでも同様です。アカウントを跨いだ巨大なウェアハウスを作成し、それぞれのVPCからRedshiftクラスタを呼び出す際にも同様の挙動となりますので参考になさってください。
さて、ここまで来ると次は、「Publicly AccessibleがYesの場合でも、エンドポイント名でローカルIP接続できるようにならないか?」という要件が出てきそうですが、長くなりそうなのでそれは次回のお楽しみということで。ではまた。
追記(2016.8.8)
上記エントリを記述した時点では、「Publicly AccessibleがYesの場合でも、エンドポイント名でローカルIP接続する」ことができませんでした。しかし、2016年7月28日のアップデートで実現できるようになりました。詳細は西澤さんの下記エントリをご参照ください。