やりたいこと
API Gateway は IPv6 は利用できないので、CloudFront を介して IPv6 のみでアクセスできるようにする。
なお、今回は 検証用途として別VPC に EC2 で IPv6を有効化して検証します。そのため先に以下の方の記事を参考に作成しておいて下さい。
手順
API Gateway と Lambda
AWS SAM で API Gateway と既存のプライベートサブネットに Lambda を作成します。
template.yaml
で <サブネットid1>、<サブネットid2>、<セキュリティグループ> はご自分の環境に合わせます。
VpcConfig:
SubnetIds:
- <サブネットid1>
- <サブネットid2>
SecurityGroupIds:
- <セキュリティグループ>
後は普通に sam build
、sam build
でデプロイします。
デプロイが完了したら、API Gateway のエンドポイントにアクセスし、Hello World が表示されるか確認しておきましょう・。
https://XXXXXXXXXXXX.execute-api.ap-northeast-1.amazonaws.com/Prod/hello/
ACM
CloudFront で代替ドメイン名(CNAME)を利用するために、SSL証明書を ACM で作成しておきます。
なお、CloudFront で利用するためにはバージニア北部リージョンで作成しておきます。
CloudFront
デフォルトから変更が必要な最低限の箇所だけ説明します。
「オリジンドメイン」は、API Gateway のドメインを指定します。
「オリジナルパス」には、/Prod/Hello を入力します。
「代替えドメイン(CNAME)」に自身のドメインを入力します。
カスタムSSL証明書に先程 ACM で作成した証明書を指定します。
確認1
CloudFront のデプロイが完了したら、ディストリビューションドメインに対して、先程作成した EC2 から dig を打ってみます。
$ dig XXXXXXXXXXXX.cloudfront.net a
;; ANSWER SECTION:
XXXXXXXXXXXX.cloudfront.net. 43 IN A 13.227.62.X
XXXXXXXXXXXX.cloudfront.net. 43 IN A 13.227.62.X
XXXXXXXXXXXX.cloudfront.net. 43 IN A 13.227.62.X
XXXXXXXXXXXX.cloudfront.net. 43 IN A 13.227.62.X
$ dig XXXXXXXXXXXX.cloudfront.net aaaa
;; ANSWER SECTION:
XXXXXXXXXXXX.cloudfront.net. 60 IN AAAA 2600:9000:21ee:XXXX:1c:70af:e540:93a1
XXXXXXXXXXXX.cloudfront.net. 60 IN AAAA 2600:9000:21ee:XXXX:1c:70af:e540:93a1
XXXXXXXXXXXX.cloudfront.net. 60 IN AAAA 2600:9000:21ee:XXXX:1c:70af:e540:93a1
XXXXXXXXXXXX.cloudfront.net. 60 IN AAAA 2600:9000:21ee:XXXX:1c:70af:e540:93a1
XXXXXXXXXXXX.cloudfront.net. 60 IN AAAA 2600:9000:21ee:XXXX:1c:70af:e540:93a1
XXXXXXXXXXXX.cloudfront.net. 60 IN AAAA 2600:9000:21ee:XXXX:1c:70af:e540:93a1
XXXXXXXXXXXX.cloudfront.net. 60 IN AAAA 2600:9000:21ee:XXXX:1c:70af:e540:93a1
XXXXXXXXXXXX.cloudfront.net. 60 IN AAAA 2600:9000:21ee:XXXX:1c:70af:e540:93a1
この状態だと、IPv4,IPv6 どちらも返ってきてしまいますね。
Route53
代替えドメイン(CNAME)に対して、IPv6 のみが返されるように AAAAレコードを追加します。
確認2
AAAAレコードが作成されたら、EC2 から自身のドメインに対して dig をうってみます。
$ dig test.XXXXXXXXXXXX.com aaaa
;; ANSWER SECTION:
XXXXXXXXXXXX.cloudfront.net. 60 IN AAAA 2600:9000:21ee:XXXX:1c:70af:e540:93a1
XXXXXXXXXXXX.cloudfront.net. 60 IN AAAA 2600:9000:21ee:XXXX:1c:70af:e540:93a1
XXXXXXXXXXXX.cloudfront.net. 60 IN AAAA 2600:9000:21ee:XXXX:1c:70af:e540:93a1
XXXXXXXXXXXX.cloudfront.net. 60 IN AAAA 2600:9000:21ee:XXXX:1c:70af:e540:93a1
XXXXXXXXXXXX.cloudfront.net. 60 IN AAAA 2600:9000:21ee:XXXX:1c:70af:e540:93a1
XXXXXXXXXXXX.cloudfront.net. 60 IN AAAA 2600:9000:21ee:XXXX:1c:70af:e540:93a1
XXXXXXXXXXXX.cloudfront.net. 60 IN AAAA 2600:9000:21ee:XXXX:1c:70af:e540:93a1
XXXXXXXXXXXX.cloudfront.net. 60 IN AAAA 2600:9000:21ee:XXXX:1c:70af:e540:93a1
確認3
最後に EC2 から自身のドメインに対して curl を打ち IPv6 で接続していることが確認できれば本検証は終了です。
$ curl -iv https://test.XXXXXXXXXXXX.com
* Trying [2600:9000:21ee:XXXX:1c:70af:e540:93a1]:443...
* Connected to test.XXXXXXXXXXXX.com (2600:9000:21ee:XXXX:1c:70af:e540:93a1) port 443