pg_lake用のS3ストレージの構成¶
pg_lakeは、ParquetやORCなどのオブジェクトストレージ形式で格納されたデータの効率的なクエリを可能にするPostgreSQL拡張機能です。Snowflake Postgresでpg_lakeを使用する場合は、Snowflakeストレージ統合を使用して、データが保存されるAmazon S3バケットへのアクセスを構成します。
このトピックでは、AWS上でS3バケット権限を構成し、Snowflake Postgresがデータにアクセスできるようにするストレージ統合の作成方法について説明します。
注釈
現在、このS3ストレージはSnowflake Postgresでは管理されていません。独自のS3バケットを提供し、Postgresインスタンスに添付したストレージ統合を通じてアクセスを構成します。
前提条件¶
pg_lakeのS3ストレージを構成する前に、以下があることを確認してください。
`S3バケット<https://docs.aws.amazon.com/AmazonS3/latest/userguide/creating-buckets-s3.html>`_および`IAMロール<https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles.html>`_を作成したり管理したりする権限を持つ、アクティブなAWSアカウント。
Snowflakeアカウントと同じAWSリージョンにあるS3バケット。Snowflakeアカウントのリージョンを確認するには、Snowflakeで次のクエリを実行します(Postgresインスタンスではありません)。
SELECT CURRENT_REGION();
`AWS IAMロールおよびポリシー<https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html>`_に精通していること。
pg_lakeをサポートする:doc:
Snowflake Postgresインスタンス</user-guide/snowflake-postgres/postgres-create-instance>。Snowflakeでストレージ統合を作成するための権限(ACCOUNTADMINロール、またはアカウントに対するCREATE INTEGRATION権限を持つロールが必要)。
ステップ1:S3バケットの作成¶
まだお持ちでない場合は、Snowflakeアカウントと同じAWSリージョンにS3バケットを作成します。たとえば、Snowflakeアカウントが``us-west-2``にある場合は、``us-west-2``リージョンにS3バケットを作成します。
`S3バケットの作成<https://docs.aws.amazon.com/AmazonS3/latest/userguide/creating-buckets-s3.html>`_の指示については、AWSのドキュメントを参照してください。
ステップ2:S3アクセス用のIAMポリシーの作成¶
pg_lakeがS3バケットからの読み取りおよびS3バケットへの書き込みを行うために必要な権限を付与するIAMポリシーを作成します。
AWS Managementコンソールにサインインし、IAMサービスに移動します。
左側のナビゲーションペインから Account settings を選択します。
エンドポイントリストの:extui:`Security Token Service (STS)`で、アカウントが存在するSnowflakeリージョンを見つけます。STSのステータスが非アクティブな場合は、トグルを:extui:`Active`に動かします。詳細については、AWSリージョン<https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_enable-regions.html>`_でのAWS STSの`アクティブ化と非アクティブ化を参照してください。
左側のナビゲーションペインから:extui:`Policies`を選択し、:extui:`Create policy`を選択します。
Policy editor には、 JSON を選択します。
SnowflakeがS3バケットとフォルダーにアクセスできるようにするポリシードキュメントを追加します。``bucket_name``と``prefix``を実際のバケット名とフォルダーパスプレフィックスに置き換えます。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:PutObject", "s3:GetObject", "s3:GetObjectVersion", "s3:DeleteObject", "s3:DeleteObjectVersion" ], "Resource": "arn:aws:s3:::bucket_name/prefix/*" }, { "Effect": "Allow", "Action": [ "s3:ListBucket", "s3:GetBucketLocation" ], "Resource": "arn:aws:s3:::bucket_name", "Condition": { "StringLike": { "s3:prefix": [ "prefix/*" ] } } } ] }
このポリシーは次の権限を提供します。
指定されたS3パス内のオブジェクトの読み取り、書き込み、削除
バケットの内容をリストアップし、バケットの場所を取得
Icebergテーブルを作成および管理するpg_lakeの機能をサポート
Next を選択します。
ポリシー名(例:
snowflake_pg_lake_access)とオプションの説明を入力します。Create policy を選択します。
ステップ3:IAMロールを作成する¶
SnowflakeがS3バケットにアクセスするために引き受けるIAMロールを作成します。
重要
このロールを作成する際は、:extui:`Maximum session duration`を``12 hours``に設定する必要があります。ストレージ統合は、デフォルトのセッション期間では機能しません。このセクションの最後のステップを参照してください。
IDおよびアクセス管理(IAM)ダッシュボードの左側のナビゲーションペインから、 Roles を選択します。
Create role を選択します。
信頼できるエンティティタイプとして AWS account を選択します。
Another AWS account を選択します。
Account ID フィールドに、自分の AWS アカウント ID を一時的に入力します。後のステップで信頼関係を変更し、Snowflakeにアクセス権限を付与します。
Require external ID オプションを選択します。``0000``などのプレースホルダーとなる外部IDを入力します。後のステップで、Snowflakeによって生成された実際の外部IDを使用してこれを更新します。
注釈
外部 ID は、Snowflakeなどのサードパーティに AWS リソース(S3バケットなど)へのアクセスを許可するために使用されます。詳細については、 サードパーティに ID リソースへのアクセスを許可する場合の外部 AWS の使用方法 をご参照ください。
Next を選択します。
Next を選択します。
ロールの名前と説明(例:
snowflake_pg_lake_role)を入力し、:extui:`Create role`を選択します。ロールの概要ページにある Role ARN 値を見つけて記録します。Snowflakeでストレージ統合を作成するときに必要です。
ロールの概要ページで、概要セクションの:extui:
Edit`を選択し、:extui:`Maximum session duration`を``12 hours``に変更します。:extui:`Save changesを選択します。詳細については、`ロールの最大セッション時間の変更(AWS)<https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use.html#id_roles_use_view-role-max-session>`_を参照してください。
ステップ4:Snowflakeでストレージ統合を作成する¶
Snowflakeで、作成したIAMロールを参照するストレージ統合オブジェクトを作成します。完全なコマンドの構文については、:doc:`/sql-reference/sql/create-storage-integration`を参照してください。
CREATE STORAGE INTEGRATION my_pg_lake_integration
TYPE = POSTGRES_EXTERNAL_STORAGE
STORAGE_PROVIDER = 'S3'
ENABLED = TRUE
STORAGE_AWS_ROLE_ARN = 'arn:aws:iam::123456789012:role/snowflake_pg_lake_role'
STORAGE_ALLOWED_LOCATIONS = ('s3://my-bucket/my-prefix/');
条件:
``my_pg_lake_integration``は、ストレージ統合用に選択した名前です。
``TYPE = POSTGRES_EXTERNAL_STORAGE``は、この統合がSnowflake Postgres用であることを指定します。
``STORAGE_AWS_ROLE_ARN``は、ステップ3で記録したロールARNです。IAMロールを作成します。
``STORAGE_ALLOWED_LOCATIONS``は、S3バケットとパスプレフィックスを指定します。``my-bucket``と``my-prefix``を、ステップ1で作成したバケット名とフォルダーパスに置き換えます。S3バケットを作成します。Postgresストレージ統合では1つの場所のみを使用できることに注意してください。
注釈
ストレージ統合の作成には、ACCOUNTADMINロール、またはアカウントに対するCREATE INTEGRATION権限を持つロールが必要です。詳細については、 アクセス制御権限 をご参照ください。
ステップ5:SnowflakeのIAMユーザーARNおよび外部IDの取得¶
ストレージ統合を作成したら、:doc:`/sql-reference/sql/desc-integration`コマンドを使用して、この統合用にSnowflakeが生成したAWS IAMユーザーおよび外部IDを取得します。
DESCRIBE STORAGE INTEGRATION my_pg_lake_integration;
出力で、次の値を見つけて記録します。
STORAGE_AWS_IAM_USER_ARN:Snowflakeがロールを引き受けるために使用するIAMユーザーARNSTORAGE_AWS_EXTERNAL_ID:信頼ポリシーで使用する外部ID
次のステップでこれらの値を使用して、IAMロールの信頼ポリシーを構成します。
ステップ6:IAMロールの信頼ポリシーを更新する¶
`ステップ3で作成したIAMロールの信頼ポリシーを更新します。Snowflakeがロールを引き受けることを許可するIAMロール`_を作成します。
AWS Managementコンソールにサインインし、IAMサービスに移動します。
左側のナビゲーションペインから Roles を選択します。
Trust relationships タブを選択します。
Edit trust policy を選択します。
ポリシードキュメントを次のテキストに置き換えます。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "<storage_aws_iam_user_arn>" }, "Action": "sts:AssumeRole", "Condition": { "StringEquals": { "sts:ExternalId": "<storage_aws_external_id>" } } } ] }
プレースホルダーの値を、`ステップ5で記録した値に置き換えます。SnowflakeのIAMユーザーARNおよび外部ID`_を取得します。
storage_aws_iam_user_arnをSTORAGE_AWS_IAM_USER_ARN値に置き換えます。これは``arn:aws:iam::<account_id>:user/snowflake-postgres-integration-management``という形式の完全なARNであり、ユーザー名は常に同じで、AWSアカウントIDのみが異なります。storage_aws_external_idをSTORAGE_AWS_EXTERNAL_ID値に置き換えます。
Update policy を選択して変更を保存します。
ステップ7:Postgresインスタンスへのストレージ統合を添付する¶
ストレージ統合をSnowflake Postgresインスタンスに添付します。ストレージ統合が添付されると、S3認証情報は自動的にPostgresコントロールプレーンに同期され、pg_lakeで使用できるようになります。
ALTER POSTGRES INSTANCE my_postgres_instance
SET STORAGE_INTEGRATION = my_pg_lake_integration;
新しいPostgresインスタンスを作成するときに、ストレージ統合を指定することもできます。
CREATE POSTGRES INSTANCE my_postgres_instance
...
STORAGE_INTEGRATION = my_pg_lake_integration;
Postgresインスタンスからストレージ統合を削除するには:
ALTER POSTGRES INSTANCE my_postgres_instance
UNSET STORAGE_INTEGRATION;
ステップ8:pg_lakeの構成と使用¶
ストレージ統合を添付したら、Postgresインスタンスに接続してpg_lakeを構成します。使用可能な拡張機能のリストについては、:doc:`/user-guide/snowflake-postgres/postgres-extensions`を参照してください。
pg_lake拡張機能を作成します。
CREATE EXTENSION pg_lake CASCADE;
Icebergテーブルのデフォルトのストレージ場所を設定します。これは、ストレージ統合で指定された場所と一致する必要があります。
SETコマンドは現在のセッションにのみ適用されます。
SET pg_lake_iceberg.default_location_prefix = 's3://my-bucket/my-prefix';
現在および将来のすべてのセッションについて値を設定するには、代わりにALTER DATABASEコマンドを使用します。複数のPostgresデータベースを使用する場合は、データベースごとにストレージの場所を設定してください。
-- Substitute the name of your database ALTER DATABASE my_database SET pg_lake_iceberg.default_location_prefix = 's3://my-bucket/my-prefix';
S3バケットの内容をリストして、ストレージ統合が正しく構成されていることを確認します。
SELECT * FROM lake_file.list('s3://my-bucket/my-prefix/*');
``my-bucket``と``my-prefix``を実際のバケット名とパスに置き換えます。構成が正しい場合、このクエリはその場所にあるファイルのリストを返します。バケットが空の場合、クエリはエラーなしで空の結果セットを返します。
Icebergテーブルを作成し、データを挿入し、クエリを実行することで、エンドツーエンドの構成を確認します。これが成功すると、pg_lakeはS3バケットから読み書きを行うことができます。
CREATE TABLE my_table ( id INT, data TEXT ) USING iceberg; INSERT INTO my_table VALUES (1, 'hello iceberg'); SELECT * FROM my_table;
セキュリティに関する考慮事項¶
pg_lakeのS3アクセスを構成するときは、次のセキュリティのベストプラクティスに注意してください。
IAMロールを使用する:Snowflake Postgresは静的な認証情報ではなくIAMロール引き受けを使用し、仮の認証情報と認証情報の自動ローテーションにより、さらに優れたセキュリティを提供します。
IAM権限を制限する:pg_lakeがアクセスする必要があるS3バケットパスに、最小限必要な権限のみを付与します。IAMポリシーは特定のバケットプレフィックスへのアクセスを制限する必要があります。
外部IDを監視する:信頼ポリシーの外部IDにより、SnowflakeアカウントのみがIAMロールを引き受けられるようになります。
ストレージ統合の変更を精査する:ストレージ統合の``STORAGE_AWS_ROLE_ARN``または``STORAGE_ALLOWED_LOCATIONS``の更新は、自動的にPostgresインスタンスに同期されます。
バケットポリシーを使用する:深度防御のために、IAMポリシーに加えてS3バケットポリシーの使用を検討してください。
S3アクセスログを有効にする:S3バケットのアクセスログを有効にして、アクセスパターンを監視および監査します。
リージョンの配置:最適なパフォーマンスを実現し、データのレジデンシー要件を満たすために、S3バケットがSnowflakeアカウントと同じAWSリージョンにあることを確認します。
トラブルシューティング¶
ストレージ統合の作成エラー¶
ストレージ統合の作成中にエラーが発生した場合:
ACCOUNTADMINロール、またはアカウントに対するCREATE INTEGRATION権限を持つロールがあることを確認します。
IAMロールARNが正しくフォーマットされ、AWSアカウントに存在することを確認します。
S3バケットの場所が正しい形式を使用していることを確認します:
s3://bucket-name/prefix/``POSTGRES_EXTERNAL_STORAGE``統合では、1つのストレージの場所のみが許可されることに注意してください。
接続エラー¶
ストレージ統合を添付した後にpg_lakeがS3にアクセスできない場合:
インスタンスプロパティをクエリして、ストレージ統合がPostgresインスタンスに適切に添付されていることを確認します。
IAMロールの信頼ポリシーが、DESCRIBE STORAGE INTEGRATION出力から得た正しいSnowflakeのIAMユーザーARNおよび外部IDで更新されていることを確認します。
S3バケットのリージョンがSnowflakeアカウントのリージョンと一致していることを確認します。
ご使用のリージョンのSTSエンドポイントが、AWS IAMアカウントの設定でアクティブであることを確認します。
権限拒否エラー¶
S3へのアクセス時に権限拒否エラーが表示された場合:
ロールに添付されたIAMポリシーに、必要なすべての権限(
s3:PutObject、s3:GetObject、s3:GetObjectVersion、s3:DeleteObject、s3:DeleteObjectVersion、s3:ListBucket、および``s3:GetBucketLocation``)が含まれていることを確認します。IAMロールの信頼ポリシーで、SnowflakeのIAMユーザーがロールを引き受けられるようになっていることを確認します。
S3バケットポリシー(存在する場合)で、IAMロールからのアクセスが拒否されていないことを確認します。
アクセスするS3パスが、``STORAGE_ALLOWED_LOCATIONS``で指定されたプレフィックスと一致していることを確認します。
信頼ポリシーエラー¶
IAMロールの引き受けに関連するエラーが発生した場合:
信頼ポリシーの外部IDが、ストレージ統合の``STORAGE_AWS_EXTERNAL_ID``と完全に一致していることを確認します。
信頼ポリシーのプリンシパルARNが、ストレージ統合の``STORAGE_AWS_IAM_USER_ARN``と一致していることを確認します。
IAMロールの最大セッション期間が12時間に設定されていることを確認します。