Githubアクションを使用したクラウド実行時のサーバレスAPIの配備
16353 ワード
GoogleクラウドRunはコンテナ化されたアプリケーションのために設計されたServerlessなランタイムです.
このポストでは、私たちは、CGI/CDツールとしてGithubアクションを使用して、クラウドランでGO REST APIを展開します.
グーグルクラウド terraform -私はV 1を使用しています.0.0 Docker -私は20.10.7を使用しています go - Go 1を使っています.16.4 This Repo :) Googleクラウドプロジェクトの設定
クラウドSQLインスタンスでデータベースPOIZEEE Managerを作成するには、GoogleクラウドコンソールまたはクラウドSQLプロキシ経由で直接行うことができます. Postgresユーザー用の新しいパスワードを生成し、安全な場所にコピーします(後で必要とします). dockerfileを準備する
Googleクラウドプロジェクトの設定 基本的なサービス 多段階ビルドを使用したGO REST API CI/CDパイプラインを有効にするには、Githubアクションを使用します. あなたのクラウド実行APIのためにカスタムメイドのドメインを加えてください パブリックアクセスを無効にする コードベースにいくつかの単体テストを追加する あなたが無制限のベースのアーキテクチャを開始しているか、長期的にKubernetesを考えているならば、中間のステップでありえます(両方の解決は容器ベースです). GitHubアクションは強いコミュニティベースのアクションを持つ堅牢なCI/CDツールです Golangを使用すると、静的コンパイルを使用して、最終製品のフットプリントを減らすことができます. Connecting from Cloud Run to Cloud SQL google-github-actions Tiny Container Images ConfiguringServerless VPC Access
このポストでは、私たちは、CGI/CDツールとしてGithubアクションを使用して、クラウドランでGO REST APIを展開します.
要件
Googleクラウドプロジェクトの設定
次の手順では、Get Run EnabledおよびCloud SQLデータベースインスタンスを準備してGCPプロジェクトを設定します.
PROJECT_NAME="mvillarreal-demo-platform"
# Create GCP project(You must enable a billing account in your project)
gcloud projects create $PROJECT_NAME
# Set project as current running project
gcloud config set project $PROJECT_NAME
# View the current project
gcloud config get-value project
# Enable cloud Run api
gcloud services enable run.googleapis.com
# Enable resource manager api
gcloud services enable cloudresourcemanager.googleapis.com
# Enable vpc access api
gcloud services enable vpcaccess.googleapis.com
# Enable compute engine(for serverless vpc access)
gcloud services enable compute.googleapis.com
# Enable container Registry
gcloud services enable containerregistry.googleapis.com
# Enable Cloud SQL services
gcloud services enable sqladmin.googleapis.com
# Enable networking services
gcloud services enable servicenetworking.googleapis.com
# Service account for Github actions
gcloud iam service-accounts create mvillarrealb-gha-saccount \
--description "Main service account for github actions" \
--display-name "mvillarreal-gha-saccount"
# Assign editor role for service account(for terraform)
gcloud projects add-iam-policy-binding $PROJECT_NAME \
--member serviceAccount:mvillarrealb-gha-saccount@$PROJECT_NAME.iam.gserviceaccount.com \
--role roles/editor
# Adding networking admin permission
gcloud projects add-iam-policy-binding $PROJECT_NAME \
--member serviceAccount:mvillarrealb-gha-saccount@$PROJECT_NAME.iam.gserviceaccount.com \
--role roles/servicenetworking.networksAdmin
# Export service account key for terraform(keep this in a safe place)
gcloud iam service-accounts keys create $(pwd)/terraform/service-account-key.json \
--iam-account mvillarrealb-gha-saccount@$PROJECT_NAME.iam.gserviceaccount.com
セットアップ地形
私たちのクラウド・ラン・サービスはデータベースを使用して、プライベートネットワークの中に配備されます.
# Initialize terraform dependencies
cd terraform && terraform init
# Preview terraform plan
terraform plan
# Apply Terraform(it will take about 10 minutes, cloud sql instance take some time)
terraform apply
ポスト地形タスク
インストール後に追加の手順が必要です.
PROJECT_NAME="mvillarreal-demo-platform"
# Create GCP project(You must enable a billing account in your project)
gcloud projects create $PROJECT_NAME
# Set project as current running project
gcloud config set project $PROJECT_NAME
# View the current project
gcloud config get-value project
# Enable cloud Run api
gcloud services enable run.googleapis.com
# Enable resource manager api
gcloud services enable cloudresourcemanager.googleapis.com
# Enable vpc access api
gcloud services enable vpcaccess.googleapis.com
# Enable compute engine(for serverless vpc access)
gcloud services enable compute.googleapis.com
# Enable container Registry
gcloud services enable containerregistry.googleapis.com
# Enable Cloud SQL services
gcloud services enable sqladmin.googleapis.com
# Enable networking services
gcloud services enable servicenetworking.googleapis.com
# Service account for Github actions
gcloud iam service-accounts create mvillarrealb-gha-saccount \
--description "Main service account for github actions" \
--display-name "mvillarreal-gha-saccount"
# Assign editor role for service account(for terraform)
gcloud projects add-iam-policy-binding $PROJECT_NAME \
--member serviceAccount:mvillarrealb-gha-saccount@$PROJECT_NAME.iam.gserviceaccount.com \
--role roles/editor
# Adding networking admin permission
gcloud projects add-iam-policy-binding $PROJECT_NAME \
--member serviceAccount:mvillarrealb-gha-saccount@$PROJECT_NAME.iam.gserviceaccount.com \
--role roles/servicenetworking.networksAdmin
# Export service account key for terraform(keep this in a safe place)
gcloud iam service-accounts keys create $(pwd)/terraform/service-account-key.json \
--iam-account mvillarrealb-gha-saccount@$PROJECT_NAME.iam.gserviceaccount.com
私たちのクラウド・ラン・サービスはデータベースを使用して、プライベートネットワークの中に配備されます.
# Initialize terraform dependencies
cd terraform && terraform init
# Preview terraform plan
terraform plan
# Apply Terraform(it will take about 10 minutes, cloud sql instance take some time)
terraform apply
ポスト地形タスク
インストール後に追加の手順が必要です.
dockerfileを準備する
我々のAPIのコンテナ化されたバージョンを作成するために、我々はDocker Multistage Buildを使用して、Go Static編集を利用して、軽量イメージを作成します.
#Build step
FROM golang:1.15 as builder
RUN mkdir -p /poi-api/api
WORKDIR /poi-api
ADD api ./api
COPY go.mod go.sum main.go ./
#static compilation options for go
RUN go build -ldflags "-linkmode external -extldflags -static" -o main .
#Run step
#Scratch image is an empty image to add our binary, so the image will be as small as possible
FROM scratch
#Environments for dataase connection
ENV DATABASE_HOST="127.0.0.1" \
DATABASE_PORT="5432" \
DATABASE_USERNAME="postgres" \
DATABASE_PASSWORD="password"
#Copy binary from builder
COPY --from=builder /poi-api/main ./main
CMD ["./main"]
Githubアクションでのクラウドランの配備
最後に、クラウドランでAPIを展開するには、github actionを使用してパイプラインを作成します.
name: poi-api
on:
push:
branches:
- master
env:
REGION: us-east1 # Cloud Run zone
PROJECT_ID: mvillarreal-demo-platform # GCP project
BASE_IMAGE: gcr.io/mvillarreal-demo-platform/poi-api #Container registry entry for the api
DATABASE_INSTANCE: mvillarreal-pg-sql # Cloud sql instance name
SERVICE_NAME: poi-api #Cloud run service name
DATABASE_IP: 10.85.0.3 # My database private IP address
jobs:
build: # Definition for Build Job
deploy: # Definition for deploy Job
test: # Definition for Test Job
さて、それぞれのジョブを定義しなければなりません.
ビルドジョブ
ビルドステージでは、私たちのDockerFileをビルドし、GCRのイメージを作成する
runs-on: ubuntu-latest
steps:
- name: Setup Project # Setup
id: checkout
uses: actions/checkout@master
- name: Login to GCR # Login to GCP
uses: docker/login-action@v1
with:
registry: gcr.io
username: _json_key
password: ${{ secrets.GCR_JSON_KEY }}
- name: Build & Publish Image # Use the dockerfile to publish image
uses: docker/build-push-action@v2
id: build
with:
context: .
push: true
tags: ${{ env.BASE_IMAGE }}:${{ github.sha }}
ジョブの配備
展開段階では、配備されたCloudrunアクションを使用して、成功したクラウドランAPIを作成します
runs-on: ubuntu-latest
needs: [build]
steps:
- name: Deploy to Cloud Run
id: deploy
uses: google-github-actions/deploy-cloudrun@main
with:
region: ${{ env.REGION }}
service: ${{ env.SERVICE_NAME }}
image: ${{ env.BASE_IMAGE }}:${{ github.sha }}
credentials: ${{ secrets.GCP_SA_KEY }}
env_vars: "DATABASE_HOST=${{ env.DATABASE_IP }},DATABASE_USERNAME=${{ secrets.DATABASE_USERNAME }},DATABASE_PASSWORD=${{ secrets.DATABASE_PASSWORD }}"
flags: "--allow-unauthenticated --vpc-connector vpc-conn --add-cloudsql-instances '${{ env.PROJECT_ID }}:${{env.REGION}}:${{env.DATABASE_INSTANCE}}'"
ここで追加した設定を詳しく見てみましょう.
羨望する
環境変数は、EV = value、env 2 = value 2という形式で、クラウドランアプリケーションに設定されています.
変数
説明
ホスト名
データベースホスト、この場合、ENVセクションで指定されたプライベートIP
ユーザ名
私たちのrepoの秘密にロードされたデータベースのユーザー名
パスワード
データベースのパスワードを我々のrepoの秘密にロード
フラグ
APIを構成するために使用されるクラウドラン固有の設定
設定
説明
--認証を許可する
認証されていないユーザからのリクエストを許可する
-- VPCコネクタ
Serverless VPCコネクタVPC CONTを指定します.
-- CloudSQLインスタンスのenvを追加するプロジェクト名: env領域: envデータベースインスタンス
クラウドSQLインスタンスのAPIへのリンク
テストジョブ
最後に、少なくとも、我々は配備されたサービスをテストするためにPostman Collectionを走らせます
runs-on: ubuntu-latest
needs: [build, deploy]
steps:
- name: Generate Variable File
run: |
echo {\"BASE_URL\": \"{{ needs.deploy.outputs.url }}\"} > variables.json
- name: Run e2e Test
uses: matt-ball/newman-action@master
id: test
with:
collection: poi-e2e.postman_collection.json
environment: variables.json
変更を押す前に、設定の秘密を設定しなければなりません.
我々が加えた秘密は、以下の通りです:
秘密
説明
ユーザ名
クラウドデータベース
パスワード
クラウドSQLデータベースのパスワード
グッチョンサニーキー
ベース64の符号化サービスアカウントキー
グロッツェ
フォーマットサービスアカウントキー
マスターブランチにプッシュした後、ジョブをクラウドランに展開します.
インストール後の手順
Geocodingのエンドポイントとリファレンスを使用したい場合は、gcpでSQLファイルを読み込むことができます.
# Create a bucket to load initial data
gsutil mb gs://h3-indexes
# Upload files
gsutil cp $(pwd)/data/*.sql gs://h3-indexes
# Load data(Remember to add ACL permissions to the h3-indexes directory)
gcloud sql instances import mvillarreal-pg-sql gs://h3-indexes/PE-Lima.sql \
--database poi_manager
今まで何をしたか
#Build step
FROM golang:1.15 as builder
RUN mkdir -p /poi-api/api
WORKDIR /poi-api
ADD api ./api
COPY go.mod go.sum main.go ./
#static compilation options for go
RUN go build -ldflags "-linkmode external -extldflags -static" -o main .
#Run step
#Scratch image is an empty image to add our binary, so the image will be as small as possible
FROM scratch
#Environments for dataase connection
ENV DATABASE_HOST="127.0.0.1" \
DATABASE_PORT="5432" \
DATABASE_USERNAME="postgres" \
DATABASE_PASSWORD="password"
#Copy binary from builder
COPY --from=builder /poi-api/main ./main
CMD ["./main"]
最後に、クラウドランでAPIを展開するには、github actionを使用してパイプラインを作成します.
name: poi-api
on:
push:
branches:
- master
env:
REGION: us-east1 # Cloud Run zone
PROJECT_ID: mvillarreal-demo-platform # GCP project
BASE_IMAGE: gcr.io/mvillarreal-demo-platform/poi-api #Container registry entry for the api
DATABASE_INSTANCE: mvillarreal-pg-sql # Cloud sql instance name
SERVICE_NAME: poi-api #Cloud run service name
DATABASE_IP: 10.85.0.3 # My database private IP address
jobs:
build: # Definition for Build Job
deploy: # Definition for deploy Job
test: # Definition for Test Job
さて、それぞれのジョブを定義しなければなりません.ビルドジョブ
ビルドステージでは、私たちのDockerFileをビルドし、GCRのイメージを作成する
runs-on: ubuntu-latest
steps:
- name: Setup Project # Setup
id: checkout
uses: actions/checkout@master
- name: Login to GCR # Login to GCP
uses: docker/login-action@v1
with:
registry: gcr.io
username: _json_key
password: ${{ secrets.GCR_JSON_KEY }}
- name: Build & Publish Image # Use the dockerfile to publish image
uses: docker/build-push-action@v2
id: build
with:
context: .
push: true
tags: ${{ env.BASE_IMAGE }}:${{ github.sha }}
ジョブの配備
展開段階では、配備されたCloudrunアクションを使用して、成功したクラウドランAPIを作成します
runs-on: ubuntu-latest
needs: [build]
steps:
- name: Deploy to Cloud Run
id: deploy
uses: google-github-actions/deploy-cloudrun@main
with:
region: ${{ env.REGION }}
service: ${{ env.SERVICE_NAME }}
image: ${{ env.BASE_IMAGE }}:${{ github.sha }}
credentials: ${{ secrets.GCP_SA_KEY }}
env_vars: "DATABASE_HOST=${{ env.DATABASE_IP }},DATABASE_USERNAME=${{ secrets.DATABASE_USERNAME }},DATABASE_PASSWORD=${{ secrets.DATABASE_PASSWORD }}"
flags: "--allow-unauthenticated --vpc-connector vpc-conn --add-cloudsql-instances '${{ env.PROJECT_ID }}:${{env.REGION}}:${{env.DATABASE_INSTANCE}}'"
ここで追加した設定を詳しく見てみましょう.羨望する
環境変数は、EV = value、env 2 = value 2という形式で、クラウドランアプリケーションに設定されています.
変数
説明
ホスト名
データベースホスト、この場合、ENVセクションで指定されたプライベートIP
ユーザ名
私たちのrepoの秘密にロードされたデータベースのユーザー名
パスワード
データベースのパスワードを我々のrepoの秘密にロード
フラグ
APIを構成するために使用されるクラウドラン固有の設定
設定
説明
--認証を許可する
認証されていないユーザからのリクエストを許可する
-- VPCコネクタ
Serverless VPCコネクタVPC CONTを指定します.
-- CloudSQLインスタンスのenvを追加するプロジェクト名: env領域: envデータベースインスタンス
クラウドSQLインスタンスのAPIへのリンク
テストジョブ
最後に、少なくとも、我々は配備されたサービスをテストするためにPostman Collectionを走らせます
runs-on: ubuntu-latest
needs: [build, deploy]
steps:
- name: Generate Variable File
run: |
echo {\"BASE_URL\": \"{{ needs.deploy.outputs.url }}\"} > variables.json
- name: Run e2e Test
uses: matt-ball/newman-action@master
id: test
with:
collection: poi-e2e.postman_collection.json
environment: variables.json
変更を押す前に、設定の秘密を設定しなければなりません.我々が加えた秘密は、以下の通りです:
秘密
説明
ユーザ名
クラウドデータベース
パスワード
クラウドSQLデータベースのパスワード
グッチョンサニーキー
ベース64の符号化サービスアカウントキー
グロッツェ
フォーマットサービスアカウントキー
マスターブランチにプッシュした後、ジョブをクラウドランに展開します.
インストール後の手順
Geocodingのエンドポイントとリファレンスを使用したい場合は、gcpでSQLファイルを読み込むことができます.
# Create a bucket to load initial data
gsutil mb gs://h3-indexes
# Upload files
gsutil cp $(pwd)/data/*.sql gs://h3-indexes
# Load data(Remember to add ACL permissions to the h3-indexes directory)
gcloud sql instances import mvillarreal-pg-sql gs://h3-indexes/PE-Lima.sql \
--database poi_manager
今まで何をしたか
# Create a bucket to load initial data
gsutil mb gs://h3-indexes
# Upload files
gsutil cp $(pwd)/data/*.sql gs://h3-indexes
# Load data(Remember to add ACL permissions to the h3-indexes directory)
gcloud sql instances import mvillarreal-pg-sql gs://h3-indexes/PE-Lima.sql \
--database poi_manager
何をすべきか
収縮
参考文献
Reference
この問題について(Githubアクションを使用したクラウド実行時のサーバレスAPIの配備), 我々は、より多くの情報をここで見つけました https://dev.to/mvillarrealb/deploy-a-serverless-api-on-cloud-run-with-github-actions-3ejoテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol