API Gatewayでカスタムドメインを利用する(SSL証明書のみAWS機能で用意するパターン)

こんにちは、CX事業本部の若槻です。

API Gatewayでカスタムドメインのホスト名(api.contoso.comなど)を利用するためには、AWSの機能もしくは外部サービスで以下の3つの要素を準備する必要があります。

  • ドメイン
    • contoso.comなどのカスタムドメイン
    • AWS機能ではRoute53を利用すれば用意可能
  • DNSサーバ
    • ホスト名api.contoso.comからAPI GatewayのAPIへの名前解決をする権威DNS
    • AWS機能ではRoute53を利用すれば用意可能
  • SSL証明書
    • ホスト名api.contoso.comに対応した証明書
    • AWS機能ではAWS Certificate Manager(ACM)を利用すれば用意可能

本記事ではSSL証明書のみAWS機能で用意するパターンの設定を行った際の手順をご紹介します。

ちなみに、3つの要素すべてをAWS機能で用意するパターンを紹介する記事(下表No.1)もDevelopers.IOにはありますので、事例に応じてご参照下さい。両パターンの対応を整理すると以下のようになります。

No. ドメインレジストラ DNSプロバイダ SSL証明書発行機関 紹介記事
1 AWS Route53 AWS Route53 AWS Certificate Manager API GatewayをカスタムドメインでHTTPS化する
2 外部サービス 外部サービス AWS Certificate Manager 本記事

設定手順

前提

  • API GatewayのAPIのカスタムドメインホストとしてapi.contoso.comを利用したい
  • 利用したいカスタムドメインcontoso.comが、外部サービスで用意されている
  • contoso.comのゾーンをホストするDNSサーバが、外部サービスで用意されている
  • カスタムドメインを利用したいAPIが、API Gatewayで作成されている

ACMコンソールでカスタムドメインに対する証明書のリクエストの実施

マネージメントコンソールからCertificate Managerを開きます。

証明書タイプで[パブリック証明書のリクエスト]を選択して[証明書のリクエスト]をクリック。 image.png

[ドメイン名]にAPI Gatewayで利用したいカスタムドメインのAPIホスト名(例:api.contoso.com)を入力し、[次へ]をクリック。 image.png

今回は[DNS の検証]を選択します。[次へ]をクリック。 image.png

必要に応じてタグを設定し、[確認]をクリック。 image.png

[確定とリクエスト]をクリック。 image.png

ドメインの検証を行うためのCNAMEレコードが示されるので控えます。[続行]をクリックします。 image.png

証明書一覧に追加をリクエストしたドメインの証明書が検証保留中で追加されています。 image.png

補足

[ステップ 2: 検証方法の選択]で[DNS の検証]を選択した場合は、[E メールの検証]に比べて下記のメリットがあるとのことです。

DNS 検証は、E メール検証よりも多数のメリットがあります。
・ DNS では、ACM 証明書をリクエストするときに、ドメイン名あたり 1 つの CNAME レコードのみを作成する必要があります。E メール検証では、ドメイン名あたり最大 8 つの E メールメッセージが送信されます。
・ DNS レコードが残っていれば、FQDN 用に追加の ACM 証明書をリクエストできます。つまり、同じドメイン名を持つ複数の証明書を作成できます。新しい CNAME レコードを取得する必要はありません。これを行うことには、いくつか理由があります。たとえば、異なるサブドメインを対象とする新しい証明書を作成する、複数のリージョンで同じ証明書を作成する (認証トークンはどのリージョンでも使用できます)、削除した証明書を置き換えるなどです。
・ ACM は、DNS を使用して検証した ACM 証明書を自動的に更新します。ACM は、証明書が使用中で DNS レコードが残っている限り、各証明書が失効する前にこれを更新します。
・ Route 53 を使用している場合は、ACM によって CNAME レコードが追加され、パブリック DNS レコードを管理できます。DNS プロバイダーとして Route 53 を使用しない場合は、レコードの追加方法について DNS プロバイダーに問い合わせてください。
・ DNS 検証プロセスは、E メール検証プロセスよりも簡単に自動化できます。
・ E メールで検証済みの証明書は、最初の検証日から 825 日目まで更新できます。825 日を経過したら、ドメインの所有者または承認された担当者は、新しい証明書をリクエストする必要があるのに対し、DNS で検証済みの証明書は、無期限に更新できます。

DNSサーバで検証用CNAMEレコードを設定

DNSサーバで、先程控えた検証用CNAMEレコードを設定。(画像はムームードメイン

image.png

補足1

これはDNSサービスによりけりですが、今回のムームードメインのDNSサーバ(例:contoso.comのゾーンをホスト)の場合は、

  • 名前は、ACM上で示されたレコード値からサブドメイン以降(.contoso.com. )を省いた値をムームードメインに設定しました。
  • は、末尾の.を省いた値をムームードメインに設定しました。(仕様としてそのような値を設定できない)
名前
ACM上のレコード値 _9141281b4a2709c4b9f1752e4c50cfe6.api.contoso.com. _e884a262ac015b8c7642ac7eb00447d0.olprtlswtu.acm-validations.aws.
↓(.contoso.com.省略) ↓末尾.省略
実際に設定したレコード値 _9141281b4a2709c4b9f1752e4c50cfe6.api _e884a262ac015b8c7642ac7eb00447d0.olprtlswtu.acm-validations.aws

補足2

ここで登録した検証用CNAMEレコードは、所有者検証以降も登録したままとすることにより、前項の備考で記載した通り別の証明書のリクエストへの利用証明書の無期限の自動更新などにも利用できます。

ACMコンソールでカスタムドメインの検証が完了したことを確認

マネージメントコンソールからCertificate Managerを開きます。

証明書の状況が発行済みとなっていればカスタムドメインの検証は完了しています。(今回の検証では、DNSレコードを設定してから証明書の検証が完了するまで20分程度要しました。) image.png

API Gatewayコンソールからカスタムドメイン名の追加

マネージメントコンソールからAPI Gatewayを開き、[カスタムドメイン名]を選択して、[カスタムドメイン名の作成]をクリックします。 image.png

[ドメイン名]でAPI Gatewayで利用したいカスタムドメインを指定し、[ACM証明書]で先程作成した証明書を指定し、[保存]をクリックします。 image.png

カスタムドメイン名が作成されたら、[編集]をクリックします。 image.png

[マッピングの追加]をクリックします。
image.png

カスタムドメインと対象のAPIとのマッピングを設定します。 [パス]ではマッピング元のパスを指定します。(指定なしも可能です) [送信先]ではマッピング先のAPIステージを指定します。 [保存]をクリックします。

image.png

ここで指定したベースマッピングの関係は以下のようになります。

URI 説明
マッピング元 https://api.contoso.com/v1 https://<カスタムドメイン>/<パス>
マッピング先 https://XXXXXXXXXX.execute-api.ap-northeast-1.amazonaws.com/dev https://<送信先API>/<送信先ステージ>

作成したカスタムドメインの[ターゲットドメイン名]を控えます。 image.png

DNSサーバでターゲットドメイン名のCNAMEレコードを設定

DNSサーバで、先程作成したカスタムドメインのターゲットドメイン名をCNAMEレコードとして設定します。(画像はムームードメインの場合)
image.png

以上で設定は完了です。

動作確認

動作確認用のAPIを叩いてみると、API Gatewayの既定のURLに加えて、カスタムドメインでもAPIにアクセスできるようになりました。

# 既定のURLの場合
$ curl "https://XXXXXXXXXX.execute-api.ap-northeast-1.amazonaws.com/dev/todos?q=done" -H "x-api-key: ${ApiKey}" | jq .
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   221  100   221    0     0    334      0 --:--:-- --:--:-- --:--:--   334
{
  "todos": [
    {
      "todoid": "a4ecbf7d-678f-4f35-9dc4-6719c01ee1d2",
      "title": "doneてすと2",
      "content": "",
      "priority": "normal",
      "done": 0,
      "created_at": "2019-09-22T15:37:13",
      "updated_at": "2019-09-22T15:37:13"
    }
  ]
}

# カスタムドメインの場合
$ curl "https://api.contoso.com/todos?q=done" -H "x-api-key: ${ApiKey}" | jq .
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   221  100   221    0     0    330      0 --:--:-- --:--:-- --:--:--   330
{
  "todos": [
    {
      "todoid": "a4ecbf7d-678f-4f35-9dc4-6719c01ee1d2",
      "title": "doneてすと2",
      "content": "",
      "priority": "normal",
      "done": 0,
      "created_at": "2019-09-22T15:37:13",
      "updated_at": "2019-09-22T15:37:13"
    }
  ]
}

おわりに

以上、API Gatewayでのカスタムドメインの利用で、SSL証明書のみAWS機能で用意するパターンの設定を行った際の手順の紹介でした。すでに保持しているドメインやDNSサーバなどのリソースを大きな変更を加えることなくAWSのサービスでも利用可能とさせられるのは良いですね。また、ベースパスマッピングにより同じカスタムドメイン名に対してパスごとに異なるAPIやステージを割り当られるようになるというのは使い所がありそうです。参考になれば幸いです。

参考