将golang应用程序部署到Cloud Run

大纲

最近,我负责的服务已从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镜像

由于在Cloud Run中进行部署是基于Docker镜像的,所以需要准备好Docker镜像和源代码。这次我们将使用我创建的Golang应用程序的镜像。因为我使用了Makefile等工具,可能会让人感到困惑…不过,由于GCP已经为Golang提供了示例镜像,我认为也可以使用那个。

请确认能够在本地构建成功所创建的Dockerfile文件。

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上构建映像

下一步是在GCP的Cloud Build上构建docker镜像。
虽然也可以将在本地构建的镜像推送到Artifact Registry,但是由于管理命令很麻烦,所以这次我们将使用cloudbuild.yaml。

请准备一个名为cloudbuild.yaml的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的用户界面上确认Cloud Build已启动。
您应该能够在Cloud Build上确认可以构建映像。

将图像推送到Artifact Registry。

在前面的工作中,我们已经完成了构建图像的步骤。
但是要部署到Cloud Run,需要从Artifact Registry中获取图像。
因此,我们需要添加从Cloud Build推送图像到Artifact Registry的描述。

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上拉取镜像并部署。

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 的用户界面,应该会看到类似于这张图片的显示。
你可以通过调用这个URL上的API来使用应用程序的功能。

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

填补了不足之处

通过选择右上方的持续部署,可以与GitHub等进行协作,将差异部署到Cloud Run上。
部署时的配置图如下所示。

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

总结

这次我们总结了如何将应用简单地部署到Cloud Run。

服务器本身可能会与负载均衡器配合使用,可以与名为Cloud SQL的数据库服务配合使用,还可以与Secret Manager进行环境变量加密配合等。
将创建的应用程序在服务器上运行,并通过CI/CD等方式进行持续运营。服务器具备自动扩展等功能,并能够耐受最低限度的使用,这一点相当容易实现。
Google Cloud的文档也非常易懂并且经过完善,我希望您能够尝试一次。

最后

在Toreta中,我们正在招募一起开发的伙伴。
如果你有兴趣,请务必来参加非正式面谈!

 

广告
将在 10 秒后关闭
bannerAds