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ストレージを構成する前に、以下があることを確認してください。

ステップ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ポリシーを作成します。

  1. AWS Managementコンソールにサインインし、IAMサービスに移動します。

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

  3. エンドポイントリストの: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の`アクティブ化と非アクティブ化を参照してください。

  4. 左側のナビゲーションペインから:extui:`Policies`を選択し、:extui:`Create policy`を選択します。

  5. Policy editor には、 JSON を選択します。

  6. 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/*"
                        ]
                    }
                }
            }
        ]
    }
    
    Copy

    このポリシーは次の権限を提供します。

    • 指定されたS3パス内のオブジェクトの読み取り、書き込み、削除

    • バケットの内容をリストアップし、バケットの場所を取得

    • Icebergテーブルを作成および管理するpg_lakeの機能をサポート

  7. Next を選択します。

  8. ポリシー名(例:snowflake_pg_lake_access)とオプションの説明を入力します。

  9. Create policy を選択します。

ステップ3:IAMロールを作成する

SnowflakeがS3バケットにアクセスするために引き受けるIAMロールを作成します。

重要

このロールを作成する際は、:extui:`Maximum session duration`を``12 hours``に設定する必要があります。ストレージ統合は、デフォルトのセッション期間では機能しません。このセクションの最後のステップを参照してください。

  1. IDおよびアクセス管理(IAM)ダッシュボードの左側のナビゲーションペインから、 Roles を選択します。

  2. Create role を選択します。

  3. 信頼できるエンティティタイプとして AWS account を選択します。

  4. Another AWS account を選択します。

  5. Account ID フィールドに、自分の AWS アカウント ID を一時的に入力します。後のステップで信頼関係を変更し、Snowflakeにアクセス権限を付与します。

  6. Require external ID オプションを選択します。``0000``などのプレースホルダーとなる外部IDを入力します。後のステップで、Snowflakeによって生成された実際の外部IDを使用してこれを更新します。

    注釈

    外部 ID は、Snowflakeなどのサードパーティに AWS リソース(S3バケットなど)へのアクセスを許可するために使用されます。詳細については、 サードパーティに ID リソースへのアクセスを許可する場合の外部 AWS の使用方法 をご参照ください。

  7. Next を選択します。

  8. ステップ2で作成したポリシーを検索して選択します。S3アクセス用のIAMポリシーを作成します

  9. Next を選択します。

  10. ロールの名前と説明(例:snowflake_pg_lake_role)を入力し、:extui:`Create role`を選択します。

  11. ロールの概要ページにある Role ARN 値を見つけて記録します。Snowflakeでストレージ統合を作成するときに必要です。

  12. ロールの概要ページで、概要セクションの: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/');
Copy

条件:

注釈

ストレージ統合の作成には、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;
Copy

出力で、次の値を見つけて記録します。

  • STORAGE_AWS_IAM_USER_ARN:Snowflakeがロールを引き受けるために使用するIAMユーザーARN

  • STORAGE_AWS_EXTERNAL_ID:信頼ポリシーで使用する外部ID

次のステップでこれらの値を使用して、IAMロールの信頼ポリシーを構成します。

ステップ6:IAMロールの信頼ポリシーを更新する

`ステップ3で作成したIAMロールの信頼ポリシーを更新します。Snowflakeがロールを引き受けることを許可するIAMロール`_を作成します。

  1. AWS Managementコンソールにサインインし、IAMサービスに移動します。

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

  3. ステップ3で作成したロールを選択します。IAMロールを作成します

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

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

  6. ポリシードキュメントを次のテキストに置き換えます。

    {
        "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>"
                    }
                }
            }
        ]
    }
    
    Copy

    プレースホルダーの値を、`ステップ5で記録した値に置き換えます。SnowflakeのIAMユーザーARNおよび外部ID`_を取得します。

    • storage_aws_iam_user_arnSTORAGE_AWS_IAM_USER_ARN 値に置き換えます。これは``arn:aws:iam::<account_id>:user/snowflake-postgres-integration-management``という形式の完全なARNであり、ユーザー名は常に同じで、AWSアカウントIDのみが異なります。

    • storage_aws_external_idSTORAGE_AWS_EXTERNAL_ID 値に置き換えます。

  7. Update policy を選択して変更を保存します。

ステップ7:Postgresインスタンスへのストレージ統合を添付する

ストレージ統合をSnowflake Postgresインスタンスに添付します。ストレージ統合が添付されると、S3認証情報は自動的にPostgresコントロールプレーンに同期され、pg_lakeで使用できるようになります。

ALTER POSTGRES INSTANCE my_postgres_instance
  SET STORAGE_INTEGRATION = my_pg_lake_integration;
Copy

新しいPostgresインスタンスを作成するときに、ストレージ統合を指定することもできます。

CREATE POSTGRES INSTANCE my_postgres_instance
  ...
  STORAGE_INTEGRATION = my_pg_lake_integration;
Copy

Postgresインスタンスからストレージ統合を削除するには:

ALTER POSTGRES INSTANCE my_postgres_instance
  UNSET STORAGE_INTEGRATION;
Copy

ステップ8:pg_lakeの構成と使用

ストレージ統合を添付したら、Postgresインスタンスに接続してpg_lakeを構成します。使用可能な拡張機能のリストについては、:doc:`/user-guide/snowflake-postgres/postgres-extensions`を参照してください。

  1. pg_lake拡張機能を作成します。

    CREATE EXTENSION pg_lake CASCADE;
    
    Copy
  2. Icebergテーブルのデフォルトのストレージ場所を設定します。これは、ストレージ統合で指定された場所と一致する必要があります。

    SETコマンドは現在のセッションにのみ適用されます。

    SET pg_lake_iceberg.default_location_prefix = 's3://my-bucket/my-prefix';
    
    Copy

    現在および将来のすべてのセッションについて値を設定するには、代わりに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';
    
    Copy
  3. S3バケットの内容をリストして、ストレージ統合が正しく構成されていることを確認します。

    SELECT * FROM lake_file.list('s3://my-bucket/my-prefix/*');
    
    Copy

    ``my-bucket``と``my-prefix``を実際のバケット名とパスに置き換えます。構成が正しい場合、このクエリはその場所にあるファイルのリストを返します。バケットが空の場合、クエリはエラーなしで空の結果セットを返します。

  4. 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;
    
    Copy

セキュリティに関する考慮事項

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つのストレージの場所のみが許可されることに注意してください。

Tip

ストレージ統合エラーは、Postgresサーバーログに``Storage integration:``プレフィックス付きで記録されます。例:

Storage integration: IAM role must have Maximum Session Duration set to 12 hours

Postgresログへのアクセスについては、:doc:`/user-guide/snowflake-postgres/postgres-logging`を参照してください。

接続エラー

ストレージ統合を添付した後にpg_lakeがS3にアクセスできない場合:

  • インスタンスプロパティをクエリして、ストレージ統合がPostgresインスタンスに適切に添付されていることを確認します。

  • IAMロールの信頼ポリシーが、DESCRIBE STORAGE INTEGRATION出力から得た正しいSnowflakeのIAMユーザーARNおよび外部IDで更新されていることを確認します。

  • S3バケットのリージョンがSnowflakeアカウントのリージョンと一致していることを確認します。

  • ご使用のリージョンのSTSエンドポイントが、AWS IAMアカウントの設定でアクティブであることを確認します。

権限拒否エラー

S3へのアクセス時に権限拒否エラーが表示された場合:

  • ロールに添付されたIAMポリシーに、必要なすべての権限(s3:PutObjects3:GetObjects3:GetObjectVersions3:DeleteObjects3:DeleteObjectVersions3: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時間に設定されていることを確認します。