Cloud RunにContainer Registryを使ってデプロイするための一連の流れ

こんにちは、かみむらです。Cloud Runは少し前から気になっていましたが、中々触る機会がありませんでした。ですが、最近Cloud Runをフロントエンドで使う事例を目にして、すぐに触ってみたくなりました。

Cloud RunとはDockerのコンテナをサーバレスな環境で実行出来るサービスで、Knativeがベースとなっています。

そして、DockerのコンテナイメージをGCPで管理できるサービスに、Container Registryがあります。これは非公開でイメージを管理できることや、Container Registry内でビルドやデプロイができること、イメージの脆弱性チェックなど、非常に強力な機能が提供されています。

今回はContainer Registryにコンテナイメージを登録して、Cloud Runにデプロイしていきます。

書いたコードはこちらです。
github.com

前提環境

GCPの課金設定が有効になっている

Google Cloud SDKがインストールされている
v 272.0.0

Dockerがインストールされている
version 18.09.2, build 6247962

公式ドキュメント

cloud.google.com

cloud.google.com

ドキュメントを参考にしながら話を進めていきます。

APIの有効化

まずはContainer Registryを使うために、APIを有効化していきます。

f:id:kamimura-dev:20191208110939p:plain

Nodeアプリケーションのコンテナイメージを作成

これからContainer Registryに登録するための、小さなNodeアプリケーションを作っていきます。まずはpackage.jsonを作成します。

package.json

{
  "name": "cloud-run",
  "version": "1.0.0",
  "main": "index.js",
  "author": "hiro08gh",
  "license": "MIT",
  "dependencies": {
    "express": "^4.17.1"
  },
  "scripts": {
    "start": "node index.js"
  }
}

そしてindex.jsを作って、下記のコードを書き込んでください。これはlocalhost:3000にアクセスした時に、ブラウザ上にHello Worldという表示する簡単なプログラムです。

index.js

const express = require('express')
const app = express()

const PORT = process.env.PORT || 3000;

app.get('/', (req, res) => res.send('Hello World!'))

app.listen(PORT, () => console.log('Start on port 3000!'))

次にDockerのコンテナイメージを作るためのDockerfileを作っていきます。こちらも記述量は多くありません。

FROM node:12.2.0-alpine

WORKDIR /src

COPY package.json /src/package.json
COPY . .
RUN yarn install --only=production

CMD [ "yarn", "start" ]

Dockerfileを元にビルドして、コンテナイメージを作成してみましょう。-tフラグをつけることで、名前をつけることができます。

$ docker build . -t hello-image

イメージが作成されてるか確認してみましょう。

$ docker images

f:id:kamimura-dev:20191208082050p:plain

Container Registryにコンテナイメージを登録

イメージをpushするためには、gcloudでリクエストの認証ヘルパーを構成する必要があります。下記のコマンドを実行します。

$ gcloud auth configure-docker

Container Registryに登録するために、先ほど作成したコンテナイメージに新しく名前をつけていきます。[PROJECT=ID]には自分が管理しているGCPのプロジェクトIDを入れます。

$ docker tag hello-image gcr.io/[PROJECT-ID]/hello-image:latest

Docker イメージを Container Registryに登録します。 形式はgcr.io/[PROJECT-ID]/[CONTAINER-NAME]で指定します。
次のコマンドを実行します。

$ docker push gcr.io/[PROJECT-ID]/hello-image:latest

これで登録できました。GCPダッシュボード上にある、Container Registryで確認します。hell-imageが登録されてることが分かります。

f:id:kamimura-dev:20191208082711p:plain

Cloud Runにデプロイ

準備が整ったので、コンテナイメージをCloud Runにデプロイしてみましょう。まずはgcloudでbetaをインストールします。

$ gcloud components install beta

そして、デプロイするためのコマンドを打ちます。

$ gcloud beta run deploy --image gcr.io/[PROJECT-ID]/hello-image

リージョン、サービス名などデプロイ時にいくつか質問されます。最後の未認証の呼び出しを許可yで大丈夫です。

デプロイに成功後、発行されたURLにアクセスしてください。

f:id:kamimura-dev:20191208094900p:plain

これでCloud Runへデプロイするための一連の流れが終わりました。簡易的ではありましたが、第一歩を踏み出せました。次回はフロントエンド + Cloud Runな構成で記事を書きたいと思います。