[AWS] Elastic Load BalancingがIPv6に対応しました!(5年ぶり2回目)
ども、大瀧です。 本日、AWSのロードバランササービスであるELBのIPv6対応がリリースされました。試してみた様子をレポートします。
5年ぶり2回目のElastic Load BalancingのIPv6対応
ご存じの方がごく一部いるかもしれませんが、ELBのIPv6対応は5年前の2011年5月に一度リリースされています。
再度リリースが出るとはどういうことでしょうか?それは、対応するロードバランサとネットワーク環境の組み合わせに差異があります。以下の表にまとめました。
ロードバランサのタイプ \ ネットワークのタイプ | EC2 Classic | VPC |
---|---|---|
Classic Load Balancer(CLB) | ○ | × |
Application Load Balancer(ALB) | × | ◎ 今回のリリース |
注意しなければならないのは「×」マークのところですね。今回のIPv6対応はALBが対象なので、VPC環境にCLBを作成する場合は引き続きIPv6が扱えません。また、ALBはEC2 Classic環境には作成できないのでこちらも自動的に×になります。
もう一つの制約として、インターネットから直接接続させない内部ロードバランサではIPv6を有効にできません。IPv6に対応済みのDirect Connect経由などの場合に要注意ですね。 ちなみに、現在選択できるのは「IPv4のみ」と「デュアルスタック」(IPv4/IPv6両対応)の2択なので、「IPv6のみ」にはできません。実用上問題無いとは思いますが。
設定手順
では、設定手順を見ていきましょう。と言っても、準備を除いた作業は1ステップのみです。
- 検証したリージョン : 東京リージョン
0. VPCのIPv6有効化
ちょうど本日VPCのIPv6対応の対象リージョンが一気に増えましたので、東京リージョンで試しています。ELBを配置するVPCで以下のブログ記事を参考に、VPCでIPv6を有効化します。
後述しますが、IPv6を有効化する必要があるのは厳密にはELBのVPCサブネットのみで、ターゲットとなるEC2のVPCサブネットはIPv6が無効でも動作します。
1. ALBのIPv6有効化
では、ALBを作成しIPv6を有効にしてみましょう。ALBの作成ウィザードにある[IPアドレスタイプ]から「dualstack」を選択します。
「アベイラビリティゾーン」(VPCサブネットの選択)では、IPv6が有効なサブネットを選択しましょう。無効なサブネットを選択するとエラーになります。
これでOKです。ELBのプロパティにある「IPアドレスタイプ」と、「DNS名」でIPv6対応かどうかが識別できます。
なお、CLBのようなdualstack.
のプレフィックス付きDNS名は用意されず、必ずAAAAレコードを持つことになります。
動作確認
それでは、IPv6で接続できるか、試してみます。今回は、Nginxを初期設定で起動したAmazon Linuxをターゲットにしています。
$ curl -v XXXXXXXX.ap-northeast-1.elb.amazonaws.com/ * Rebuilt URL to: XXXXXXXX.ap-northeast-1.elb.amazonaws.com/ * Trying 2406:da14:aea:1400:64c3:9807:e87:cf5b... * Connected to XXXXXXXX.ap-northeast-1.elb.amazonaws.com (2406:da14:aea:1400:64c3:9807:e87:cf5b) port 80 (#0) > GET / HTTP/1.1 > Host: XXXXXXXX.ap-northeast-1.elb.amazonaws.com > User-Agent: curl/7.47.1 > Accept: */* > < HTTP/1.1 200 OK < Date: Thu, 26 Jan 2017 09:11:51 GMT < Content-Type: text/html < Content-Length: 3770 < Connection: keep-alive < Server: nginx/1.10.1 < Last-Modified: Fri, 05 Aug 2016 00:04:06 GMT < ETag: "57a3d7f6-eba" < Accept-Ranges: bytes < <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> :(以下略) $
AAAAレコードで名前解決が行われIPv6のアドレスにリクエストを送信、Nginxのデフォルトページのレスポンスが返ってきました!IPv6で動作していることがわかります。ちなみに、Nginxのアクセスログは以下のようになりました。
172.31.16.207 - - [26/Jan/2017:09:11:36 +0000] "GET / HTTP/1.1" 200 3770 "-" "ELB-HealthChecker/2.0" "-" 172.31.5.116 - - [26/Jan/2017:09:11:41 +0000] "GET / HTTP/1.1" 200 3770 "-" "ELB-HealthChecker/2.0" "-" 172.31.5.116 - - [26/Jan/2017:09:11:51 +0000] "GET / HTTP/1.1" 200 3770 "-" "curl/7.47.1" "2406:da14:aea:1400:a0e:a448:1241:d7bd" 172.31.16.207 - - [26/Jan/2017:09:12:06 +0000] "GET / HTTP/1.1" 200 3770 "-" "ELB-HealthChecker/2.0" "-" 172.31.5.116 - - [26/Jan/2017:09:12:12 +0000] "GET / HTTP/1.1" 200 3770 "-" "ELB-HealthChecker/2.0" "-"
172.31.5.116
と172.31.16.207
はALBのIPv4 Private IPなので、ELB-EC2間はIPv4で通信していることがわかります。また、Nginxの既定のログ形式は末尾がX-Forwarded-Forヘッダなので、クライアント-ELB間はIPv6になっていることがわかりますね。
まとめ
新しいロードバランサであるALB(Application Load Balancer)がIPv6に対応した様子をご紹介しました。東京リージョンのVPCにもIPv6対応が来たことでAWSのIPv6対応が一巡した印象です。 そろそろ皆さんのAWS環境をIPv6に対応させる良いタイミングではないでしょうか。