API GatewayをCloudFrontでIPv6対応しつつ独自ドメインで叩けるようにする
AWSのAPI Gatewayは現時点ではIPv6に対応してない。でもIPv6有効にしたCloudFrontを手前に置くことでIPv6対応できるらしいので、やってみた。ついでに独自ドメインも設定した。
amazon web services - Enable API Gateway IPv6 on AWS? - Stack Overflow
AWSの画面や内容は現時点のものです。よく変わるので注意。
最初に備考
- この記事では、APIのエンドポイントタイプはRegionalであること前提です。エッジ最適化だと、裏でCloudFrontが使われてるので何かが無駄かもしれません。
- 全ての設定が反映されるまで、筆者の時は1時間ほどかかりました。もっとかかるかもしれないので、時間に余裕がある時にやった方がいいです。
- API Gatewayのカスタムドメインの設定は不要です。独自ドメインはCloudFront側で設定します。
では始めます。
手順1. ドメイン名を用意
先にドメイン名を用意しておきます。この記事では、あらかじめ『お名前ドットコム』で買っていたものを使います。でも違うとこで買えるなら違うとこで買った方がいいと思います。
手順2. Route 53にホストゾーン作成
CloudFrontで独自ドメインを使うには、CloudFrontの『代替ドメイン名』(CNAME) 機能を使います。
代替ドメイン名 (CNAME) を追加してカスタム URL を使用する - Amazon CloudFront
代替ドメイン名を設定するには、対象のドメインをAmazon Route 53でルーティングできるようにしておく必要があります。
まず、Route 53のコンソールの『ホストゾーンの作成』ボタンからホストゾーンを作成します。『ホストゾーンの作成』ボタンを押すと、↓のような入力欄が出てきます。
入力内容は以下の通りです。
- ドメイン名 ...あらかじめ用意しておいたドメイン名を正しく入力。
- コメント ... コメント。必要なら入力。
- タイプ ... 『パブリックホストゾーン』を選択。
下部の『作成』ボタンを押すと、ホストゾーンが作成されます。
作成されたホストゾーンには、デフォルトで NS
と SOA
のレコードが登録されてます。
NS
の Value
には、AWSのDNSサーバーが4つ分設定されてるはずです。この NS
の値を、ドメインの管理画面 (ここではお名前ドットコム) からドメインのネームサーバーとして設定します。
お名前ドットコムだと↓こんな感じです。複数設定できたので、全部設定しました。
ネームサーバーの変更は、私の時は反映されるまでに数時間かかりました。
手順3. SSL証明書を用意
CloudFrontで代替ドメイン名を使うには、SSL証明書が必要です。
この記事では、事前にLet's Encryptで作成しておいた証明書を使います。当ブログの以下の記事の手順で作成した証明書を使いました。
Squidで立てたHTTPSプロキシをLet's Encryptする - キリウ君が読まないノート
次の手順で証明書の本文が必要になるので、Let's Encryptで作成された cert.pem
/ privkey.pem
/ chain.pem
の3ファイルの場所を確認しておきます。
手順4. Certificate ManagerにSSL証明書をインポート
CloudFrontから使えるようにするために、SSL証明書を米国東部 (バージニア北部) リージョンでAWS Certificate Managerにインポートします。必ずバージニア北部で行ってください。CloudFrontで使うためには、証明書が us-east-1
で管理されてる必要があるみたいです。
Certificate Managerのコンソールを開き、『証明書のインポート』ボタンを押すと、↓のような入力画面が出てきます。
入力内容は以下の通りです。
- 証明書本文 ...
cert.pem
の中身をそのままコピペ。 - 証明書のプライベートキー ...
privkey.pem
の中身をそのままコピペ。 - 証明書チェーン ...
chain.pem
の中身をそのままコピペ。
コピペするときは全文をコピペします。-----BEGIN なんとか-----
から -----END なんとか-----
を含む全文です。
入力したら右下の『レビューとインポート』ボタンを押します。正しく入力できていれば、証明書をインポートできるはずです。
手順5. CloudFrontディストリビューションを作成
CloudFrontディストリビューションを作って、API Gatewayの前に置きます。
CloudFrontのコンソールで、左メニューの『ホストゾーン』からホストゾーンの画面を開きます。それから上部の『Create Distribution』ボタン → Webの方の『Get Started』ボタンを押すと、↓のような入力欄が出てきます。
かなりいっぱい入力欄がありますが、設定が必要なのは以下の項目です。
Origin Settings
- Origin Domain Name ... API Gatewayのドメイン名を入力します。APIをデプロイすると出てくる、
{APIのID}.execute-api.ap-northeast-1.amazonaws.com
みたいなやつのことです。 - Origin Path ... APIのURLにAPI Gatewayのステージ名を含めたくなければ、『/{APIのステージ名}』と入力します。ステージ名が『aaa』なら『/aaa』です。含めてよければカラでOKです。
- Origin Protocol Policy ... 必ず『HTTPS Only』を選びます。API Gatewayと繋げる場合はこれが必要です。
Default Cache Behavior Settings
- Allowed HTTP Methods ... APIによりますが、筆者はAPIでPOSTを使っていたので『GET, HEAD, OPTIONS, PUT, POST, PATCH, DELETE』を選びました。
Distribution Settings
- Alternate Domain Names (CNAMEs) ... ドメイン名を入力します。
- SSL Certificate ... 『Custom SSL Certificate (example.com)』を選択します。下の入力欄で、インポートしたSSL証明書を選択してください。
- Enable IPv6 ... IPv6対応するならONにします。デフォルトONのはずです。
全て入力して『Create Distribution』ボタンを押すと、CloudFrontディストリビューションが作成されます。
StatusがDeployedになったら、いったんCloudFrontのURL (https://{ディストリビューションID}.cloudfront.net/{APIのパス}
) からAPIを叩いてみてください。ちゃんと叩けるはずです。
手順6. Route 53にエイリアス追加
最後です。ホストゾーンにエイリアスのAレコードとAAAAレコードを追加して、ドメイン名からCloudFrontに飛べるようにします。
コンソールでRoute 53に作っておいたホストゾーンを開き、『レコードセットの作成』ボタンを押すと、右側に入力欄が出てきます。『タイプ』で『A - IPv4 address』を選択して、『エイリアス』で『はい』を選択すると、入力欄が↓のようになります。
入力内容は以下の通りです。
- 名前 ... サブドメインを使う場合は入力します。
- エイリアス先 ... CloudFrontの『Domain Name』を入力します。
{ほにゃほにゃ}.cloudfront.net
みたいなやつのことです。 - ルーティングポリシー ... ここでは『シンプル』を選択しました。
- ターゲットの正常性の評価 ... ここでは『いいえ』を選択しました。
入力したら、下部の『レコードセットの保存』ボタンを押します。
Aレコードを作成し終えたら タイプ『AAAA - IPv6アドレス』でも同じものを作成します。 AレコードはIPv4用で、AAAAレコードはIPv6用です。
これで全ての設定完了です。Route 53の設定が反映されるまで一晩くらいかかるかもなので、動作確認はしばらく待ってから行いましょう。
ドメイン名でAPIを叩いてみる
curl
などでドメイン名のURLでAPIを叩いてみて、ちゃんとレスポンスが返ってくればOKです。
API GatewayのURLとCloudFrontのURLも生きてるので、うまくいかなかったらそっちも叩いてみると原因判別できるかもです。
IPv6対応できてるか確認するには、コマンド nslookup
または dig
でドメイン名を引いてみてIPv6アドレスが出てくるかを見ます。出てくればOKです。
以上で終わりです。さようなら。