Masayan tech blog.

  1. ブログ記事一覧>
  2. 【Cloud Runでサクッとサービスをデプロイ】Part2:アプリケーションの手動デプロイ

【Cloud Runでサクッとサービスをデプロイ】Part2:アプリケーションの手動デプロイ

公開日

※GCPアカウントの作成、プロジェクト作成、課金有効化、Cloud SDKのインストールなどは完了している前提で進める

シリーズ構成

【Cloud Runでサクッとサービスをデプロイ】Part1:導入

【Cloud Runでサクッとサービスをデプロイ】Part2:アプリケーションの手動デプロイ

【Cloud Runでサクッとサービスをデプロイ】Part3:CI/CDパイプライン構築

【Cloud Runでサクッとサービスをデプロイ】Part4:DB(Cloud Sql)と接続

イメージ図

最終的なゴールは以下の図の通り

デプロイ手順

Nodeアプリケーションを手動でデプロイする。なんとGo,Java,Python,Node.js,.Netに関しては、リポジトリにDockerfileがなくてもアプリケーションをデプロイ可能。本記事ではDockerfileを使用しない方法と使用する方法を紹介する 

Dockerfileを使用しない方法

簡単なプロジェクト作成

mkdir express-ts && cd express-ts

src/app.ts

import express, { Application, Request, Response } from "express";

const app: Application = express();

app.use(express.json());
app.use(express.urlencoded({ extended: true }));

app.get("/", async (req: Request, res: Response) => {
  return res.status(200).send({
    message: "Hello World!",
  });
});

const port = process.env.PORT || 8000;
try {
  app.listen(port, () => {
    console.log(`Running at Port ${port}...`);
  });
} catch (e) {
  if (e instanceof Error) {
    console.error(e.message);
  }
}

package.json

{
  "name": "express-ts",
  "version": "1.0.0",
  "description": "",
  "main": "dist/app.js",
  "scripts": {
    "start": "node .",
    "test": "echo \"Error: no test specified\" && exit 1",
    "dev": "ts-node-dev --respawn src/app.ts",
    "clean": "rimraf dist",
    "tsc": "tsc",
    "build": "npm-run-all clean tsc"
  },
  "author": "",
  "license": "ISC",
  "dependencies": {
    "@types/express": "^4.17.17",
    "@types/node": "^20.6.0",
    "express": "^4.18.2",
    "npm-run-all": "^4.1.5",
    "ts-node-dev": "^2.0.0",
    "typescript": "^5.2.2"
  }
}

tsconfig.json

{
    "compilerOptions": {
      "allowJs": true,
      "target": "ES2020",
      "module": "commonjs",
      "sourceMap": true,
      "outDir": "./dist",
      "strict": true,
      "strictNullChecks": true,
      "alwaysStrict": true,
      "moduleResolution": "node",
      "esModuleInterop": true,
      "skipLibCheck": true,
      "forceConsistentCasingInFileNames": true
    },
    "include": ["src/**/*"]
  }

expressサーバーができたのでデプロイコマンドを打ち、サービス名やソースコードのパス、リージョンなどを選択

gcloud run deploy
・・・

Service name (express-ts):  
Please specify a region:3

Allow unauthenticated invocations to [express-ts] (y/N)? Y

Artifact Registry上にビルドされたDockerイメージが保存される

デプロイが完了すると、アプリケーションにアクセスするためのURLが発行される。

gcloud run deploy
・・・

Done.                                                                                                                                                                                                                                                                                                           
Service [express-ts] revision [express-ts-00001-hef] has been deployed and is serving 100 percent of traffic.
Service URL: https://express-ts-j2jmnmiayq-an.a.run.app

URLにアクセスし、message: Hello Woldが表示されていればOK

Dockerfileを使用する方法

Dockerfileを使用する場合、Artifact Registryに保存済みのイメージ、もしくはプロジェクトのソースコードに含まれるDockerfileを指定してデプロイする。今回は後者の方法で進める

すでに作成したプロジェクトにDockerfileを追加する。PORT8080で待ち受けるexpressサーバー

FROM node:lts-slim

WORKDIR /usr/src/app

ENV PORT 8080

COPY package*.json ./

RUN npm install --only=production

COPY . ./

RUN npm run build
CMD [ "npm", "start" ]

デプロイコマンドを打つと作成したDockerfileを元にアプリケーションがデプロイされる 

gcloud run deploy
...

Dockerfileを使用しない方法と同じくデプロイが完了すると、アプリケーションにアクセスするためのURLが発行されるので、こちらにアクセスしてメッセージが表示されていればOK

Artifact Registryにイメージを保存する手順

すでに、ソースコード上に存在するDockerイメージを参照する方法を紹介したが、Artifact Registryにイメージを保存する方法についても紹介しておく。(Part3ではこちらのイメージを参照してビルド、デプロイする方法を行うため)

Artifact Registryを開き、リポジトリを作成をクリック

作成画面でリポジトリ名、形式はDockerを選択、リージョンなどを指定し、作成ボタンをクリックすると一覧に追加される

保存したいイメージをbuildする(-tでイメージにタグをつけることが可能)

docker build -t <リージョン>-docker.pkg.dev/<プロジェクトID>/<リポジトリ名>/<イメージ名>:<タグ> <ビルドコンテキスト> -f <Dockerfileのパス>

docker build -t asia-northeast1-docker.pkg.dev/XXXXXX/my-repo/my-image:latest . -f docker/Dockerfile

buildしたイメージをpushする

docker push <リージョン>-docker.pkg.dev/<プロジェクトID>/<リポジトリ名>/<イメージ名>:<タグ>

docker push asia-northeast1-docker.pkg.dev/XXXXXX/my-repo/my-image:latest

これでArtifact Registryで作成したリポジトリの次階層にイメージが保存されていれば完了。作成したイメージはCloud runでアプリケーションを構築する際に参照する

Part2ここまで。次回のPart3では今回手動で行った内容をCI/CDパイプライン構築して自動化する

まとめ

いかがでしたでしょうか。本記事では、【Cloud Runでサクッとサービスをデプロイ】シリーズのPart2として、Cloud RunでDockerfileを使用しない方法と使用する方法の2種類を紹介しました。ぜひ参考にしてみてください。