Microsoft Fabric データパイプラインで Azure Blob Storage にデータを書きこむベストプラクティス

## はじめに

運用環境レベルでデータパイプラインによる Azure Blob または ADLS 出力をする場合のベストプラクティスを紹介します。

## Azure Blob Storage のセキュリティ構成

### 認証のベストプラクティス： Azure Blob Storage への Entra ID認証

Azure Blob ストレージには キー認証（Shared Key） と ID ベース認証（Microsoft Entra ID 認証） の2種類のアクセス方法があります。
セキュリティの観点から、Microsoft は ID ベース認証を推奨しています。

> Microsoft Entra ID を使用して BLOB データへのアクセスを承認する

引用：https://learn.microsoft.com/ja-jp/azure/storage/blobs/security-recommendations

したがって以下の Azure RBAC ロールを割り当てる必要があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/d2b05b66-577b-451d-940d-6d2b38b7bc99.png)

:::note info

または、[Azure Data Lake Storage のアクセス制御モデル](https://learn.microsoft.com/ja-jp/azure/storage/blobs/data-lake-storage-access-control-model) に記載のより細かな粒度でのアクセス制御を利用します

:::


これらのロールには Data Actions が含まれるため blob の操作が可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/765269ca-3ffc-4835-8832-52bdc86f240e.png)
引用：https://learn.microsoft.com/ja-jp/azure/role-based-access-control/built-in-roles/storage#storage-blob-data-contributor

参考
- https://learn.microsoft.com/ja-jp/azure/storage/blobs/assign-azure-role-data-access?tabs=portal

:::note warn

所有者や、共同作成者には Data Actions の権限はありません。 Azure Portal ではこれらの特権ロールが自動的にアカウントキーを取得してデータのアップロードなどの操作を助ける機能が組み込まれています。

アカウントキーで認証しているとき（誰がアクセスしたかは不明となります）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/629f6405-c2df-4ebb-b8c6-0c58b069b63d.png)

Blob Data Actions の権限を用いて参照しているとき（誰がアクセスしたかが記録可能です）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/19474a7c-6551-4ea5-8315-c153af3c2be6.png)


:::

Entra ID 認証でのアクセスをベースラインにしていた場合、


推奨事項の一つである、

>共有キーによる認可を禁止する

引用：https://learn.microsoft.com/ja-jp/azure/storage/blobs/security-recommendations

についても適用可能となります。




### ネットワークセキュリティのベストプラクティス

全てのネットワークアクセスではなく、**選択した仮想ネットワークと IP アドレスから有効** か、無効にします。

> ファイアウォール規則を有効にする
引用：https://learn.microsoft.com/ja-jp/azure/storage/blobs/security-recommendations

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/bce5526b-4b70-4c37-8257-5fe2a916f2fa.png)


※無効にした場合には今回紹介する方法は採用不可となります。プライベートエンドポイントにアクセス可能なオンプレミスデータゲートウェイなどを使用してください。

## 手順

実際に Fabric データパイプラインでデータを書き込むための構成をしていきます。

セキュアなストレージへのアクセス機能として、 [信頼されたワークスペース アクセス](https://learn.microsoft.com/ja-jp/fabric/security/security-trusted-workspace-access)　を使用します。


### 1. ワークスペース ID の構成

Fabric ワークスペースの設定から、ワークスペース ID の作成を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/87be91e8-01b3-45bf-a155-652d8efbe0d0.png)

作成が完了したら、url から workspace の id をメモします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/5fdca81e-faed-4d28-932f-27ebf568c57e.png)

この画面に表れている 2 つの ID は以下のような役割を持ちます。

| 対象 | 役割 |
|:-:|:-:|
|URL上のID   | Azure リソースインスタンスとしての ID  |
|ワークスペース ID 機能で生成した ID   | ストレージなどに認証を行うときに利用できるサービスプリンシパルとしての ID |

### 2. ストレージの構成

#### Entra ID 認可

ストレージ Blog 共同作成者ロールを ワークスペース ID に割り当てます。ワークスペース名で検索が可能です

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/d3fe5b14-e79b-420d-93b8-a288f9b0bb44.png)

割当が完了しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/17b3ed89-8bee-41f3-82aa-d4c3d781ad80.png)


#### ネットワーク認可

ネットワーク認可の方法には、以下の 2 通りがあります。

テナント全体で許可（すべてのワークスペースを許可するシンプルな方法）
特定のワークスペースのみ許可（セキュリティを強化した方法）

##### テナント全体で許可

同一テナントのワークスペースからのアクセスは全て許可する場合にはこちらが簡単です。

ネットワーク設定にて、Microsoft.Fabric/workspaces に類するリソースインスタンスを現在のテナント内のすべてで許可します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/16fad4a6-e2fe-4f1e-b7cd-dcea695564ce.png)

##### 特定のワークスペースのみ許可

以下の ARM テンプレートを使用します。<>は置き換える必要があります。

```json:ARMテンプレート

{
    "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
    "resources": [
        {
            "type": "Microsoft.Storage/storageAccounts",
            "apiVersion": "2023-01-01",
            "name": "<storage account name>",
            "id": "/subscriptions/<subscription id of storage account>/resourceGroups/<resource group name>/providers/Microsoft.Storage/storageAccounts/<storage account name>",
            "location": "<region>",
            "kind": "StorageV2",
            "properties": {
                "networkAcls": {
                    "resourceAccessRules": [
                        {
                            "tenantId": "<tenantid>",
                            "resourceId": "/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/Fabric/providers/Microsoft.Fabric/workspaces/<workspace-id>"
                        }]
                }
            }
        }
    ]
}

```


引用：https://learn.microsoft.com/ja-jp/fabric/security/security-trusted-workspace-access#arm-template-sample


:::note info

json の修正は面倒なので、 Deploy ボタンを作りました。対象のストレージアカウントのあるリソースグループを選択し、ストレージアカウント名称と URL から取得した ID を使用してデプロイしてください。

[![Deploy to Azure](https://aka.ms/deploytoazurebutton)](https://portal.azure.com/#create/Microsoft.Template/uri/https%3A%2F%2Fraw.githubusercontent.com%2Fryoma-nagata%2Ftools%2Fmain%2FFabric%2FTrusted-workspace-access-ARM%2Fmain.json)


:::

設定を完了すると、以下のようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/2ac40f21-fc7d-4ba8-8934-56d27dc8f684.png)


### 3. データパイプラインの作成

コピーアシスタントで作成していきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/4dfe97c2-bdf7-4a9f-9f8d-c4e17d525df7.png)


サンプルデータを使います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/4c021fb5-7d3f-4de4-9117-4778773bf882.png)

Azure Data Lake を選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/86180e90-2c25-4530-8834-29e9bd8b976a.png)

:::note warn

Azure 上でリソースへの権限があれば、 Azure タブから選択できますが後述のワークスペース ID 認証とならず、個人に紐づいた接続が作成されるため、変更が必要となります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/beacd636-be8e-440e-a628-8c30db4a0f19.png)

:::

url を設定し、認証の種類をワークスペース ID にします。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/3eac61d9-c508-46f5-b2be-e9f2c90084df.png)

:::note info

url はエンドポイントタブから確認可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/84ccdcd5-eee7-42d3-9d67-7e1d3276cc73.png)


:::





任意のエンドポイントであて先を設定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/1b6c4738-e3f6-43df-8e39-470d7baea927.png)

詳細設定とレビューを行い、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/c5373583-6b42-4a61-9464-e5ccec8ceee9.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/12fe08a1-58f2-46c0-9ae6-65f62855e888.png)

コピーアクティビティが完成し、実行ができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/8594b89d-e65b-41fc-b0ed-268994f74ce5.png)


ファイルを確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/418b60c6-bced-402e-ae8c-38e1212c1871.png)

以上です。ご活用ください。