Serverless Frameworkを使用してAPI Gatewayにカスタムドメインを設定する方法
2021.04.10#AWS概要
Serverless Frameworkを使用して、API Gatewayにカスタムドメインを設定する際、まずそのカスタムドメインをRoute53で管理しているかどうかで設定方法が異なります。
Route53でドメインを管理している場合、とても楽にServerless FrameworkからAPI Gatewayにカスタムドメインを設定することが出来ます。(そういった記事は調べればたくさん出てきます)
また、外部サービスでドメインを購入している場合、上記のように楽に設定するするには、サブドメインをRoute53に委任する必要があります。
外部サービスからRoute53にドメインを委任する方法は、こちらの記事が参考になります。
上記記事を確認するとわかりますが、Route53にドメインを委任するには、ホストゾーンを1つ登録する必要が有り、ここに月0.5USDの料金が掛かります。
大した額では無いのですが、DNS周りの知識が浅い私は、Route53に委任する方法しかないと思っておりました。
しかし、Route53にサブドメインを委任せず、無料でカスタムドメインをAPI Gatewayに設定する方法が有ったため、その手順を備忘録として記事にしました。
前提
- ドメインは、Route53ではない外部のサービス(この記事ではお名前ドットコムを利用)で購入している
- API Gatewayで設定するカスタムドメインにサブドメインを使用する
- 証明書はAWS Certificate Manager(ACM)より発行されたものを使用する
- この記事では、サブドメインとして
sub.ricknigel.dev
を使用する - Serverless Frameworkの認証周りの設定は完了済みである
- Serverless Frameworkを使用してAPI Gatewayを構築する
- API Gatewayは、東京リージョン(ap-northeast-1)で構築する
手順
1. ACMにてカスタムドメインへ証明書の発行をリクエストする
まずAWSのマネジメントコンソールより、ACMに移動します。 この時、Serverless Frameworkで構築するAPI Gatewayのエンドポイントタイプによって、リージョンを変更する必要が有ります。
- エッジ最適化の場合、
バージニア北部リージョン(us-east-1)
- リージョンの場合、API Gatewayと同じリージョン(この記事では
ap-northeast-1
)
Serverless Frameworkを使用してAPI Gatewayを構築する場合、エンドポイントタイプのデフォルトはエッジ最適化が設定されるため、ここではus-east-1
にてACMでの作業を実施します。
「証明書のリクエスト」をクリック
「パブリック証明書のリクエスト」を選択し、「証明書のリクエスト」をクリック
使用するサブドメインを入力し、「次へ」をクリック
「DNSの検証」が選択状態のまま、「次へ」をクリック
何も設定せず「確認」をクリック
「確定とリクエスト」をクリック
CNAMEに設定する値が表示されるので、画像の①、②の値をメモしておく
ステータスは検証保留中となる。
DNSサーバにCNAMEレコードを追加する
ここでは、ドメイン購入元のお名前ドットコムでレコードを追加する。
ステータスが発行済みとなったことを確認する
CNAMEレコードを追加後、20分程待った後に再度ACMを開くとステータスが発行済みとなる。
これでドメインへの証明書の発行が完了となる。
2. Serverless FrameworkでAPI Gatewayを構築する
Serverlessのプロジェクトを作成
ここではランタイムをNode.js
、プロジェクト名をcustom-domain-test
にしました。
$ sls create -t aws-nodejs -p custom-domain-test
$ cd custom-domain-test
serverless.ymlは、下記のようになります。(コード部分)
service: custom-domain-test
frameworkVersion: '2'
provider:
name: aws
runtime: nodejs12.x
lambdaHashingVersion: 20201221
functions:
hello:
handler: handler.hello
serverless-domain-managerをインストールする
$ npm init -y
$ npm i -D serverless-domain-manager
serverless.ymlを編集する
リージョンを東京リージョン(ap-northeast-1)に設定する。
provider:
name: aws
runtime: nodejs12.x
+ region: ap-northeast-1
lambdaHashingVersion: 20201221
カスタムドメインの設定を追加
この時、createRoute53Record
には、false
を設定する。
+ plugins:
+ - serverless-domain-manager
+ custom:
+ customDomain:
+ stage: dev
+ domainName: sub.ricknigel.dev
+ certificateName: sub.ricknigel.dev
+ basePath: ''
+ createRoute53Record: false
functionsにAPI Gatewayの設定を追加
functions:
hello:
handler: handler.hello
+ events:
+ - http:
+ path: test
+ method: get
API Gatewayで使用するカスタムドメインを作成
$ sls create_domain
コマンド実行後、マネジメントコンソールよりAPI Gatewayのカスタムドメイン欄にて、カスタムドメインが追加されている(リージョンは、東京を指定)
AWSへデプロイする
この時、API Gatewayのエンドポイントも表示されるので、メモする。
$ sls deploy
...
endpoints:
GET - https://xxxxxxxx.execute-api.ap-northeast-1.amazonaws.com/dev/test
...
CNAMEレコードを追加する
メモしたエンドポイントのドメインを値に設定する
しばらくすると、DNSが切り替わります。下記コマンドで切り替わったことが確認できます。
$ dig sub.ricknigel.dev CNAME
...
;; ANSWER SECTION:
sub.ricknigel.dev. 3523 IN CNAME xxxxxxxxxx.execute-api.ap-northeast-1.amazonaws.com.
...
先ほど追加したAPI Gatewayのドメインが表示されていれば切り替え完了となります。
作成したAPIを実行してみます。
$ curl https://sub.ricknigel.dev/test
{
"message": "Go Serverless v1.0! Your function executed successfully!",
"input": {
"resource": "/test",
"path": "/test",
"httpMethod": "GET",
...
お疲れ様でした。これでAPI Gatewayのカスタムドメインの設定は完了となります。