Route53でリージョン別APIのDNS設定をする

インサイトウォッチ

はじめに

サーバーレス開発部の岡です。

今回、Route53で管理しているドメインでAPI Gatewayのカスタムドメインを設定しました。
が、エンドポイントタイプをRegionalに設定している場合に、Route53のコンソール上でAレコードを追加しようとするとエラーが出てしまいます。

公式ドキュメントを見てみると、Regional APIの場合はAliasの追加を
AWS CLIまたはAWS SDK for Route 53で行う必要があるようです。

Route 53 マネジメントコンソールを使用して、エッジ最適化カスタムドメイン名の DNS レコードをセットアップすることもできますが、リージョン別カスタムドメイン名の場合はできません。

分かってしまえば手順は簡単なのですが、エラー内容から公式ドキュメントまでなかなかたどり着けなかったため、今回手順をご紹介したいと思います。

詳細

エンドポイントタイプとは

現在(2018/08/13)API Gatewayがサポートしているエンドポイントタイプは以下の3つになります。

  • エッジ最適化(Edge optimized)
  • プライベート(Private)
  • 地域(Regional)

今回は地域(Regional)のパターンのお話です。

コンソールで実行した場合のエラー

ちなみに、Route53コンソールで実行した場合、以下のエラーとなります。

The record set could not be saved because: - Alias Target contains an invalid value.

実際の手順

手順についてはこちらの記事と同じになります。

最後の方のRoute53でDNSの設定の所のみをCLIで実行しないといけません。

ACMでパブリック証明書の作成

上記事のCertficate ManagerでSSLを取得すると同手順

API Gatewayでカスタムドメインを設定

上記事のAPI Gatewayでカスタムドメインを設定すると同手順

ちなみにCLIで実行する場合は、

1
2
3
4
aws apigateway create-domain-name \
    --domain-name 'regional.example.com' \
    --endpoint-configuration types=REGIONAL \
    --regional-certificate-arn 'arn:aws:acm:us-west-2:123456789012:certificate/c19332f0-3be6-457f-a244-e03a423084e6'

成功すると以下のようなレスポンスが返ってきます。

1
2
3
4
5
6
7
8
9
{
    "certificateUploadDate": "2017-10-13T23:02:54Z",
    "domainName": "regional.example.com",
    "endpointConfiguration": {
        "types": "REGIONAL"
    },
    "regionalCertificateArn": "arn:aws:acm:us-west-2:123456789012:certificate/c19332f0-3be6-457f-a244-e03a423084e6",
    "regionalDomainName": "d-numh1z56v6.execute-api.us-west-2.amazonaws.com"
}

DNS設定(CLIで実行)

ここが本筋です!
AWS CLIでRoute53のドメインとAPI Gateway上に作成したカスタムドメイン名マッピングするためのAレコード(Alias)を追加していきます。

JSONファイルを作成

API Gatewayで作成したカスタムドメイン名のエンドポイントの設定を入力していきます。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
{
  "Changes": [
    {
      "Action": "CREATE",
      "ResourceRecordSet": {
        "Name": "regional.example.com",
        "Type": "A",
        "AliasTarget": {
          "DNSName": "pppppp.execute-api.ap-northeast-1.amazonaws.com",
          "HostedZoneId": "Z5TEXXXXXXXXXX",
          "EvaluateTargetHealth": false
        }
      }
    }
  ]
}
  • "Name"・・・設定したいドメイン
  • "DNSName"・・・ターゲットドメイン名(regionalDomainName)
  • "HostedZoneId"・・・API GatewayのホストゾーンID(regionalHostedZoneId)

ちなみに、ホストゾーンIDは以下のドキュメントからも参照できます。 https://docs.aws.amazon.com/ja_jp/general/latest/gr/rande.html#apigateway_region

コマンドを実行

1
2
3
aws route53 change-resource-record-sets \
    --hosted-zone-id ZPPXXXXXXX \
  • --hosted-zone-id・・・Route53のドメインに紐づいたホストゾーンID
  • --change-batch file://・・・上の手順で作成したJSONファイル名

実行するとステータスを含んだレスポンスがJSON形式で返ってきます。

まとめ

いかがでしたでしょうか。
Route53を使えばAWSのサービス上で簡単にDNSの設定ができる一方、思わぬ制限がありました。
カスタムドメイン名のマッピングする際に出たエラーメッセージから公式ドキュメントに結びつかず時間を要してしまったので、備忘録もかねて記事にしました。

API Gatewayのドメイン設定をする人はアプリ開発者の人も多いかと思うので、
ドメイン設定等、アプリ開発の本筋でない所には上手くAWSサービスを活用してなるべくスムーズにできればと思います。

参考

AWS公式ドキュメント

新メンバーズ