インターン生の高橋です.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 でデプロイする手順を記すことにする.
詳細な情報は 公式ドキュメント 参照.
準備
-
gcloud beta component のインストール
$ gcloud components install beta
- components のアップデート
$ gcloud components update
- Django プロジェクトを作成 (既存のプロジェクトでも良い)
$ django-admin startproject [YOUR-APP-NAME]
ビルド・デプロイ
[YOUR-APP-NAME]/
にrequirements.txt
を配置
Django==2.1.8
gunicorn==19.9.0
[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
- ビルド
$ cd [YOUR-APP-NAME]
$ gcloud builds submit --tag gcr.io/[PROJECT-ID]/[IMAGE]
[PROJECT-ID]
: 利用する GCP のプロジェクト ID
[IMAGE]
: イメージ名.自由に決める
- デプロイ
$ 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 のトリガーは現在ベータ版である.
[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}
- Cloud Build からトリガーを作成する
- "トリガーを追加" を選択
- リポジトリ ホスティング オプションを選択
- リポジトリを選択
- トリガー設定をし,トリガーを作成
- トリガーする条件を設定
- "ビルド設定" で "Cloud Build 構成ファイル" にチェック
- "代入変数" で
cloudbuild.yaml
の${_PROJECT_ID}
,${_IMAGE}
,${_SERVICE_NAME}
を設定
これで,特定のブランチに push された際などに,自動的にデプロイできる.
その他
紹介していない機能の中には,ユーザのアクセス権限を制御したり,カスタムドメインを設定したりと様々ある.
終わりに
実際にベータ版を利用してみて,デプロイまでの速さには感動します.それに加えて,普段から Docker を利用する場合にはコストほぼ無しに,多様なプログラミング言語をサーバレスサービスに利用できます.まだベータ版なので,今後拡張されていくことを考えるとワクワクします.機会があれば Cloud Run on GKE も利用してみたいと思います.また,このような最新のサービスを常に意識して今後も開発を進めていきたいと思います.
最後まで読んで頂き,ありがとうございます.