LoginSignup
2
1

More than 1 year has passed since last update.

Cloud Runにgolangアプリケーションをデプロイ

Last updated at Posted at 2022-11-20

概要

先日私が担当しているサービスをAWSからGCPに移行する作業を行いました。
元々はAWSのEKSで動いていたのですが、この度GCPのCloud Runにサービスを移行することとなりました。
その際Cloud Runに触ったことがなかったためキャッチアップした内容をまとめていきます。

この記事では下記構成を目標にまとめていきます。
ローカル環境からコマンドを叩くことで、Cloud Runをとりあえず動かすことができる、を目指します。

スクリーンショット 2022-11-20 15.48.58.png

Cloud Run とは

Webアプリケーションをコンテナとして構築できるサーバレスサービスです
サーバーレスであるためサーバー管理の手間が少なく、負荷増大などに対する対策も元々の機能として持っていることが大きなメリットだと感じています。

下記のような機能を備えています。

  • コンテナイメージを使ったデプロイによる実行環境の流用
  • コンテナのオートスケーリング(0~1000コンテナインスタンス)
  • トラフィックのコントロール(内部トラフィックのみを許可、ロードバランサからのトラフィックのみを許可など)
  • Cloud Buildを用いた自動デプロイ
  • 従量課金制: 使用したリソース(CPU、メモリ)に対して課金

docker imageの作成

Cloud Runではdockerイメージを元にデプロイを行うため、dockerイメージとソースコードを用意しておくことが前提となります。
今回は私が作成したgolangアプリケーションのイメージを使います。
makefileなどを使用しているのでわかりづらいかもしれません・・
GCPがgolangのサンプルのイメージを用意してくれているのでこちらを使用するでもいいと思います。

作成したDockerfileがローカルでbuildできることを確認してください。

FROM golang:1.19-buster AS build

WORKDIR /go/src/github.com/qiita/myapp

COPY . /go/src/github.com/qiita/myapp

RUN apt-get update && apt-get install -y unzip clang-format

RUN set -e && make myapp.build-for-docker

FROM alpine:3.16.2

WORKDIR /app

RUN apk --update add --no-cache ca-certificates dumb-init

COPY --from=build /go/src/github.com/toreta/myapp/bin/myapp /app

EXPOSE 8080

ENTRYPOINT ["/usr/bin/dumb-init", "--"]
CMD ["./myapp"]

Cloud Build上でイメージをbuildする

次にGCPのCloud Build上でdockerイメージをbuildします。
ローカルでbuildしたイメージをArtifact Registryにpushするということも可能なのですが、コマンドを管理していくのが面倒なので今回はcloudbuild.yamlを使います。

下記のようなyamlをcloudbuild.yamlというファイル名で用意してください。
この時、GCPのArtifact Registryで test-golang-repo というリポジトリを作成しておいてください。
${PROJECT_ID}にはご自身のGCPのプロジェクトIDを入れてください。

steps:
  - name: gcr.io/cloud-builders/docker
    args:
      - build
      - --no-cache
      - -t
      - asia-northeast1-docker.pkg.dev/${PROJECT_ID}/test-golang-repo/api:latest
      - .
      - -f
      - Dockerfile
    id: build the container image

その後、下記コマンドをローカルで実行してください
cloudbuild.yamlの設定値を元に、Cloud Buildを起動できます。

gcloud builds submit --config=cloudbuild.yaml 

このコマンドを実行すると、GCPのUIでCloud Buildが起動していることを確認できると思います。
Cloud Buildでイメージのbuildができることを確認できるはずです。

イメージをArtifact Registryにpushする

上記までの作業で、イメージをbuildするところまでできました。
ですがCloud Runがデプロイするには、Artifact Registryからイメージをpullする必要があります。
なのでCloud BuildからArtifact Registryにイメージをpushする記述を追加します。

steps:
  - name: gcr.io/cloud-builders/docker
    args:
      - build
      - --no-cache
      - -t
      - asia-northeast1-docker.pkg.dev/${PROJECT_ID}/test-golang-repo/api:latest
      - .
      - -f
      - Dockerfile
    id: build the container image

  - name: gcr.io/cloud-builders/docker
    args:
      - push
      - asia-northeast1-docker.pkg.dev/${PROJECT_ID}/test-golang-repo/api:latest
    id: push the container image to Artifact Registry

Cloud Runにデプロイする

これでArtifact Registryにイメージが格納されました。
最後にCloud Runでイメージをpullしてデプロイします。

steps:
  - name: gcr.io/cloud-builders/docker
    args:
      - build
      - --no-cache
      - -t
      - asia-northeast1-docker.pkg.dev/${PROJECT_ID}/test-golang-repo/api:latest
      - .
      - -f
      - Dockerfile
    id: build the container image

  - name: gcr.io/cloud-builders/docker
    args:
      - push
      - asia-northeast1-docker.pkg.dev/${PROJECT_ID}/test-golang-repo/api:latest
    id: push the container image to Artifact Registry

  - name: gcr.io/google.com/cloudsdktool/cloud-sdk
    entrypoint: gcloud
    args:
      - run
      - deploy
      - api
      - --allow-unauthenticated
      - --image
      - asia-northeast1-docker.pkg.dev/${PROJECT_ID}/test-golang-repo/api:latest
      - --region
      - asia-northeast1
      - --platform
      - managed

もしアプリケーションの起動に環境変数が必要な場合は --set-env-vars を使用すればCloud Runの環境変数に設定できます。

  - name: gcr.io/google.com/cloudsdktool/cloud-sdk
    entrypoint: gcloud
    args:
      - run
      - deploy
      - api
      - --allow-unauthenticated
      - --image
      - asia-northeast1-docker.pkg.dev/${PROJECT_ID}/test-golang-repo/api:latest
      - --region
      - asia-northeast1
      - --platform
      - managed
      - --set-env-vars
      - DB_HOST=XXXXXXXX

Cloud RunのAPIを叩く

Cloud RunのUIを見にいくと、画像のような表示になっているはずです。
このURLに対してAPIを叩くことで、アプリケーションの機能を使うことができます。

スクリーンショット 2022-11-20 16.54.27.png

補足

画像右上の継続的デプロイを選択することで、githubなどと連携してCloud Runに差分をデプロイすることが可能です。
その際の構成図は下記のようになります。

スクリーンショット 2022-11-20 17.09.09.png

まとめ

今回はCloud Runにごく簡単にデプロイするまでをまとめました

サーバーなので当然かもしれませんが、ロードバランサと連携することができたり、Cloud SQLというDBサービスと連携させたり、環境変数では暗号化のためにSecret Managerと連携したりすることができます。
作ったアプリケーションをサーバーで動かしCI/CDなどで継続運用する、サーバーはオートスケーリングなどの機能を備えていて最低限の使用に耐えうるというところを達成するまでがかなり簡単だなと感じました。
GCPのドキュメントもかなりわかりやすく整備されているので一度試していただければと思います。

さいごに

トレタでは一緒に開発する仲間を募集しています。

興味がある方は是非カジュアル面談へお越しください!

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1