はじめに
ここではServerless Frameworkおいて、カスタムドメインを使用して
特定のドメインからServerless Frameworkでデプロイしたモジュールにアクセスできるようにします。
カスタムドメインを使用する前:
Serverless Frameworkから発行される適当なドメインにアクセスしてアプリケーションを表示
カスタムドメインを使用した後:
自ら指定したドメインにアクセスしてアプリケーションを表示
所要時間
証明書の発行などあるため、60分ほどかかる想定です。
手順
Route53にてホストゾーンを登録
Route53のコンソールから簡単に登録できるので詳細な手順は割愛します。
作成したホストゾーンのホストゾーンIDは後ほど使うのでメモしておきます。
Certificate ManagerよりSSL証明書の発行
Certificate ManagerからSSL証明書(ACM)を発行します。
ここも詳細な手順は割愛します。以下が注意するポイントです。
今回はドメイン検証で証明書を作成しましたが、AWSはドメイン作成まで30分ほどかかる場合があるとアナウンスしていました。
私の場合は5分ほどで完了しました。
注意点
- ワイルドカード証明書として発行しておいたほうが良いです。
- US-east1(バージニア北部)リージョンで発行します。
- Nameタグを設定します。「*.xxxxx.com」に対して証明書を発行したなら、Nameタグの値は「xxxxx.com」とします。
serverless-domain-managerをインストール
$ npm install serverless-domain-manager --save-dev
カスタムドメイン作成
serverless.ymlを編集
Customの部分に以下を追加します。また、プラグインにserverless-domain-managerも追加します。
plugins:
- serverless-domain-manager
custom:
customDomain:
hostsZoneId: '<ホストゾーンID>'
domainName: '${self:provider.stage}.xxxxx.com'
certificateName: '*.xxxxx.com'
certificateArn: '<SSL証明書のarn>'
basePath: ''
stage: ${self:provider.stage}
createRoute53Record: true
例えばFlaskアプリ用のserverless.ymlだと、以下のようになります。
service:
name: <サービス名>
plugins:
- serverless-python-requirements
- serverless-wsgi
- serverless-domain-manager
provider:
name: aws
runtime: python3.6
stage: ${opt:stage, 'dev'}
region: ap-northeast-1
timeout: 300
memorySize: 2048 # Overwrite the default memory size. Default is 1024
deploymentBucket: ${self:service}-deployment
custom:
name: ${self:service.name}
wsgi:
app: main.app
packRequirements: false
stage: ${opt:stage, self:provider.stage}
logRetentionInDays:
dev: "30"
stg: "60"
prod: "90"
pythonRequirements:
dockerizePip: non-linux
customDomain:
hostsZoneId: '<ホストゾーンID>'
domainName: '${self:provider.stage}.xxxxx.com'
certificateName: '*.xxxxx.com'
certificateArn: '<SSL証明書のarn>'
basePath: ''
stage: ${self:provider.stage}
createRoute53Record: true
functions:
app:
handler: wsgi.handler
events:
- http: ANY /
- http: 'ANY {proxy+}'
カスタムドメイン作成
下記コマンドからカスタムドメインを作成します。
$ sls create_domain --aws-profile <プロファイル名>
ymlの記載上、デフォルトのstageはdevとしています。
stage名を指定したい場合は以下のようにコマンドを打ちます。
$ sls create_domain --aws-profile <プロファイル名> --stage <ステージ名>
(例)
$ sls create_domain --aws-profile sls-adm --stage prod
この時、Route53やACMに対して権限があるので、
Serverless Framework用にIAMユーザを発行している場合は権限の付与が必要です。
私はこのコマンドの実行の際にはAWS管理者権限を持った認証情報(アクセスキー/シークレットアクセスキー)を使用して行いました。
新しいプロファイルの作成は以下のコマンドから行えます。
$ serverless config credentials --profile <プロファイル名> --provider aws --key <アクセスキー> --secret <シークレットアクセスキー>
また、通常使用しているServerless FrameworkのIAMポリシーは下記URLに記載しています。
https://qiita.com/htanaka/items/631e11c1f69f128079f9
なにか問題がある場合は、下記コマンドを実行してから再度行うことで、
エラーをトラッキングできます。
export SLS_DEBUG=*
以下のような文言が表示されれば成功しています。40分ほどで設定完了するとのことなので少し待ちますが、私の場合15分くらいで出来ているようでした。
Serverless: Custom domain xxxxx.com was created.
New domains may take up to 40 minutes to be initialized.
serverlessアプリケーションのデプロイ
アプリケーションをデプロイし、カスタムドメインでアクセスできるか確認します。
デプロイ時は管理者権限は必要ありません。
$ sls deploy --profile <プロファイル名>
下記のようにドメイン名がカスタムドメインで設定したものに変わっています。
Distribution Domain Name
Domain Name: dev.xxxxx.com
Target Domain: xxxxxxxx.cloudfront.net
Hosted Zone Id: XXXXXXXXXXX
参考
同じ手順が公式にも載っているのでそちらも参照してみてください。
https://www.serverless.com/blog/serverless-api-gateway-domain/