こんにちは。サーバーサイドエンジニアの平井です。
今年もあと1ヶ月ですね。リモートワーク中心の生活スタイルに変わり、より一層時が過ぎるのを速く感じています。
もう年末ということで、弊社では今年もAdvent Calendarを開催します!!
題して、Enigmo Advent Calendar 2020です!!
記念すべき1日目は、私、平井の「Cloud Run 使ってみた」になります。 プロジェクトで簡単なAPIをCloud Run(フルマネージド)上に実装したので、それについて話したいと思います。
構成
会員毎にパーソナライズされたコンテンツ情報を返すAPIをCloud Runを使って実装しました。 とてもシンプルですが、構成図は以下のようになります。
Cloud Run上にRuby on RailsでAPIを実装し、Datastoreに格納されている情報を取得します。 Datastoreには、会員毎のコンテンツ情報が格納されていて、この情報はBigquery上に格納されている機械学習のデータを元に生成されています。 そして、クライアントからAPIにアクセスして情報を表示させています。
Cloud Run(フルマネージド)について
Knativeを基盤として構築されたGCPのサーバーレスサービスの一つで、コンテナをサーバーレスで実行してくれます。 スケーリングなども自動で行われるため、開発者はアプリケーションの開発に専念することができます。
Cloud Runには二種類あり、Googleが管理するKubernetes環境で動作するCloud Runと自身の管理するGKEで動作するCloud Run for Anthosがあります。 今回は、より簡単に利用できるCloud Runを使いました。
準備
Dockerfile
Cloud Run上で動かすコンテナを用意する必要があるので、 Dockerfileを用意します。
cloudbuild yaml
Cloud Runへのデプロイ関連のタスクはcloudbuild.yamlで管理しました。 公式ドキュメントにも記載されているやり方と同じです。 ファイルの中身は、コンテナイメージのbuildとCloud Runへのデプロイなどのタスクが記載されていて、 実際の内容とは違いますが、以下のような感じになります。
steps: # コンテナイメージのビルド - name: 'gcr.io/cloud-builders/docker' args: ['build', '-t', 'gcr.io/PROJECT_ID/IMAGE', '.'] # コンテナレジストリーにpush - name: 'gcr.io/cloud-builders/docker' args: ['push', 'gcr.io/PROJECT_ID/IMAGE'] # コンテナレジストリー上のイメージを使って、Cloud Runにコンテナをデプロイ。 - name: 'gcr.io/google.com/cloudsdktool/cloud-sdk' entrypoint: gcloud args: ['run', 'deploy', 'SERVICE-NAME', '--image', 'gcr.io/PROJECT_ID/IMAGE', '--region', 'REGION', '--platform', 'managed'] images: - gcr.io/PROJECT_ID/IMAGE
cloudbuild.yamlを作成したディレクトリによりますが、
gcloud builds submit
を実行するとファイルに書かれたタスクが実行され、Cloud Run上にサービスがデプロイされます。
基本的には、Cloud Run上でコンテナを起動するために必要な準備は以上になります。
その他
ドメイン
Cloud Runでサービスを作成すると自動でデフォルトのドメインが発行されます。 ただ、実際のサービスで利用する際にはカスタムのドメインを設定したくなると思います。 Cloud Runにはカスタムドメインのマッピング機能が実装されているので、使いたいドメインをマッピングすることができます。 実際にカスタムドメインを設定してみましたが、ドキュメントを読んで簡単に設定することができました。
他GCPサービスとの連携
APIのデータ取得先として、Datastoreを使用しています。 今回は、Cloud Runのサービス とDatastoreのデータが同じプロジェクト上で管理されていたので、二つのサービスが連携する際に、認証の設定は必要ありませんでした。
感想
実際にCloud Runを使ってみた感想は以下です。
- インフラ関連を意識せず開発できて、アプリケーションの実装に集中できた。
- デフォルトのメトリクスが充実していた。
- リクエスト数、コンテナのメモリ使用率
- ログも充実していた。
- キーワード検索、 重要度によるフィルタリング
- 他GCPサービスとの連携が楽だった。
最後に
今回のプロジェクトの方針で、なるべく早くユーザーの行動をみたいという背景もあり、Cloud Run上にAPIだけを実装するという最低限の選択をしました。 今後の長期運用を考えて、機械学習のデータからAPI用のデータを生成する部分もCloud Run上に乗っけていこうと考えています。
最後まで読んで頂き誠にありがとうございました。
明日の記事の担当は、UXDグループの本田さんです!!
株式会社エニグモ 正社員の求人一覧