Githubアクションを使用したクラウド実行時のサーバレスAPIの配備


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クラウドプロジェクトの設定


    次の手順では、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
    

    ポスト地形タスク


    インストール後に追加の手順が必要です.
  • クラウドSQLインスタンスでデータベースPOIZEEE Managerを作成するには、GoogleクラウドコンソールまたはクラウドSQLプロキシ経由で直接行うことができます.
  • Postgresユーザー用の新しいパスワードを生成し、安全な場所にコピーします(後で必要とします).
  • 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
    

    今まで何をしたか

  • 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