Google Cloud Storageの統合の構成¶
このトピックでは、Google Cloud Storageバケットに格納されているデータファイルへの安全なアクセスを構成する方法について説明します。
Snowflakeストレージ統合の構成¶
このセクションでは、ストレージ統合を使用して、Snowflakeが外部 (つまりクラウドストレージ) ステージで参照されるGoogle Cloud Storageバケットからデータを読み取り、バケットに書き込む方法について説明します。統合は、名前付きのファーストクラスSnowflakeオブジェクトであり、秘密キーやアクセストークンなどの明示的なクラウドプロバイダー認証情報を渡す必要がありません。代わりに、統合オブジェクトはCloud Storageサービスアカウントを参照します。組織の管理者は、Cloud Storageアカウントのサービスアカウントのアクセス許可を付与します。
管理者は、統合を使用する外部ステージによってアクセスされるCloud Storageバケット(およびオプションのパス)の特定のセットにユーザーを制限することもできます。
注釈
- このセクションの手順を完了するには、プロジェクトエディターとしてCloud Storageプロジェクトにアクセスする必要があります。プロジェクトエディターでない場合は、Cloud Storage管理者にこれらのタスクを実行するよう依頼してください。 
- Snowflakeが、ストレージがホストされているGoogle Cloud Storageリージョンをサポートしていることを確認します。詳細については、 サポートされているクラウドリージョン をご参照ください。 
次の図は、Cloud Storageステージの統合フローを示しています。
 
- 外部 (つまりクラウドストレージ) ステージは、その定義でストレージ統合オブジェクトを参照します。 
- Snowflakeは、ストレージ統合をアカウント用に作成されたCloud Storageサービスアカウントに自動的に関連付けます。Snowflakeは、Snowflakeアカウントのすべての GCS ストレージ統合によって参照される単一のサービスアカウントを作成します。 
- Cloud Storageプロジェクトのプロジェクトエディターは、ステージ定義で参照されているバケットにアクセスするためのアクセス許可をサービスアカウントに付与します。多数の外部ステージオブジェクトが、異なるバケットとパスを参照し、認証に同じ統合を使用できます。 
ユーザーがステージに対してデータをロードまたはアンロードすると、Snowflakeは、アクセスを許可または拒否する前に、バケットのサービスアカウントに付与された権限を確認します。
このセクションの内容:
ステップ1:Snowflakeでクラウドストレージ統合を作成する¶
CREATE STORAGE INTEGRATION コマンドを使用して統合を作成します。統合は、外部クラウドストレージの認証責任をSnowflakeが生成したエンティティ (つまり、クラウドストレージサービスアカウント) に委譲するSnowflakeオブジェクトです。Cloud Storageバケットにアクセスするために、Snowflakeは、データファイルを保存するバケットへのアクセス許可を付与できるサービスアカウントを作成します。
1つのストレージ統合で、複数の外部ステージ (つまり、 GCS) をサポートすることができます。ステージ定義にある URL は、 STORAGE_ALLOWED_LOCATIONS パラメーターのために指定された GCS バケット(およびオプションのパス)に合わせる必要があります。
注釈
この SQL コマンドを実行できるのは、アカウント管理者( ACCOUNTADMIN ロールを持つユーザー)またはグローバル CREATE INTEGRATION 権限を持つロールのみです。
CREATE STORAGE INTEGRATION <integration_name>
  TYPE = EXTERNAL_STAGE
  STORAGE_PROVIDER = 'GCS'
  ENABLED = TRUE
  STORAGE_ALLOWED_LOCATIONS = ('gcs://<bucket>/<path>/', 'gcs://<bucket>/<path>/')
  [ STORAGE_BLOCKED_LOCATIONS = ('gcs://<bucket>/<path>/', 'gcs://<bucket>/<path>/') ]
条件:
- integration_nameは、新しい統合の名前です。
- bucketは、データファイルをストレージするクラウドストレージのバケット名です (例えば、- mybucket)。必須の STORAGE_ALLOWED_LOCATIONS パラメーターおよびオプションの STORAGE_BLOCKED_LOCATIONS パラメーターは、この統合を参照するステージが作成または変更されたときに、それぞれこれらのバケットへのアクセスを制限またはブロックします。
- pathは、バケット内のオブジェクトを細かく制御するために使用できるオプションのパスです。
次の例では、2つのバケットとパスのいずれかを参照するために統合を使用する外部ステージを明示的に制限する統合を作成します。後のステップで、これらのバケットとパスのいずれかを参照する外部ステージを作成します。
この統合も使用する追加の外部ステージは、許可されたバケットとパスを参照できます。
CREATE STORAGE INTEGRATION gcs_int TYPE = EXTERNAL_STAGE STORAGE_PROVIDER = 'GCS' ENABLED = TRUE STORAGE_ALLOWED_LOCATIONS = ('gcs://mybucket1/path1/', 'gcs://mybucket2/path2/') STORAGE_BLOCKED_LOCATIONS = ('gcs://mybucket1/path1/sensitivedata/', 'gcs://mybucket2/path2/sensitivedata/');
ステップ2:Snowflakeアカウント用のCloud Storageサービスアカウントを取得する¶
DESCRIBE INTEGRATION コマンドを実行して、Snowflakeアカウント用に自動的に作成されたCloud Storageサービスアカウントの ID を取得します。
DESC STORAGE INTEGRATION <integration_name>;
条件:
integration_nameは、 ステップ1:Snowflakeでクラウドストレージ統合を作成する (このトピック内) で作成した統合の名前です。
例:
DESC STORAGE INTEGRATION gcs_int; +-----------------------------+---------------+-----------------------------------------------------------------------------+------------------+ | property | property_type | property_value | property_default | +-----------------------------+---------------+-----------------------------------------------------------------------------+------------------| | ENABLED | Boolean | true | false | | STORAGE_ALLOWED_LOCATIONS | List | gcs://mybucket1/path1/,gcs://mybucket2/path2/ | [] | | STORAGE_BLOCKED_LOCATIONS | List | gcs://mybucket1/path1/sensitivedata/,gcs://mybucket2/path2/sensitivedata/ | [] | | STORAGE_GCP_SERVICE_ACCOUNT | String | service-account-id@project1-123456.iam.gserviceaccount.com | | +-----------------------------+---------------+-----------------------------------------------------------------------------+------------------+
出力の STORAGE_GCP_SERVICE_ACCOUNT プロパティには、Snowflake アカウントに作成されたクラウドストレージサービスアカウントが表示されます (つまり、 service-account-id@project1-123456.iam.gserviceaccount.com)。Snowflakeアカウント全体に、単一のCloud Storageサービスアカウントをプロビジョニングします。すべてのCloud Storage統合で、そのサービスアカウントを使用します。
ステップ3: バケットオブジェクトにアクセスするためのサービスアカウント権限を付与する¶
次の詳細な手順では、Cloud Storageバケットを使用してデータをロードおよびアンロードできるようにするために、 Google Cloud console でSnowflake用の IAM アクセス許可を構成する方法を説明します。
カスタム IAM ロールの作成¶
バケットにアクセスしてオブジェクトを取得するために必要な権限を持つカスタムロールを作成します。
- プロジェクトエディターとして Google Cloud console にサインインします。 
- ホームダッシュボードから、 IAM & Admin » Roles を選択します。 
- Create Role を選択します。 
- カスタムロールの Title およびオプションの Description を入力します。 
- Add Permissions を選択します。 
- 権限のリストをフィルターし、リストから次を追加します。 - アクション - 必要な権限 - データのロードのみ - storage.buckets.get
- storage.objects.get
- storage.objects.list
 - パージオプションありのデータのロード、ステージ上で REMOVE コマンドを実行。 - storage.buckets.get
- storage.objects.delete
- storage.objects.get
- storage.objects.list
 - データのロードとアンロード - storage.buckets.get(データ転送コスト計算用)
- storage.objects.create
- storage.objects.delete
- storage.objects.get
- storage.objects.list
 - データのアンロードのみ - storage.buckets.get
- storage.objects.create
- storage.objects.delete
- storage.objects.list
 - COPY FILES を使用して外部ステージにファイルをコピーする - 以下の追加権限が必要です。 - storage.multipartUploads.abort
- storage.multipartUploads.create
- storage.multipartUploads.list
- storage.multipartUploads.listParts
 
- Add を選択します。 
- Create を選択します。 
Cloud Storage Serviceアカウントへのカスタムロールの割り当て¶
- プロジェクトエディターとして Google Cloud console にサインインします。 
- ホームダッシュボードから、 Cloud Storage » Buckets を選択します。 
- バケットのリストをフィルタリングし、ストレージ統合の作成時に指定したバケットを選択します。 
- Permissions » View by principals を選択してから、 Grant access を選択します。 
- Add principals の下に、 DESC STORAGE INTEGRATION コマンド出力から取得したサービスアカウント名を貼り付けます。 
- Assign roles で、以前に作成したカスタム IAM ロールを選択し、次に Save を選択します。 
Cloud StorageサービスアカウントにCloud Key Management Serviceの暗号化 キー の権限を付与すること¶
注釈
この手順は、Google Cloud Key Management Service(Cloud KMS)に保存されているキーを使用して GCS バケットが暗号化されている 場合にのみ 必要です。
- プロジェクトエディターとして Google Cloud console にサインインします。 
- ホームダッシュボードから、 Security » Key Management を検索して選択します。 
- GCS バケットに割り当てられているキーリングを選択します。 
- 右上隅の SHOW INFO PANEL をクリックします。キーリングの情報パネルがスライドアウトします。 
- ADD PRINCIPAL ボタンをクリックします。 
- New principals フィールドで、 DESCRIBE INTEGRATION 出力からサービスアカウント名を検索します ステップ2:SnowflakeアカウントのCloud Storageサービスアカウントを取得する (このトピック内)。 
- Select a role ドロップダウンから、 - Cloud KMS CrytoKey Encryptor/Decryptorロールを選択します。
- Save ボタンをクリックします。サービスアカウント名は、情報パネルの Cloud KMS CrytoKey Encryptor/Decryptor ロールドロップダウンに追加されます。 
注釈
SYSTEM$VALIDATE_STORAGE_INTEGRATION 関数を使用して、ストレージ統合の構成を検証することができます。
ステップ4: 外部ステージを作成する¶
作成した統合を参照する外部ステージを作成します。
注釈
- データベースとスキーマに対する USAGE 権限、およびスキーマに対する CREATE STAGE 権限が付与または継承されたロールを使用する必要があります。ステージの所有者(つまり、ステージに対する OWNERSHIP 権限を持つロール)にも、ストレージ統合に対する USAGE 権限が必要です。 - CREATE STAGE については、 アクセス制御の要件 をご参照ください。 
- 統合を使用するステージから、またはステージにデータをロードまたはアンロードするには、ステージに対する USAGE 権限がロールに必要です。ストレージ統合に対する USAGE 権限も必要:emph: - ありません。
- Snowflakeは、Amazon S3およびGoogle Cloud Storageへのアップロード時にマルチパートアップロードを使用します。このプロセスは、外部ステージのストレージの場所に不完全なアップロードが残る可能性があります。 - 不完全なアップロードが蓄積されないようにするには、ライフサイクルルールを設定することを推奨します。手順については、Amazon S3 または Google Cloud Storage ドキュメントをご参照ください。 
SQL を使用して外部ステージを作成する¶
使用中のロールが、ストレージ統合を使用するステージを作成するために必要な権限を付与または継承していることを確認してください。例:
GRANT USAGE ON DATABASE mydb TO ROLE myrole;
GRANT USAGE ON SCHEMA mydb.stages TO ROLE myrole;
GRANT CREATE STAGE ON SCHEMA mydb.stages TO ROLE myrole;
GRANT USAGE ON INTEGRATION gcs_int TO ROLE myrole;
CREATE STAGE コマンドを使用して外部ステージを作成できます。
例1:
この例では、 mydb.stages をユーザーセッションの現在のデータベースとスキーマとしてセットし、 my_gcs_stage という名前のステージを作成します。この例では、ステージはCloud Storageバケットとパス mybucket1/path1 を参照しますが、これらは統合でサポートされています。ステージは、 my_csv_format という名前のファイル形式オブジェクトも参照します。
USE SCHEMA mydb.stages;
CREATE STAGE my_gcs_stage
  URL = 'gcs://mybucket1/path1'
  STORAGE_INTEGRATION = gcs_int
  FILE_FORMAT = my_csv_format;
例2:
この例では、顧客管理キー(CMK)を使ってGoogle Cloud Storageに接続します。
USE SCHEMA mydb.stages;
CREATE STAGE my_ext_stage2
  URL='gcs://load/encrypted_files/'
  STORAGE_INTEGRATION = gcs_int
  ENCRYPTION=(TYPE = 'GCS_SSE_KMS' KMS_KEY_ID = '{a1b2c3});
  FILE_FORMAT = my_csv_format;
注釈
- URL 値にスラッシュ( - /)を追加して、指定したフォルダーパスにフィルターをかけます。スラッシュを省略すると、指定したパスのプレフィックスで始まるすべてのファイルとフォルダーが含まれます。- ステージの非構造化データファイルへのアクセスとファイルの取得には、スラッシュが 必要 であることに注意してください。 
- STORAGE_INTEGRATION パラメーターは、 FILE_FORMAT などの他のステージパラメーターとは別に処理されます。これらの他のパラメーターのサポートは、 GCS バケットへのアクセスに使用される統合に関係なく同じです。 
Pythonを使った外部ステージの作成¶
Snowflake Python APIs の StageCollection.create メソッドを使用して、外部ステージを作成します。
前述の SQL の例と同様に、次のPythonの例では mydb データベースと stages スキーマに my_gcs_stage という外部ステージを作成します。
from snowflake.core.stage import Stage
my_stage = Stage(
  name="my_gcs_stage",
    storage_integration="gcs_int",
    url="gcs://mybucket1/path1"
)
root.databases["mydb"].schemas["stages"].stages.create(my_stage)
注釈
Python API は現在、 CREATE STAGE SQL コマンドの FILE_FORMAT パラメーターをサポートしていません。
Snowsightを使用して外部ステージを作成する¶
Snowsight を使用して名前付き外部ステージを作成するには、次を実行します。
- Snowsight にサインインします。 
- ナビゲーションメニューで Catalog » Database Explorer を選択します。 
- ステージを作成するデータベースとスキーマを選択します。 
- Create » Stage を選択します。 
- Google Cloud Platform を選択します。 
- Stage Name を入力します。 
- Google Cloud Storageバケットの URL を入力します。 
- Enable Directory Table がデフォルトで選択されていることに注意してください。これによりステージ上でファイルを確認できるようになりますが、ウェアハウスが必要となりコストが発生します。現時点ではこのオプションの選択を解除し、後でディレクトリテーブルを有効にすることもできます。 
- Authentication を有効にします。 
- メニューからストレージ統合を選択します。 
- 必要に応じて、 SQL Preview を展開し、生成された SQL ステートメントを表示します。AUTO_REFRESH などのステージの追加オプションを指定するには、ワークシートでこの SQL プレビューを開きます。 
- Create を選択します。 
ストレージ統合を使用するための既存ステージの編集¶
SQL またはウェブインターフェイスを使用して、既存の外部ステージ構成を編集してストレージ統合を使用できます。
注釈
- ステージの認証または暗号化設定を無効にすることはできません。 
- 認証にストレージ統合を使用するようにステージを更新できます。ただし、ステージでストレージ統合が すでに 使用されている場合は、認証タイプを認証情報に変更することはできません。認証タイプを変更するには、ステージをドロップして再作成します。 
SQL を使用してステージを編集する¶
ALTER STAGE を使用してステージを変更します。例:
ALTER STAGE my_gcs_stage
  SET STORAGE_INTEGRATION = gcs_int;
Snowsightを使用してステージを編集する¶
- Snowsight にサインインします。 
- ナビゲーションメニューで Catalog » Database Explorer を選択します。 
- 編集するステージを選択します。 
- ステージに必要な変更を加えます。 
- Save を選択します。 
