4
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Last updated at Posted at 2020-03-27

概要

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"}
4
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?