Workload identity federation で EC2 インスタンスから ODBC ドライバーで Snowflake に接続してみた
はじめに
2025年8月のアップデートで、AWS、Azure などのプラットフォームから Snowflake への認証をより安全かつシンプルに行える機能である Workload identity federation が一般提供となりました。
こちらを試してみた内容を、本記事でまとめます。
アップデートの概要
Workload identity federation は、アプリケーション、サービスなどのワークロードが、AWS であれば IAM ロールなど、クラウドサービス側のシステムを使用して Snowflake に接続できる機能です。この構成により、パスワードやキーペアなどの長期的な認証情報を保管・管理する必要がなくなります。
また、アクティビティに関するログも Snowflake と各クラウドサービスに記録され、双方から確認することも可能です。
この構成で認証するには、Snowflake 側では対象のサービス向けのサービスユーザー(TYPE = SERVICE)を作成します。また、各ワークロード(外部のサービス)が Snowflake に接続する際は Snowflakeドライバーを使用します。
試してみる
ここでは ODBC ドライバーを使用し、Workload identity federation(以下、WIF とします) による認証を行います。
前提条件
- ODBC ドライバーは v3.11.0 以上である必要があります
以下の環境を使用しました。
- OS:Amazon Linux 2023
- ドライバー マネージャー:unixODBC
- RPM パッケージを使用してドライバーをインストール
- ODBC ドライバー バージョン:3.11.0
EC2 に Snowflake ODBC ドライバーをインストール
はじめに、以下の手順でドライバ パッケージのインストールまで行いました。
#パッケージのアップデート
sudo dnf upgrade --releasever=latest
#アップデート後の更新確認
sudo dnf check-upgrade --releasever=latest
# unixODBC をインストール
$ sudo dnf install -y unixODBC
# Amazon Linux 2023 にデフォルトでインストールされているgnupg2-minimalをgnupg2-fullに置き換え
$ sudo dnf swap gnupg2-minimal gnupg2-full
# パッケージ署名の確認
$ gpg --keyserver hkp://keyserver.ubuntu.com --recv-keys 2A3149C82551A34A
gpg: key 2A3149C82551A34A: public key "Snowflake Computing (Snowflake Computing Gpg key) <snowflake_gpg@snowflake.net>" imported
gpg: Total number processed: 1
gpg: imported: 1
# パッケージのダウンロード
wget https://sfc-repo.snowflakecomputing.com/odbc/linux/3.11.0/snowflake-odbc-3.11.0.x86_64.rpm
RPM ドライバー パッケージの署名を確認します。
$ gpg --list-keys
/home/ec2-user/.gnupg/pubring.kbx
---------------------------------
pub rsa4096 2024-09-16 [SC] [expires: 2026-09-16]
F46822FE012CC3FF371724F75A125630709DD64B
uid [ unknown] Snowflake Computing (Snowflake Computing Gpg key) <snowflake_gpg@snowflake.net>
sub rsa4096 2024-09-16 [E] [expires: 2026-09-16]
$ rpm -K snowflake-odbc-3.11.0.x86_64.rpm
snowflake-odbc-3.11.0.x86_64.rpm: digests SIGNATURES NOT OK
ドキュメントにもあるように、rpm
インポートした GPG キーがない場合、上記の出力となるので、ここでは続けて以下を実行しました。
# GPGキーをエクスポート
gpg --export -a 2A3149C82551A34A > odbc-signing-key.asc
# GPGキーをRPMにインポート
$ sudo rpm --import odbc-signing-key.asc
# RPMファイルの署名を再度検証
$ rpm -K snowflake-odbc-3.11.0.x86_64.rpm
snowflake-odbc-3.11.0.x86_64.rpm: digests signatures OK
ドライバーをインストールします。
$ sudo dnf install -y snowflake-odbc-3.11.0.x86_64.rpm
Last metadata expiration check: 0:10:45 ago on Fri Aug 22 04:46:28 2025.
Dependencies resolved.
=============================================================================================================================================================================
Package Architecture Version Repository Size
=============================================================================================================================================================================
Installing:
snowflake-odbc x86_64 3.11.0-1 @commandline 64 M
Transaction Summary
=============================================================================================================================================================================
Install 1 Package
Total size: 64 M
Installed size: 212 M
Downloading Packages:
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
Preparing : 1/1
Installing : snowflake-odbc-3.11.0-1.x86_64 1/1
Running scriptlet: snowflake-odbc-3.11.0-1.x86_64 1/1
[WARN] SF_ACCOUNT is not set, please manually update the odbc.ini file after installation
Adding driver info to odbcinst.ini...
odbcinst: Driver installed. Usage count increased to 1.
Target directory is /etc
Adding connect info to odbc.ini...
odbcinst: Sections and Entries from stdin have been added to ODBC.INI
Adding Simba Snowflake ini...
Creating a symlink /usr/lib64/libodbccr.so.1...
Verifying : snowflake-odbc-3.11.0-1.x86_64 1/1
Installed:
snowflake-odbc-3.11.0-1.x86_64
Complete!
ドライバーを構成をします。以下を実行しsimba.snowflake.ini
ファイルを編集します。
sudo vi /usr/lib64/snowflake/odbc/lib/simba.snowflake.ini
ドキュメントを参考に、ここでは以下の内容を追記しました。
ODBCInstLib=/usr/lib64/libodbcinst.so.2
ANSIENCODING=UTF-8
DSN 設定を行います。/etc/odbc.ini
を確認すると、デフォルトで以下のように記載があります。
$ cat /etc/odbc.ini
[snowflake]
Description=SnowflakeDB
Driver=SnowflakeDSIIDriver
Locale=en-US
SERVER=SF_ACCOUNT.snowflakecomputing.com
PORT=443
SSL=on
ACCOUNT=SF_ACCOUNT
/etc/odbc.ini
を変更し、テスト接続用に以下の内容を追記しました。
[snowflake_test]
Description=SnowflakeDB
Driver=SnowflakeDSIIDriver
Locale=en-US
SERVER=<組織名>-<アカウント名>.snowflakecomputing.com
PORT=443
SSL=on
ACCOUNT=<組織名>-<アカウント名>
この状態で接続をテストすると、問題なく接続できました。
# 環境変数を設定
export SNOWSQL_USER="ユーザー名"
export SNOWSQL_PWD="パスワード"
# Snowflakeに接続
$ isql -v snowflake_test $SNOWSQL_USER $SNOWSQL_PWD
+---------------------------------------+
| Connected! |
| |
| sql-statement |
| help [tablename] |
| quit |
| |
+---------------------------------------+
SQL> select current_timestamp();
+------------------------------+
| CURRENT_TIMESTAMP() |
+------------------------------+
| 2025-08-22 05:12:31.892000000|
+------------------------------+
SQLRowCount returns 1
1 rows fetched
ここまでの手順の詳細は以下をご参照ください。
Workload identity federation の構成:AWS 側
ここから WIF のための構成を行います。
AWS の場合は、IAM ロールでを使用できます。今回は EC2 インスタンスから接続するので、インスタンスに IAM ロールをアタッチすればよいです。
ここでは特にポリシーは設定せず、以下の信頼関係の IAM ロール(sf-workload-role
)を作成しました。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "ec2.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
Snowflake 側の構成に必要なので、IAM ロールの ARN を控えておきます。
arn:aws:iam::xxxxxxxxxxxx:role/sf-workload-role
Workload identity federation の構成:Snowflake 側
WIF を使用して Snowflake で認証するサービス ユーザーを以下の内容で作成しました。ARN に先の手順で作成した IAM ロールの ARN を指定します。
CREATE USER service_ec2_user
WORKLOAD_IDENTITY = (
TYPE = AWS
ARN = 'arn:aws:iam::xxxxxxxxxxxx:role/sf-workload-role'
)
TYPE = SERVICE
DEFAULT_ROLE = PUBLIC;
Workload identity federation の構成:ドライバー
ここまでの内容で設定はほぼ完了で、ODBC ドライバーの場合は、最後に以下の手順で WIF を使用して認証するように構成します。この手順は以下に記載があります。
この内、今回は AWS(IAM ロール)を使用するので、以下の設定を行います。
authenticator
接続パラメータをWORKLOAD_IDENTITY
に設定workload_identity_provider
接続パラメータをAWS
に設定
/etc/odbc.ini
ファイルを編集し、上記の設定を追加した DSN を作成します。
$ sudo vi /etc/odbc.ini
[snowflake_aws_wlif]
Description=Snowflake WLF for AWS
Driver=SnowflakeDSIIDriver
SERVER=<組織名>-<アカウント名>.snowflakecomputing.com
PORT=443
SSL=on
ACCOUNT=<組織名>-<アカウント名>
authenticator=WORKLOAD_IDENTITY
workload_identity_provider=AWS
接続してみる
この状態で、EC2 インスタンスに IAM ロールが紐づいていない状態で接続してみると、以下のようにエラーとなりました。
# Snowflakeに接続
$ isql -v snowflake_aws_wlif
[S1000][unixODBC][Snowflake][Snowflake] (62)
Unable to obtain workload identity attestation. Make sure that correct workload identity provider has been set and that Snowflake ODBC driver runs on supported environment.
先の IAM ロールを関連付けると、問題なく接続されクエリも実行できました。
$ isql -v snowflake_aws_wlif
+---------------------------------------+
| Connected! |
| |
| sql-statement |
| help [tablename] |
| quit |
| |
+---------------------------------------+
SQL> select current_user();
+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| CURRENT_USER() |
+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| SERVICE_EC2_USER |
+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
SQLRowCount returns 1
1 rows fetched
Snowflake 側でログイン履歴を確認すると、WIF による接続であることを確認できました。
--ログイン履歴
select *
from table(information_schema.login_history())
order by event_timestamp desc;
+-------------------------------+-------------+------------+------------------+----------------+----------------------+-------------------------+-----------------------------+------------------------------+------------+------------+---------------+------------------+------------+------------------------+--------------------------------+---------------------------------+
| EVENT_TIMESTAMP | EVENT_ID | EVENT_TYPE | USER_NAME | CLIENT_IP | REPORTED_CLIENT_TYPE | REPORTED_CLIENT_VERSION | FIRST_AUTHENTICATION_FACTOR | SECOND_AUTHENTICATION_FACTOR | IS_SUCCESS | ERROR_CODE | ERROR_MESSAGE | RELATED_EVENT_ID | CONNECTION | CLIENT_PRIVATE_LINK_ID | FIRST_AUTHENTICATION_FACTOR_ID | SECOND_AUTHENTICATION_FACTOR_ID |
|-------------------------------+-------------+------------+------------------+----------------+----------------------+-------------------------+-----------------------------+------------------------------+------------+------------+---------------+------------------+------------+------------------------+--------------------------------+---------------------------------|
| 2025-08-22 14:47:35.319 +0900 | 11546574485 | LOGIN | SERVICE_EC2_USER | xx.xx.xx.xx | ODBC_DRIVER | 3.11.0 | WORKLOAD_IDENTITY | NULL | YES | NULL | NULL | NULL | NULL | NULL | 1 | NULL |
+-------------------------------+-------------+------------+------------------+----------------+----------------------+-------------------------+-----------------------------+------------------------------+------------+------------+---------------+------------------+------------+------------------------+--------------------------------+---------------------------------+
さいごに
Workload identity federation による認証を試してみました。
IAM ロールの場合、構成手順もシンプルで、ワークロード(ここでは AWS 上の EC2 インスタンス)から Snowflake に接続できます。パスワードやキーペアの管理も不要となるため、本機能を使える場面ではぜひとも使っていきたい機能と思います。
こちらの内容が何かの参考になれば幸いです。