🚀

FastAPI × GitLab × GCPで自動デプロイ(CI/CD)を構築する

2023/01/15に公開

実装内容

ローカルで作成したAPIをGitlabにプッシュ・マージされたらCI/CDが走り、自動デプロイされる。
GCPのCloud Buildを経由してCloud Runにデプロイします。

前提条件

  1. FastAPI(Python)でAPIを実装している。
  2. Gitlabを使用している。
  3. GCPに登録している。

全体の流れ

  1. Dockerfileを作成する。
  2. cloudbuild.yamlを作成する。
  3. .gitlab-ci.ymlを作成する。

1. Dockerfileを作成する

まず初めにローカル環境のルートディレクトリ直下にDockerfileを作成し、中身を記述して行きます。
今回は以下のような内容を記載しました。

Dockerfile
FROM python:3.9

COPY ./requirements.txt .

RUN pip install fastapi uvicorn

EXPOSE 8080

RUN pip install -r requirements.txt

COPY ./app /app

CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8080"]

2. cloudbuild.yamlを作成する

ルートディレクトリ直下にcloudbuild.yamlを作成します。内容は以下を記述しました。
参考記事
SERVICE_NAMEとPROJECT_IDとIMAGEはGCPにてご確認の上、ご入力ください。

cloudbuild.yaml
steps:
# Build the container image
- name: 'gcr.io/cloud-builders/docker'
 args: ['build', '-t', 'gcr.io/PROJECT_ID/IMAGE', '.']
# Push the container image to Container Registry
- name: 'gcr.io/cloud-builders/docker'
 args: ['push', 'gcr.io/PROJECT_ID/IMAGE']
# Deploy container image to Cloud Run
- name: 'gcr.io/cloud-builders/gcloud'
 entrypoint: gcloud
 args: ['run', 'deploy', 'SERVICE_NAME', '--image', 'gcr.io/PROJECT_ID/IMAGE', '--region', 'asia-northeast1']
options:
 pool:
   name: 'projects/PROJECT_ID/locations/asia-northeast1/workerPools/api-ci-cd'
images:
 - "gcr.io/PROJECT_ID/IMAGE"

3. .gitlab-ci.ymlを作成する

最後に.gitlab-ci.ymlを作成します。同じくルートディレクトリ直下でOKです。
ファイルを作成、中身を記述した後にGitlabに変数(GCP_SERVICE_KEYとGCP_PROJECT_ID)を登録します。

.gitlab-ci.yml
image: docker:latest

stages:
- deploy
deploy:
only:
  refs:
    - dev
stage: deploy
image: google/cloud-sdk
script:
  - echo $GCP_SERVICE_KEY # Google Cloud service accounts
  - cp $GCP_SERVICE_KEY gcloud-service-key.json
  - gcloud auth activate-service-account --key-file gcloud-service-key.json
  - gcloud projects list
  - gcloud config set project $GCP_PROJECT_ID
  - gcloud builds submit . --config=cloudbuild.yaml
after_script:
  - rm gcloud-service-key.json
Gitlabに変数を登録します。

$GCP_PROJECT_IDは、GCPのダッシュボードで確認できるプロジェクトIDのことです。
$GCP_SERVICE_KEYはGCPのIAMと管理>サービスアカウントの項目にてサービスアカウントを作成します。
そして作成したサービスアカウントに対するJSONキーを作成し、GitlabにJSONキーの中身をコピペします。
GCP_SERVICE_KEYの作成の参考

以上の作業が終了したら、Gitlabにプッシュ・マージします。
CI/CDが成功したら以下の画面が確認できます。

念の為、GCPのCloud Buildのビルド履歴を確認、さらにCloud Runが正常に動作しているかを確認しておきましょう。
お疲れ様でした。

Discussion