API Gatewayに独自ドメインでアクセスする方法（エッジ最適化編）

カスタムドメインを使って、API Gatewayに独自ドメインでアクセスする方法をまとめます。
本記事は「**エッジ最適化編（API Gatewayのエンドポイントをエッジ最適化に設定）**」で CloudFrontを利用するので、グローバルに展開するサービスに良いと思います。
また、API Gateway につながる実際の APIについては「[API Gateway、Lambda(Node.js)、DynamoDB を使ったAPIの作り方](https://qiita.com/chinone0711/items/13abf8b6f39d09f04962)」で作ったAPIを利用するので、こちらを先に見ておくと良いかと思います。

ちなみに、CloudFrontを利用しないリージョン編については、「[API Gatewayに独自ドメインでアクセスする方法（リージョン編）](https://qiita.com/chinone0711/items/64f12aa6739baeebb3af)」を参考にしてください。

# 前提
route53でドメインを取得していること。
本記事では取得済ドメインの **サブドメイン** を利用します。

# ACMでSSL証明書を発行
ACM（Certificate Manager）を使って取得済ドメインのSSL証明書を発行します。
今回はエッジ最適化編なので、米国北部（バージニア北部）リージョンで証明書を発行する必要があります。

「バージニア北部」リージョンを選択してから、「証明書をリクエスト」をクリックします。
![acm1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2348676/be10d18e-e74e-2792-98a4-c8ec595dd6d2.png)

「パブリック証明書をリクエスト」が選択されているので、そのまま「次へ」をクリックします。
![acm2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2348676/dfbf190d-7499-290a-c771-49462068129a.png)

「完全修飾ドメイン名」入力欄に値を入力します。例えば取得済ドメインが「hoge.com」ならば、「*.hoge.com」と入力しましょう。
検証方法は推奨されている「DNS検証」のまま、「リクエスト」をクリックします。
![acm3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2348676/acbf23fd-a5f3-a6e8-e3d7-a2945f9bc457.png)

すると以下のような画面になり、まだ保留中のままになっているので、「証明書ID」のリンクをクリックします。
![acm4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2348676/4a8b2956-8a41-6473-1278-481922b58e80.png)

すると以下のような画面になります。あとで route53で利用するので「CNAME名」と「CNAME値」を控えておきます。
![acm5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2348676/b6257f30-6ece-336f-dce2-ab8fc994df74.png)

# route53 で CNAME を設定する

route53の画面を選択、既に作成済ドメインのホストゾーンを選択して、以下のように「レコードを作成」をクリックします。
![route53_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2348676/53b85b7c-2dd0-31b1-de10-6ffa23aaaec9.png)

レコードタイプに「CNAME」を選択し、前述の「CNAME名」と「CNAME値」を入力します。
![route53_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2348676/af7398a9-2008-3b86-898e-40c983fb4597.png)

その後、約20分ほどで SSL証明書が発行済となります。
以下ACMの画面からも、「発行済み」になっていることを確認できます。
![acm_route53_5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2348676/3dcf60bd-c367-f382-e39b-d29ba168bfaa.png)

# API Gateway でカスタムドメインを作成

カスタムドメインを選択して「作成」をクリックします。
忘れがちですが、ここからはバージニア北部リージョンである必要はありません。東京リージョンに変更します。
![custom1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2348676/5e9d37d5-68f7-42f0-499c-9ee88b7e0875.png)

カスタムドメイン名（例えば取得済ドメインがhogehoge.comならば、api.hogehoge.comとする）を入力します。
その後、エンドポイント設定を「エッジ最適化」にチェックすると、ACM証明書のところで、前述のバージニア北部で発行したSSL証明書が選べるので選択をします。
その後に「ドメイン名を作成」をクリックします。
![custom2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2348676/4c6602bc-09a7-1ec6-685d-e167c0b88d99.png)

すると、以下のようにカスタムドメインが出来ます。
ここで注目すべきポイントは、「API Gatewayドメイン名」に cloudfront.net が作成されているところです。これは後ほど route53の設定で利用するので覚えておきましょう。
![custom3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2348676/a11a5af4-524f-4fdd-69cf-2dffcee12e48.png)

続いて「APIマッピング」タブを選択して、「APIマッピングを設定」をクリックします。
![custom4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2348676/0be7a205-b24b-d133-801e-4250f8efd83a.png)

「新しいマッピングを追加」をクリックします。
![custom5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2348676/87686064-74b3-81b8-44c2-bee14f2b08d1.png)

APIの欄に API GatewayのAPI（ここでは「[API Gateway、Lambda(Node.js)、DynamoDB を使ったAPIの作り方](https://qiita.com/chinone0711/items/13abf8b6f39d09f04962)」を利用）、ステージには同じくAPI Gatewayのステージを選択します。
パスは任意で設定します。ここではAPIをバージョン管理できるように「v1」とつけておきます。これにより、URLが https://api.hogehoge.com/v1/ などになります。
全て設定できたら、「保存」をクリックします。
![custom6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2348676/4d4d476a-2f24-12cd-108c-5eaf1c549599.png)

# 再び route53でサブドメインを設定
API Gatewayのカスタムドメインが設定できたら、route53でそのカスタムドメイン（サブドメイン）を設定します。
以下のよう該当のホストゾーンから「レコードを作成」をクリックします。
![route53_10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2348676/439ff903-6cd7-bd5c-aa39-3ec1d0933bc9.png)

レコード名には、カスタムドメインと同じく「api」を設定して、レコードタイプは「Aレコードとします」
トラフィックのルーティングは以下のようになりますが、ここで注目すべきは、前述で出てきた cloudfront.net が選べるようになっていることです。cloudfront.net を選んで「レコードを作成」をクリックしましょう。
![route53_11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2348676/16477885-9102-2488-ba31-0b75c07cabd1.png)

以上で独自ドメイン（カスタムドメイン）でAPI Gateway が利用できるようになりました。
ためしに postman でアクセスしてみましょう。
前述したように、API GatewayのAPIには（[API Gateway、Lambda(Node.js)、DynamoDB を使ったAPIの作り方](https://qiita.com/chinone0711/items/13abf8b6f39d09f04962)）で作成したAPIがつながっているので、リクエストJsonを以下のようにします。
```
{
    "action": "overview",
    "eid": "00001"
}
```
postmanでは以下のように正常にレスポンスが返ってきたことが分かります。
![postman.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2348676/3f49fd9d-44fb-0e3e-1bca-3f996e3f5e34.png)

以上です。