⚙️
GitHub Actionsを利用してGCPのCloud Storageへの自動デプロイを実現する方法
🎯目的
- Cloud Storageのリソースデータを自動デプロイできるようにしたい。
- Cloud Storage, GitHub Actionsも非公開とする。
- 最初の導入メモとしても利用。
前提条件
まずは以下設定を行います。
-
Google Cloud SDKのインストールと設定
以下ドキュメントを参考にしてください。
- GCPプロジェクトのセットアップ
まだ一度もGCPを触れていない方はこちらを参考にしてください。
🗝️GCPへの認証情報(JSONキー)をGitHub Secretsに保存
GCPでサービスアカウントを作成し、キーを生成します。
- 左のナビゲーションペインから「IAM & 管理」→「サービスアカウント」を選択します。
- 「サービスアカウントを作成」ボタンをクリックします。
- 必要な情報(サービスアカウント名、説明等)を入力し、「作成」をクリックします。
- 役割を付与して、サービスアカウントに必要な権限を設定します。
- Storage オブジェクト閲覧者
- Storage オブジェクト作成者
- ストレージ管理者
- 「キー」タブをクリックして、「鍵を追加」→「JSON」を選択し、キーを生成してダウンロードします。このJSONファイルは後ほどGitHub Secretsに追加するものとなります。
🔑GitHub Secretsにサービスアカウントキーを追加
- 保存したJSONキーをテキストエディタで開き、その内容をコピーします。
- GitHubリポジトリに移動し、「Settings」タブをクリックします。
- 左のサイドバーから「Secrets and variables」を選択し、「Actions」へ移動します。
- 「Secrets」タブを選択中に「New repository secret」ボタンをクリックします。
- 「Name」フィールドに秘密情報の名前を入力します(例: GCP_KEY)。
そして、「Value」フィールドに、先ほどコピーしたサービスアカウントキーのJSON文字列をペーストします。 - 「Add secret」をクリックして保存します。
🔑その他シークレットをGitHub Secretsに追加
- BUCKET_REGION:デプロイ先バケットのリージョン
- GCP_KEY_BASE64:サービスアカウントキーをbase64で変換したもの
変換コマンドは以下を利用します。
base64 -w0 < [サービスアカウントキー].json
- GCS_BUCKET_PATH・・・Cloud Storageのバケット名(gs://バケット名)
- PROJECT_ID ・・・プロジェクトID
- STORAGE_CLASS・・・追加するバケットのストレージクラス(standard/nearline/coldline/archive)
📂リポジトリのフォルダ構成
# 📂GitHubリポジトリのフォルダ構成
- .github
- workflows
- deploy-storage.yml
- data
- json
- sample.json
- README.md
「.github/workflows/deploy-storage.yml」は
name: Deploy to Google Cloud Storage
on:
push:
paths:
- 'data/json/**'
branches:
- main
workflow_dispatch:
env:
# 環境変数
JSON_DIR: data/json/
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Setup GCP
uses: google-github-actions/auth@v1
with:
credentials_json: ${{ secrets.GCP_KEY }}
- name: Decode GCP Service Account Key
run: |
echo "${{ secrets.GCP_KEY_BASE64 }}" | base64 -d > temp-sa.json
- name: Authenticate with gcloud using temp-sa.json
run: |
gcloud auth activate-service-account --key-file=temp-sa.json
- name: Create GCS Bucket
run: |
if ! gsutil ls ${{ secrets.GCS_BUCKET_PATH }}; then
gsutil mb -p ${{ secrets.PROJECT_ID }} -c ${{ secrets.STORAGE_CLASS }} -l ${{ secrets.BUCKET_REGION }} -b off ${{ secrets.GCS_BUCKET_PATH }}
fi
- name: Upload JSON data to GCS
run: |
gsutil -m rsync -r -d ${{ env.JSON_DIR }} ${{ secrets.GCS_BUCKET_PATH }}/${{ env.JSON_DIR }}
- name: Post Processing
run : |
rm -f temp-sa.json
ここでは主に以下のステップを実行しています。
- Setup GCP: GCPとの認証を設定します。
- Decode GCP Service Account Key: Base64でエンコードされたサービスアカウントキーをデコードします。
- Authenticate with gcloud using temp-sa.json: デコードしたキーを使用してgcloudに認証します。
- Create GCS Bucket: Cloud Storageのバケットが存在しない場合、新しく作成します。
- Upload JSON data to GCS: ローカルのデータをCloud Storageにアップロードします。
- Post Processing: 一時ファイルを削除
以上の内容をGitHubでプルリクが通った後にGitHub Actionsが自動的に走ります。GitHub Actionsの処理に成功するとCLoud Storageが自動作成、自動更新されます。
参考URL
- バケットを作成します。
「gsutil mb」コマンドのオプションが確認できます。
最後までお読みいただき本当にありがとうございます!
Discussion