【AWS】API Gateway カスタムドメインの設定方法

# はじめに
髙橋愛理です！  :frog:
AWSサーバーレス開発のチームリーダーやってます。

API Gatewayを使うと、サクッとAPIが作成できて便利ですよね。  
API作成時に作成されるデフォルトエンドポイントがあれば、パッとリクエストできちゃいますが、  
本番ではカスタムドメインを設定することが多いのではないでしょうか。

今回、開発中のアプリケーションの実装が終盤にさしかかってきて、
API Gatewayにカスタムドメインを設定したので、記事にしてみました。




# 前提
- API GatewayにてAPIを作成済み
- Route53にカスタムドメインのホストゾーンを作成済み
- SSL/TLS 証明書がわかる
- ドメイン、サブドメインがわかる

今回は、証明書やドメインなどの前提知識がある方を対象とします。  
内容の性質上、どうしても初学者には難しい部分があるのですが、できるだけ手順がわかりやすいように書きますね。  

また、今回は、**CloudFrontでのデプロイ**を想定しています。
Route53のドメイン設定方法やAPIの作成方法は、本筋からそれてしまうので、別の機会に。




<a id="#Chapter1"></a>
# ホストゾーンIDを確認
まず、作成したいAPIのドメインを管轄するホストゾーンが同環境内にあるかを確認ます。

例えば…
api.airi-app.net
を作成するのであれば、
airi-app.netのホストゾーンIDを控えます。

### :computer:手順
➡サービス「Route53」を選択
➡左側メニューの「ホストゾーン」を選択し、ホストゾーン一覧を表示
  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2529351/6b8b18e7-b185-6144-531f-24a619805ab6.png)

➡該当のホストゾーン（今回は「airi-app.net」）をクリックして詳細を表示  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2529351/c95a9f28-a594-50f9-d7d9-4cd7fb8342eb.png)
画像の赤枠の部分、ホストゾーンIDを控えて、メモ帳などに張り付けておいてください。

:frog: 💭
<font color="DarkOliveGreen ">ここのホストゾーンに、証明書やAPIのレコードが作成されるよ！</font>



<a id="#Chapter2"></a>
# ACM証明書を取得
パブリック SSL/TLS 証明書のことです。  
ドメイン用（airi-app.net）と、サブドメイン用（*.airi-app.net）の証明書をそれぞれ作成します。

### :computer:手順
➡リージョン「バージニア北部」を選択  
➡サービス「AWS Certificate Manager」を選択、 
➡左側メニューの「証明書を一覧」を選択し、証明書一覧を表示
➡右上の「リクエスト」ボタンを押してリクエスト作成画面を表示
➡「パブリック証明書をリクエスト」を選択し、次へ進む
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2529351/6f6a057e-a3cd-393d-f190-f8b1856eacff.png)
以下の設定値（画像と同様）でカスタムドメインを作成します。
- ドメイン名
ドメイン（今回は「airi-app.net」）とサブドメイン（今回は「*.airi-app.net」）を入力。
（それぞれ別で登録してもOK）
- 検証方法
「DNS検証」を選択（デフォルト値）
- キーアルゴリズム
「RSA 2048」を選択（デフォルト値）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2529351/171d1f7d-537d-71e6-60a7-564b3403cc56.png)
作成したら詳細を表示し、「Route53でレコードを作成」をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2529351/aaf9d192-0d5c-2d34-4b2f-652a7d852177.png)
先ほど入力したドメイン、サブドメインが表示されるので、「レコードを作成」をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2529351/f6bd8dc4-8359-36ae-6b13-0fdd460ebd3c.png)
ステータスが発行済みになったら完了です。  
（※しばらくしてもステータスが変わらない場合は、設定が間違っている可能性があります）

:frog: 💭
<font color="DarkOliveGreen ">CloudFrontは世界中のキャッシュサーバ使うサービスだからバージニア北部で証明書を作らないといけないよ！</font>




<a id="#Chapter3"></a>
# カスタムドメインを作成
いよいよ、API Gateway側にカスタムドメインを作成していきます。

### :computer:手順
➡カスタムドメインを設定したいAPI Gatewayがあるリージョンを選択
➡サービス「API Gateway」を選択
➡左メニュー「カスタムドメイン名」を選択
➡カスタムドメイン名一覧が表示されるので、作成をクリックして作成画面を開く
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2529351/8fcf02bc-243c-1843-bbbf-a07f04d97ca2.png)
以下の設定値（画像と同様）でカスタムドメインを作成します。

- ドメイン名
api用ドメイン（今回は「api.airi-app.net」）を入力
- TLSの最小バージョン
「TLS 1.2（推奨）」を選択
- エンドポイントタイプ
「エッジ最適化」を選択
- ACM証明書
先ほど登録したACM証明書のワイルドカードの方（今回は「*.airi-app.net」）を選択

すると、カスタムドメイン名一覧に作成したカスタムドメインが表示されるます。

➡作成したカスタムドメイン名をクリックして設定を表示
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2529351/e1383b39-1a7a-6f71-1c4f-4a50ec0ff95e.png)

画像赤枠の「API Gateway エンドポイント名」を控えて、メモ帳などに張り付けておいてください。





<a id="#Chapter4"></a>
# ホストゾーンにレコードを追加
ホストゾーンにカスタムドメインの情報を登録します。

### :computer:手順
➡サービス「Route53」を選択
➡左側メニューの「ホストゾーン」を選択し、ホストゾーン一覧を表示
➡最初の工程で確認したドメイン（今回は「airi-app.net」）をクリックして詳細を表示
➡「レコードを作成」ボタンをクリックし、作成画面を開く
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2529351/fc09146c-4e68-78a8-8cb3-e12dc70d4c29.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2529351/492f6844-f622-e3d6-a12b-70e8abce1be5.png)

以下の設定値（画像と同様）でレコードを作成します。

- レコード名
作成したカスタムドメイン名と一緒になるようにサブドメイン名（今回は、api.airi-app.netなので、「api」）を入力
- レコードタイプ
「A - IPv4」を選択
- エイリアス
トグルボタンをクリックし有効にすると、トラフィックのルーティング先入力欄が出る
- トラフィックのルーティング先
上から以下を設定
  - 「API Gatewat API へのエイリアス」
  - APIリソースがあるリージョン（今回は「アジアパシフィック[東京]」）
  - 前項で控えたAPI Gateway エンドポイント名
- ルーティングポリシー
「シンプルルーティング」を選択

すると、レコード一覧にAレコードが追加される。




<a id="#Chapter5"></a>
# APIの設定を変更
マッピングするAPIの設定を変更します。

### :computer:手順
➡サービス「API Gateway」を選択、
➡左メニュー「API」を選択し、API一覧を表示、
➡マッピングしたいAPI名（今回はairiAPI）をクリックし、API詳細を表示、
➡左メニュー「設定」をクリックし、設定を表示
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2529351/8efcd1b1-2a5f-e2b8-79d3-8101807eac88.png)
➡設定を開いたら、以下の設定値（画像と同様）に変更します。

- エンドポイントの設定
「エッジ最適化」を選択
- デフォルトのエンドポイント
「無効」を選択

変更を保存したら、APIの設定は完了です。

:frog: 💭
<font color="DarkOliveGreen ">デフォルトエンドポイントを無効にしないとカスタムドメイン使えないよ！</font>




<a id="#Chapter6"></a>
# カスタムドメインとAPIをマッピング
カスタムドメインにAPIを関連付けします、複数のAPIを関連付けることが可能です。

### :computer:手順
➡サービス「API Gateway」を選択、
➡左メニュー「カスタムドメイン名」を選択し、カスタムドメイン名一覧を表示
➡先ほど作成したカスタムドメイン（今回は「api.airi-app.net」）をクリックし、詳細を表示
➡「API マッピング」タブをクリックし、API マッピング一覧を表示
➡「APIマッピングを設定」をクリックし、設定画面を開く
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2529351/d12580f0-a884-be4e-a233-e0f25d727dc3.png)
以下の設定値でカスタムドメインを作成します。

- API
先ほど設定変更したAPI（今回は「airiAPI」）を選択
- ステージ
APIに設定してある任意のステージ（今回は「dev」）を選択
- パス（オプション）
ベースパスを設定したい場合は入力
（今回は、api.airi-app.net/adminというパスにしたいので、「admin」と入力）

保存すると、API マッピング一覧にAPIが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2529351/9fca42e9-65f0-6e0d-6add-56b662513e3e.png)
あとは、curlコマンド等でリクエスト疎通を確認して、リクエストが疎通したら設定完了です。

# 最後に
初めての記事作成でしたが、結構長かったですね…。。
手順、是非是非参考にしてくださいー！