[AWS] Elastic Load BalancingがIPv6に対応しました!(5年ぶり2回目)

2017.01.26

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

ども、大瀧です。 本日、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」を選択します。

elb-ipv601

「アベイラビリティゾーン」(VPCサブネットの選択)では、IPv6が有効なサブネットを選択しましょう。無効なサブネットを選択するとエラーになります。

elb-ipv602

これでOKです。ELBのプロパティにある「IPアドレスタイプ」と、「DNS名」でIPv6対応かどうかが識別できます。

elb-ipv603

なお、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.116172.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に対応させる良いタイミングではないでしょうか。

参考URL