💨

AWS SAMの チュートリアル: Hello World アプリケーションに独自ドメインを設定してみる

2023/06/20に公開

今回やること

先日、AWS SAMのチュートリアル、Hello World アプリケーションをAWS上にデプロイしてみました。非常に簡単に REST API 構築することが出来ました。

https://zenn.dev/gami113/articles/c605bc991ccab3

今回は、これに対して独自のドメインを設定していきたいと思います。

環境

OS

  • エディション Windows 10 Pro
  • バージョン 21H2
  • OS ビルド 19044.2965

ソフトウェア

  • Python 3.9.13
  • aws-cli/2.11.25 Python/3.11.3 Windows/10 exe/AMD64 prompt/off
  • SAM CLI, version 1.85.0
  • PSVersion 5.1.19041.2673
  • git version 2.40.0.windows.1

ResourcesにAPI Gatewayのリソースを記載する

独自ドメインを設定するためには、AWS::Serverless::Apiを利用して設定していく必要があるようなので、リファレンスのAWS::Serverless::APIを参考に設定を加えました。

template.yaml

Serverless::Apiを作成し、Lambdaで利用するように指定

ファイル上部で作成したApiGatewayApiをApiGatewayApi:Ref:に記載することで、Lambdaが上部のServerless::Apiのリソースを利用してくれるようになります。

API Gatewayの不要なステージを削除する

API Gatewayに、「Prod」と「Stage」の2つのステージが出来ていました。1つのみで良いため、Stageを削除します。下記の記事を参考にし、OpenApiVersionを設定に書き加え、「Stage」を削除しました。

https://dev.classmethod.jp/articles/aws-sam-delete-deploy-unused-stage/

あとは、パスなどの設定を自分好みに変えて完了です。ビルド&デプロイを行い、上手く動作していることを確認して、gitへコミット&プッシュを行います。

PS E:\prog\sam-hello-world> curl https://xxxxxxxxxx.execute-api.ap-northeast-1.amazonaws.com/prod/v1/hello


StatusCode        : 200
StatusDescription : OK
Content           : {"message": "hello world"}
RawContent        : HTTP/1.1 200 OK

独自ドメインを手動で設定してみる

このまま、template.yamlにパラメータを書き足してもいいのですが、実際に画面上で操作をしないとイメージが付きにくいと思い、一度、画面上から独自ドメインを設定していきます。内容は、下記ページを参考にしました。

https://zenn.dev/tatsurom/articles/api-gateway-domain-mapping

カスタムドメイン名のページを開く

まずは、カスタムドメイン名のページに遷移し、作成を押下します。

カスタムドメインの作成

各種設定を行う

ドメイン名

利用したいドメイン名を指定します。ここでは、自分の所持しているドメイン、サブドメインを指定します。

エンドポイント設定

エッジ最適化を選択します

ACM 証明書

作成していないため新たに作成します。下部にあるリンク「新しい ACM 証明書を作成 」から遷移します。

ACM 証明書の発行、設定

ACM 証明書の発行

指定したドメイン名をここでも指定します。

ACM 証明書作成

その後、名前解決をしてもらうために、Route53にCNAMEレコードを作成します。しばらく経てばステータスが発行済みになる想定です。

API Gatewayで設定

先ほど作成した ACM 証明書を指定して、ドメイン名の作成を押下します。

ドメイン名の作成

ドメイン名の設定が完了しました。

ドメイン名の設定完了

APIマッピングの設定

どのAPIと紐づけるかの設定を行います。APIマッピングの設定を押下します。

APIマッピングの設定

ここでは、作成したAPIとステージを画像の通りに設定します。

APIマッピングの詳細設定

API Gateway ドメイン名までルーティング

route53を用いて、API Gateway ドメイン名までルーティングします。route53まで移動して、レコードの新規作成を実施してください。

レコードの作成

動作確認

カスタムドメイン名を指定してcurlを実行。正常に値が返却されることを確認します。
手動での設定方法はこれにて完了です。

PS E:\prog\sam-hello-world> curl https://xxxtest.xxxxxxx.com/v1/hello/


StatusCode        : 200
StatusDescription : OK
Content           : {"message": "hello world"}
RawContent        : HTTP/1.1 200 OK

これをSAMから設定していきます。
カスタムドメイン名、API Gateway ドメイン名までルーティングのために追加したAレコードは削除します。ACM 証明書はそのままにします。

SAMを用いてカスタムドメイン名を設定する

ここまで手動で実施した内容を、template.xmlに記載していきます。設定方法は、AWS::Serverless::Api、および、DomainConfigurationを参照します。

DomainName の例に記載されている内容を設定してしまえばよいです。

DomainNameの例

YAML

Domain:
 DomainName: www.example.com
 CertificateArn: arn-example
 EndpointConfiguration: EDGE
 Route53:
   HostedZoneId: Z1PA6795UKMFR9
 BasePath:
   - foo
   - bar

実際に設定します。手動設定を行ったので、大体何がどこに対応しているかがわかるかと思います。ビルド&デプロイを実施します。

template.yamlの修正

念のためにビルド前にcurlを実行し、失敗することを確認します。

PS E:\prog\sam-hello-world> curl https://xxxtest.xxxxxxx.com/v1/hello/
curl : リモート名を解決できませんでした。: 'xxxtest.xxxxxxx.com'

デプロイ後の再実施では上手くいくことが確認できました。

PS E:\prog\sam-hello-world> curl https://xxxtest.xxxxxxx.com/v1/hello/


StatusCode        : 200
StatusDescription : OK
Content           : {"message": "hello world"}
RawContent        : HTTP/1.1 200 OK

最後に

SAMを用いて、API Gatewayのカスタムドメイン化を行いました。手動でかなりポチポチ設定をしていたのですが、SAMを使えば少ない記述量ですくに作成できるのが非常に良いです。ただ、ドキュメントのどこを探せば情報が載っているのかわからず、なれるまで時間がかかりそうです。すこしずつ覚えていきます。

参考

Discussion