Snowflake Azure BLOB Storageデータロード：①ストレージ統合

[目次に戻る](https://qiita.com/taku_tachibana/items/408686a031b9624e981e)

### ■本記事の目的
Snowflakeのデータロードを理解する。
ユーザー管理のAzureBLOBStorageからSnowflakeにデータロードを行います。
コンテナーおよび取込用のテストデータ（CSV形式）は、事前に作成済みとします。
※階層型名前空間を有効にしないのでコンテナー配下のフォルダはありません。

### ■概要
ストレージ統合を作成していきます。
ストレージ統合とは、SnowflakeとBLOBStorageの間のセキュアアクセスを行うための
認証情報とストレージの所在の定義とご理解いただけると良いと思います。
また、Snowflake,ユーザー管理のAzureの双方で、セキュリティに関する設定を行っていきます。

### ■前提
SnowflakeはAzure（tokyoリージョン）にホストします。トライアル環境です。

### ■前提の備忘
実は、一度SnowflakeをAWSホストの環境でも検証したのですが、外部ステージの接続確認の段階で"パブリックアクセス"をBLOBのネットワークで許可する必要があることが判明しました。Snowflake(AWS)とAzureストレージの組み合わせだと、ストレージ側でネットワークの制限（Snowflake(AWS)のみの制限など）を行うことができないようです。
サービスプリンシパルのみ許可することでも、セキュリティを担保できるとは思いますが、やはり実務的な環境だとネットワーク周りのセキュリティを確保することも必要になります。
あまりセキュアではない検証は今後の顧客の環境構築でも良くないと考え、今回はやり直し、Azureでサービスプロバイダを揃えています。

このことから、Snowflakeをホストしているクラウドプロバイダとストレージサービスのクラウドプロバイダが異なるケースについては、セキュリティ要件（ネットワークなど）を含め必ず検証をいただくことをお願いいたします。

### ■AzureのテナントIDとBLOBStorageのロケーションを取得する。
ユーザー管理のAzureでの作業です。
　
Snowflakeからデータロードに使用するAzureのテナントIDとBLOBStorageのロケーションを取得します。
　
AzureのテナントIDを取得する。
AzurePortal > MicrosoftEntraID > プロパティ > テナントID
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2731433/02ec6d4d-e227-7af8-bed2-b3e692f98da8.png)
　 ↓↓↓↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2731433/89c47b00-6720-d315-5621-894e5aa06f6b.png)

　
BLOBStorageのロケーションを取得する。
ストレージアカウント > コンテナー > プロパティ
※一旦URLを取得してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2731433/a855a18d-6d14-d44e-17ed-54fccae48197.png)
　
取得したURLをストレージ統合用に手動で変換します。
```
https://<ストレージアカウント>.blob.core.windows.net/<コンテナー>
↓↓↓↓ httpsをazureに変換します。　　　　　末尾に"/"を追加します。↓↓↓↓
azure://<ストレージアカウント>.blob.core.windows.net/<コンテナー>/
```
　
### ■ストレージ統合を作成する。
Snowflakeアカウントに戻ります。
　
AzureBlobStorageの場合は、以下の構文でストレージ統合を作成します。
デフォルトでは、アカウント管理者が作成できます。
別のロールに作成させる場合は、ストレージ統合作成権を、別途割り当ててください。
```
use role ACCOUNTADMIN;

create storage integration <ストレージ統合>
type=EXTERNAL_STAGE --外部ステージ
storage_provider='AZURE' --ストレージのクラウドプロバイダ名
enabled=TRUE --有効化
azure_tenant_id='<AzureテナントID>'
storage_allowed_locations=('変換後のロケーションURL',<追加のURL>・・・)
;

例）
use role ACCOUNTADMIN;
create storage integration TEST_INTEG_AZ
type=EXTERNAL_STAGE --外部ステージ
storage_provider='AZURE' --ストレージのクラウドプロバイダ名
enabled=TRUE --有効化
azure_tenant_id='xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
storage_allowed_locations=('azure://storage_account.blob.core.windows.net/container/')
;
```
　
### ■ストレージ統合使用権を、外部ステージ作成者のロールに付与する。
後ほど、外部ステージを作成する際、ストレージ統合使用権がないと
外部ステージを作成できないため権限を付与します。
```
use role ACCOUNTADMIN;
grant usage on integration <ストレージ統合> to role <ロール>;
```
　
### ■ストレージ統合の情報を取得する。
作成後、以下の構文でストレージ統合の情報を照会します。
```
describe integration <ストレージ統合>;
```

照会後の出力から赤枠内のSnowflakeアカウントの
AZURE_CONSENT_URLおよびAZURE_MULTI_TENANT_APP_NAMEの値を取得します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2731433/472399c1-7bf9-237e-0acb-36906a4d9637.png)

AZURE_CONSENT_URL：Microsoftのアクセス許可リクエストページへの URL。
AZURE_MULTI_TENANT_APP_NAME：アカウント用に作成されたSnowflakeクライアントアプリケーション
　
### ■AZURE_CONSENT_URLへのアクセスからサービスプリンシパル（アプリ）の作成
BLOBへのセキュアアクセスを行うためのサービスプリンシパル（アプリ）をAzure上に作成するためにURLをクリックします。
　
アクセスすると、以下のように権限なしとのことなので、
サービスプリンシパル作成に同意できませんでした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2731433/4b8d24fd-64d6-2ab7-aca1-1e21566412c9.png)
　
Azureの管理者に、問合わせて
「Application administrator」 などのアプリケーション作成が許可されているロールを許可してもらう必要があるようです。
以下のように許可してもらいました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2731433/d42696c6-06bb-a524-1017-91f8e4585e45.png)
　
許可後、同意画面が出てきました。＞承諾します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2731433/889e04a8-aafd-8baa-68fd-c944a94856d9.png)
　

MicrosoftEntraID>エンタープライズアプリケーション>一覧
AZURE_MULTI_TENANT_APP_NAMEの"_"より前の文字列の名義で、作成されたことを確認できます。
（承諾後、作成に時間がかかることもあるようです。）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2731433/e279d567-2160-8590-6249-d6c453b2d9b1.png)

　
### ■ストレージアカウントからエンタープライズアプリケーションへのアクセス許可
ストレージアカウント>アクセス制御 (IAM)>追加>ロールの割り当ての追加
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2731433/3311326f-19cc-d97b-f7fd-1a1af4eb0988.png)
　
ロール>BLOBで検索>以下、用途に応じて、いずれかを選択する。>次へ
読み取り専用：Storage Blob Data Reader(ストレージ BLOB データ閲覧者)を選択する。
読み取り、書き込み、削除：Storage Blob Data Contributor (ストレージ BLOB データ共同作成者)を選択する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2731433/6c0faae9-7eb7-3533-a1bf-9da9215b7818.png)


メンバー>ユーザー・グループまたはサービスプリンシパル>メンバーを選択する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2731433/c511d691-5bcd-3e72-7f75-f4935b3e126f.png)
　
メンバー選択は、AZURE_MULTI_TENANT_APP_NAMEの"_"より前の名義で検索する。>
チェックを入れる>選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2731433/9cb398d5-6dc6-87ba-f0a7-bbe87190339a.png)

レビューと割り当てをクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2731433/5c5db0ac-10fc-632e-9307-d11507b24550.png)

再度、レビューと割り当てをクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2731433/3f937eeb-8af2-8877-a528-5debb407cfca.png)

アクセス制御(IAM)で確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2731433/0aa7fd70-2132-4c68-86c9-590e6fdfbe1a.png)

正常に割り当てが行われたら、ストレージ統合作成は以上です。

### ■あとがき
次回は、Azureストレージのネットワーク構成を記事にします。
少し内容が複雑なので、ストレージ統合と切り分けを行います。

### ■次の記事
[Snowflake Azure BLOB Storageデータロード：②ストレージネットワーク構成](https://qiita.com/taku_tachibana/items/4252293bf53d498f971c)

[目次に戻る](https://qiita.com/taku_tachibana/items/408686a031b9624e981e)