この記事について
- 社内向けに勉強会的なものをやったときにステップバイステップで環境構築できるように説明した資料。
- Cloud Runで何かしらのbotを作成したいが何していいかわからない、という情シス向けの資料
- Cloud Runにデプロイする環境はNode.jsのものを利用するので、Node.js環境の構築から触れてます。
免責
- GCP環境 及び GCPプロジェクトは事前に用意しておいてください。
- GCP環境の開設等はググればたくさん情報があるので、そちらでお願いします。
- 想定端末はMacです。( Windows環境では若干違う情報もあると思います )
- コードが綺麗とかは度外視してます。
- 私自信はガチガチの開発者じゃないのでそういうのはできない。
- セキュリティ周りのことも何も考慮していないので実際に運用する場合は自己責任でお願いします。
参考にさせていただいたURL
https://cloud.google.com/run/docs/quickstarts/build-and-deploy/deploy-nodejs-service?hl=ja
実施するステップ
- Node.js環境の構築。
- 構築したNode.js環境で、
hello, world
を出力できるようになることを確認。 - Cloud Runにデプロイする予定のローカルWebサーバーを構築。リクエストを投げて
hello, world
と返却されることを確認。 - Cloud Runに上記環境をデプロイ。デプロイした環境(Internet上の環境) で
hello, world
と表示されることを確認。
実践編1: Node.js環境の構築
正直、構築できれば何でもいいですが利便性観点でNode.jsのパッケージが選択可能なnvmを使って環境構築します。
- nvmのインストール
curl -o- [https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.sh](https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.sh) | bash
を実行。- ターミナルを閉じて、再度開いて
nvm -v
コマンドでnvmバージョンが表示されればOK
- Node.jsのインストール ( 2023年2月時点でのLTS版である18.14.1をインストールする手順 )
nvm install v18.14.1
- LTS版を入れたい場合は単純に
nvm install --lts
でもOKですが勉強のために、あえてバージョン指定にしています。
- LTS版を入れたい場合は単純に
- 普段使う、Nodeバージョンを指定する。
nvm use v18.14.1
node --version
と打って、想定のNodeバージョンかを確認する。
- hello, worldしてみる。
node
と打ってnode CLIを起動。console.log("hello, world");
と打ってhello, worldが出ればOK。
実践編2: コンテナ想定環境のテスト
適当なフォルダを用意し、下記2つのファイルを用意する。
index.js
/*-------------------------------------------------- Expressサーバ起動用に必要な記述 --------------------------------------------------*/ const express = require('express'); const bodyParser = require('body-parser'); let app = express(); app.use(bodyParser.urlencoded({ extended: true })); app.use(bodyParser.json({ verify: (req, res, buf) => { req.rawBody = buf; } })); const port = process.env.PORT || 8080; app.listen(port); console.log('listen on port ' + port); app.post('/', async function(request, response){ /*-------------------------------------------------- 実処理(ここ以降に実際に処理したい内容とかを書く) --------------------------------------------------*/ console.log("headers", JSON.stringify(request.headers)); console.log("body", JSON.stringify(request.body)); console.log("hello, world"); response.json("ok"); return; });
npm init
で package.json を生成する。- 質問は全部デフォルトのものを答える。
npm install express
でexpressをインストールする。npm install node-fetch-commonjs
でnode-fetch-commonjsもインストールしておく。node index.js
を実行してExpressサーバ(Webサーバ)をlocalhostで起動する。別のターミナルで
node
と実行し、node CLIから下記コマンドを実行して、上記の手順5のターミナルでhello, worldが返却されることを確認。const fetch = require('node-fetch-commonjs'); const headers = { "content-type": "application/json", }; const body = { "body": "dummy" }; fetch('http://localhost:8080', { method: 'POST', headers: { 'Content-Type': headers["content-type"], }, body: JSON.stringify(body) });
実践編3: Cloud Runにデプロイ
デプロイ対象のGCPプロジェクトで、 このページなどを参考に、 Cloud Build と Cloud RunのAPIを有効化する。
実践編2で用意したフォルダに下記ファイルを用意する。
Dockerfile
FROM node:18.14-slim WORKDIR /usr/src/app COPY package*.json ./ RUN npm install --only=production COPY . ./ CMD [ "npm", "start" ]
実践編2で用意した package.json に下記を追記する。
scripts に
"start": "node index.js",
を追記。//これを "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, //こんな感じ "scripts": { "start": "node index.js", "test": "echo \"Error: no test specified\" && exit 1" },
gcloud CLI をインストール。
gcloud auth login --no-launch-browser
で認証情報をセットする。- URLが表示されるので認証するユーザーで認証後、表示された Enter authorization をターミナルに貼り付け。
下記コマンドで環境情報諸々をセットしておく。
gcloud config set run/platform managed gcloud config set run/region asia-northeast1 PROJECT_ID="事前に用意したGCPプロジェクトの名前" image_name="CloudRun上に表示する名前"
下記コマンドでデプロイする。
- ※下記コマンド実施後、デプロイされたCloud Run環境のものが表示されるのでメモしておく。
#Container Registryにアップ gcloud builds submit --project ${PROJECT_ID} --tag gcr.io/${PROJECT_ID}/${image_name} #上記内容をCloud Runにデプロイ gcloud beta run deploy --project ${PROJECT_ID} --image gcr.io/${PROJECT_ID}/${image_name} --platform managed
念の為、
gcloud auth revoke
で認証情報を破棄しておく。別のターミナルで
node
と実行し、node CLIから下記コマンドを実行。const url = "デプロイ時に表示されたURL"; const fetch = require('node-fetch-commonjs'); const headers = { "content-type": "application/json", }; const body = { "body": "dummy" }; const hoge = fetch(url, { method: 'POST', headers: { 'Content-Type': headers["content-type"], }, body: JSON.stringify(body) });
Cloud Runにアクセスして、デプロイした名前の環境を開き ログ を確認。hello, worldが記載されていることを確認。