将golang应用程序部署到Cloud Run
大纲
最近,我负责的服务已从AWS迁移到GCP进行了迁移工作。
最初它是在AWS的EKS上运行的,但现在我们决定将服务迁移到GCP的Cloud Run上。
由于之前没有使用过Cloud Run,我将总结学习的内容。
本文旨在根据以下构成总结。
通过从本地环境执行命令,旨在实现简单地运行Cloud Run。
“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来使用应用程序的功能。
填补了不足之处
通过选择右上方的持续部署,可以与GitHub等进行协作,将差异部署到Cloud Run上。
部署时的配置图如下所示。
总结
这次我们总结了如何将应用简单地部署到Cloud Run。
服务器本身可能会与负载均衡器配合使用,可以与名为Cloud SQL的数据库服务配合使用,还可以与Secret Manager进行环境变量加密配合等。
将创建的应用程序在服务器上运行,并通过CI/CD等方式进行持续运营。服务器具备自动扩展等功能,并能够耐受最低限度的使用,这一点相当容易实现。
Google Cloud的文档也非常易懂并且经过完善,我希望您能够尝试一次。
最后
在Toreta中,我们正在招募一起开发的伙伴。
如果你有兴趣,请务必来参加非正式面谈!