NIKKEI Digital Recruiting Site

GCPの新サービス「Cloud Run」を「Django」で試す

インターン生の高橋です.iOS アプリや 社内 API などの開発を行なっています. GCP の新サービスである Cloud Run を利用したので,簡単にご紹介したいと思います.

Cloud Run とは

サーバレスとコンテナ化を統合した Google Cloud Platform の新サービス.現在ベータ版. 2019/4/9 に開催された Google Cloud Next カンファレンスで発表された.

なぜ Cloud Run を使ったのか?

1. サーバレス

サーバ領域に意識を割くことなくサービスの中心となる開発を進められる.そして自動スケーリング,使用した分だけの課金で良い,という利点もある.ステートレスな関数の集まりとなるため,マイクロサービスと組み合わせることが多くなる.

2. Docker によるコンテナ化

Docker を用いたコンテナ化では,Dockerfile を用いて OS やライブラリ,環境変数をパッケージング出来るため,移植性が高い.これにより,既存のサーバレスサービス (Cloud Functions や AWS Lambda) には無い,任意のプログラミング言語,フレームワーク,ライブラリを使用できるという大きなメリットがある.

3. 既存の GCP サービスとの連携

サービスを構築する際には Cloud Build,構築後には Monitoring,Logging,Error Reporting などにより,サービスを自動化したり,メンテナンスが容易になったりと効能が大きい.

4. GKE との連携

Cloud Run の発表と同時に,Cloud Run on GKE も発表された.本記事では詳しく述べないが,Cloud Run に更なる拡張を提供している.小規模にサービスを展開する場合は必要ないと思うが,今後試す機会があるかもしれない.

他サービスとの違い

どのような状況でも優れているサービスは少ない.そのため各サービスの違いを理解し,状況に合わせて利用する必要がある.

Cloud Functions, AWS Lambda

  • サーバレスサービスという点では同じ
  • プログラミング言語による制約がある
  • 現状,他サービスとの連携が充実していることが多い

GKE, AWS ECS

  • サーバレスではない.これによる違いがほとんど.

試す

既存の Cloud Run に関する記事の多くは,公式チュートリアルをなぞるものがほとんどだった. そのため以下では,広く利用されている Django プロジェクトを Cloud Run でデプロイする手順を記すことにする.

詳細な情報は 公式ドキュメント 参照.

準備

  1. GCP プロジェクトを選択・または作成

  2. GCP プロジェクトに対して課金を有効にする

  3. Cloud Run API を利用可能にする

  4. Cloud SDK のインストールと初期化

  5. gcloud beta component のインストール

$ gcloud components install beta
  1. components のアップデート
$ gcloud components update
  1. Django プロジェクトを作成 (既存のプロジェクトでも良い)
$ django-admin startproject [YOUR-APP-NAME]

ビルド・デプロイ

  1. [YOUR-APP-NAME]/requirements.txt を配置
Django==2.1.8
gunicorn==19.9.0
  1. [YOUR-APP-NAME]/Dockerfile を配置
FROM python:3.7

ENV APP_HOME /src
ENV PORT 8000

RUN mkdir $APP_HOME

WORKDIR $APP_HOME

COPY . $APP_HOME/

RUN pip install -r requirements.txt

EXPOSE 8000

CMD gunicorn config.wsgi -b 0.0.0.0:$PORT
  1. ビルド
$ cd [YOUR-APP-NAME]
$ gcloud builds submit --tag gcr.io/[PROJECT-ID]/[IMAGE]

[PROJECT-ID]: 利用する GCP のプロジェクト ID
[IMAGE]: イメージ名.自由に決める

  1. デプロイ
$ gcloud beta run deploy [SERVICE-NAME] --image gcr.io/[PROJECT-ID]/[IMAGE] --region us-central1

[SERVICE-NAME]: サービス名.自由に決める
未認証の呼び出しを許可するか聞かれるので答える
※ベータ版でのリージョンは us-central1 のみ

→ デプロイまで完了!

環境変数

環境変数を利用する場合には,GCP のナビゲーション メニューから "Cloud Run" を選択し,サービスの名前を選択.ページ上部の "DEPLOY NEW REVISION" から設定し,デプロイする.

自動化

ここでは,GCP のサービスである Cloud Build を利用した.Cloud Build のトリガーは現在ベータ版である.

  1. [YOUR-APP-NAME]/cloudbuild.yaml を配置
# ${_PROJECT_ID} = [PROJECT-ID]
# ${_IMAGE} = [IMAGE]
# ${_SERVICE_NAME} = [SERVICE-NAME]
steps:
  # build the container image
- name: 'gcr.io/cloud-builders/docker'
  args: ['build', '-t', 'gcr.io/${_PROJECT_ID}/${_SERVICE_NAME}', '.']
  # push the container image to Container Registry
- name: 'gcr.io/cloud-builders/docker'
  args: ['push', 'gcr.io/${_PROJECT_ID}/${_SERVICE_NAME}']
  # Deploy container image to Cloud Run
- name: 'gcr.io/cloud-builders/gcloud'
  args: ['beta', 'run', 'deploy', '${_SERVICE_NAME}', '--image', 'gcr.io/${_PROJECT_ID}/${_IMAGE}', '--region', 'us-central1']
images:
  - gcr.io/${_PROJECT_ID}/${_IMAGE}
  1. Cloud Build からトリガーを作成する
    1. "トリガーを追加" を選択
    2. リポジトリ ホスティング オプションを選択
    3. リポジトリを選択
    4. トリガー設定をし,トリガーを作成
      • トリガーする条件を設定
      • "ビルド設定" で "Cloud Build 構成ファイル" にチェック
      • "代入変数" で cloudbuild.yaml${_PROJECT_ID}${_IMAGE}${_SERVICE_NAME} を設定

これで,特定のブランチに push された際などに,自動的にデプロイできる.

その他

紹介していない機能の中には,ユーザのアクセス権限を制御したり,カスタムドメインを設定したりと様々ある.

終わりに

実際にベータ版を利用してみて,デプロイまでの速さには感動します.それに加えて,普段から Docker を利用する場合にはコストほぼ無しに,多様なプログラミング言語をサーバレスサービスに利用できます.まだベータ版なので,今後拡張されていくことを考えるとワクワクします.機会があれば Cloud Run on GKE も利用してみたいと思います.また,このような最新のサービスを常に意識して今後も開発を進めていきたいと思います.
最後まで読んで頂き,ありがとうございます.

高橋碧
ENGINEER高橋碧

Entry

各種エントリーはこちらから

キャリア採用
Entry
新卒採用
Entry
短期インターン
Entry