プライベート接続エンドポイントの管理: AWS

このトピックでは、 AWS へのプライベート接続で使用するプライベート接続エンドポイントの管理方法について説明します。

プライベート接続エンドポイントのプロビジョニング

SYSTEM$PROVISION_PRIVATELINK_ENDPOINT システム関数を使用し、サービスまたはリソースとホスト名を指定して、プライベート接続エンドポイントを作成できます。このシステム関数を使用する場合は、 ACCOUNTADMIN ロールを使用する必要があります。

注釈

外部ステージまたは外部ボリュームにプライベート接続を使用する場合は、ホスト名を指定する際にワイルドカード文字 (*) を使用する必要があります。ワイルドカードを使用しても、すべてのS3バケットがプライベート接続でアクセスされるわけではありません。プライベート接続が有効であるSnowflakeオブジェクト(つまり、外部ステージまたは外部ボリューム)から参照されるバケットのみ、 VPC エンドポイント経由でアクセスできます。

SYSTEM$PROVISION_PRIVATELINK_ENDPOINT 関数はプロバイダーサービス名とホスト名を引数として受け取ります。これらの値は、 AWS コマンドラインから describe-vpc-endpoint-services サブコマンドを使用して取得できます。 AWS ドキュメント で説明されているように、この AWS サブコマンドは ServiceName フィールドと PrivateDnsName フィールドを含む JSON オブジェクトを返します。SYSTEM$PROVISION_PRIVATELINK_ENDPOINT 関数にどの値を使用するかは、以下の表をご参照ください。

SYSTEM$PROVISION_PRIVATELINK_ENDPOINT 引数

describe-vpc-endpoint-services 出力

provider_service_name

ServiceName

host_name

PrivateDnsName

外部ステージまたは外部ボリュームにプライベート接続を使用する場合は、値をワイルドカードで指定する必要があります。

例えば、Amazon S3への外部アクセスで PrivateLink を作成するには、次の SQL ステートメントを実行して us-west-2 エンドポイントを構成します。

SELECT SYSTEM$PROVISION_PRIVATELINK_ENDPOINT(
  'com.amazonaws.us-west-2.s3',
  '*.s3.us-west-2.amazonaws.com'
);
Copy

ターゲットサービスが VPC エンドポイントサービス の場合、エンドポイントサービスは Snowflake に接続を許可する必要があります。エンドポイントを作成する前に、 SYSTEM$GET_PRIVATELINK_CONFIG の出力から privatelink-account-principal の値を 許可プリンシパル として VPC エンドポイントサービスに追加します。

次の SQL ステートメントは、エンドポイントを VPC エンドポイントサービスに構成します。Snowflakeアカウントと同じリージョンのサービスである必要があります。

SELECT SYSTEM$PROVISION_PRIVATELINK_ENDPOINT(
  'com.amazonaws.vpce.us-west-2.vpce-svc-012345678910f1234',
  'my.onprem.storage.com'
);
Copy

エンドポイントを作成した後、エンドポイントを使用できるようになるまでには時間がかかります。作成したエンドポイントのステータスの確認については、 SYSTEM$GET_PRIVATELINK_ENDPOINTS_INFO を参照してください。

直接アクセスできないエンドポイントへの接続セットアップ

すべてのサービスで、Snowflakeがインターフェイスエンドポイントを通じて特定のインスタンスに直接接続できるわけではありません。このような場合、代わりに プロキシをセットアップし、サービスを VPC エンドポイントサービス として公開することで、サービスへのアクセスを可能にすることができます。

Amazon RDS に特化したウォークスルーについては、ブログポスト Connecting To Amazon RDS Using Private Connectivity from Snowflake を参照してください。

ダイレクトアクセスが可能なサービスかどうかの確認

Snowflakeは通常、以下のいずれかが真であれば、プライベート接続を介して AWS サービスに直接アクセスできます。

  • サービスの DNS 名---その AWS DescribeVpcEndpointServices の出力から PrivateDnsName 値---にはワイルドカードがプレフィックスとして付きます。

    サービスの DNS 名がワイルドカード文字 * で始まる場合、 AWS がそのサービス上の個々のリソースへの直接アクセスをサポートしている可能性があります。DNS 名は通常この形式です。

    *.<service>.<region>.amazonaws.com
    
    Copy
  • サービスは純粋にデータプレーンです。 AWS Bedrock Runtime がその例です。

    特定のサービスについての情報は、 AWS のドキュメントやブログ記事を参照してください。

直接アクセスできない場合のサービスへのアクセス

インターフェイスエンドポイントを介した直接アクセスでサービスが可用性にならない場合、プロキシをセットアップし、 VPC エンドポイントサービスとしてサービスを公開することで、サービスへのアクセスを可能にすることができます。

そのようなサービスの例としては、以下のようなものがあります。

  • ec2.us-west-2.amazonaws.com のAmazon EC2 のインスタンス。

  • rds.us-west-2.amazonaws.com の Amazon Relational Database Service (RDS) サーバー。

プロキシ経由でのアクセス用に AWS をセットアップします。

プロキシを通してサービスインスタンスを公開するには、仮想プライベートクラウド (VPC) とロードバランサー (AWS) をセットアップし、 AWS エンドポイントサービスのサービス名とロードバランサー (DNS) 名を使用して Snowflake プライベートリンクエンドポイントを作成します。

以下、基本的な手順を説明します。

  1. AWS 上に、3つの異なる利用可能ゾーンにまたがるサブネットを持つ 仮想プライベートクラウド (VPC) を作成します。

    リソースの初期利用可能ゾーン (たとえば、az1とaz2) を選択します。Snowflakeはリージョンによっては新しい AZs をサポートしない場合があります。エンドポイントとその他のリソースが同じ可用性ゾーンに作成されていることを確認し、クロスゾーントラフィックを回避します。

  2. アクセスするサービス・インスタンスのネットワーク設定で、インスタンスが作成した VPC にあることを確かめます。

  3. アクセスしたいサービスインスタンスを含む ターゲットグループ を作成します。

  4. 作成したターゲットグループにトラフィックを転送する ネットワークロードバランサー を作成します。

  5. 作成したネットワークロードバランサーで エンドポイントサービス を作成します。

    エンドポイントサービス名---endpoint_service_name---を記録し、Snowflakeがサービスにアクセスできるようにセットアップする際に使用します。

  6. Snowflakeで以下のクエリを実行して、エンドポイントの作成を許可するSnowflakeアカウントプリンシパルを取得します。

    SELECT key, value FROM TABLE(FLATTEN(INPUT => PARSE_JSON(SYSTEM$GET_PRIVATELINK_CONFIG())));
    
    Copy
  7. クエリの結果から、 privatelink-account-principal キーを見つけ、その値をメモします。

  8. AWS で、作成したエンドポイントサービスについて、 Allow principals セクションを更新して、 ARN が Snowflake の privatelink-account-principal キー値であるプリンシパルを追加します。

  9. Snowflakeで、作成した AWS エンドポイントサービスへの プライベートエンドポイントを作成します

    SYSTEM$PROVISION_PRIVATELINK_ENDPOINT 関数を実行する場合、引数として以下の値を使用します。

    SYSTEM$PROVISION_PRIVATELINK_ENDPOINT 引数

    AWS 構成からの値

    provider_service_name

    AWS エンドポイント Service name--- エンドポイントサービスの詳細セクションにある endpoint_service_name 値。

    host_name

    DNS Name を作成したネットワークロードバランサーから取得します。

  10. AWS で、 PrivateLink の接続を承認します。

    1. 作成したエンドポイントサービスのエンドポイント接続に移動します。

    2. 保留中のエンドポイント接続を選択します。

    3. Accept Endpoint Connection Request をクリックします。

  11. 次のクエリを実行して、エンドポイントのステータスを確認します。

    エンドポイントのステータスが pendingAcceptance から available に変わったことを確認します。

    SELECT SYSTEM$GET_PRIVATELINK_ENDPOINTS_INFO();
    
    Copy

サービスへのプライベート接続エンドポイントの削除

SYSTEM$DEPROVISION_PRIVATELINK_ENDPOINT システム関数を使用し、サービスまたはリソースを指定して、プライベート接続エンドポイントを削除できます。

エンドポイントが削除されると、そのエンドポイントはキューに入り、7日後に削除されます。

このシステム関数を使用する場合は、 ACCOUNTADMIN ロールを使用する必要があります。

例えば、Amazon S3への外部アクセスで PrivateLink を削除するには、次の SQL ステートメントを実行します。

SELECT SYSTEM$DEPROVISION_PRIVATELINK_ENDPOINT('com.amazonaws.us-west-2.s3');
Copy

サービスへのプライベート接続エンドポイントの復元

SYSTEM$RESTORE_PRIVATELINK_ENDPOINT システム関数を使用し、サービスまたはリソースを指定して、削除キューに残っている削除済みのプライベート接続エンドポイントを復元できます。削除キューにエンドポイントが見つからない場合、エンドポイントを復元することはできません。

このシステム関数を使用する場合は、 ACCOUNTADMIN ロールを使用する必要があります。

例えば、Amazon S3への外部アクセスで PrivateLink を復元するには、次の SQL ステートメントを実行します。

SELECT SYSTEM$RESTORE_PRIVATELINK_ENDPOINT('com.amazonaws.us-west-2.s3');
Copy

サービスへのプライベート接続エンドポイントのリストアップ

SYSTEM$GET_PRIVATELINK_ENDPOINTS_INFO システム関数を使用すると、アカウント内のすべてのプライベート接続エンドポイント、およびエンドポイントに関する情報をリストアップできます。

このシステム関数を使用する場合は、 ACCOUNTADMIN ロールを使用する必要があります。

例えば、すべての AWS PrivateLink エンドポイントを AWS サービスでリストアップするには、次の SQL ステートメントを実行します。

SELECT SYSTEM$GET_PRIVATELINK_ENDPOINTS_INFO();
Copy

関数によって返される JSON オブジェクトのフィールドについては、 戻り値 をご参照ください。

注釈

ACCOUNT_USAGE スキーマの OUTBOUND_PRIVATELINK_ENDPOINTS ビューをクエリして、アカウントのプライベートエンドポイントをリストアップすることもできます。