CDKを使ってAPI Gatewayに任意のドメインを設定する


概要

API Gatewayの作成、カスタムドメインの設定、ホストゾーンにエイリアスレコードを追加するところまでCDKで設定します。

前提

CDKをある程度触ったことがあるのを前提とした記事です。

用意しておくもの

  • ホストゾーン
    • ホストゾーンID
    • ドメイン名
  • SSL証明書
    • ARN

環境

  • Typescript 6.13.7
  • CDK 1.3.0
    • @aws-cdk/core
    • @aws-cdk/aws-apigateway
    • @aws-cdk/aws-certificatemanager
    • @aws-cdk/aws-route53
    • @aws-cdk/aws-route53-targets

CDKを書いていく

今回はサンプルとして api.example.com にGETリクエストを送ると500エラーが返ってくる環境を作ります。
以降のコードはCDKの lib/cdk-stack.ts のconstructor()内に記述していきます。
最低限の設定を行なうため、必要に合わせてパラメータを追加・変更してください。
サンプルコード

RestAPIの作成とカスタムドメインの設定

RestAPIを作成

CDKではデフォルトで、prodというステージが作成され、デプロイされます。
別のステージや自動デプロイさせたくない場合は第三引数にパラメータを追加しましょう。

cdk-stack.ts
const restAPI = new apigateway.RestApi(
  this,
  'APIGateway',
  {
    restApiName: 'Example',
    endpointTypes: [apigateway.EndpointType.REGIONAL],
  },
);

リソースを作成

正しく設定できたか確認するために、Mockのリソースを作成しておきます。
デプロイする時にリソースが一つ以上ないとエラーになるため、リソースは忘れずに作成しましょう。

cdk-stack.ts
restAPI.root
      .resourceForPath('')
      .addMethod('GET');

SSL証明書を取得

事前に用意しておいたSSL証明書を取得します。
第三引数にはSSLのARNを設定します。

cdk-stack.ts
const certificate = certificatemanager.Certificate.fromCertificateArn(
    this,
    'RestAPICertificate',
    'arn:aws:acm:ap-northeast-1:000000000000:certificate/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx', // 証明書のARN
),

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

RestAPIを作成する際にステージの設定を行なっていない場合は、カスタムドメインのマッピング先のステージは自動でprodになります。
domainNameはAPIに使用したいドメインにしてください。

cdk-stack.ts
restAPI.addDomainName(
  'CustomDomain',
  {
    domainName: 'api.example.com',
    certificate: certificate,
    securityPolicy: apigateway.SecurityPolicy.TLS_1_2,
    endpointType: apigateway.EndpointType.REGIONAL,
  }
);

カスタムドメインのエイリアスレコードの作成

先ほど作成したAPI Gatewayに向いてくれるようにDNSを設定します。

ホストゾーンを取得

hostedZoneId, zoneNameは事前に用意しておいたホストゾーンに合わせて変更してください。

cdk-stack.ts
const hostZone = route53.PublicHostedZone.fromHostedZoneAttributes(
  this,
  `HostZone`,
  {
    hostedZoneId: 'XXXXXXXXXXXXXXXXXXXX',
    zoneName: 'example.com',
  }
);

エイリアスレコードを作成

先ほど取得したホストゾーンにAレコードを追加します。
recordNameはAPIに使用したいドメインにしてください。

cdk-stack.ts
new route53.ARecord(
  this,
  'ARecord',
  {
    zone: hostZone,
    recordName: 'api.example.com',
    target: route53.RecordTarget.fromAlias(
        new route53Tragts.ApiGateway(restAPI),
    ),
  }
);

環境が正しく作られたか確かめる

以上が書けたらCDKをデプロイしてください。
デプロイでエラーが出なかった場合は実際にリクエストを送って、レスポンスが返ってくるか確かめましょう。

以下のコマンドを叩いて

curl https://api.example.com/

こちらのレスポンスが返って来れば正しく設定されています。

{"message": "Internal server error"}