/vocabulary-list

Cloud Run + Firebase Hosting

Primary LanguageTypeScript

usage

FROM node:12-alpine
ENV PORT=3000
WORKDIR /usr/src/app
COPY package.json yarn.lock ./
RUN yarn --production
COPY . .
CMD ["yarn", "start"]
$ docker build . -t vocabulary-list-app
$ docker run -it -p 3000:3000 vocabulary-list-app

GCP プロジェクトを作成しておく。gcloud コマンドが手元にインストールされてない場合は適宜インストールする。

$ PROJECT_ID=vocabulary-list-293610
$ gcloud builds submit --tag=gcr.io/$PROJECT_ID/app --project=$PROJECT_ID

Cloud Builds でコンテナをビルドする。数分でビルドが完了し、プロジェクトページの Container Registry に app というコンテナイメージが登録されている。

Cound Run のページで Create Service を押下する。

Cloud Build で CD の設定をしておくと master ブランチにプッシュする度にデプロイが走るようになる。

$ yarn add @google-cloud/translate

Cloud SQL for PostgreSQL に接続する

管理画面からインスタンスを適当に作成し、C loud SQL に接続するためのユーザーアカウントも作成する。

ローカル環境からは Cloud SQL Proxy で接続する。

$ ./cloud_sql_proxy -instances=vocabulary-list-293610:asia-northeast1:vocabulary-list=tcp:3306

pgAdmin でデータベースに接続し、適当にクエリを実行する。

CREATE TABLE words.words (
  `id` INT NOT NULL AUTO_INCREMENT,
  `ja` VARCHAR(200) NOT NULL,
  `en` VARCHAR(200) NOT NULL,
  `es` VARCHAR(200) NOT NULL,
  `fr` VARCHAR(200) NOT NULL,
  `done` BOOLEAN NOT NULL DEFAULT 0,
  PRIMARY KEY (`id`));
)

INSERT INTO words (id, ja, en, es, fr, done) VALUES (1, '今日', 'today', 'hoy', 'anjourd''hui', false);
INSERT INTO words (id, ja, en, es, fr, done) VALUES (2, '明日', 'tomorrow', 'mañana', 'demain', false);

/words にアクセスすると、追加したデータが表示されている。

Cloud Run から接続するには、Cloud SQL Proxy を通して UNIX ソケットを用いる。 環境変数を設定する。

DB_USER=xxxxx
DB_PASSWORD=xxxxx
DB_NAME=words
DB_PORT=3306
DB_HOST=/cloudsq/<Project ID>:<Region>:<Cloud SQL instance name>

静的ファイルを Firebase Hosting で配信

$ npx firebase init --project vocabulary-list-293610
#...
? For which GitHub repository would you like to set up a GitHub workflow? nokazn/vocabulary-list? nokazn/vocabulary-list
#...
+ "build:hosting": "rimraf dist/ && tsc -p ./tsconfig.json"

特定のパスへのアクセスは Cloud Run に向ける。

+ "rewrites": [
+   {
+     "source": "/words/{,/**}",
+     "run": {
+       "serviceId": "vocabulary-list-app",
+       "region": "asia-northeast1"
+     }
+   },
+   {
+     "source": "/translate/**",
+     "run": {
+       "serviceId": "vocabulary-list-app",
+       "region": "asia-northeast1"
+     }
+   },
+   {
+     "source": "**",
+     "destination": "/index.html"
+   }
+ ]

https://firebase.google.com/docs/hosting/cloud-run?hl=ja#direct_requests_to_container

参考

https://ishida-it.com/blog/post/2020-07-23-cloudrun-nodejs-1/