Amazon S3用ディレクトリテーブルの自動更新¶
このトピックでは、S3バケット用の Amazon SQS (Simple Queue Service) 通知を使用して、ディレクトリテーブルを作成し、ディレクトリテーブルのメタデータを自動的に更新する手順について説明します。この操作は、メタデータを外部ステージと外部パスの関連ファイルの最新セットと同期します。つまり、
パス内の新しいファイルがテーブルメタデータに追加されます。
パス内のファイルへの変更は、テーブルメタデータで更新されます。
パス内になくなったファイルは、テーブルメタデータから削除されます。
注釈
この機能は、 AWS のSnowflakeアカウントに制限されています。
このトピックで説明されているタスクを実行するには、スキーマに対する CREATE STAGE 権限を持つロールを使用する必要があります。
さらに、 AWS への管理アクセスが必要です。 AWS の管理者でない場合は、 AWS のイベント通知を設定するために必要な手順を完了するよう AWS の管理者に依頼してください。
Snowflakeは、コスト、イベントノイズ、遅延を低減するために、ディレクトリテーブルでサポートされているイベントのみを送信することをお勧めします。
このトピックの内容:
Amazon SQS を使用したディレクトリテーブルの自動更新の制限¶
Virtual Private Snowflake(VPS) および AWS PrivateLink のお客様: Amazon SQS は現在、 AWS によって VPC エンドポイント としてはサポートされていません。 VPC ( VPS を含む)内の AWS サービスは SQS と通信できますが、このトラフィックは VPC 内にないため、 VPC によって保護されません。
SQS 通知は、監視対象のS3バケットに新しいファイルが到着し、ロードする準備ができたときにSnowflakeに通知します。SQS 通知には、S3イベントとファイル名のリストが含まれます。通知にはファイルの実際のデータは 含まれません。
クラウドプラットフォームのサポート¶
S3イベントメッセージを使用した自動による外部メタデータ更新のトリガーは、Amazon Web Services(AWS)でホストされているSnowflakeアカウントでのみサポートされています。
クラウドストレージへの安全なアクセスの構成¶
注釈
データファイルを格納するS3バケットへの安全なアクセスをすでに構成している場合は、このセクションをスキップできます。
このセクションでは、Snowflakeストレージ統合オブジェクトを構成して、クラウドストレージの認証責任をSnowflake IDおよびアクセス管理(IAM)エンティティに委任する方法について説明します。
注釈
このオプションを強くお勧めします。これにより、クラウドストレージにアクセスするときに IAM 認証情報を提供する必要がなくなります。その他のストレージアクセスオプションについては Amazon S3へのセキュアアクセスの構成 をご参照ください。
このセクションでは、ストレージ統合を使用して、Snowflakeが外部(つまり、S3)ステージで参照されるAmazon S3バケットに対してデータを読み書きできるようにする方法について説明します。統合は、名前付きのファーストクラスのSnowflakeオブジェクトであり、秘密キーまたはアクセストークンといった、クラウドプロバイダーの明示的な認証情報を渡す必要がありません。統合オブジェクトには、 AWS IDおよびアクセス管理(IAM)ユーザー IDが保存されます。組織の管理者が、 AWS アカウントの統合 IAM ユーザー権限を付与します。
統合では、統合を使用する外部ステージを作成するときにユーザーが指定できる場所を制限するバケット(およびオプションのパス)もリストできます。
注釈
このセクションの手順を完了するには、 IAM ポリシーおよびロールの作成および管理のための AWS の権限が必要です。AWS 管理者でない場合は、 AWS 管理者にこれらのタスクを実行するように依頼します。
現在、ストレージ統合を使用した 政府リージョン のS3ストレージへのアクセスは、同じ政府リージョンの AWS でホストされているSnowflakeアカウントに限定されていることに注意してください。直接認証情報を使用した、政府リージョン外でホストされているアカウントからS3ストレージへのアクセスがサポートされています。
次の図は、S3ステージの統合フローを示しています。
外部(つまり、S3)ステージは、その定義でストレージ統合オブジェクトを参照します。
Snowflakeは、ストレージ統合をアカウント用に作成されたS3 IAM ユーザーに自動的に関連付けます。Snowflakeは、SnowflakeアカウントのすべてのS3ストレージ統合によって参照される単一の IAM ユーザーを作成します。
組織の AWS 管理者は、 IAM ユーザーにステージ定義で参照されているバケットにアクセスする権限を付与します。多数の外部ステージオブジェクトでは、異なるバケットとパスを参照し、認証に同じストレージ統合を使用できます。
ユーザーがステージに対してデータをロードまたはアンロードすると、Snowflakeは、アクセスを許可または拒否する前に、バケット上の IAM ユーザーに付与された権限を確認します。
このセクションの内容:
ステップ1: S3バケットのアクセス許可を構成する¶
AWS アクセス制御の要件¶
Snowflakeでは、フォルダー(およびサブフォルダー)内のファイルにアクセスできるようにするために、S3バケットおよびフォルダーに対する次の権限が必要です。
s3:GetBucketLocation
s3:GetObject
s3:GetObjectVersion
s3:ListBucket
ベストプラクティスとして、Snowflakeは、S3バケットへのSnowflakeアクセス用の IAM ポリシーを作成することをお勧めします。その後、ポリシーをロールに添付し、ロールのために AWS によって生成されたセキュリティ認証情報を使用して、バケット内のファイルにアクセスできます。
IAM ポリシーの作成¶
次の詳細な手順では、S3バケットにアクセスするために AWS 管理コンソールでSnowflakeのアクセス許可を構成する方法について説明します。
AWS 管理コンソールにログインします。
ホームダッシュボードから、 Identity & Access Management (IAM)を選択します。
左側のナビゲーションペインから Account settings を選択します。
Security Token Service Regions リストを展開し、アカウントがある 地域 に対応する AWS 地域を見つけ、ステータスが Inactive の場合は Activate を選択します。
左側のナビゲーションペインから Policies を選択します。
Create Policy をクリックします。
JSON タブをクリックします。
SnowflakeがS3バケットとフォルダーにアクセスできるようにするポリシードキュメントを追加します。
次のポリシー( JSON 形式)は、単一のバケットとフォルダーパスを使用してデータをロードまたはアンロードするために必要な権限をSnowflakeに提供します。
テキストをコピーしてポリシーエディターに貼り付けます。
注釈
bucket
とprefix
を実際のバケット名とフォルダーパスプレフィックスに確実に置き換えます。政府リージョン のバケットのAmazonリソースネーム(ARN)には、
arn:aws-us-gov:s3:::
プレフィックスがあります。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:GetObject", "s3:GetObjectVersion" ], "Resource": "arn:aws:s3:::<bucket>/<prefix>/*" }, { "Effect": "Allow", "Action": [ "s3:ListBucket", "s3:GetBucketLocation" ], "Resource": "arn:aws:s3:::<bucket>", "Condition": { "StringLike": { "s3:prefix": [ "<prefix>/*" ] } } } ] }
注釈
"s3:prefix":
条件を["*"]
または["< パス>/*"]
に設定すると、指定されたバケット内のすべてのプレフィックスまたはバケット内のパスへのアクセスがそれぞれ許可されます。AWS ポリシーは、さまざまなセキュリティユースケースをサポートします。
Review policy をクリックします。
ポリシー名(例:
snowflake_access
)とオプションの説明を入力します。 Create policy をクリックします。
ステップ2: IAM AWS ロールを作成する¶
AWS 管理コンソールでSnowflakeのアクセス許可を設定するには、次の手順を実行します。
AWS 管理コンソールにログインします。
ホームダッシュボードから、 Identity & Access Management (IAM)を選択します。
左側のナビゲーションペインから Roles を選択します。
Create role を選択します。
信頼できるエンティティタイプとして Another AWS account を選択します。
Account ID フィールドに、自分の AWS アカウント ID を一時的に入力します。後で、信頼関係を変更し、Snowflakeへのアクセスを許可します。
Require external ID オプションを選択します。外部 ID は、Snowflakeなどのサードパーティに AWS リソース(S3バケットなど)へのアクセスを許可するために使用されます。
0000
などのプレースホルダー ID を入力します。後のステップで、 IAM ロールの信頼関係を変更し、ストレージ統合の外部 ID を指定します。Next を選択します。
ステップ1: S3バケットのアクセス許可を構成する (このトピック内)で作成したポリシーを選択します。
Next を選択します。
ロールの名前と説明を入力し、 Create role を選択します。
これで、バケットの IAM ポリシー、および IAM ロールを作成し、ロールにポリシーを添付しました。
ロールの概要ページにある Role ARN 値を見つけて記録します。次のステップでは、このロールを参照するSnowflake統合を作成します。
注釈
Snowflakeは、一時的な認証情報を一定期間キャッシュしますが、60分の有効期限を越えることができません。Snowflakeからのアクセスを取り消すと、ユーザーはキャッシュの有効期限が切れるまでファイルをリストし、クラウドストレージの場所からデータにアクセスできる場合があります。
ステップ3:Snowflakeでクラウドストレージ統合を作成する¶
CREATE STORAGE INTEGRATION コマンドを使用してストレージ統合を作成します。ストレージ統合は、S3クラウドストレージ用に生成されたIDおよびアクセス管理(IAM)ユーザーと、許可またはブロックされたストレージロケーション(バケットなど)のオプションセットを保存するSnowflakeオブジェクトです。組織のクラウドプロバイダー管理者は、生成されたユーザーにストレージの場所に対するアクセス許可を付与します。このオプションにより、ユーザーはステージの作成時またはデータのロード時に、認証情報の提供を回避できます。
単一のストレージ統合で複数の外部(つまり、S3)ステージをサポートできます。ステージ定義にある URL は、 STORAGE_ALLOWED_LOCATIONS パラメーターのために指定されたS3バケット(およびオプションのパス)に合わせる必要があります。
注釈
この SQL コマンドを実行できるのは、アカウント管理者( ACCOUNTADMIN ロールを持つユーザー)またはグローバル CREATE INTEGRATION 権限を持つロールのみです。
CREATE STORAGE INTEGRATION <integration_name>
TYPE = EXTERNAL_STAGE
STORAGE_PROVIDER = 'S3'
ENABLED = TRUE
STORAGE_AWS_ROLE_ARN = '<iam_role>'
STORAGE_ALLOWED_LOCATIONS = ('s3://<bucket>/<path>/', 's3://<bucket>/<path>/')
[ STORAGE_BLOCKED_LOCATIONS = ('s3://<bucket>/<path>/', 's3://<bucket>/<path>/') ]
条件:
integration_name
は、新しい統合の名前です。iam_role
は、 ステップ2: AWS で IAM ロールを作成する (このトピック内)で作成したロールのAmazonリソースネーム(ARN)です。bucket
は、データファイルを保存するS3バケットの名前です(例:mybucket
)。必須の STORAGE_ALLOWED_LOCATIONS パラメーターおよびオプションの STORAGE_BLOCKED_LOCATIONS パラメーターは、この統合を参照するステージが作成または変更されたときに、それぞれこれらのバケットへのアクセスを制限またはブロックします。path
は、バケット内のオブジェクトを細かく制御するために使用できるオプションのパスです。
次の例では、アカウント内のすべてのバケットへのアクセスを許可し、定義された sensitivedata
フォルダーへのアクセスをブロックする統合を作成します。
この統合も使用する追加の外部ステージは、許可されたバケットとパスを参照できます。
CREATE STORAGE INTEGRATION s3_int TYPE = EXTERNAL_STAGE STORAGE_PROVIDER = 'S3' ENABLED = TRUE STORAGE_AWS_ROLE_ARN = 'arn:aws:iam::001234567890:role/myrole' STORAGE_ALLOWED_LOCATIONS = ('*') STORAGE_BLOCKED_LOCATIONS = ('s3://mybucket1/mypath1/sensitivedata/', 's3://mybucket2/mypath2/sensitivedata/');
注釈
オプションで、 STORAGE_AWS_EXTERNAL_ID パラメーターを使用して、独自の外部 ID を指定します。複数の外部ボリュームやストレージ統合で同じ外部 ID を使用する場合は、このオプションを選択します。
ステップ4:Snowflakeアカウントの AWS IAM ユーザーを取得する¶
Snowflakeアカウント用に自動的に作成された IAM ユーザーの ARN を取得するには、 DESCRIBE INTEGRATION を使用します。
DESC INTEGRATION <integration_name>;
条件:
integration_name
は、 ステップ3: Snowflakeでクラウドストレージ統合を作成する (このトピック内)で作成した統合の名前です。
例:
DESC INTEGRATION s3_int; +---------------------------+---------------+--------------------------------------------------------------------------------+------------------+ | property | property_type | property_value | property_default | +---------------------------+---------------+--------------------------------------------------------------------------------+------------------| | ENABLED | Boolean | true | false | | STORAGE_ALLOWED_LOCATIONS | List | s3://mybucket1/mypath1/,s3://mybucket2/mypath2/ | [] | | STORAGE_BLOCKED_LOCATIONS | List | s3://mybucket1/mypath1/sensitivedata/,s3://mybucket2/mypath2/sensitivedata/ | [] | | STORAGE_AWS_IAM_USER_ARN | String | arn:aws:iam::123456789001:user/abc1-b-self1234 | | | STORAGE_AWS_ROLE_ARN | String | arn:aws:iam::001234567890:role/myrole | | | STORAGE_AWS_EXTERNAL_ID | String | MYACCOUNT_SFCRole=2_a123456/s0aBCDEfGHIJklmNoPq= | | +---------------------------+---------------+--------------------------------------------------------------------------------+------------------+
次のプロパティの値を記録します。
プロパティ
説明
STORAGE_AWS_IAM_USER_ARN
Snowflakeアカウント用に作成された AWS IAM ユーザー。例えば、
arn:aws:iam::123456789001:user/abc1-b-self1234
。Snowflakeは、Snowflakeアカウント全体用に単一の IAM ユーザーをプロビジョニングします。アカウント内のすべてのS3ストレージ統合では、その IAM ユーザーが使用されます。STORAGE_AWS_EXTERNAL_ID
Snowflakeが AWS との信頼関係を確立するために使用する外部 ID。ストレージ統合の作成時に外部 ID (
STORAGE_AWS_EXTERNAL_ID
)を指定しなかった場合、Snowflakeは ID を生成して使用します。これらの値は次のセクションで提供します。
ステップ5:バケットオブジェクトにアクセスするために IAM ユーザー権限を付与する¶
次の手順では、S3バケットを使用してデータをロードおよびアンロードできるように、 AWS 管理コンソールでSnowflakeの IAM アクセス許可を構成する方法を説明します。
AWS 管理コンソールにログインします。
Identity & Access Management (IAM)を選択します。
左側のナビゲーションペインから Roles を選択します。
ステップ2: IAM AWS ロールを作成する (このトピック内)で作成したロールを選択します。
Trust relationships タブを選択します。
Edit trust relationship を選択します。
ステップ4:Snowflakeアカウントの AWS IAM ユーザーを取得する (このトピック内)で記録した DESC STORAGE INTEGRATION 出力値でポリシードキュメントを変更します。
IAM ロールのポリシードキュメント
{ "Version": "2012-10-17", "Statement": [ { "Sid": "", "Effect": "Allow", "Principal": { "AWS": "<snowflake_user_arn>" }, "Action": "sts:AssumeRole", "Condition": { "StringEquals": { "sts:ExternalId": "<snowflake_external_id>" } } } ] }
条件:
snowflake_user_arn
は、記録した STORAGE_AWS_IAM_USER_ARN 値です。snowflake_external_id
は、記録した STORAGE_AWS_EXTERNAL_ID 値です。この例では、
snowflake_external_id
の値はMYACCOUNT_SFCRole=2_a123456/s0aBCDEfGHIJklmNoPq=
です。注釈
セキュリティ上の理由から、外部 ID を指定せずに新しいストレージ統合を作成した場合(または CREATE OR REPLACE STORAGE INTEGRATION 構文を使用して既存のストレージ統合を再作成した場合)、新しい統合には 異なる 外部 ID が含まれるため、信頼ポリシーを更新しない限り信頼関係を解決できません。
Update Trust Policy ボタンを選択します。変更が保存されます。
注釈
Snowflakeは、一時的な認証情報を一定期間キャッシュしますが、60分の有効期限を越えることができません。Snowflakeからのアクセスを取り消すと、ユーザーはキャッシュの有効期限が切れるまでファイルを一覧表示し、クラウドストレージの場所からデータを読み込むことができる場合があります。
正しいオプションの決定¶
先に進む前に、データファイルが置かれているS3バケットのターゲットパス(または AWS 用語では「プレフィックス」)にS3イベント通知が存在するかどうかを確認します。AWS ルールでは、同じパスに対して競合する通知を作成することを禁止しています。
Amazon SQS を使用してディレクトリテーブルメタデータの更新を自動化するための、次のオプションがサポートされています。
オプション1。新しいS3イベント通知: S3バケットにあるターゲットパスのイベント通知を作成します。パス内の新しいファイル、削除されたファイル、または変更されたファイルでディレクトリテーブルのメタデータの更新が必要になると、イベント通知は SQS キューを介してSnowflakeに通知します。
重要
S3バケットに競合するイベント通知が存在する場合は、代わりにオプション2を使用します。
オプション2。既存のイベント通知: Amazon Simple Notification Service(SNS) をブロードキャスターとして構成し、ディレクトリテーブル更新自動化用のSnowflake SQS キューを含む、複数のエンドポイント(または「サブスクライバー」。例: SQS キューまたは AWS Lambdaワークロード)に通知を共有するようにします。SNS によって発行されたS3イベント通知は、 SQS キューを介してパス内のファイルの変更をSnowflakeに通知します。
注釈
ステージ、パイプ、ロード履歴の複製 を使用する場合は、このオプションを推奨します。複製グループまたはフェールオーバーグループを作成した後に、オプション1からオプション2に移行することもできます。詳細については、 Amazon Simple Notification Service(SNS)への移行 をご参照ください。
オプション1: 新しいS3イベント通知を作成する¶
このセクションでは、S3バケット用の Amazon SQS (Simple Queue Service) 通知を使用して、ディレクトリテーブルのメタデータを自動的に更新するための最も一般的なオプションについて説明します。ステップでは、データファイルが保存されているS3バケットのターゲットパス(または AWS の用語では「プレフィックス」)のイベント通知を作成する方法を説明します。
重要
S3バケットに対して競合するイベント通知が存在する場合は、代わりに オプション2:Amazon SNS を構成する (このトピック内)を使用します。AWS ルールでは、同じターゲットパスに対して競合する通知の作成を禁じています。
ステップ1: 含まれているディレクトリテーブルを使用してステージを作成する¶
CREATE STAGE コマンドを使用して、S3バケットを参照する外部ステージを作成します。Snowflakeは、ステージングされたデータファイルをディレクトリテーブルのメタデータに読み取ります。または、既存の外部ステージを使用できます。
注釈
クラウドストレージの場所への安全なアクセスを構成するには、 クラウドストレージへの安全なアクセスの構成 (このトピック内)をご参照ください。
CREATE STAGE ステートメントでストレージ統合を参照するには、ストレージ統合オブジェクトに対する USAGE 権限がロールに必要です。
-- External stage
CREATE [ OR REPLACE ] [ TEMPORARY ] STAGE [ IF NOT EXISTS ] <external_stage_name>
<cloud_storage_access_settings>
[ FILE_FORMAT = ( { FORMAT_NAME = '<file_format_name>' | TYPE = { CSV | JSON | AVRO | ORC | PARQUET | XML } [ formatTypeOptions ] } ) ]
[ directoryTable ]
[ COPY_OPTIONS = ( copyOptions ) ]
[ COMMENT = '<string_literal>' ]
注釈
URL 値の保存場所は、スラッシュ(/
)で終わる必要があります。
条件:
directoryTable (for Amazon S3) ::= [ DIRECTORY = ( ENABLE = { TRUE | FALSE } [ AUTO_REFRESH = { TRUE | FALSE } ] ) ]
ディレクトリテーブルパラメーター(directoryTable
)¶
ENABLE = TRUE | FALSE
ディレクトリテーブルをステージに追加するかどうかを指定します。値が TRUE の場合は、ステージとともにディレクトリテーブルが作成されます。
デフォルト:
FALSE
AUTO_REFRESH = TRUE | FALSE
[ WITH ] LOCATION =
設定で指定された名前付き外部ステージで 新しいまたは更新された データファイルが使用可能な場合に、Snowflakeがディレクトリテーブルのメタデータの自動更新トリガーを有効にするかどうかを指定します。TRUE
Snowflakeを使用すると、ディレクトリテーブルのメタデータの自動更新をトリガーできます。
FALSE
Snowflakeは、ディレクトリテーブルのメタデータの自動更新トリガーを有効にしません。 ALTER STAGE ... REFRESH を使用して、ディレクトリテーブルのメタデータを手動で定期的に更新し、メタデータをステージパスにあるファイルの現在のリストと同期する必要があります。
デフォルト:
FALSE
次の例では、ユーザーセッションのアクティブスキーマに mystage
という名前のステージを作成します。クラウドストレージ URL にはパス files
が含まれています。ステージは my_storage_int
という名前のストレージ統合を参照します。
USE SCHEMA mydb.public;
CREATE STAGE mystage
URL='s3://load/files/'
STORAGE_INTEGRATION = my_storage_int
DIRECTORY = (
ENABLE = true
AUTO_REFRESH = true
);
新規または更新されたデータファイルがクラウドストレージの場所に追加されると、イベント通知はSnowflakeに通知して、それらをディレクトリテーブルのメタデータにスキャンします。
ステップ2: イベント通知を構成する¶
S3バケットのイベント通知を設定して、ディレクトリテーブルのメタデータを読み込むための新しいデータまたは更新されたデータが利用可能になったときにSnowflakeに通知します。自動更新機能は、S3からSnowflakeへのイベント通知の配信を SQS キューに依存しています。
使いやすくするために、これらの SQS キューはSnowflakeによって作成および管理されます。 DESCRIBE STAGE コマンド出力には、 SQS キューのAmazonリソースネーム(ARN)が表示されます。
DESCRIBE STAGE コマンドを実行します。
DESC STAGE <stage_name>;
例:
DESC STAGE mystage;
directory_notification_channel
フィールドにあるディレクトリテーブルの SQS キューの ARN に注意してください。ARN を便利な場所にコピーします。注釈
AWS ガイドラインに従って、SnowflakeはS3バケットごとに1つ以下の SQS キューを指定します。この SQS キューは、同じ AWS アカウントの複数のバケットで共有できます。SQS キューは、同じS3バケットからデータファイルを読み取るすべてのディレクトリテーブルの通知を調整します。新しいデータファイルまたは変更されたデータファイルがバケットにアップロードされると、ステージディレクトリパスと一致するすべてのディレクトリテーブル定義がファイルの詳細をメタデータに読み込みます。
AWS 管理コンソールにログインします。
Amazon S3ドキュメント に記載されている手順を使用して、S3バケットのイベント通知を構成します。次のようにフィールドに入力します。
Name :イベント通知の名前(例:
Auto-ingest Snowflake
)。Events : ObjectCreate (All) および ObjectRemoved オプションを選択します。
Send to :ドロップダウンリストから SQS Queue を選択します。
SQS: ドロップダウンリストから Add SQS queue ARN を選択します。
SQS queue ARN : DESC STAGE 出力から SQS キュー名を貼り付けます。
注釈
これらの手順は、S3バケット全体のアクティビティをモニターする単一のイベント通知を作成します。これが最も簡単なアプローチです。この通知は、S3バケットディレクトリでより詳細なレベルで構成されたすべてのディレクトリテーブルを処理します。
または、上記のステップで、1つ以上のパスおよび/またはファイル拡張子(または AWS の用語では プレフィックス および サフィックス)を構成して、イベントアクティビティをフィルターします。手順については、関連する AWS ドキュメントトピック のオブジェクトキー名フィルタリング情報をご参照ください。通知で監視する追加のパスまたはファイル拡張子ごとにこれらの手順を繰り返します。
AWS では、これらの通知 キュー構成 の数がS3バケットごとに最大100に制限されます。
また、 AWS では、同じS3バケットのキュー構成の重複(イベント通知全体)が許可されません。たとえば、既存の通知が s3://mybucket/files/path1
に構成されている場合、 s3://mybucket/files
などの上位レベルで別の通知を作成することはできません。その逆も同様です。
これで、自動更新のある外部ステージが構成されました。
新規または更新されたデータファイルがS3バケットに追加されると、イベント通知はSnowflakeに通知して、それらをディレクトリテーブルのメタデータにスキャンします。
ステップ3: ディレクトリテーブルのメタデータを手動で更新する¶
ALTER STAGE コマンドを使用して、ディレクトリテーブルのメタデータを手動で更新します。
ALTER STAGE [ IF EXISTS ] <name> REFRESH [ SUBPATH = '<relative-path>' ]
条件:
REFRESH
ディレクトリテーブル定義で参照されるステージングされたデータファイルにアクセスし、テーブルメタデータを更新します。
パス内の新しいファイルがテーブルメタデータに追加されます。
パス内のファイルへの変更は、テーブルメタデータで更新されます。
パス内になくなったファイルは、テーブルメタデータから削除されます。
現在、ファイルがステージに追加、更新、または削除されるたびに、このコマンドを実行する必要があります。このステップでは、ディレクトリテーブルのステージ定義にある関連ファイルの最新セットとメタデータが同期されます。
SUBPATH = '<relative-path>'
任意で、相対パスを指定して、データファイルの特定のサブセットに対するメタデータを更新します。
たとえば、 mystage
という名前のステージでディレクトリテーブルのメタデータを手動で更新します。
ALTER STAGE mystage REFRESH;
重要
ディレクトリテーブルの作成後にこのステップが少なくとも1回正常に完了しなかった場合は、通知イベントがディレクトリテーブルのメタデータをトリガーして、初めて自動的に更新されるまで、ディレクトリテーブルをクエリしても結果は返されません。
ステップ4: セキュリティを構成する¶
ディレクトリテーブルのクエリに使用される追加のロールごとに、 GRANT <権限> を使用してさまざまなオブジェクト(つまり、データベース、スキーマ、ステージ、およびテーブル)に十分なアクセス制御権限を付与します。
オブジェクト |
権限 |
注意 |
---|---|---|
データベース |
USAGE |
|
スキーマ |
USAGE |
|
名前付きステージ |
USAGE , READ |
|
名前付きファイル形式 |
USAGE |
オプション2: Amazon SNS の構成¶
このセクションでは、S3バケット用の Amazon SQS (Simple Queue Service) 通知を使用して、ディレクトリテーブルのメタデータの更新を自動的にトリガーする方法について説明します。このステップでは、 Amazon Simple Notification Service(SNS) をブロードキャスターとして構成して、S3バケット用のイベント通知を複数のサブスクライバー(例: SQS キューまたは AWS Lambdaワークロード)にパブリッシュする方法を説明します。サブスクライバーには、ディレクトリテーブルの更新自動化用のSnowflake SQS キューを含みます。
注釈
これらの手順は、データファイルが置かれているS3バケットのターゲットパスにイベント通知が存在することを前提としています。イベント通知が存在しない場合は、次のいずれかを実行します。
その代わり、 オプション1:新しいS3イベント通知の作成 に従います。
S3バケットのイベント通知を作成し、このトピックの手順に従って進みます。詳細については、 Amazon S3のドキュメント をご参照ください。
前提条件:Amazon SNS トピックとサブスクリプションを作成する¶
AWS アカウントで SNS トピックを作成して、S3バケットのSnowflakeステージロケーションのすべてのメッセージを処理します。
S3イベント通知(例:他の SQS キューまたは AWS Lambdaワークロード)のターゲットの宛先をこのトピックにサブスクライブします。SNS バケットのイベント通知をトピックのすべてのサブスクライバーにパブリッシュします。
手順については、 SNS ドキュメント をご参照ください。
ステップ1:Snowflake SQS キューを SNS トピックに登録する¶
AWS 管理コンソールにログインします。
ホームダッシュボードから、 Simple Notification Service (SNS)を選択します。
左側のナビゲーションペインから Topics を選択します。
S3バケットのトピックを見つけます。トピック ARN に注意します。
Snowflakeクライアントを使用して、 SNS トピック ARNで SYSTEM$GET_AWS_SNS_IAM_POLICY システム関数をクエリします。
select system$get_aws_sns_iam_policy('<sns_topic_arn>');
この関数は、 SNS トピックをサブスクライブするSnowflake SQS キュー許可を付与する IAM ポリシーを返します。
例:
select system$get_aws_sns_iam_policy('arn:aws:sns:us-west-2:001234567890:s3_mybucket'); +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | SYSTEM$GET_AWS_SNS_IAM_POLICY('ARN:AWS:SNS:US-WEST-2:001234567890:S3_MYBUCKET') | +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | {"Version":"2012-10-17","Statement":[{"Sid":"1","Effect":"Allow","Principal":{"AWS":"arn:aws:iam::123456789001:user/vj4g-a-abcd1234"},"Action":["sns:Subscribe"],"Resource":["arn:aws:sns:us-west-2:001234567890:s3_mybucket"]}]} | +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
AWS 管理コンソールに戻ります。左側のナビゲーションペインから Topics を選択します。
S3バケットのトピックを選択し、 Edit ボタンをクリックします。 Edit ページが開きます。
Access policy - Optional をクリックして、ページのこの領域を展開します。
SYSTEM$GET_AWS_SNS_IAM_POLICY 関数の結果から追加された IAM ポリシーを JSON ドキュメントにマージします。
例:
元の IAM ポリシー(略称):
{ "Version":"2008-10-17", "Id":"__default_policy_ID", "Statement":[ { "Sid":"__default_statement_ID", "Effect":"Allow", "Principal":{ "AWS":"*" } .. } ] }
統合された IAM ポリシー:
{ "Version":"2008-10-17", "Id":"__default_policy_ID", "Statement":[ { "Sid":"__default_statement_ID", "Effect":"Allow", "Principal":{ "AWS":"*" } .. }, { "Sid":"1", "Effect":"Allow", "Principal":{ "AWS":"arn:aws:iam::123456789001:user/vj4g-a-abcd1234" }, "Action":[ "sns:Subscribe" ], "Resource":[ "arn:aws:sns:us-west-2:001234567890:s3_mybucket" ] } ] }
追加のポリシー許可を追加して、S3がバケットのイベント通知を SNS トピックに公開できるようにします。
例(これらの手順全体で使用される SNS トピック ARN およびS3バケットを使用):
{ "Sid":"s3-event-notifier", "Effect":"Allow", "Principal":{ "Service":"s3.amazonaws.com" }, "Action":"SNS:Publish", "Resource":"arn:aws:sns:us-west-2:001234567890:s3_mybucket", "Condition":{ "ArnLike":{ "aws:SourceArn":"arn:aws:s3:*:*:s3_mybucket" } } }
統合された IAM ポリシー:
{ "Version":"2008-10-17", "Id":"__default_policy_ID", "Statement":[ { "Sid":"__default_statement_ID", "Effect":"Allow", "Principal":{ "AWS":"*" } .. }, { "Sid":"1", "Effect":"Allow", "Principal":{ "AWS":"arn:aws:iam::123456789001:user/vj4g-a-abcd1234" }, "Action":[ "sns:Subscribe" ], "Resource":[ "arn:aws:sns:us-west-2:001234567890:s3_mybucket" ] }, { "Sid":"s3-event-notifier", "Effect":"Allow", "Principal":{ "Service":"s3.amazonaws.com" }, "Action":"SNS:Publish", "Resource":"arn:aws:sns:us-west-2:001234567890:s3_mybucket", "Condition":{ "ArnLike":{ "aws:SourceArn":"arn:aws:s3:*:*:s3_mybucket" } } } ] }
Save changes ボタンをクリックします。
ステップ2: 含まれているディレクトリテーブルを使用してステージを作成する¶
CREATE STAGE コマンドを使用して、S3バケットを参照する外部ステージを作成します。Snowflakeは、ステージングされたデータファイルをディレクトリテーブルのメタデータに読み取ります。または、既存の外部ステージを使用できます。
注釈
クラウドストレージの場所への安全なアクセスを構成するには、 クラウドストレージへの安全なアクセスの構成 (このトピック内)をご参照ください。
CREATE STAGE ステートメントでストレージ統合を参照するには、ストレージ統合オブジェクトに対する USAGE 権限がロールに必要です。
-- External stage
CREATE [ OR REPLACE ] [ TEMPORARY ] STAGE [ IF NOT EXISTS ] <external_stage_name>
<cloud_storage_access_settings>
[ FILE_FORMAT = ( { FORMAT_NAME = '<file_format_name>' | TYPE = { CSV | JSON | AVRO | ORC | PARQUET | XML } [ formatTypeOptions ] } ) ]
[ directoryTable ]
[ COPY_OPTIONS = ( copyOptions ) ]
[ COMMENT = '<string_literal>' ]
条件:
directoryTable (for Amazon S3) ::= [ DIRECTORY = ( ENABLE = { TRUE | FALSE } [ AUTO_REFRESH = { TRUE | FALSE } ] [ AWS_SNS_TOPIC = '<sns_topic_arn>' ] ) ]
ディレクトリテーブルパラメーター(directoryTable
)¶
ENABLE = TRUE | FALSE
ディレクトリテーブルをステージに追加するかどうかを指定します。値が TRUE の場合は、ステージとともにディレクトリテーブルが作成されます。
デフォルト:
FALSE
AUTO_REFRESH = TRUE | FALSE
[ WITH ] LOCATION =
設定で指定された名前付き外部ステージで 新しいまたは更新された データファイルが使用可能な場合に、Snowflakeがディレクトリテーブルのメタデータの自動更新トリガーを有効にするかどうかを指定します。TRUE
Snowflakeを使用すると、ディレクトリテーブルのメタデータの自動更新をトリガーできます。
FALSE
Snowflakeは、ディレクトリテーブルのメタデータの自動更新トリガーを有効にしません。 ALTER STAGE ... REFRESH を使用して、ディレクトリテーブルのメタデータを手動で定期的に更新し、メタデータをステージパスにあるファイルの現在のリストと同期する必要があります。
デフォルト:
FALSE
Amazon S3
AWS_SNS_TOPIC = '<SNSトピックARN>'
S3バケット用の SNS トピックの ARN を指定します。CREATE ディレクトリテーブルステートメントは、指定された SNS トピックにSnowflake SQS キューをサブスクライブします。
次の例では、ユーザーセッションのアクティブスキーマに mystage
という名前のステージを作成します。クラウドストレージ URL にはパス files
が含まれています。ステージは my_storage_int
という名前のストレージ統合を参照します。
USE SCHEMA mydb.public;
CREATE STAGE mystage
URL='s3://load/files/'
STORAGE_INTEGRATION = my_storage_int
DIRECTORY = (
ENABLE = true
AUTO_REFRESH = true
AWS_SNS_TOPIC = 'arn:aws:sns:us-west-2:001234567890:s3_mybucket'
);
新規または更新されたデータファイルがクラウドストレージの場所に追加されると、イベント通知はSnowflakeに通知して、それらをディレクトリテーブルのメタデータにスキャンします。
ステップ3: ディレクトリテーブルのメタデータを手動で更新する¶
ALTER STAGE コマンドを使用して、ディレクトリテーブルのメタデータを手動で更新します。
ALTER STAGE [ IF EXISTS ] <name> REFRESH [ SUBPATH = '<relative-path>' ]
条件:
REFRESH
ディレクトリテーブル定義で参照されるステージングされたデータファイルにアクセスし、テーブルメタデータを更新します。
パス内の新しいファイルがテーブルメタデータに追加されます。
パス内のファイルへの変更は、テーブルメタデータで更新されます。
パス内になくなったファイルは、テーブルメタデータから削除されます。
現在、ファイルがステージに追加、更新、または削除されるたびに、このコマンドを実行する必要があります。このステップでは、ディレクトリテーブルのステージ定義にある関連ファイルの最新セットとメタデータが同期されます。
SUBPATH = '<relative-path>'
任意で、相対パスを指定して、データファイルの特定のサブセットに対するメタデータを更新します。
たとえば、 mystage
という名前のステージでディレクトリテーブルのメタデータを手動で更新します。
ALTER STAGE mystage REFRESH;
重要
ディレクトリテーブルの作成後にこのステップが少なくとも1回正常に完了しなかった場合は、通知イベントがディレクトリテーブルのメタデータをトリガーして、初めて自動的に更新されるまで、ディレクトリテーブルをクエリしても結果は返されません。
ステップ4: セキュリティを構成する¶
ディレクトリテーブルのクエリに使用される追加のロールごとに、 GRANT <権限> を使用してさまざまなオブジェクト(つまり、データベース、スキーマ、ステージ、およびテーブル)に十分なアクセス制御権限を付与します。
オブジェクト |
権限 |
注意 |
---|---|---|
データベース |
USAGE |
|
スキーマ |
USAGE |
|
名前付きステージ |
USAGE , READ |
|
名前付きファイル形式 |
USAGE |