はじめに
2025年8月14日にSnowflakeに新しい認証方式「Workload Identity Federation」が追加されました。この機能により、OIDCで長期的な認証情報(パスワードやAPIキー)を管理することなく、Snowflakeに安全に接続できるようになりました。
本記事では、AWS等に依らない一般的なOIDCの設定を行ったWorkload Identity Federationで認証してSnowflakeオブジェクトを作成する方法を詳しく解説します。
本記事で使用するファイルは以下のGitHubリポジトリに配置しています。
記事を書いた理由ですが、Snowflakeのドキュメントを読んでも、OIDCによる一般的な設定方法が分かりずらかったので、GitHub ActionsとSnowflake CLIを題材に検証しました。
本当はSnowflake CLIの代わりにTerraformを使いたかったのですが、サポートされるのは2025年の終わりのようです。
Workflow Identity Federation will be supported before the end of 2025.
なお、Snowflake CLIは2025年8月21日時点でWorkload Identity Federationを未サポートですが、後述のパラメータ設定で利用できるようになります。
OIDCの設定方法が主となる記事のため、Snowflake CLIを利用していますが、実運用時は未サポートである点に注意してください。
2025年8月26日 追記
Snowflake CLI は v3.11.0 でWorkload Identity Federationをサポートしました。
GitHub Actions上のOIDCトークンを読み込む処理も組み込まれているようです。
Added snow auth OIDC command group for managing workload identity federation authentication:
snow auth oidc read-token - Reads and displays OIDC tokens from CI/CD environments
Supports GitHub Actions OIDC provider for passwordless authentication in CI/CD pipelines
Workload Identity Federationとは
Workload Identity Federationは、アプリケーション、サービス、コンテナなどのワークロードが、クラウドプロバイダーのネイティブIDシステム(AWS IAM、Microsoft Entra ID、Google Cloudサービスアカウントなど)を使用してSnowflakeに認証できるサービス間認証方式です。
主なメリット
- セキュリティ向上: 長期的な認証情報の管理が不要
- 運用コスト削減: 既存のIDプロバイダーを活用
OpenID Connect (OIDC) の仕組み
GitHub ActionsからSnowflakeへのWorkload Identity Federationは、OpenID Connect (OIDC) プロトコルを使用しています。OIDCにより、長期的な認証情報を保存することなく、安全にクラウドサービス間の認証が可能になります。
OIDC認証フローの概要
OIDCの主要コンポーネント
1. JWT (JSON Web Token)
GitHub Actionsが生成するデジタル署名付きトークンで、以下の重要なClaim(情報)を含みます:
-
iss(Issuer): トークン発行者- 値:
https://token.actions.githubusercontent.com - 用途: Snowflakeがトークンの発行元を検証
- 値:
-
sub(Subject): 認証されたユーザを一意に識別する識別子- 値:
repo:owner/repository:ref:refs/heads/branch - 例:
repo:bgcanary/snowflake-demo:ref:refs/heads/main - 用途: 特定のリポジトリ・ブランチのみアクセス許可
- 値:
-
aud(Audience): トークンの受信者- 値:
https://github.com/owner - 例:
https://github.com/bgcanary - 用途: 特定のGitHub組織のみアクセス許可
- 値:
2. Snowflake Workload Identity設定
SnowflakeのサービスユーザーでOIDC認証を設定する際の各パラメータ:
CREATE USER xxx
WORKLOAD_IDENTITY = (
TYPE = OIDC -- OIDC認証を使用
ISSUER = 'issuer_url' -- JWTのissクレームと一致必須
SUBJECT = 'subject_pattern' -- JWTのsubクレームと一致必須
OIDC_AUDIENCE_LIST = ('aud') -- JWTのaudクレームと一致必須
);
各パラメータの役割:
-
TYPE = OIDC: Workload Identity FederationでOIDCプロバイダーを使用することを指定 -
ISSUER: 信頼するOIDCプロバイダーのURL- GitHub Actions固定値:
https://token.actions.githubusercontent.com - Snowflakeはこの発行者からのトークンのみ受け入れ
- GitHub Actions固定値:
-
SUBJECT: 認証を許可するワークロードの識別子- パターン:
repo:組織名/リポジトリ名:ref:refs/heads/ブランチ名 - セキュリティ: 特定のリポジトリ・ブランチのみアクセス制限
- パターン:
-
OIDC_AUDIENCE_LIST: トークンの対象者リスト- GitHub組織URL:
https://github.com/組織名 - 複数指定可能:
('aud1', 'aud2')
- GitHub組織URL:
事前準備
Snowflake
- Snowflakeアカウント
- GitHub Actions用のユーザー作成権限、ロール(SYSADMIN等)の付与権限を持ったロール(SECURITYADMIN等)
GitHub
- GitHubアカウント
- ローカルPC等のgit設定(任意)
- 各ファイルのGit Clone(任意)
git clone git@github.com:bgcanary/snowflake-wif-demo.git
設定手順
1. GitHub ActionsのOIDCトークンSubject値を確認
まず、GitHub Actionsで使用されるOIDCトークンのSubject値を確認します。この値はGitHubリポジトリとブランチの組み合わせで決まります。
Subject値の形式は以下のようになります:
-
特定のブランチ:
repo:OWNER/REPOSITORY:ref:refs/heads/BRANCH_NAME -
mainブランチの例:
repo:your-org/your-repo:ref:refs/heads/main -
developブランチの例:
repo:your-org/your-repo:ref:refs/heads/develop
2. Snowflakeでサービスユーザーを作成
次に、確認したSubject値を使用してWorkload Identity Federationを使用するサービスユーザーをSnowflakeで作成します。
-- セキュリティ管理者ロールに切り替え
USE ROLE SECURITYADMIN;
-- GitHub Actions用のサービスユーザーを作成
CREATE USER github_actions_user
WORKLOAD_IDENTITY = (
TYPE = OIDC
ISSUER = 'https://token.actions.githubusercontent.com'
SUBJECT = 'repo:your-org/your-repo:ref:refs/heads/main'
OIDC_AUDIENCE_LIST = ('https://github.com/your-org')
)
TYPE = SERVICE
DEFAULT_ROLE = SYSADMIN;
-- GitHub ActionsからSnowflakeを操作するための権限を付与
GRANT ROLE SYSADMIN TO USER github_actions_user;
重要なポイント:
-
ISSUER: GitHub ActionsのOIDCプロバイダーURL(固定値) -
SUBJECT: リポジトリとブランチの組み合わせに変更- 形式:
repo:組織名/リポジトリ名:ref:refs/heads/ブランチ名 - 例:
repo:mycompany/myproject:ref:refs/heads/main
- 形式:
-
OIDC_AUDIENCE_LIST: GitHub組織URLに変更- 形式:
https://github.com/組織名 - 例:
https://github.com/mycompany
- 形式:
2. GitHub ActionsワークフローYAMLの作成
.github/workflows/snowflake-deploy.yml を作成します:
name: Snowflake Deployment with Workload Identity
on:
push:
branches: [ main ]
pull_request:
branches: [ main ]
permissions:
id-token: write # OIDC token取得に必要
contents: read # リポジトリコンテンツ読み取りに必要
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Setup Snowflake CLI
uses: snowflakedb/snowflake-cli-action@v1.5
- name: Install OIDC Client from Core Package
run: npm install @actions/core@1.6.0 @actions/http-client
- name: Get OIDC Token
uses: actions/github-script@v7
id: get-token
with:
script: |
const coredemo = require('@actions/core')
let id_token = await coredemo.getIDToken('https://github.com/${{ github.repository_owner }}')
coredemo.setOutput('id_token', id_token)
- name: Deploy Snowflake resources
env:
SNOWFLAKE_ACCOUNT: ${{ secrets.SNOWFLAKE_ACCOUNT }}
SNOWFLAKE_USER: ${{ secrets.SNOWFLAKE_USER }}
SNOWFLAKE_AUTHENTICATOR: WORKLOAD_IDENTITY
SNOWFLAKE_WORKLOAD_IDENTITY_PROVIDER: OIDC
SNOWFLAKE_TOKEN: ${{ steps.get-token.outputs.id_token }}
SF_ENABLE_EXPERIMENTAL_AUTHENTICATION: true
run: |
# データベースの作成
snow sql -f sql/01_create_database.sql --temporary-connection
# スキーマの作成
snow sql -f sql/02_create_schema.sql --temporary-connection
対応するSQLファイルを sql/ ディレクトリに作成します:
sql/01_create_database.sql
CREATE OR ALTER DATABASE DEMO_DB;
sql/02_create_schema.sql
CREATE OR ALTER SCHEMA DEMO_DB.DEMO_SCHEMA;
実際は任意のSQLを実行可能です。
3. GitHub Secretsの設定
GitHub リポジトリの Settings > Secrets and variables > Actions の「Secrets」タブで以下の変数を追加:
-
SNOWFLAKE_ACCOUNT: SnowflakeアカウントID(例:abc12345.us-west-2) -
SNOWFLAKE_USER: サービスユーザー名(例:github_actions_user)
4. GitHub リポジトリへリソースをPushし、GitHub Actionsを実行
実行結果
5. Snowflake側でリソースの作成状況を確認
Query History を確認すると、クエリが実行完了できている。
トラブルシューティング
エラーと対処法
1. Snowflake CLIの接続設定エラー
Connection default is not configured
原因: 環境変数で接続しようとしたが、フラグが無いためconfigファイルを参照しようとしている。
解決策: --temporary-connectionフラグを追加
# 修正前
snow sql -f sql/01_create_database.sql
# 修正後
snow sql -f sql/01_create_database.sql --temporary-connection
2. Snowflake CLIでWorkload Identity Federationを使おうとした際のエラー
Please set the 'SF_ENABLE_EXPERIMENTAL_AUTHENTICATION' environment variable true to use the 'WORKLOAD_IDENTITY' authenticator
原因: Snowflake CLIが利用するPythonのバージョンが古く、Workload Identity Federationが試験用の機能として扱われている
Snowflake CLIは2025年8月21日時点でWorkload Identity Federationを未サポート。
解決策: 環境変数を追加
env:
SF_ENABLE_EXPERIMENTAL_AUTHENTICATION: true
3. Workload Identity認証情報エラー
No workload identity credential was found for 'auto-detect'
原因: GitHub ActionsのOIDCトークンが正しく設定されていない
解決策: GitHub ActionsのOIDCトークン取得手順を追加
- name: Install OIDC Client from Core Package
run: npm install @actions/core@1.6.0 @actions/http-client
- name: Get OIDC Token
uses: actions/github-script@v7
id: get-token
with:
script: |
const coredemo = require('@actions/core')
let id_token = await coredemo.getIDToken('https://github.com/${{ github.repository_owner }}')
coredemo.setOutput('id_token', id_token)
Snowflake CLIがOIDC Token (id_token) を読み込めるよう、 SNOWFLAKE_TOKEN 環境変数に値を設定する。
- name: Deploy Snowflake resources
env:
SNOWFLAKE_ACCOUNT: ${{ secrets.SNOWFLAKE_ACCOUNT }}
SNOWFLAKE_USER: ${{ secrets.SNOWFLAKE_USER }}
SNOWFLAKE_AUTHENTICATOR: WORKLOAD_IDENTITY
SNOWFLAKE_WORKLOAD_IDENTITY_PROVIDER: OIDC
SNOWFLAKE_TOKEN: ${{ steps.get-token.outputs.id_token }} # ← OIDCトークン用のパラメータを環境変数に設定
SF_ENABLE_EXPERIMENTAL_AUTHENTICATION: true
run: |
# データベースの作成
snow sql -f sql/01_create_database.sql --temporary-connection
4. JWT audience claim無効エラー
JWT contains an invalid audience ("aud") claim
原因: Snowflakeサービスユーザーにaudience値が未設定
解決策: SnowflakeサービスユーザーのOIDC_AUDIENCE_LISTに値を設定
-- 修正前
OIDC_AUDIENCE_LIST = ('') -- 未設定
-- 修正後(実際のaud値を使用)
OIDC_AUDIENCE_LIST = ('https://github.com/your-org')
5. JWT subject/issuer認識エラー
Either the JWT contained an unrecognized subject or issuer claim, or the JWTs signature could not be verified
原因: JWTトークンのsubjectまたはissuer, audience クレームがSnowflakeの設定と不一致
解決策:
-
JWTトークンクレームをデバッグ出力で確認
# デバッグ用コード echo $IDTOKEN | cut -d'.' -f2 | base64 -d | jq .出力例
{ "actor": "bgcanary", "actor_id": "89304360", "aud": "https://github.com/bgcanary", "base_ref": "", "event_name": "push", "exp": 1755552448, "head_ref": "", "iat": 1755530848, "iss": "https://token.actions.githubusercontent.com", "job_workflow_ref": "bgcanary/snowflake-demo/.github/workflows/hoge.yml@refs/heads/main", "job_workflow_sha": "75a3e64e76a6571ed45cefab3a7b48c929ac899e", "jti": "248cd4c5-fe97-4f87-8475-e152164079b0", "nbf": 1755530548, "ref": "refs/heads/main", "ref_protected": "false", "ref_type": "branch", "repository": "bgcanary/snowflake-demo", "repository_id": "1040116597", "repository_owner": "bgcanary", "repository_owner_id": "89304360", "repository_visibility": "public", "run_attempt": "1", "run_id": "17045018715", "run_number": "9", "runner_environment": "github-hosted", "sha": "75a3e64e76a6571ed45cefab3a7b48c929ac899e", "sub": "repo:bgcanary/snowflake-demo:ref:refs/heads/main", "workflow": "Snowflake Deployment with Workload Identity", "workflow_ref": "bgcanary/snowflake-demo/.github/workflows/hoge.yml@refs/heads/main", "workflow_sha": "75a3e64e76a6571ed45cefab3a7b48c929ac899e" } -
実際のクレーム値でSnowflakeサービスユーザーを再作成
CREATE USER github_actions_user WORKLOAD_IDENTITY = ( TYPE = OIDC ISSUER = 'https://token.actions.githubusercontent.com' -- iss値 SUBJECT = 'repo:your-org/your-repo:ref:refs/heads/main' -- sub値 OIDC_AUDIENCE_LIST = ('https://github.com/your-org') -- aud値 ) TYPE = SERVICE DEFAULT_ROLE = SYSADMIN;
まとめ
Workload Identity Federationを使用することで、GitHub ActionsからSnowflakeへの認証がより安全かつ管理しやすくなりました。

