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

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

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

今回、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)・・・CloudFrontディストリビューションからのアクセス
  • プライベート(Private)・・・パブリックインターネットから分離され、許可されたVPCからのアクセスのみ
  • 地域(Regional)・・・APIと同じリージョンから発信される場合に、リクエストのレイテンシーを減らすことができる

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

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

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

実際の手順

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

API GatewayをカスタムドメインでHTTPS化する

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

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

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

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

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

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

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'

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

{
    "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で作成したカスタムドメイン名のエンドポイントの設定を入力していきます。

{
  "Changes": [
    {
      "Action": "CREATE",
      "ResourceRecordSet": {
        "Name": "regional.example.com",
        "Type": "A",
        "AliasTarget": {
          "DNSName": "d-numh1z56v6.execute-api.us-west-2.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

コマンドを実行

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

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

まとめ

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

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

参考

AWS公式ドキュメント