Snowflake × GitHub Actions の OIDC 認証
少し前 (2025年10月) に dbt project on Snowflake が一般公開となりましたね 🎉
「いつかやらなきゃ…」と思いつつも dbt の導入ができていなかったので、これを機にとりあえず触ってみました。と言いながら、今回の記事は dbt project on Snowflake の記事ではありません 🙅
dbt project on Snowflake を触ってみた感想については、いずれ記事にしようと思います 📝
CI / CD パイプラインを構築
dbt project on Snowflake の費用感や機能を調査しつつ Snowsight から軽く触ってみた感じ、導入できそうに思えたので、早速 GitHub Actions で CI / CD パイプラインを構築することにしました。
パイプラインでは Snowflake CLI を利用して Snowflake へ接続・操作するので、何かしらの認証が必要です。Snowflake では OpenID Connect (OIDC) による認証ができるので OIDC を利用することにしました。
GitHub Actions 上で Snowflake CLI を使えるように
GitHub Actions 上で OIDC 認証を行い、Snowflake CLI を使う方法は、公式ドキュメントに丁寧に記載されているので、この通りに実装すればよいだけです。
かいつまむと、
-
サービスユーザを作成
CREATE OR REPLACE USER {ユーザ名} COMMENT = "Service user for GitHub Actions." WORKLOAD_IDENTITY = ( TYPE = OIDC ISSUER = 'https://token.actions.githubusercontent.com' SUBJECT = 'repo:{組織名}/{リポジトリ名}:ref:refs/heads/{ブランチ名}' ) TYPE = SERVICE;
-
Snowflake CLI をインストール
- name: Set up Snowflake CLI uses: snowflakedb/snowflake-cli-action@v2.0 with: use-oidc: true cli-version: "3.12.0"
のみです。
あとは、SNOWFLAKE_ACCOUNT や SNOWFLAKE_USER 等の環境変数を設定してあげれば、簡単に Snowflake へ接続できます。
aud クレームを指定してみた
OIDC では ID Token (JWT) を発行して認証を行います。
前述のユーザ作成の際に、ISSUER と SUBJECT を指定しており、これらが ID Token 内の iss クレーム及び sub クレームと一致していなければいけません。
ドキュメントにも
For
TYPE=OIDC, specifies the OpenID Connect (OIDC) issuer URL. An OIDC provider is identified by its issuer URL.
For
TYPE=OIDC, specifies the identifier of the workload that is connecting to Snowflake. The format of the value is specific to the OIDC provider that is issuing the attestation.
と記載されています。
これに加えてさらに
CREATE OR REPLACE USER {ユーザ名} COMMENT = "Service user for Terraforming Snowflake from GitHub Actions." WORKLOAD_IDENTITY = ( TYPE = OIDC ISSUER = 'https://token.actions.githubusercontent.com' SUBJECT = 'repo:{組織名}/{リポジトリ名}:ref:refs/heads/{ブランチ名}' OIDC_AUDIENCE_LIST = ('https://github.com/{組織名}') ) TYPE = SERVICE;
のように OIDC_AUDIENCE_LIST を指定することができるので、
GitHub Actions 上でも
- name: Set up Snowflake CLI uses: snowflakedb/snowflake-cli-action@v2.0 with: cli-version: "3.12.0" - name: Get OIDC Token uses: actions/github-script@v8 id: get-oidc-token with: script: | const core = require('@actions/core') let idToken = await core.getIDToken('https://github.com/${{ github.repository_owner }}') core.setOutput('id_token', idToken) - name: Set SNOWFLAKE_TOKEN environment variables run: | echo "SNOWFLAKE_TOKEN=${{ steps.get-oidc-token.outputs.id_token }}" >> $GITHUB_ENV
のように actions/github-script を使用して ID Token を取り出し、Snowflake に渡してみました。
すると、「aud クレームが snowflakecomputing.com となっており、指定した値と一致しない」というエラーになりました。

エラーの原因
原因はもちろんエラー内容のとおり、aud クレームの不一致です。しかし、どうしても aud クレームが snowflakecomputing.com になってしまい変更する方法がわかりませんでした。
他の方が書かれている記事も参考にして、試しに Snowflake CLI のバージョンを 3.10.0 に落としてみたところ認証が通りました。
- name: Set up Snowflake CLI uses: snowflakedb/snowflake-cli-action@v2.0 with: cli-version: "3.10.0"
ちょうど下記のとおり 3.11.0 へのアップデートで OIDC に関する修正が入っており、3.10.0 で試したのはビンゴでした 👏
Added the
snow auth oidccommands for managing workload identity federation authentication:snow auth oidc read-tokento read and display OIDC tokens from CI/CD environments.
念のため、「aud クレームが snowflakecomputing.com 固定となる原因」と「固定とした理由」について Snowflake Support へ質問してみると、
-
Snowflake CLI v3.11 以降、aud が固定値になるよう仕様変更された
-
詳細な理由は非公開だが『業界標準的な動向に従ったもの』らしい
とのことでした。(いつもサポートの方には迅速に回答いただいて助かっています 🙇)
aud クレームは "Value that identifies the Authorization Server as an intended audience." のとおり、 「トークンの受信者側」 を確認するためのものなので、わざわざ指定する必要もありませんね 🤔
おわりに
今回は Snowflake と GitHub Actions の認証で余計なことをして時間を浪費したという記事でした。公式に記載されているとおり素直に設定するのが一番ですね。
時間は浪費しましたが、OIDC の仕組みを改めて勉強でき、記事も執筆できたのでよしとします 😅
最後に余談ですが、ユーザ作成の時に指定する SUBJECT にはワイルドカードを指定できないそうです。(サポート問い合わせ済)
CREATE OR REPLACE USER {ユーザ名} COMMENT = "Service user for Terraforming Snowflake from GitHub Actions." WORKLOAD_IDENTITY = ( TYPE = OIDC ISSUER = 'https://token.actions.githubusercontent.com' SUBJECT = 'repo:{組織名}/{リポジトリ名}:ref:refs/heads/*' OIDC_AUDIENCE_LIST = ('https://github.com/{組織名}') ) TYPE = SERVICE;
環境ごとにブランチを分けていると、GitHub Actions 上で使用する Snowflake ユーザも分けなければいけません 😿
