Azure Blobストレージの外部テーブルを自動的に更新する

このトピックでは、Azureコンテナの Microsoft Azure Event Grid 通知を使用して、外部テーブルを作成し、外部テーブルメタデータを自動的に更新する手順について説明します。この操作は、メタデータを外部ステージと外部パスの関連ファイルの最新セットと同期します。つまり、

  • パス内の新しいファイルがテーブルメタデータに追加されます。

  • パス内のファイルへの変更は、テーブルメタデータで更新されます。

  • パス内になくなったファイルは、テーブルメタデータから削除されます。

Snowflakeは現在BLOBストレージのみをサポートしています。Snowflakeは、次のタイプのストレージアカウントをサポートしています。

  • BLOBストレージ

  • Data Lake Storage Gen2 --- プレビュー 機能としてサポートされています。

  • 汎用v2

Microsoft.Storage.BlobCreated イベントと Microsoft.Storage.BlobDeleted イベントのみが外部テーブルの自動更新をトリガーします。ディレクトリまたはオブジェクトの名前を変更しても、これらのイベントタイプはトリガーされません。

注釈

  • この機能は、Microsoft Azure クラウドプラットフォーム のSnowflakeアカウントに限定されます。

  • このトピックで説明されているタスクを実行するには、スキーマに対する CREATE STAGE および CREATE EXTERNAL TABLE 権限を持つロールを使用する必要があります。

    さらに、Microsoft Azureへの管理アクセスが必要です。Azure管理者でない場合は、Azure管理者に ステップ1:Event Gridサブスクリプションを構成する の手順を完了するよう依頼します。

このトピックの内容:

クラウドストレージへの安全なアクセスの構成

注釈

データファイルを格納するAzureBLOBストレージコンテナーへの安全なアクセスを既に構成している場合は、このセクションをスキップできます。

このセクションでは、Snowflakeストレージ統合オブジェクトを構成して、クラウドストレージの認証責任をSnowflake IDおよびアクセス管理(IAM)エンティティに委任する方法について説明します。

注釈

このオプションを強くお勧めします。これにより、クラウドストレージにアクセスするときに IAM 認証情報を提供する必要がなくなります。その他のストレージアクセスオプションについては データをロードするためのAzureコンテナーの構成 をご参照ください。

このセクションでは、ストレージ統合を使用して、Snowflakeが外部(Azure)ステージで参照されるAzureコンテナーに対してデータを読み書きできるようにする方法について説明します。統合は、名前付きのファーストクラスのSnowflakeオブジェクトであり、秘密キーまたはアクセストークンといった、クラウドプロバイダーの明示的な認証情報を渡す必要がありません。統合オブジェクトには、 アプリ登録 と呼ばれるAzure IDおよびアクセス管理(IAM)ユーザー ID が格納されます。組織の管理者は、このアプリにAzureアカウントで必要なアクセス許可を付与します。

統合では、統合を使用する外部ステージを作成するときにユーザーが指定できる場所を制限するコンテナー(およびオプションのパス)も指定する必要があります。

注釈

このセクションの手順を完了するには、ストレージアカウントを管理するAzureの権限が必要です。Azure管理者でない場合は、Azure管理者にこれらのタスクを実行するよう依頼します。

このセクションの内容:

ステップ1:Snowflakeでクラウドストレージ統合を作成する

CREATE STORAGE INTEGRATION コマンドを使用してストレージ統合を作成します。ストレージ統合は、Azureクラウドストレージ用に生成されたサービスプリンシパルと、許可またはブロックされたストレージの場所(コンテナーなど)のオプションセットを格納するSnowflakeオブジェクトです。組織のクラウドプロバイダー管理者は、生成されたサービスプリンシパルにストレージの場所に対するアクセス許可を付与します。このオプションにより、ユーザーはステージの作成時またはデータのロード時に認証情報の提供を回避できます。

単一のストレージ統合により、複数の外部(つまり、Azure)ステージをサポートできます。ステージ定義にある URL は、 STORAGE_ALLOWED_LOCATIONS パラメーターのために指定されたAzureコンテナー(およびオプションのパス)に合わせる必要があります。

注釈

この SQL コマンドを実行できるのは、アカウント管理者( ACCOUNTADMIN ロールを持つユーザー)またはグローバル CREATE INTEGRATION 権限を持つロールのみです。

CREATE STORAGE INTEGRATION <integration_name>
  TYPE = EXTERNAL_STAGE
  STORAGE_PROVIDER = AZURE
  ENABLED = TRUE
  AZURE_TENANT_ID = '<tenant_id>'
  STORAGE_ALLOWED_LOCATIONS = ('azure://<account>.blob.core.windows.net/<container>/<path>/', 'azure://<account>.blob.core.windows.net/<container>/<path>/')
  [ STORAGE_BLOCKED_LOCATIONS = ('azure://<account>.blob.core.windows.net/<container>/<path>/', 'azure://<account>.blob.core.windows.net/<container>/<path>/') ]

条件:

  • 統合名 は、新しい統合の名前です。

  • テナントID は、許可およびブロックされたストレージアカウントが属するOffice 365テナントの ID です。ストレージ統合は1つのテナントのみを認証できるため、許可およびブロックされたストレージの場所は、すべてこのテナントに属するストレージアカウントを参照する必要があります。

    テナント IDを見つけるには、Azureポータルにログインして Azure Active Directory » Properties をクリックします。テナント ID が Directory ID フィールドに表示されます。

  • コンテナー は、データファイルを保存するAzureコンテナーの名前です(例: mycontainer)。STORAGE_ALLOWED_LOCATIONS および STORAGE_BLOCKED_LOCATIONS パラメーターは、この統合を参照するステージが作成または変更されるときに、それぞれこれらのコンテナーへのアクセスを許可またはブロックします。

  • パス は、コンテナー内の論理ディレクトリを細かく制御するために使用できるオプションのパスです。

次の例では、2つのコンテナーとパスのいずれかを参照するために統合を使用する外部ステージを明示的に制限する統合を作成します。後のステップで、これらのコンテナーとパスのいずれかを参照する外部ステージを作成します。この統合を使用する複数の外部ステージは、許可されたコンテナーとパスを参照できます。

CREATE STORAGE INTEGRATION azure_int
  TYPE = EXTERNAL_STAGE
  STORAGE_PROVIDER = AZURE
  ENABLED = TRUE
  AZURE_TENANT_ID = 'a123b4c5-1234-123a-a12b-1a23b45678c9'
  STORAGE_ALLOWED_LOCATIONS = ('azure://myaccount.blob.core.windows.net/mycontainer1/mypath1/', 'azure://myaccount.blob.core.windows.net/mycontainer2/mypath2/')
  STORAGE_BLOCKED_LOCATIONS = ('azure://myaccount.blob.core.windows.net/mycontainer1/mypath1/sensitivedata/', 'azure://myaccount.blob.core.windows.net/mycontainer2/mypath2/sensitivedata/');

ステップ2:ストレージの場所にSnowflakeアクセスを許可する

  1. DESCRIBE INTEGRATION コマンドを実行して、同意 URL を取得します。

    DESC STORAGE INTEGRATION <integration_name>;
    

    条件:

AZURE_CONSENT_URL 列にある、次の形式を持つ URL に注意します。

https://login.microsoftonline.com/<tenant_id>/oauth2/authorize?client_id=<snowflake_application_id>

AZURE_MULTI_TENANT_APP_NAME 列の値にも注意します。これは、アカウント用に作成されたSnowflakeクライアントアプリケーションの名前です。これらの手順の後半で、許可されたストレージの場所でアクセストークンを取得するために必要な権限をこのアプリケーションに付与する必要があります。

  1. ウェブブラウザーで AZURE_CONSENT_URL URL 列の URL に移動します。このページには、Microsoft許可リクエストページが表示されます。

  2. Accept ボタンをクリックします。これにより、Snowflakeアカウント用に作成されたAzureサービスプリンシパルは、テナント内のリソースでアクセストークンを取得できます。アクセストークンの取得は、コンテナーに対する適切なアクセス許可をサービスプリンシパルに付与した場合にのみ成功します(次の手順を参照)。

  3. Microsoft Azureポータルにログインします。

  4. Azure Services » Storage Accounts に移動します。Snowflakeサービスプリンシパルアクセスを許可するストレージアカウントの名前をクリックします。

  5. Access Control (IAM) » Add role assignment をクリックします。

  6. Snowflakeサービスプリンシパルに付与する目的のロールを選択します。

    • Storage Blob Data Reader 読み取りアクセスのみを許可します。これにより、ストレージアカウントにステージングされたファイルからデータをロードできます。

    • Storage Blob Data Contributor 読み取りおよび書き込みアクセスを許可します。これにより、ストレージアカウントでステージングされたファイルからのデータのロードまたはアンロードが可能になります。

  7. Search for the Snowflake service principal. This is the identity in the AZURE_MULTI_TENANT_APP_NAME property in the DESC STORAGE INTEGRATION output (in Step 1). Search for the string before the underscore in the AZURE_MULTI_TENANT_APP_NAME property.

    重要

    • このセクションのMicrosoftリクエストページでリクエストされたSnowflakeサービスプリンシパルをAzureが作成するのに、1時間以上かかる場合があります。サービスプリンシパルがすぐに利用できない場合は、1~2時間待ってから、もう一度検索することをお勧めします。

    • サービスプリンシパルを削除すると、ストレージ統合が機能しなくなります。

  8. Save ボタンをクリックします。

    注釈

    Microsoft Azureのドキュメントによると、ロールの割り当てが反映されるまでに最大5分かかる場合があります。

ステップ1:Event Gridサブスクリプションを構成する

このセクションでは、Azure CLI を使用してAzure StorageイベントのEvent Gridサブスクリプションを設定する方法について説明します。このセクションで説明されている手順の詳細については、Azureドキュメントの次の記事をご参照ください:

リソースグループを作成する

Event Grid トピック は、ソース(つまり、Azureストレージ)がイベントを送信するエンドポイントを提供します。トピックは、関連するイベントのコレクションに使用されます。Event GridトピックはAzureリソースであり、Azureリソースグループに配置する必要があります。

次のコマンドを実行して、リソースグループを作成します。

az group create --name <resource_group_name> --location <location>

条件:

  • リソースグループ名 は、新しいリソースグループの名前です。

  • ロケーション は、Azure Storageアカウントの場所、またはSnowflakeの用語では 地域 です。

Event Gridリソースプロバイダーの有効化

次のコマンドを実行して、Event Gridリソースプロバイダーを登録します。この手順は、AzureアカウントでEvent Gridを使用したことがない場合にのみ必要です:

az provider register --namespace Microsoft.EventGrid
az provider show --namespace Microsoft.EventGrid --query "registrationState"

データファイル用のストレージアカウントの作成

次のコマンドを実行して、データファイルを保存するストレージアカウントを作成します。このアカウントは、BLOBストレージ(つまり、 BlobStorage の種類)または GPv2 (つまり、 StorageV2 の種類)アカウントでなければなりません。これら2つのアカウントタイプのみがイベントメッセージをサポートするためです。

注釈

BLOBストレージまたは GPv2 アカウントを既にお持ちの場合は、代わりにそのアカウントを使用できます。

例えば、BLOBストレージアカウントを作成します。

az storage account create --resource-group <resource_group_name> --name <storage_account_name> --sku Standard_LRS --location <location> --kind BlobStorage --access-tier Hot

条件:

  • リソースグループ名 は、 リソースグループの作成 で作成したリソースグループの名前です。

  • ストレージアカウント名 は、新しいストレージアカウントの名前です。

  • ロケーション は、Azure Storageアカウントの場所です。

ストレージキューのストレージアカウントの作成

次のコマンドを実行して、ストレージキューをホストするストレージアカウントを作成します。このアカウントは GPv2 アカウントでなければなりません。この種類のアカウントのみがストレージキューへのイベントメッセージをサポートするためです。

注釈

既に GPv2 アカウントをお持ちの場合、そのアカウントを使用して、データファイルとストレージキューの両方をホストできます。

例えば、 GPv2 アカウントを作成します:

az storage account create --resource-group <resource_group_name> --name <storage_account_name> --sku Standard_LRS --location <location> --kind StorageV2

条件:

  • リソースグループ名 は、 リソースグループの作成 で作成したリソースグループの名前です。

  • ストレージアカウント名 は、新しいストレージアカウントの名前です。

  • ロケーション は、Azure Storageアカウントの場所です。

ストレージキューの作成

1つのAzure Queue Storageキューで、多くのEvent Gridサブスクリプションのイベントメッセージを収集できます。最高のパフォーマンスを得るために、Snowflakeは、Snowflakeに関連するすべてのサブスクリプションに対応する、単一のストレージキューを作成することをお勧めします。

次のコマンドを実行して、ストレージキューを作成します。ストレージキューには、一連のメッセージ、この場合はEvent Gridからのイベントメッセージが格納されます:

az storage queue create --name <storage_queue_name> --account-name <storage_account_name>

条件:

参照用のストレージアカウントとキュー IDs のエクスポート

次のコマンドを実行して、次の手順の際にのちほどリクエストされる、ストレージアカウントとキュー IDs の環境変数を設定します。

  • Linuxまたは macOS:

    export storageid=$(az storage account show --name <data_storage_account_name> --resource-group <resource_group_name> --query id --output tsv)
    export queuestorageid=$(az storage account show --name <queue_storage_account_name> --resource-group <resource_group_name> --query id --output tsv)
    export queueid="$queuestorageid/queueservices/default/queues/<storage_queue_name>"
    
  • Windows:

    set storageid=$(az storage account show --name <data_storage_account_name> --resource-group <resource_group_name> --query id --output tsv)
    set queuestorageid=$(az storage account show --name <queue_storage_account_name> --resource-group <resource_group_name> --query id --output tsv)
    set queueid="%queuestorageid%/queueservices/default/queues/<storage_queue_name>"
    

条件:

Event Grid拡張機能のインストール

次のコマンドを実行して、Azure CLIのEvent Grid拡張機能をインストールします:

az extension add --name eventgrid

Event Gridサブスクリプションの作成

次のコマンドを実行して、Event Gridサブスクリプションを作成します。トピックをサブスクライブすると、Event Gridに追跡するイベントが通知されます:

  • Linuxまたは macOS:

    az eventgrid event-subscription create \
    --source-resource-id $storageid \
    --name <subscription_name> --endpoint-type storagequeue \
    --endpoint $queueid
    
  • Windows:

    az eventgrid event-subscription create \
    --source-resource-id %storageid% \
    --name <subscription_name> --endpoint-type storagequeue \
    --endpoint %queueid%
    

条件:

ステップ2: Snowflakeで通知統合を作成する

通知統合は、Snowflakeと、Azure Event Gridといった、サードパーティのクラウドメッセージキューサービス間のインターフェイスを提供するSnowflakeオブジェクトです。

注釈

Azure Queue Storageキューは、単一の通知の統合をサポートしています。イベント通知は通知の統合間で分割されるため、複数の通知統合で単一のストレージキューを参照すると、ターゲットテーブルのデータが失われる可能性があります。

ストレージキュー URL およびテナント ID の取得

  1. Microsoft Azureポータルにログインします。

  2. Storage account » Queue service » Queues に移動します。後で参照できるように、 ストレージキューの作成 で作成したキューの URL を記録します。 URL の形式は次のとおりです。

    https://<storage_account_name>.queue.core.windows.net/<storage_queue_name>
    
  3. Azure Active Directory » Properties に移動します。後で参照できるように、 Directory ID 値を記録します。Event GridサブスクリプションへのSnowflakeアクセスを許可する同意 URL を生成するには、ディレクトリ IDまたは テナント ID が必要です。

統合の作成

CREATE NOTIFICATION INTEGRATION コマンドを使用して統合を作成します。

注釈

この SQL コマンドを実行できるのは、アカウント管理者( ACCOUNTADMIN ロールを持つユーザー)またはグローバル CREATE INTEGRATION 権限を持つロールのみです。

CREATE NOTIFICATION INTEGRATION <integration_name>
  ENABLED = true
  TYPE = QUEUE
  NOTIFICATION_PROVIDER = AZURE_STORAGE_QUEUE
  AZURE_STORAGE_QUEUE_PRIMARY_URI = '<queue_URL>'
  AZURE_TENANT_ID = '<directory_ID>';

条件:

例:

CREATE NOTIFICATION INTEGRATION my_azure_int
  ENABLED = true
  TYPE = QUEUE
  NOTIFICATION_PROVIDER = AZURE_STORAGE_QUEUE
  AZURE_STORAGE_QUEUE_PRIMARY_URI = 'https://myqueue.queue.core.windows.net/mystoragequeue'
  AZURE_TENANT_ID = 'a123bcde-1234-5678-abc1-9abc12345678';

ストレージキューへのSnowflakeアクセスの許可

  1. DESCRIBE INTEGRATION コマンドを実行して、同意 URL を取得します。

    DESC NOTIFICATION INTEGRATION <integration_name>;
    

    条件:

  2. AZURE_CONSENT_URL 列にある、次の形式を持つ URL に注意します。

    https://login.microsoftonline.com/<tenant_id>/oauth2/authorize?client_id=<snowflake_application_id>
    
  3. ウェブブラウザーで URL に移動します。このページには、Microsoft許可リクエストページが表示されます。

  4. Accept ボタンをクリックして、SnowflakeをActive Directoryに登録します。

  5. Microsoft Azureポータルにログインします。

  6. Azure Active Directory » Enterprise applications に移動します。Snowflakeアプリケーションがリストされていることを確認します。

    重要

    Azure Active DirectoryでSnowflakeアプリケーションを削除すると、通知統合が機能しなくなります。

  7. Queues » ストレージキュー名 に移動します。 ストレージキュー名 は、 ストレージキューの作成 で作成したストレージキューの名前です。

  8. Access Control (IAM) » Add role assignment をクリックします。

  9. Snowflakeアプリケーションを検索します。

  10. Snowflakeアプリに次の権限を付与します。

    • Role: ストレージキューデータコントリビューター(プレビュー)

    • Assign access to: Azure AD のユーザー、グループ、またはサービスプリンシパル

    • Select: SnowflakeアプリケーションID

    Snowflakeアプリケーションが Storage Queue Data Contributor の下にリストされるはずです(同じダイアログ上)。

ステップ3:ステージを作成する(必要な場合)

CREATE STAGE コマンドを使用して、Azureコンテナーを参照する外部ステージを作成します。Snowflakeは、ステージングされたデータファイルを外部テーブルメタデータに読み取ります。または、既存の外部ステージを使用できます。

注釈

クラウドストレージの場所への安全なアクセスを構成するには、 クラウドストレージへの安全なアクセスの構成 (このトピック内)を参照してください。

次の例では、ユーザーセッションのアクティブスキーマに mystage という名前のステージを作成します。クラウドストレージ URL にはパス files が含まれています。ステージは myint という名前のストレージ統合を参照します。

USE SCHEMA mydb.public;

CREATE STAGE mystage
  URL='azure://myaccount.blob.core.windows.net/mycontainer/files/'
  STORAGE_INTEGRATION = myint;

注釈

Data Lake Storage Gen2を含む、サポートされているすべてのタイプのAzure BLOBストレージアカウントに、 blob.core.windows.net エンドポイントを使用します。

ステップ4:外部テーブルを作成する

CREATE EXTERNAL TABLE コマンドを使用して外部テーブルを作成します。

例えば、 path1/ パスで mystage ステージにステージングされたファイルから JSON データを読み取る mydb.public スキーマに外部テーブルを作成します。

INTEGRATION パラメーターは 、 統合の作成 で作成した my_azure_int 統合を参照します。統合名はすべて大文字で指定する必要があります。

AUTO_REFRESH パラメーターはデフォルトで TRUE であることに注意してください:

CREATE OR REPLACE EXTERNAL TABLE ext_table
 INTEGRATION = 'MY_AZURE_INT'
 WITH LOCATION = @mystage/path1/
 FILE_FORMAT = (TYPE = JSON);

これで、自動更新のある外部ステージが構成されました。

新規または更新されたデータファイルがAzureコンテナに追加されると、イベント通知はSnowflakeに通知して、それらを外部テーブルメタデータにスキャンします。

ステップ5:外部テーブルのメタデータを手動で更新する

REFRESH パラメーターを指定した ALTER EXTERNAL TABLE を使用して、外部テーブルのメタデータを1回手動で更新します。例:

ALTER EXTERNAL TABLE ext_table REFRESH;

+---------------------------------------------+----------------+-------------------------------+
| file                                        | status         | description                   |
|---------------------------------------------+----------------+-------------------------------|
| files/path1/file1.json                      | REGISTERED_NEW | File registered successfully. |
| files/path1/file2.json                      | REGISTERED_NEW | File registered successfully. |
| files/path1/file3.json                      | REGISTERED_NEW | File registered successfully. |
+---------------------------------------------+----------------+-------------------------------+

このステップは、外部テーブル定義のステージおよびパス内のファイルのリストとメタデータを同期します。また、このステップにより、外部テーブルが指定されたステージとパスのデータファイルを読み取ることができ、外部テーブル定義に欠落しているファイルがないことが徹底されます。

file 列のファイルのリストが期待と一致しない場合、外部テーブル定義と外部ステージ定義のパスを確認します。外部テーブル定義のパスは、ステージ定義で指定されたパスに追加されます。詳細については、 CREATE EXTERNAL TABLE をご参照ください。

重要

外部テーブルの作成後にこの手順が少なくとも1回正常に完了しない場合、外部テーブルのクエリは、Event Grid通知が外部テーブルのメタデータを初めて自動的に更新するまで結果を返しません。

これにより、ステップ4以降に発生したファイルリストへの変更とメタデータが同期されます。その後、Event Grid通知はメタデータの更新を自動的にトリガーします。

ステップ6:セキュリティを構成する

外部テーブルのクエリに使用される追加のロールごとに、 GRANT <権限> ... TO ROLE を使用してさまざまなオブジェクト(つまり、データベース、スキーマ、ステージ、およびテーブル)に十分なアクセス制御権限を付与します。

オブジェクト

権限

注意

データベース

USAGE

スキーマ

USAGE

名前付きステージ

USAGE , READ

名前付きファイル形式

USAGE

オプション: ステップ3:ステージを作成する(必要な場合) で作成したステージが名前付きファイル形式を参照する場合にのみ必要です。

外部テーブル

SELECT