BRINK ジャパン株式会社

ブログ一覧へ

WIFでGitHub ActionsからRcloneを使ってGoogle Driveを操作する

Automation

はじめに

本記事では、GitHub ActionsとRcloneを組み合わせてGoogle Driveを操作する方法について解説します。認証方式として、Workload Identity Federation (WIF) を利用したキーレス認証を使用します。

従来はサービスアカウントキー(JSONファイル)を使用する方法が一般的でしたが、セキュリティ要件の向上やキー管理の複雑さを避けるため、WIFが利用されるようになっています。

本記事で解説する内容

  • Rcloneの基本的な使い方
  • Workload Identity Federation (WIF) の設定方法
  • GitHub Actionsワークフローでの具体的な実装例

Rcloneの概要と特徴

Rclone(アールクローン)は、クラウドストレージサービスとローカルファイルシステム間でファイルを同期、コピー、移動するためのオープンソースのコマンドラインツールです。Amazon S3、Google Cloud Storage、Google Drive、Dropbox、OneDrive、Box、FTP/SFTP、WebDAVなど、70以上の異なるクラウドストレージサービスに対応しており、統一されたインターフェースで様々なクラウドプロバイダーを操作できます。

主要な機能:

  • ファイルの同期・コピー・移動
  • 暗号化機能(アップロード時に自動暗号化)
  • 並列転送による高速処理
  • マウント機能(クラウドストレージをローカルファイルシステムとして使用)

Google Drive APIの認証設定

GitHub Actionsのような自動化環境からGoogle Driveを操作するには、Google Cloud で認証設定を行う必要があります。主な認証方法として、Workload Identity Federation (WIF) とサービスアカウントキー(JSON)の2種類があります。

  • Workload Identity Federation (WIF): キーレス認証を実現する仕組みです。永続的な認証情報(キー)を管理する必要がなく、セキュリティインシデントのリスクを低減できます。企業のセキュリティポリシーでサービスアカウントキーの作成が制限されている環境(iam.disableServiceAccountKeyCreation)では、WIFが主要な選択肢となります。
  • サービスアカウントキー (JSON): 従来から利用されている認証方法です。設定は比較的容易ですが、キーの漏洩リスクや定期的なローテーションといった管理コストが発生します。

本記事では、セキュリティと管理の観点から推奨されるWorkload Identity Federation (WIF) を利用した手順を詳しく解説します。

Workload Identity Federation (WIF) の設定

WIFの概要

WIFを利用すると、GitHub Actionsのワークフローが発行する短命のOIDCトークンを使い、Google Cloudリソースへのアクセス権を一時的に取得できます。これにより、永続的なキー(JSONファイル)を管理する必要がなくなります。

1. WIFの設定手順(gcloud CLI を利用 )

以下の手順は gcloud コマンドラインツールを使用して行います。Cloud Shellの利用が考えられます。

a. 事前準備と変数の設定

まず、必要なAPIを有効化し、各種変数を設定します。

Bash
# 変数を設定
PROJECT_ID="your-project-id" # あなたのGoogle CloudプロジェクトID
GITHUB_ORG="your-github-organization" # あなたのGitHub組織名またはユーザー名
GITHUB_REPO="your-github-repository" # あなたのGitHubリポジトリ名
SA_NAME="github-actions-rclone" # 作成するサービスアカウント名
SA_EMAIL="${SA_NAME}@${PROJECT_ID}.iam.gserviceaccount.com"
POOL_ID="github-pool" # Workload Identity プールID(任意)
PROVIDER_ID="github-provider" # Workload Identity プロバイダID(任意)

# APIを有効化
gcloud services enable \
	iam.googleapis.com \
    iamcredentials.googleapis.com \
	sts.googleapis.com \
	drive.googleapis.com \
	--project="${PROJECT_ID}"

# サービスアカウントを作成(存在しない場合)
gcloud iam service-accounts create ${SA_NAME} \
    --display-name="GitHub Actions Rclone Service Account" \
    --project=${PROJECT_ID}

b. Workload Identity プールの作成

Bash
gcloud iam workload-identity-pools create ${POOL_ID} \
    --project=${PROJECT_ID} \
    --location="global" \
    --display-name="GitHub Actions Pool"

c. GitHub OIDCプロバイダの作成

GitHub ActionsからのOIDCトークンを信頼するように設定します。attribute-conditionで、どのリポジトリからのアクセスを許可するかを厳密に指定することが可能です。

Bash
gcloud iam workload-identity-pools providers create-oidc ${PROVIDER_ID} \
    --project=${PROJECT_ID} \
    --location="global" \
    --workload-identity-pool=${POOL_ID} \
    --display-name="GitHub OIDC Provider" \
    --issuer-uri="https://token.actions.githubusercontent.com" \
    --attribute-mapping="google.subject=assertion.sub,attribute.actor=assertion.actor,attribute.repository=assertion.repository" \
    --attribute-condition="attribute.repository == '${GITHUB_ORG}/${GITHUB_REPO}'"

> セキュリティに関する考慮事項: mainブランチからの実行のみを許可するなど、さらに条件を厳しくすることも可能です。

attribute.repository == '${GITHUB_ORG}/${GITHUB_REPO}' && attribute.ref == 'refs/heads/main'

d. サービスアカウントへの権限付与

最後に、特定のGitHubリポジトリから発行されたトークンが、サービスアカウントとして動作(impersonate)できるように権限を付与します。

Bash
gcloud iam service-accounts add-iam-policy-binding ${SA_EMAIL} \
    --project=${PROJECT_ID} \
    --role="roles/iam.workloadIdentityUser" \
    --member="principalSet://iam.googleapis.com/projects/$(gcloud projects describe ${PROJECT_ID} --format='value(projectNumber)')/locations/global/workloadIdentityPools/${POOL_ID}/attribute.repository/${GITHUB_ORG}/${GITHUB_REPO}"

2. Google Drive APIの有効化と権限設定

WIFで作成したサービスアカウント(SA_EMAIL)を、操作対象のGoogle Driveフォルダまたは共有ドライブのメンバーに追加し、適切な権限(投稿者 or コンテンツ管理者)を付与してください。

Rcloneの設定と基本操作

インストール

macOSやLinux環境では、以下のコマンドで簡単にインストールできます。

Bash
# スクリプトによるインストール
curl https://rclone.org/install.sh | sudo bash

# macOS (Homebrew)
brew install rclone

Rcloneの設定とGoogle Drive連携

~/.config/rclone/rclone.conf

PLAINTEXT
[gdrive]
type = drive
scope = drive   
service_account_file = /path/to/service-account-file.json
root_folder_id = フォルダID
#   : https://drive.google.com/drive/folders/[フォルダID]
team_drive = 共有ドライブID
#   : https://drive.google.com/drive/folders/[共有ドライブID]

基本的なコマンド

Rcloneは直感的なコマンドで操作できます。

Bash
# リモートのファイル一覧を表示
rclone ls gdrive:

# ファイルをコピー(ローカル → Google Drive)
rclone copy /path/to/local/file.txt gdrive:remote/folder/

# ディレクトリを同期(ローカルをリモートに反映)
rclone sync /path/to/local/directory gdrive:backup/

# 進行状況を表示しながらコピー
rclone copy large_file.zip gdrive:uploads/ --progress

GitHub Actionsでの実装

WIFを利用する場合のワークフロー(キーレス)

Workload Identity Federation(WIF)で google-github-actions/auth@v2 を使い、ADC(アプリケーション既定の認証情報)を生成して rclone の Google Drive バックエンドに渡します。rclone v1.63+ は env_auth true(= ADC を使用)に対応しているため、サービスアカウント鍵(JSON)は不要です。rclone forum

また、サービスアカウントは「My Drive」に保存できずクォータも持ちません。共有ドライブを使い、SAをメンバー追加し、rclone リモートで team_drive=<共有ドライブID> を指定してください。  Google for Developers

1. GitHub Secretsの設定

ワークフローで使用する以下の情報を、リポジトリの Settings > Secrets and variables > Actions に登録します。

  • GCP_PROJECT_ID: Google CloudプロジェクトID
  • GCP_SA_EMAIL: WIF用に設定したサービスアカウントのメールアドレス
  • GCP_WIF_PROVIDER: 作成したWIFプロバイダのフルパス
  • DRIVE_TEAMDRIVE_ID: 共有ドライブのURLに含まれるIDを指定します。
  • DRIVE_FOLDER_ID: (任意)アップロード先のフォルダのURLに含まれるIDを指定します。

WIFプロバイダのフルパスを確認するコマンド:

Bash
gcloud iam workload-identity-pools providers describe "${PROVIDER_ID}" \
  --project="${PROJECT_ID}" \
  --location="global" \
  --workload-identity-pool="${POOL_ID}" \
  --format="value(name)"

コマンドの出力例: projects/${PROJECT_NUMBER}/locations/global/workloadIdentityPools/${POOL_ID}/providers/${PROVIDER_ID}

2. ワークフローファイル (.github/workflows/rclone-wif.yml)

YAML
name: Upload to Drive (WIF)

on: workflow_dispatch

permissions:
  contents: read
  id-token: write

jobs:
  upload:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      # WIFでADC(外部アカウント資格情報)を作成
      - name: Authenticate to Google Cloud
        id: auth
        uses: google-github-actions/auth@v2
        with:
          workload_identity_provider: ${{ secrets.GCP_WIF_PROVIDER }}
          service_account: ${{ secrets.GCP_SA_EMAIL }}
          create_credentials_file: true

      - name: Setup rclone
        uses: AnimMouse/setup-rclone@v1

      # ADCを使うDriveリモートを作成(env_auth=true)
      - name: Configure rclone (Drive via ADC on Shared Drive)
        env:
          TEAM_DRIVE_ID: ${{ secrets.DRIVE_TEAMDRIVE_ID }}
          FOLDER_ID: ${{ secrets.DRIVE_FOLDER_ID }} # 共有ドライブ内の任意フォルダID(省略可)
        run: |
          set -euo pipefail
          ARGS=(env_auth true scope drive --non-interactive)
          [ -n "${TEAM_DRIVE_ID:-}" ] && ARGS+=(team_drive "$TEAM_DRIVE_ID")
          [ -n "${FOLDER_ID:-}" ] && ARGS+=(root_folder_id "$FOLDER_ID")
          rclone config create gdrive drive "${ARGS[@]}"

      - name: Create dummy file
        run: echo "Hello from WIF workflow" > upload_wif.txt

      - name: Upload to Google Drive
        run: |
          rclone copy upload_wif.txt gdrive: --progress

ワークフローの解説

  • permissions: id-token: write を設定することで、GitHub ActionsのOIDCトークン発行を許可します。これがWIF認証の起点となります。
  • google-github-actions/auth: このアクションがOIDCトークンを取得し、Google Cloudに対して認証を行います。create_credentials_file: true オプションにより、認証結果としてADC(Application Default Credentials)ファイルが生成され、環境変数 GOOGLE_APPLICATION_CREDENTIALS に設定されます。
  • AnimMouse/setup-rclone: Rcloneをインストールし、GitHub Actions環境で使用できるようにします。
  • rclone config create: Rcloneの設定を動的に生成します。env_auth true により、環境変数に設定されたADCを使用してGoogle Drive APIにアクセスします。共有ドライブを使用する場合は team_drive パラメータを指定し、特定のフォルダを指定する場合は root_folder_idを設定します。
  • ファイルアップロード: 作成したダミーファイルを、設定したGoogle Driveリモートにアップロードします。

まとめ

本記事では、GitHub ActionsとRcloneを連携させ、Workload Identity Federation (WIF) を用いてGoogle Driveを操作する方法を解説しました。

WIFを利用することで、永続的なサービスアカウントキーを管理することなく、GitHub ActionsからGoogle Cloudリソースへの認証が可能になります。これは、特にセキュリティ要件が厳しい、あるいはキー作成がポリシーで制限されている環境において有効なアプローチです。

参考

  • Rclone公式サイト: https://rclone.org/
  • Google Drive API ドキュメント: https://developers.google.com/drive/api
  • GitHub Actions ドキュメント: https://docs.github.com/en/actions
  • AnimMouse/setup-rclone: https://github.com/AnimMouse/setup-rclone
  • Google Cloud Workload Identity Federation: https://cloud.google.com/iam/docs/workload-identity-federation
  • google-github-actions/auth: https://github.com/google-github-actions/auth