

# Snowflake で認証する
<a name="connectors-snowflake-authentication"></a>

Amazon Athena Snowflake コネクタは、キーペア認証または OAuth 認証方法を使用して Snowflake データウェアハウスに接続するように設定できます。どちらの方法でも、Snowflake へのセキュアアクセスを提供し、接続文字列にパスワードを保存する必要がなくなります。
+ **キーペア認証** – この方法は、RSA パブリックキーペアまたはプライベートキーペアを使用して Snowflake で認証します。プライベートキーは認証リクエストにデジタル署名するものであり、対応するパブリックキーは検証のために Snowflake に登録されます。この方法だと、パスワードを保存する必要がなくなります。
+ **OAuth 認証** – この方法は、認可トークンと更新トークンを使用して Snowflake で認証します。自動トークン更新をサポートしているため、長時間実行されるアプリケーションに適しています。

詳細については、Snowflake ユーザーガイドの「[キーペア認証](https://docs.snowflake.com/en/user-guide/key-pair-auth)」と「[OAuth 認証](https://docs.snowflake.com/en/user-guide/oauth-custom)」を参照してください。

## 前提条件
<a name="connectors-snowflake-authentication-prerequisites"></a>

開始する前に、次の前提条件を完了します。
+ 管理者権限を持つ Snowflake アカウントアクセス。
+ Athena コネクタ専用の Snowflake ユーザーアカウント。
+ キーペア認証用の OpenSSL またはそれと同等のキー生成ツール。
+ シークレットを作成および管理するための AWS Secrets Manager アクセス。
+ OAuth 認証の OAuth フローを完了するためのウェブブラウザ。

## キーペア認証を設定する
<a name="connectors-snowflake-keypair-authentication"></a>

このプロセスでは、RSA キーペアの生成、パブリックキーを使用した Snowflake アカウントの設定、AWS Secrets Manager でのプライベートキーの安全な保存を行います。次の手順では、暗号化キーの作成、必要な Snowflake アクセス許可の設定、シームレスな認証を実現するための AWS 認証情報の設定について説明します。

1. **RSA キーペアを生成する**

   OpenSSL を使用してプライベートキーとパブリックキーのペアを生成します。
   + 暗号化されていないバージョンを生成するには、ローカルのコマンドラインアプリケーションで次のコマンドを使用します。

     ```
     openssl genrsa 2048 | openssl pkcs8 -topk8 -inform PEM -out rsa_key.p8 -nocrypt
     ```
   + 暗号化されたバージョンを生成するには、`-nocrypt` を省略した次のコマンドを使用します。

     ```
     openssl genrsa 2048 | openssl pkcs8 -topk8 -v2 des3 -inform PEM -out rsa_key.p8
     ```
   + プライベートキーからパブリックキーを生成する場合

     ```
     openssl rsa -in rsa_key.p8 -pubout -out rsa_key.pub
     # Set appropriate permissions (Unix/Linux)
     chmod 600 rsa_key.p8
     chmod 644 rsa_key.pub
     ```
**注記**  
プライベートキーは共有しないでください。プライベートキーにアクセスするのは、Snowflake で認証する必要があるアプリケーションのみであるべきです。

1. **Snowflake のパブリックキーコンテンツを区切り文字なしで抽出する**

   ```
   # Extract public key content (remove BEGIN/END lines and newlines)
   cat rsa_key.pub | grep -v "BEGIN\|END" | tr -d '\n'
   ```

   次のステップの後半で必要になるため、この出力を保存します。

1. **Snowflake ユーザーを設定する**

   Snowflake ユーザーを設定するには、次の手順に従います。

   1. Athena コネクタがまだ存在しない場合は、専用ユーザーを作成します。

      ```
      -- Create user for Athena connector
      CREATE USER athena_connector_user;
      
      -- Grant necessary privileges
      GRANT USAGE ON WAREHOUSE your_warehouse TO ROLE athena_connector_role;
      GRANT USAGE ON DATABASE your_database TO ROLE athena_connector_role;
      GRANT SELECT ON ALL TABLES IN DATABASE your_database TO ROLE athena_connector_role;
      ```

   1. 認証権限を付与します。ユーザーにパブリックキーを割り当てるには、次のいずれかのロールまたは権限が必要です。
      + ユーザーの `MODIFY PROGRAMMATIC AUTHENTICATION METHODS` または `OWNERSHIP` 権限。
      + `SECURITYADMIN` ロール 以上。

      次のコマンドを使用して、パブリックキーを割り当てるために必要な権限を付与します。

      ```
      GRANT MODIFY PROGRAMMATIC AUTHENTICATION METHODS ON USER athena_connector_user TO ROLE your_admin_role;
      ```

   1. 次のコマンドを使用して、パブリックキーを Snowflake ユーザーに割り当てます。

      ```
      ALTER USER athena_connector_user SET RSA_PUBLIC_KEY='RSAkey';
      ```

      次のコマンドを使用して、パブリックキーがユーザーに正常に割り当てられていることを確認します。

      ```
      DESC USER athena_connector_user;
      ```

1. **AWS Secrets Manager にプライベートキーを保存する**

   1. プライベートキーを、コネクタに必要な形式に変換します。

      ```
      # Read private key content
      cat rsa_key.p8
      ```

   1. AWS Secrets Manager で、次のような構造体のシークレットを作成します。

      ```
      {
        "sfUser": "your_snowflake_user",
        "pem_private_key": "-----BEGIN PRIVATE KEY-----\n...\n-----END PRIVATE KEY-----",
        "pem_private_key_passphrase": "passphrase_in_case_of_encrypted_private_key(optional)"
      }
      ```
**注記**  
ヘッダーとフッターはオプションです。
プライベートキーは `\n` で区切る必要があります。

## OAuth 認証を設定する
<a name="connectors-snowflake-oauth-authentication"></a>

この認証方法では、認証情報の自動更新機能を使用して、Snowflake へのトークンベースのセキュアアクセスが可能になります。設定プロセスでは、Snowflake でのセキュリティ統合の作成、OAuth クライアント認証情報の取得、アクセスコードを取得するための認可フローの完了、コネクタが使用する OAuth 認証情報の AWS Secrets Manager への保存を行います。

1. **Snowflake でセキュリティ統合を作成する**

   Snowflake で次の SQL コマンドを実行して、Snowflake OAuth セキュリティ統合を作成します。

   ```
   CREATE SECURITY INTEGRATION my_snowflake_oauth_integration_a
     TYPE = OAUTH
     ENABLED = TRUE
     OAUTH_CLIENT = CUSTOM
     OAUTH_CLIENT_TYPE = 'CONFIDENTIAL'
     OAUTH_REDIRECT_URI = 'https://localhost:8080/oauth/callback'
     OAUTH_ISSUE_REFRESH_TOKENS = TRUE
     OAUTH_REFRESH_TOKEN_VALIDITY = 7776000;
   ```

   **設定パラメータ**
   + `TYPE = OAUTH` – OAuth 認証タイプを指定します。
   + `ENABLED = TRUE` – セキュリティ統合を有効にします。
   + `OAUTH_CLIENT = CUSTOM` – カスタム OAuth クライアント設定を使用します。
   + `OAUTH_CLIENT_TYPE = 'CONFIDENTIAL'` – 安全なアプリケーションのクライアントタイプを設定します。
   + `OAUTH_REDIRECT_URI` – OAuth フローのコールバック URL。テストでは localhost にすることができます。
   + `OAUTH_ISSUE_REFRESH_TOKENS = TRUE` – 更新トークンの生成を有効にします。
   + `OAUTH_REFRESH_TOKEN_VALIDITY = 7776000` – 更新トークンの有効期間 (90日、秒単位) を設定します。

1. **OAuth クライアントシークレットを取得する**

   1. 次の SQL コマンドを実行して、これらの認証情報を取得します。

      ```
      DESC SECURITY INTEGRATION 'MY_SNOWFLAKE_OAUTH_INTEGRATION_A';
      ```

   1. OAuth クライアントシークレットを取得します。

      ```
      SELECT SYSTEM$SHOW_OAUTH_CLIENT_SECRETS('MY_SNOWFLAKE_OAUTH_INTEGRATION_A');
      ```

      **レスポンスの例**

      ```
      {
        "OAUTH_CLIENT_SECRET_2": "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY",
        "OAUTH_CLIENT_SECRET": "je7MtGbClwBF/2Zp9Utk/h3yCo8nvbEXAMPLEKEY,
        "OAUTH_CLIENT_ID": "AIDACKCEVSQ6C2EXAMPLE"
      }
      ```
**注記**  
これらの認証情報は安全に保管し、共有しないでください。これらは OAuth クライアントの設定に使用されます。

1. **ユーザーを承認し、認可コードを取得する**

   1. 次の URL をブラウザで開きます。

      ```
      https://<your_account>.snowflakecomputing.com/oauth/authorize?client_id=<OAUTH_CLIENT_ID>&response_type=code&redirect_uri=https://localhost:8080/oauth/callback
      ```

   1. 認可フローを完了します。

      1. Snowflake 認証情報を使用してサインインします。

      1. リクエストされたアクセス許可を付与します。認可コードが付加されたコールバック URI にリダイレクトされます。

   1. リダイレクト URL からコードパラメータをコピーして、認可コードを抽出します。

      ```
      https://localhost:8080/oauth/callback?code=<authorizationcode>
      ```
**注記**  
認可コードは期間限定で有効で、1 回のみ使用できます。

1. **AWS Secrets Manager に OAuth 認証情報を保存する**

   AWS Secrets Manager で、次のような構造体のシークレットを作成します。

   ```
   {
     "redirect_uri": "https://localhost:8080/oauth/callback",
     "client_secret": "je7MtGbClwBF/2Zp9Utk/h3yCo8nvbEXAMPLEKEY",
     "token_url": "https://<your_account>.snowflakecomputing.com/oauth/token-request",
     "client_id": "AIDACKCEVSQ6C2EXAMPLE,
     "username": "your_snowflake_username",
     "auth_code": "authorizationcode"
   }
   ```

   **必須フィールド**
   + `redirect_uri` – ステップ 1 で取得した OAuth リダイレクト URI。
   + `client_secret` – ステップ 2 で取得した OAuth クライアントシークレット。
   + `token_url` – Snowflake OAuth トークンエンドポイント。
   + `client_id` – ステップ 2 の OAuth クライアント ID。
   + `username` – コネクタの Snowflake ユーザー名。
   + `auth_code` – ステップ 3 で取得した認可コード。

シークレットを作成したら、[データソース接続を作成する](connect-to-a-data-source.md)ときに Glue 接続で使用できるシークレット ARN を取得します。