データをロードするためのAzureコンテナーの構成

このトピックでは、Microsoft Azureコンテナーに格納されているデータファイルへの安全なアクセスを構成する方法について説明します。

次のオプションがサポートされています。

オプション1

ストレージ統合オブジェクトを構成して、外部クラウドストレージの認証責任をAzureサービスプリンシパルに委任します。サービスプリンシパルは、Snowflakeなどのサービスを使用してAzureリソースにアクセスするために作成されたIDです。

注釈

このオプションを強くお勧めします。これにより、ステージの作成時またはデータのロード時に SAS トークンを提供する必要がなくなります。

オプション2

共有アクセス署名(SAS)トークンを生成して、Snowflakeがストレージアカウント内のオブジェクトへの制限付きアクセスを許可します。その後、 SAS トークンを使用して、コンテナーを参照する外部(Azure)ステージにアクセスできます。

注釈

このトピックの手順を完了するには、Azureへの管理アクセスが必要です。Azure管理者でない場合は、Azure管理者にこれらのタスクを実行するよう依頼します。

このトピックの内容:

オプション1:Snowflakeストレージ統合の構成

このセクションでは、ストレージ統合を使用して、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分かかる場合があります。

ステップ3:外部ステージを作成する

ステップ1:Snowflakeでクラウドストレージ統合を作成する (このトピック内)で作成したストレージ統合を参照する、外部(Azure)ステージを作成します。

注釈

ストレージ統合を使用するステージを作成するには、スキーマの CREATE STAGE 権限と統合の USAGE 権限を持つロールが必要です。例:

GRANT CREATE STAGE ON SCHEMA public TO ROLE myrole;

GRANT USAGE ON INTEGRATION azure_int TO ROLE myrole;

CREATE STAGE コマンドを使用してステージを作成します。

例えば、 mydb.public をユーザーセッションの現在のデータベースおよびスキーマとして設定し、 my_azure_stage という名前のステージを作成します。この例では、ステージは、統合でサポートされているAzureコンテナーとパス mycontainer1/path1 を参照します。ステージは、 my_csv_format という名前のファイル形式オブジェクトも参照します。

USE SCHEMA mydb.public;

CREATE STAGE my_azure_stage
  STORAGE_INTEGRATION = azure_int
  URL = 'azure://myaccount.blob.core.windows.net/container1/path1'
  FILE_FORMAT = my_csv_format;

注釈

  • ステージの所有者(つまり、ステージで OWNERSHIP 権限を持つロール)には、ストレージ統合に対する USAGE 権限が必要です。

  • 統合を使用するステージから、またはステージにデータをロードまたはアンロードするには、ステージに対する USAGE 権限がロールに必要です。ストレージ統合に対する USAGE 権限も、必要 ありません

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

  • STORAGE_INTEGRATION パラメーターは、 FILE_FORMAT などの他のステージパラメーターとは別に処理されます。これらの他のパラメーターのサポートは、Azureコンテナーへのアクセスに使用される統合に関係なく同じです。

オプション2: SAS トークンの生成

ステップ1: SAS トークンを生成する

次の詳細な手順では、ストレージアカウントのオブジェクトに対するSnowflakeの制限付きアクセスを許可する SAS トークンを生成する方法について説明します。

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

  2. ホームダッシュボードから、 Storage Accounts » <storage_account> » Settings » Shared access signature を選択します。

    Shared access signature in Azure portal
  3. 次の 許可されたリソースタイプ を選択します。

    • Container (ストレージアカウントのオブジェクトを一覧表示するために必要)

    • Object (ストレージアカウントとの間でオブジェクトを読み書きするために必要)

  4. 次の許可された権限を選択して、Azureリソースからデータファイルをロードします。

    • 読む

    • リスト

    ファイルをコンテナーにアンロードする場合は、追加の WriteAdd、および Create 権限も必要です。

  5. SAS トークンの開始日と有効期限を指定します。一般的なセキュリティ計画の一環として、異なる SAS トークンを定期的に生成できます。

  6. 許可された IP アドレス フィールドを空白のままにして、 HTTPS only または HTTPS and HTTPAllowed protocols 下)を指定します。

  7. Generate SAS ボタンをクリックします。SAS token フィールドに ? 含んで始まる、完全な値を記録します。これは SAS トークンです。外部ステージを作成するときに、このトークンを指定します。

ステップ2:外部ステージを作成する

ステップ1: SAS トークンを生成する (このトピック内)で生成した SAS トークンを参照する、外部(Azure)ステージを作成します。

次の例では、 SQL を使用して、Azureの認証情報とマスター暗号化キーを含む my_azure_stage という名前の外部ステージを作成します。ステージ URL はAzure myaccount アカウントを参照します。データファイルは mycontainer コンテナーと /load/files パスに保存されます。ステージは my_csv_format という名前のファイル形式オブジェクトを参照します。

CREATE OR REPLACE STAGE my_azure_stage
  URL='azure://myaccount.blob.core.windows.net/mycontainer/load/files'
  CREDENTIALS=(AZURE_SAS_TOKEN='?sv=2016-05-31&ss=b&srt=sco&sp=rwdl&se=2018-06-27T10:05:50Z&st=2017-06-27T02:05:50Z&spr=https,http&sig=bgqQwoXwxzuD2GJfagRg7VOS8hzNr3QLT7rhS8OFRLQ%3D')
  ENCRYPTION=(TYPE='AZURE_CSE' MASTER_KEY = 'kPxX0jzYfIamtnJEUTHwq80Au6NbSgPH5r4BDDwOaO8=')
  FILE_FORMAT = my_csv_format;

この例で使用されている AZURE_SAS_TOKEN と MASTER_KEY の値は、説明のみを目的としています。

注釈

ステージに名前付きファイル形式オブジェクト(または個々のファイル形式オプション)を指定すると、後でステージからデータをロードするために使用される COPY コマンドで同じファイル形式オプションを指定する必要がありません。ファイル形式オブジェクトとオプションの詳細については、 CREATE FILE FORMAT をご参照ください。

データファイルの暗号化

ストレージアカウントで保存データのAzure Storage Service Encryption(SSE)を直接有効にすると、Snowflakeがそれを正しく処理します。詳細については、 SSE のAzureドキュメント をご参照ください。

さらに、Snowflakeは、Azureコンテナーにステージングされたファイルを復号化するクライアント側の暗号化をサポートしています。

  • クライアント側の暗号化:

    • AZURE_CSE : MASTER_KEY 値が必要です。詳細については、Microsoft Azureのドキュメントの クライアント側の暗号化情報 をご参照ください。

      注釈

      ブロックBLOB および 追加BLOB はクライアント側の暗号化をサポートしますが、 ページBLOB はサポートしません。

次: Azureステージの作成