GCPのCloud Run環境にデプロイするまでの手順( + Node.js環境の構築 )

この記事について

  • 社内向けに勉強会的なものをやったときにステップバイステップで環境構築できるように説明した資料。
  • Cloud Runで何かしらのbotを作成したいが何していいかわからない、という情シス向けの資料
  • Cloud Runにデプロイする環境はNode.jsのものを利用するので、Node.js環境の構築から触れてます。

免責

  • GCP環境 及び GCPプロジェクトは事前に用意しておいてください。
    • GCP環境の開設等はググればたくさん情報があるので、そちらでお願いします。
  • 想定端末はMacです。( Windows環境では若干違う情報もあると思います )
  • コードが綺麗とかは度外視してます。
    • 私自信はガチガチの開発者じゃないのでそういうのはできない。
  • セキュリティ周りのことも何も考慮していないので実際に運用する場合は自己責任でお願いします。
    • たとえばAPI TokenはSecret Managerを使ってそこに保存するようにする、とか。
    • たとえばheaderとかに任意の文字列とかを設定しておいて、その文字列と一緒じゃないとリクエストを受け付けないようにする、とか。

参考にさせていただいたURL

github.com

qiita.com

https://cloud.google.com/run/docs/quickstarts/build-and-deploy/deploy-nodejs-service?hl=ja

実施するステップ

  1. Node.js環境の構築。
  2. 構築したNode.js環境で、hello, world を出力できるようになることを確認。
  3. Cloud Runにデプロイする予定のローカルWebサーバーを構築。リクエストを投げて hello, world と返却されることを確認。
  4. Cloud Runに上記環境をデプロイ。デプロイした環境(Internet上の環境) で hello, world と表示されることを確認。

実践編1: Node.js環境の構築

正直、構築できれば何でもいいですが利便性観点でNode.jsのパッケージが選択可能なnvmを使って環境構築します。

  1. nvmのインストール
    1. 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 を実行。
    2. ターミナルを閉じて、再度開いて nvm -v コマンドでnvmバージョンが表示されればOK
  2. Node.jsのインストール ( 2023年2月時点でのLTS版である18.14.1をインストールする手順 )
    1. nvm install v18.14.1
      • LTS版を入れたい場合は単純に nvm install --lts でもOKですが勉強のために、あえてバージョン指定にしています。
    2. 普段使う、Nodeバージョンを指定する。
      1. nvm use v18.14.1
    3. node --version と打って、想定のNodeバージョンかを確認する。
  3. hello, worldしてみる。
    1. node と打ってnode CLIを起動。
    2. console.log("hello, world"); と打ってhello, worldが出ればOK。

実践編2: コンテナ想定環境のテスト

  1. 適当なフォルダを用意し、下記2つのファイルを用意する。

    1. 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;
       });
      
  2. npm initpackage.json を生成する。

    1. 質問は全部デフォルトのものを答える。
  3. npm install express でexpressをインストールする。
  4. npm install node-fetch-commonjs でnode-fetch-commonjsもインストールしておく。
  5. node index.js を実行してExpressサーバ(Webサーバ)をlocalhostで起動する。
  6. 別のターミナルで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にデプロイ

  1. デプロイ対象のGCPプロジェクトで、 このページなどを参考に、 Cloud Build と Cloud RunのAPIを有効化する。

  2. 実践編2で用意したフォルダに下記ファイルを用意する。

    1. Dockerfile

       FROM node:18.14-slim
       WORKDIR /usr/src/app
       COPY package*.json ./
       RUN npm install --only=production
       COPY . ./
       CMD [ "npm", "start" ]
      
  3. 実践編2で用意した package.json に下記を追記する。

    1. 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"
       },
      
  4. gcloud CLI をインストール。

  5. gcloud auth login --no-launch-browser で認証情報をセットする。
    1. URLが表示されるので認証するユーザーで認証後、表示された Enter authorization をターミナルに貼り付け。
  6. 下記コマンドで環境情報諸々をセットしておく。

     gcloud config set run/platform managed
     gcloud config set run/region asia-northeast1
     PROJECT_ID="事前に用意したGCPプロジェクトの名前"
     image_name="CloudRun上に表示する名前"
    
  7. 下記コマンドでデプロイする。

    1. ※下記コマンド実施後、デプロイされた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
    
  8. 念の為、 gcloud auth revoke で認証情報を破棄しておく。

  9. 別のターミナルで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)
     });
    
  10. Cloud Runにアクセスして、デプロイした名前の環境を開き ログ を確認。hello, worldが記載されていることを確認。