Workload identity federation で EC2 インスタンスから ODBC ドライバーで Snowflake に接続してみた

Workload identity federation で EC2 インスタンスから ODBC ドライバーで Snowflake に接続してみた

2025.08.22

はじめに

2025年8月のアップデートで、AWS、Azure などのプラットフォームから Snowflake への認証をより安全かつシンプルに行える機能である Workload identity federation が一般提供となりました。

https://docs.snowflake.com/en/release-notes/2025/other/2025-08-14-wif

こちらを試してみた内容を、本記事でまとめます。

アップデートの概要

Workload identity federation は、アプリケーション、サービスなどのワークロードが、AWS であれば IAM ロールなど、クラウドサービス側のシステムを使用して Snowflake に接続できる機能です。この構成により、パスワードやキーペアなどの長期的な認証情報を保管・管理する必要がなくなります。
また、アクティビティに関するログも Snowflake と各クラウドサービスに記録され、双方から確認することも可能です。

この構成で認証するには、Snowflake 側では対象のサービス向けのサービスユーザー(TYPE = SERVICE)を作成します。また、各ワークロード(外部のサービス)が Snowflake に接続する際は Snowflakeドライバーを使用します。

https://docs.snowflake.com/user-guide/workload-identity-federation#supported-snowflake-drivers

試してみる

ここでは 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

ここまでの手順の詳細は以下をご参照ください。

https://dev.classmethod.jp/articles/install-snowflake-odbc-driver-on-amzon-linux-2023/

https://docs.snowflake.com/en/developer-guide/odbc/odbc-linux

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 を使用して認証するように構成します。この手順は以下に記載があります。

https://docs.snowflake.com/developer-guide/odbc/odbc-parameters#authenticating-with-workload-identity-federation-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 に接続できます。パスワードやキーペアの管理も不要となるため、本機能を使える場面ではぜひとも使っていきたい機能と思います。
こちらの内容が何かの参考になれば幸いです。

この記事をシェアする

facebookのロゴhatenaのロゴtwitterのロゴ

© Classmethod, Inc. All rights reserved.