Serverless Frameworkでカスタムドメインを設定する

はじめに

ここでは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/

Spread the love