Apache Iceberg™ REST カタログのカタログ統合を構成する

Apache Iceberg™ REST カタログ統合 により、Snowflakeはオープンソース Apache Iceberg REST OpenAPI 仕様 に準拠した Apache Iceberg™ テーブル で管理されているリモートカタログにアクセスできます。

REST カタログへの接続

パブリックエンドポイントまたはプライベートネットワークを使用するIceberg REST API に接続できます。

パブリックエンドポイント

パブリックエンドポイントを使用してIceberg REST API に接続するには、次の認証方法を使用するカタログ統合を作成します。

  • OAuth

  • ベアラートークンまたはパーソナルアクセストークン(PAT)

  • SigV4

プライベートネットワーク

プライベートネットワークでホストされているIceberg REST API に接続するには、署名バージョン4(SigV4)認証を使用するカタログ統合を作成できます。

カタログ統合を使用する

CREATE CATALOG INTEGRATION (Apache Iceberg™ REST) コマンドを使用して、選択した認証方法のカタログ統合を作成します。REST_CONFIG と REST_AUTHENTICATION の引数に指定する値は、選択した認証方法によって異なります。

OAuth

以下の例では、 OAuth を使用して Tabular に接続する REST カタログ統合を作成しています。

CREATE OR REPLACE CATALOG INTEGRATION tabular_catalog_int
  CATALOG_SOURCE = ICEBERG_REST
  TABLE_FORMAT = ICEBERG
  CATALOG_NAMESPACE = 'default'
  REST_CONFIG = (
    CATALOG_URI = 'https://api.tabular.io/ws'
    WAREHOUSE = '<tabular_warehouse_name>'
  )
  REST_AUTHENTICATION = (
    TYPE = OAUTH
    OAUTH_TOKEN_URI = 'https://api.tabular.io/ws/v1/oauth/tokens'
    OAUTH_CLIENT_ID = '<oauth_client_id>'
    OAUTH_CLIENT_SECRET = '<oauth_secret>'
    OAUTH_ALLOWED_SCOPES = ('catalog')
  )
  ENABLED = TRUE;
Copy

次の例では、 OAuth を使用してDatabricks Unity Catalogに接続する REST カタログ統合を作成します。

CREATE OR REPLACE CATALOG INTEGRATION unity_catalog_int_oauth
  CATALOG_SOURCE = ICEBERG_REST
  TABLE_FORMAT = ICEBERG
  CATALOG_NAMESPACE = 'default'
  REST_CONFIG = (
    CATALOG_URI = 'https://my-api/api/2.1/unity-catalog/iceberg'
  )
  REST_AUTHENTICATION = (
    TYPE = OAUTH
    OAUTH_TOKEN_URI = 'https://my-api/oidc/v1/token'
    OAUTH_CLIENT_ID = '123AbC ...'
    OAUTH_CLIENT_SECRET = '1365910ab ...'
    OAUTH_ALLOWED_SCOPES = ('all-apis', 'sql')
  )
  ENABLED = TRUE;
Copy

ベアラートークンまたは PAT

次の例では、 PAT トークンを使用してDatabricks Unity Catalogに接続する REST カタログ統合を作成します。

CREATE OR REPLACE CATALOG INTEGRATION unity_catalog_int_pat
  CATALOG_SOURCE = ICEBERG_REST
  TABLE_FORMAT = ICEBERG
  CATALOG_NAMESPACE = 'my_namespace'
  REST_CONFIG = (
    CATALOG_URI = 'https://my-api/api/2.1/unity-catalog/iceberg'
  )
  REST_AUTHENTICATION = (
    TYPE = BEARER
    BEARER_TOKEN = 'eyAbCD...eyDeF...'
  )
  ENABLED = TRUE;
Copy

SigV4

次の図は、 API Gatewayおよび SigV4 認証を使用して、Snowflakeが REST カタログサーバーとどのようにやり取りするかを示しています。

Iceberg REST カタログがAmazon API Gateway、 IAM、S3とどのように連動するかを示す図です。

このセクションの手順に従って、 Amazon API Gateway および 署名バージョン4(SigV4) 認証の REST API を使用して、Snowflakeを一般にアクセスできないIceberg REST カタログに安全に接続します。

  1. Amazon API Gatewayで REST API を作成

  2. IAM ポリシーを作成し、ロールに添付する

  3. API Gatewayリソースポリシーを添付(プライベート APIs のみ)

  4. API で IAM ベースの認証を選択

  5. エンドポイント URL の取得

  6. SigV4 のカタログ統合を作成する

  7. IAM の信頼関係を設定する

Amazon API Gatewayで REST API を作成

SnowflakeをIceberg REST カタログに接続するには、Amazon API Gatewayの REST API リソース が必要です。

Amazon API GatewayにIcebergカタログ用の REST API リソースがまだない場合は、Icebergカタログ OpenAPI 定義ファイルをインポートするか、手動でエンドポイントを追加することで、シンプルな REST API を作成できます。

  1. AWS 管理コンソールで、 API Gateway を検索し、選択します。

  2. Create API を選択します。

  3. REST API の下にある Build を選択します。 プライベート の REST API を作成するには、 REST API Private の下にある Build を選択します。

  4. 以下のオプションのいずれかを選択します。

    • 手動でエンドポイントを追加して API を作成するには、 New API を選択します。

    • OpenAPI 定義ファイルを使用して API を作成するには、 Import API を選択し、ファイルをアップロードするか、コードエディターに定義を貼り付けます。

  5. API name とオプションで Description を入力します。

    注釈

    プライベート REST API を作成する際、 VPC エンドポイント ID を入力する必要はありません。

  6. Create API を選択します。

API Gatewayでの REST API の作成と開発の詳細については、 Amazon API Gateway開発者ガイド を参照してください。

IAM ポリシーを作成し、ロールに添付する

このステップでは、Snowflakeが API Gatewayに接続するために使用できる AWS IAM ロールを作成します。API を呼び出す許可を与えるポリシーをロールに添付します。

  1. AWS 管理コンソールで、 IAM を検索し、選択します。

  2. 左側のナビゲーションペインから Policies を選択します。

  3. Create policy を選択し、 Policy editorJSON を選択します。

  4. 空のポリシーを、 API メソッドを呼び出す許可を持つポリシーに置き換えます。たとえば、次の一般ポリシーは、 AWS アカウントのすべての API Gatewayリソースに対して起動アクションを許可します。

    {
      "Version": "2012-10-17",
      "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "execute-api:Invoke"
            ],
            "Resource": "arn:aws:execute-api:*:<aws_account_id>:*"
        }
      ]
    }
    
    Copy

    重要

    ベストプラクティスとして、ユースケースに最低限必要な権限を付与するポリシーを使用してください。その他のガイダンスおよびポリシー例については、 IAM 権限で API へのアクセスを制御 を参照してください。

  5. Next を選択します。

  6. Policy name (例: snowflake_access)とオプションの Description を入力します。

  7. Create policy を選択します。

  8. IAM ダッシュボードの左側のナビゲーションペインから、 Roles を選択します。

  9. ポリシーを添付するロールを選択します。カタログ統合を作成するときに、このロールを指定します。ロールを持っていない場合は、 新しいロールを作成します

  10. Permissions タブのロール Summary ページで、 Add permissions » Attach policies を選択します。

  11. API Gateway用に作成したポリシーを検索し、その横にあるボックスにチェックを入れ、 Add permissions を選択します。

  12. ロール Summary のページで、ロール ARN をコピーします。この ARN は、カタログ統合を作成するときに指定します。

API Gatewayリソースポリシーを添付(プライベート APIs のみ)

REST API がプライベートの場合、Amazon API Gatewayリソースポリシーを API に添付する必要があります。リソースポリシーにより、SnowflakeはSnowflakeアカウントが配置されているAmazon Virtual Private Cloud(VPC)から API を呼び出すことができます。

  1. Snowflakeでは、 SYSTEM$GET_SNOWFLAKE_PLATFORM_INFO 関数を呼び出して、Snowflakeアカウントがある VPC の ID を取得します。関数出力から VPC ID をコピーします。

    SELECT SYSTEM$GET_SNOWFLAKE_PLATFORM_INFO();
    
    Copy

    出力:

    {"snowflake-vpc-id":["vpc-c1c234a5"]}
    
  2. API Gatewayリソースポリシーの添付 の指示に従って、リソースポリシーを REST API に添付します。

    以下のポリシー例を貼り付け、修正します。

    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Effect": "Deny",
          "Principal": "*",
          "Action": "execute-api:Invoke",
          "Resource": "<api_gateway_arn>",
          "Condition": {
            "StringNotEquals": {
              "aws:sourceVpc": "<snowflake_vpc_id>"
            }
          }
        },
        {
          "Effect": "Allow",
          "Principal": {
            "AWS": "arn:aws:sts::123456789012:assumed-role/<my_api_permissions_role_name>/snowflake"
          },
          "Action": "execute-api:Invoke",
          "Resource": "<api_gateway_arn>/*/*/*",
          "Condition": {
            "StringEquals": {
              "aws:sourceVpc": "<snowflake_vpc_id>"
            }
          }
        }
      ]
    }
    
    Copy

ポリシーの最初のステートメントは、Snowflake VPC から発信されていないすべてのリクエストを拒否します。2番目のステートメントは、 想定ロールセッションプリンシパル を使用するSnowflake VPC から発信されるリクエストからの(すべてのメソッドに対する)呼び出しアクションを許可します。

API Gatewayリソースポリシーについては、こちらをご覧ください。

API で IAM ベースの認証を選択

REST API でアクセスを提供したい各メソッドについて、 IAM ベースの認証を選択します。IAM ベースの認証を使用すると、Snowflakeは設定した IAM ロールを使用して、 API にコールすることができます。

  1. Amazon API Gatewayコンソールで、 REST API を選択します。

  2. それぞれの方法について、次を行います。

    1. Resources の下で、リストからメソッドを選択します。

    2. Method request settings の下で、 Edit を選択します。

    3. Authorization には、 AWS IAM を選択します。

    4. Save を選択します。

  3. 認証の変更を適用するには、 Deploy API を選択します。詳細については、 API Gatewayコンソールから REST API をデプロイする を参照してください。

エンドポイント URL の取得

REST API エンドポイント URL を取得します(または URL を 呼び出します)。エンドポイント URL を取得する前に、 API をステージにデプロイする必要があります。

  1. Amazon API Gatewayコンソールで、 REST API を選択します。

  2. 左側のナビゲーションペインで、 Stages を選択します。

  3. Stage details の下で、 Invoke URL をコピーします。

カタログ統合を作成するときに、エンドポイント URL を指定します。

SigV4 のカタログ統合を作成する

Amazon API Gatewayで REST API を用意し、 IAM 権限を使用して API へのアクセスを制御する初期手順を完了したら、Snowflakeでカタログ統合を作成できます。

コマンドの構文とパラメーターの説明を表示するには、 CREATE CATALOG INTEGRATION (Apache Iceberg™ REST) を参照してください。

パブリック REST API

パブリック REST API のカタログ統合を作成するには、 CATALOG_SOURCE として ICEBERG_REST を指定し、 SIGV4 認証を使用します。

API エンドポイント URL や IAM ロール ARN などの詳細を含めてください。

CREATE OR REPLACE CATALOG INTEGRATION my_rest_catalog_integration
  CATALOG_SOURCE = ICEBERG_REST
  TABLE_FORMAT = ICEBERG
  CATALOG_NAMESPACE = 'my_namespace'
  REST_CONFIG = (
    CATALOG_URI = 'https://asdlkfjwoalk-execute-api.us-west-2-amazonaws.com/MyApiStage'
  )
  REST_AUTHENTICATION = (
    TYPE = SIGV4
    SIGV4_IAM_ROLE = 'arn:aws:iam::123456789012:role/my_api_permissions_role'
  )
  ENABLED = TRUE;
Copy

プライベート REST API

プライベート REST API のカタログ統合を作成するには、 CATALOG_API_TYPE パラメーターを AWS_PRIVATE_API_GATEWAY に設定する必要があります。

CREATE OR REPLACE CATALOG INTEGRATION my_rest_catalog_integration
  CATALOG_SOURCE = ICEBERG_REST
  TABLE_FORMAT = ICEBERG
  CATALOG_NAMESPACE = 'my_namespace'
  REST_CONFIG = (
    CATALOG_URI = 'https://asdlkfjwoalk-execute-api.us-west-2-amazonaws.com/MyApiStage'
  )
  REST_AUTHENTICATION = (
    TYPE = SIGV4
    CATALOG_API_TYPE = AWS_PRIVATE_API_GATEWAY
    SIGV4_IAM_ROLE = 'arn:aws:iam::123456789012:role/my_api_permissions_role'
  )
  ENABLED = TRUE;
Copy

IAM の信頼関係を設定する

次に、カタログ統合を作成したときにSnowflakeアカウントに作成された AWS IAM ユーザーと外部 ID に関する情報を取得し、 IAM ロールの信頼関係を構成する必要があります。

  1. Snowflakeで、 DESCRIBE CATALOG INTEGRATION コマンドを呼び出します。

    DESCRIBE CATALOG INTEGRATION my_rest_catalog_integration;
    
    Copy

    次の値を記録します。

    説明

    API_AWS_IAM_USER_ARN

    Snowflakeアカウント用に作成された AWS IAM ユーザー。例えば、 arn:aws:iam::123456789001:user/abc1-b-self1234。Snowflakeは、Snowflakeアカウント全体用に単一の IAM ユーザーをプロビジョニングします。

    API_AWS_EXTERNAL_ID

    信頼関係を確立するために必要な外部 ID。

  2. AWS 管理コンソールで、 IAM を検索し、選択します。

  3. 左側のナビゲーションペインから Roles を選択します。

  4. カタログ統合用に作成した IAM ロールを選択します。

  5. Trust relationships タブを選択します。

  6. Edit trust policy を選択します。

  7. 記録した値でポリシードキュメントを修正します。

    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Sid": "",
          "Effect": "Allow",
          "Principal": {
            "AWS": "<api_aws_iam_user_arn>"
          },
          "Action": "sts:AssumeRole",
          "Condition": {
            "StringEquals": {
              "sts:ExternalId": "<api_aws_external_id>"
            }
          }
        }
      ]
    }
    
    Copy
  8. Update policy を選択して変更を保存します。