第2の人生の構築ログ

自分の好きなことをやりつつ、インカムもしっかりと。実現していく過程での記録など。読書、IT系、旅行、お金に関係する話などの話題。

【GCP】GAE プロジェクトで複数のサービスを構成する〜1プロジェクトで複数サブドメインを利用する

f:id:dr_taka_n:20200719171524p:plain

GCP の GAE (Google App Engine) では、1つのプロジェクトの中に複数サービスを立ち上げることができます。

ここで書いている「サービス」とは、app.yml で定義し、デプロイした1つ1つのアプリの単位をいっています。 以前以下の記事で書いたアプリの単位ですね。

www.morelife.work

何をやりたいのか

dispatch.yaml で定義を行うことでルーティングのオーバーライドができますので、指定された URL に対するサービスをマッピング(特定)することができます。それにより、以下のことができるようになります。

  • サービス毎に異なる言語を使いたい場合、言語/機能毎にサービスをわけることができます。
    • こっちのサービスは python で、こっちは Go で、みたいな。
  • カスタムドメインで1つのプロジェクトに追加できるのは1ドメインだけですが、複数のサービスを利用したいケースもあります。その場合、ホスト単位で分け(サブドメイン)たりしますが、このケースにも利用できます。

ここでは、タイトルの補足にありますように、後者にあたる「1プロジェクトで複数サブドメインを利用する」を行ってみます。以下のような構成を実現します。

  • www.example.com は、default サービス
  • a.example.com は、a サービス
  • b.example.com は、b サービス

前提と作業概要

まず、前提としてまして、

  • GAE をカスタムドメインで利用しています
  • すでにカスタムドメインの設定は行っており、サービス(app.ymlのアプリ)も1つ deploy しています

となっています。ちょうど以下の記事の作業を終えている状態となります。

www.morelife.work

ここでは、これに対して、以下の作業を行うことで「1プロジェクトで複数サブドメインを利用する」を実現します。

  1. 新たに追加するサービス用のサブドメインを追加する
  2. 新たなサービスを追加する
  3. dispatch.yaml でサブドメインとサービスのマッピングを行う

1. 新たに追加するサービス用のサブドメインを追加する

GAE の[設定] -> [カスタムドメイン] -> [カスタムドメインを追加] と辿ります。 f:id:dr_taka_n:20200718093555p:plain:w500

以下にありますようにここでの作業は3ステップです。1. 使用するドメインを選択する、2. 新たなドメインを現在のプロジェクトに指定する、3. DNS レコードを更新してセキュリティを有効化する。

f:id:dr_taka_n:20200718094238p:plain:w500

使用するドメインを選択して(「1. 使用するドメインを選択する」ここでは webapps-in.tokyo)、新たなサブドメインを追加します(「2. 新たなドメインを現在のプロジェクトに指定する」)。ここでは、sample-firestore.webapps-in.tokyo を追加しています。

f:id:dr_taka_n:20200718093338p:plain:w500

最後の「3. DNS レコードを更新してセキュリティを有効化する」ですが、ここでの作業ではありません。以下に表示されている DNS レコードを自身で管理している DNS に反映しておきます。以下には全ての情報がでていますが、今回は追加ですので、最後のCNAMEの部分だけが、新たに追加する必要のある情報です。

f:id:dr_taka_n:20200718094459p:plain:w500

DNS 側の設定に関しましてはここでは詳細は割愛します。以下の記事に記載していますので、そちらを確認ください。

www.morelife.work

サブドメインの追加は以上です。

2. 新たなサービスを追加する

新たなサービスをデプロイします。

先程サブドメインの追加でsample-firestore.webapps-in.tokyoを追加しました。このサブドメインに割り当てるサービスの登録を追加することになります。

簡単な GAE アプリを用意して、app.yaml を以下のように記述します。

runtime: go111
env_variables:
  PROJECT_ID: any_project_id
  VERSION: v1
service: sample-firestore

ポイントは、service の指定ですね。ここにサービス名を明示的に指定しています。指定しない場合は、default が指定されているものと見なされます。

GAE アプリの記載はここでは割愛します。以下の記事などを参照ください。

www.morelife.work

deploy します。

$ gcloud app deploy

3. dispatch.yaml でサブドメインとサービスのマッピングを行う

最後に追加したサブドメインと GAE アプリケーションのサービスを紐つけます。

現状サービスは2つあります。default サービスと sample-firestore サービスです。

適当な場所にdispatch.yamlを用意して、サブドメインとサービスのマッピングを以下のように記述します。

dispatch:
  - url: "webapps-in.tokyo/*"
    service: default
  - url: "www.webapps-in.tokyo/*"
    service: default
  - url: "sample-firestore.webapps-in.tokyo/*"
    service: sample-firestore

上記では、urlserviceの指定を1セットで3セット記載しています。

webapps-in.tokyo というドメインに対して、wwwwww 無し、sample-firestore の3つのホスト(サブドメイン)が用意されており、これは既にDNSで名前解決できる状態になっています。

それぞれのホスト(サブドメイン)に対して、GAE アプリケーションのサービスを指定しています。これは、app.yamlで指定を行ったサービス名になり、指定を行っていない場合には default が暗黙的に指定されたものと見なされています。

上記の指定により、www.webapps-in.tokyowebapps-in.tokyo にアクセスした場合には、default のサービス (GAE アプリケーション) が呼び出され、sample-firestore.webapps-in.tokyo にアクアセスした婆いには、sample-firestore のサービス (GAE アプリケーション) が呼び出されます。

dispatch.yaml をデプロイします。アプリのデプロイとコマンドが異なります。

$ gcloud app deploy dispatch.yaml

完了しますと、以下のようにサービスメニューにて「サービス」と「送信ルート」が設定されているのを確認することができます。

f:id:dr_taka_n:20200719165246p:plain

以上で、「1プロジェクトで複数サブドメインを利用する」を実現できました。

GAE の場合、サブドメインを追加する際に http だけでなく、https プロトコルでの口も用意してくれ、証明書も自動でそれぞれのホスト毎に作成してくれていますので、とても手軽に Web アプリの配置を行うことができるようになっています。