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

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

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

オプション1:

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

注釈

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

  • ストレージ統合を使用した 政府リージョン のAzure BLOBストレージへのアクセスは、同じ政府リージョンのAzureでホストされているSnowflakeアカウントに限定されていることに注意してください。直接認証情報を使用した、政府リージョン外でホストされているアカウントからBLOBストレージへのアクセスがサポートされています。

オプション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>/') ]
Copy

条件:

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

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

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

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

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

次の例では、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/');
Copy

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

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

    DESC STORAGE INTEGRATION <integration_name>;
    
    Copy

    条件:

次の列の値に注意します。

AZURE_CONSENT_URL:

Microsoftのアクセス許可リクエストページへの URL。

AZURE_MULTI_TENANT_APP_NAME:

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

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

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

    Microsoftの権限リクエストページは、Snowflakeの企業サイト(snowflake.com)にリダイレクトされます。

  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 読み取りおよび書き込みアクセスを許可します。これにより、ストレージアカウントでステージングされたファイルからのデータのロードまたはアンロードが可能になります。このロールでは、 REMOVE コマンドを実行して、ストレージアカウントにステージングされたファイルを削除することもできます。

  7. Snowflakeサービスプリンシパルを検索します。これは DESC STORAGE INTEGRATION 出力(ステップ1)の AZURE_MULTI_TENANT_APP_NAME プロパティにあるIDです。AZURE_MULTI_TENANT_APP_NAME プロパティで、アンダースコアの 前にある 文字列を検索します。

    重要

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

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

    Azure Storage Consoleでロールの割り当てを追加する
  8. Review + assign ボタンをクリックします。

    注釈

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

    • Snowflakeは、一時的な認証情報を一定期間キャッシュしますが、60分の有効期限を越えることができません。Snowflakeからのアクセスを取り消すと、ユーザーはキャッシュの有効期限が切れるまでファイルを一覧表示し、クラウドストレージの場所からデータを読み込むことができる場合があります。

ステップ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;
    
    Copy
  • CREATE STAGE ステートメントでストレージ統合を参照するには、ストレージ統合オブジェクトに対する USAGE 権限がロールに必要です。

  • URL 値にスラッシュ(/)を追加して、指定したフォルダーパスにフィルターをかけます。スラッシュを省略すると、指定したパスのプレフィックスで始まるすべてのファイルとフォルダーが含まれます。

    ステージ内の非構造化データファイルにアクセスして取得するには、スラッシュが 必須 であることに注意してください。

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

注釈

  • ステージの所有者(つまり、ステージで 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 » <ストレージアカウント> を選択します。 Security + networking の下で、 Shared access signature を選択します。

    Azure Storage Consoleのストレージアカウントの詳細
  3. 次の 許可されるサービス を選択します。

    • Blob

  4. 次の 許可されたリソースタイプ を選択します。

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

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

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

    • 読む

    • リスト

    ファイルをコンテナにアンロードする場合は、 WriteAdd、および Create 権限も必要です。さらに、 PURGE = TRUE オプションを使用するには、 Permanent Delete 権限が必要です。

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

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

    Azure Storage Consoleの共有アクセス署名の詳細
  8. Generate SAS and connection string ボタンをクリックします。 SAS token フィールドに ? 含んで始まる、完全な値を記録します。これは SAS トークンです。外部ステージを作成するときに、このトークンを指定します。

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

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

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

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 = 'kPx...')
  FILE_FORMAT = my_csv_format;
Copy

この例で使用されている 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ステージの作成