概要
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というステージが作成され、デプロイされます。
別のステージや自動デプロイさせたくない場合は第三引数にパラメータを追加しましょう。
const restAPI = new apigateway.RestApi(
this,
'APIGateway',
{
restApiName: 'Example',
endpointTypes: [apigateway.EndpointType.REGIONAL],
},
);
リソースを作成
正しく設定できたか確認するために、Mockのリソースを作成しておきます。
デプロイする時にリソースが一つ以上ないとエラーになるため、リソースは忘れずに作成しましょう。
restAPI.root
.resourceForPath('')
.addMethod('GET');
SSL証明書を取得
事前に用意しておいたSSL証明書を取得します。
第三引数にはSSLのARNを設定します。
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に使用したいドメインにしてください。
restAPI.addDomainName(
'CustomDomain',
{
domainName: 'api.example.com',
certificate: certificate,
securityPolicy: apigateway.SecurityPolicy.TLS_1_2,
endpointType: apigateway.EndpointType.REGIONAL,
}
);
カスタムドメインのエイリアスレコードの作成
先ほど作成したAPI Gatewayに向いてくれるようにDNSを設定します。
ホストゾーンを取得
hostedZoneId, zoneNameは事前に用意しておいたホストゾーンに合わせて変更してください。
const hostZone = route53.PublicHostedZone.fromHostedZoneAttributes(
this,
`HostZone`,
{
hostedZoneId: 'XXXXXXXXXXXXXXXXXXXX',
zoneName: 'example.com',
}
);
エイリアスレコードを作成
先ほど取得したホストゾーンにAレコードを追加します。
recordNameはAPIに使用したいドメインにしてください。
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"}