Amazon API ゲートウェイ用のカタログ統合の構成¶
次の図は、 API Gatewayおよび SigV4 認証を使用して、Snowflakeが REST カタログサーバーとどのようにやり取りするかを示しています。
このトピックの手順に従って、 REST API の Amazon API Gateway および Signature Version 4 (SigV4) 認証ドを使用して、Snowflake を一般にアクセスできない Iceberg REST カタログにセキュアに接続します。
Amazon API Gatewayで REST API を作成¶
SnowflakeをIceberg REST カタログに接続するには、Amazon API Gatewayの REST API リソース が必要です。
Amazon API GatewayにIcebergカタログ用の REST API リソースがまだない場合は、Icebergカタログ OpenAPI 定義ファイルを修正してインポートするか、手動でエンドポイントを追加することで、シンプルな REST API を作成できます。
注釈
Icebergカタログ OpenAPI 定義をインポートするには、 YAML ファイルを修正する必要があります。Amazon API Gatewayは、 OpenAPI 2.0または3.0仕様のすべてのコンポーネントをサポートしているわけではありません。詳細については、 Amazon API Gatewayの REST APIs に対する重要な注意事項 をご参照ください。
AWS 管理コンソールで、 API Gateway を検索し、選択します。
Create API を選択します。
REST API の下にある Build を選択します。 プライベート の REST API を作成するには、 REST API Private の下にある Build を選択します。
以下のオプションのいずれかを選択します。
手動でエンドポイントを追加して API を作成するには、 New API を選択します。
OpenAPI 定義ファイルを使用して API を作成するには、 Import API を選択し、ファイルをアップロードするか、コードエディターに定義を貼り付けます。
API name とオプションで Description を入力します。
注釈
プライベート REST API を作成する際、 VPC エンドポイント ID を入力する必要はありません。
Create API を選択します。
API Gatewayでの REST API の作成と開発の詳細については、 Amazon API Gateway開発者ガイド を参照してください。
IAM ポリシーを作成し、ロールに添付する¶
このステップでは、Snowflakeが API Gatewayに接続するために使用できる AWS IAM ロールを作成します。API を呼び出す許可を与えるポリシーをロールに添付します。
AWS 管理コンソールで、 IAM を検索し、選択します。
左側のナビゲーションペインから Policies を選択します。
Create policy を選択し、 Policy editor に JSON を選択します。
空のポリシーを、 API メソッドを呼び出す許可を持つポリシーに置き換えます。たとえば、次の一般ポリシーは、 AWS アカウントのすべての API Gatewayリソースに対して起動アクションを許可します。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "execute-api:Invoke" ], "Resource": "arn:aws:execute-api:*:<aws_account_id>:*" } ] }
重要
ベストプラクティスとして、ユースケースに最低限必要な権限を付与するポリシーを使用してください。その他のガイダンスおよびポリシー例については、 IAM 権限で API へのアクセスを制御 を参照してください。
Next を選択します。
Policy name (例:
snowflake_access
)とオプションの Description を入力します。Create policy を選択します。
IAM ダッシュボードの左側のナビゲーションペインから、 Roles を選択します。
ポリシーを添付するロールを選択します。カタログ統合を作成するときに、このロールを指定します。ロールを持っていない場合は、 新しいロールを作成します。
Permissions タブのロール Summary ページで、 Add permissions » Attach policies を選択します。
API Gateway用に作成したポリシーを検索し、その横にあるボックスにチェックを入れ、 Add permissions を選択します。
ロール Summary のページで、ロール ARN をコピーします。この ARN は、カタログ統合を作成するときに指定します。
API Gatewayリソースポリシーを添付(プライベート APIs のみ)¶
REST API がプライベートの場合、Amazon API Gatewayリソースポリシーを API に添付する必要があります。リソースポリシーにより、SnowflakeはSnowflakeアカウントが配置されているAmazon Virtual Private Cloud(VPC)から API を呼び出すことができます。
Snowflakeでは、 SYSTEM$GET_SNOWFLAKE_PLATFORM_INFO 関数を呼び出して、Snowflakeアカウントがある VPC の IDs を取得します。関数の出力から、"purpose": "generic"で識別された各プロパティについて、対応する VPC ID(s)を記録します。
SELECT SYSTEM$GET_SNOWFLAKE_PLATFORM_INFO();
出力:
{ "snowflake-vpc-id": ["vpc-c1c234a5"], "snowflake-egress-vpc-ids": [ ... { "id": "vpc-c1c234a5", "expires": "2025-03-01T00:00:00", "purpose": "generic" }, ... ] }
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::123456789XXX:assumed-role/<my_api_permissions_role_name>/snowflake" }, "Action": "execute-api:Invoke", "Resource": "<api_gateway_arn>/*/*/*", "Condition": { "StringEquals": { "aws:sourceVpc": "<snowflake_vpc_id>" } } } ] }
ポリシーの最初のステートメントは、Snowflake VPC から発信されていないすべてのリクエストを拒否します。2番目のステートメントは、 想定ロールセッションプリンシパル を使用するSnowflake VPC から発信されるリクエストからの(すべてのメソッドに対する)呼び出しアクションを許可します。
API Gatewayリソースポリシーについては、こちらをご覧ください。
エンドポイント URL の取得¶
REST API エンドポイント URL を取得します(または URL を 呼び出します)。エンドポイント URL を取得する前に、 API をステージにデプロイする必要があります。
Amazon API Gatewayコンソールで、 REST API を選択します。
左側のナビゲーションペインで、 Stages を選択します。
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'
CATALOG_API_TYPE = AWS_API_GATEWAY
)
REST_AUTHENTICATION = (
TYPE = SIGV4
SIGV4_IAM_ROLE = 'arn:aws:iam::123456789XXX:role/my_api_permissions_role'
SIGV4_EXTERNAL_ID = 'my_iceberg_external_id'
)
ENABLED = TRUE;
プライベート 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'
CATALOG_API_TYPE = AWS_PRIVATE_API_GATEWAY
)
REST_AUTHENTICATION = (
TYPE = SIGV4
SIGV4_IAM_ROLE = 'arn:aws:iam::123456789XXX:role/my_api_permissions_role'
SIGV4_EXTERNAL_ID = 'my_iceberg_external_id'
)
ENABLED = TRUE;
注釈
どちらの例も、(次のステップで) IAM ロールの信頼関係で使用できる 外部 ID (SIGV4_EXTERNAL_ID = 'my_iceberg_external_id'
)を指定します。
外部 ID を指定すると、 IAM ロールの信頼ポリシーを更新することなく、複数のカタログ統合で同じ IAM ロールを使用できます。カタログ統合を何度も作成したり置き換えたりする必要がある場合、この方法はテストシナリオで特に役立ちます。
IAM の信頼関係を設定する¶
カタログ統合の作成時にSnowflakeアカウントに作成された AWS IAM ユーザーの情報を取得し、 IAM ロールの信頼関係を構成します。
Snowflakeで、 DESCRIBE CATALOG INTEGRATION コマンドを呼び出します。
DESCRIBE CATALOG INTEGRATION my_rest_catalog_integration;
次の値を記録します。
値
説明
API_AWS_IAM_USER_ARN
Snowflakeアカウント用に作成された AWS IAM ユーザー。例えば、
arn:aws:iam::123456789001:user/abc1-b-self1234
。Snowflakeは、Snowflakeアカウント全体用に単一の IAM ユーザーをプロビジョニングします。API_AWS_EXTERNAL_ID
信頼関係を確立するために必要な外部 ID。カタログ統合の作成時に外部 ID (
SIGV4_EXTERNAL_ID
)が指定されなかった場合、Snowflakeは ID を生成して使用します。生成された外部IDでIAMのロール信頼ポリシーを更新できるように値を記録してください。AWS 管理コンソールで、 IAM を検索し、選択します。
左側のナビゲーションペインから Roles を選択します。
カタログ統合用に作成した IAM ロールを選択します。
Trust relationships タブを選択します。
Edit trust policy を選択します。
記録した値でポリシードキュメントを修正します。
{ "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>" } } } ] }
Update policy を選択して変更を保存します。