Microsoft Fabric データパイプラインで SharePoint Online / Teams 上のファイルを OneLake に連携する

## はじめに

Azure Data Factory でできたことをできるのか確認

- ほぼすべての参考：https://qiita.com/yaagi/items/eb6a86e0c9a2fc3b3e61
- docs : https://learn.microsoft.com/ja-jp/azure/data-factory/connector-sharepoint-online-list?tabs=data-factory#copy-file-from-sharepoint-online
- fabric docs : https://learn.microsoft.com/ja-jp/fabric/data-factory/connector-sharepoint-online-list-overview

2024-04-08 時点の情報です。

## 連携対象

10_ファイル連携フォルダの全ファイルをもってきたい

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/742529b2-28e8-fdaf-b81f-cbad941c0df1.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/c00283c3-03ec-6942-d453-a2c0a6d1c738.png)

## 検証手順

### 疎通準備

1. アプリ登録、サイトアクセス許可を実施(https://learn.microsoft.com/ja-jp/fabric/data-factory/connector-sharepoint-online-list-copy-activity)
2. レイクハウスを作成して、出力先のフォルダ作っておく（https://learn.microsoft.com/ja-jp/fabric/data-engineering/tutorial-build-lakehouse）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/5dde4008-2e32-fd38-fc6c-11b4cd02c94f.png)
3. 接続を構成しておく(https://learn.microsoft.com/ja-jp/fabric/data-factory/connector-sharepoint-online-list)
※遷移用URL https://app.fabric.microsoft.com/groups/me/gateways
4. パイプラインを作成して対象フォルダを示すパラメータを作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/c47be80c-f6d4-d09c-f464-84b376511b75.png)
5. 作成した接続でもってルックアップを構成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/66179398-9ab6-0e8e-67a2-8148ff2239d1.png)
6. 配列が帰ってきました
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/2091f363-c9e2-326c-bb00-c8e3afbdc237.png)
7. Lookupした結果をフィルタします
```
@and(
    startswith(item().パス,pipeline().parameters.directory)
    ,equals(item().コンテンツタイプ,'ドキュメント'))
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/9ecf990a-7c32-2ff8-2018-fc75c1f0ad36.png)


### ファイルを取得する（トークン取得）

ファイル取得では専用の子パイプラインを作成してみます。
まずはトークンを取得するためのWebアクティビティを使います。

1. http 接続
https://accounts.accesscontrol.windows.net/ への **Web v2** 接続を構成します。末尾のスラッシュ忘れずに
※遷移用URL https://app.fabric.microsoft.com/groups/me/gateways
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/24bbaa32-b72d-cbd8-8f37-1e3a8d91204c.png)
2. 新しいパイプラインを作成してパラメータを追加
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/37fe3f96-f461-0ad2-a8a0-a087d8af4997.png)
3. web アクティビティを追加して、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/ab193f5e-0fdc-897b-8ee2-beaa089c5697.png)
相対URL
```
@concat(pipeline().parameters.tenant_id,'/tokens/OAuth/2')
```
本文
```
@concat(
    'grant_type=client_credentials&client_id=',
    pipeline().parameters.client_id,
    '@',
    pipeline().parameters.tenant_id,
    '&client_secret=',
    pipeline().parameters.client_secret,
    '&resource=00000003-0000-0ff1-ce00-000000000000/',
    pipeline().parameters.tenant_name,
    '.sharepoint.com@',
    pipeline().parameters.tenant_id
)
```
ヘッダー
名前：Content-Type
値：application/x-www-form-urlencoded
4. 一度実行して、成功を確認したら入力と出力についてセキュリティで保護のチェックをつけましょう
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/ff3ecc27-6338-15ac-f97c-313b275b9a7c.png)

### ファイルを取得する（ファイル取得、書き込み）
1. [テナント名].sharepoint.com への **Web 接続** を構成します。末尾のスラッシュ忘れずに。また、ここではテスト接続をスキップしましょう。(ここを間違えるとはまります)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/e009de15-ac67-f3f4-2004-012ea1c81dec.png)
※遷移用URL https://app.fabric.microsoft.com/groups/me/gateways
URLはhttps://{テナント名}.sharepoint.com/sites/{サイト名}/_api/web/ で入力
2. コピーアクティビティを後続に追加してソース設定を以下のようにします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/0ba2bb0a-179a-460f-c783-c3e934cd2478.png)
相対 URL
```
GetFileByServerRelativeUrl('@{pipeline().parameters.file_path}/@{pipeline().parameters.file_name}')/$value
```
追加のヘッダー
```
@{concat('Authorization: Bearer ', activity('get_access_token').output.access_token)}
```
※アクティビティ名に合わせてください。
3. あて先の設定をします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/0dd94838-a00b-cf83-aae4-f337c6069727.png)

ファイルパス(フォルダ)
```
@replace(
    concat(pipeline().parameters.distination_path,
        '/',
        pipeline().parameters.file_path)
    ,pipeline().parameters.directory
    ,''
    )
```
ファイルパス(ファイル名)
```
@pipeline().parameters.file_name
```
4.ルックアップを構成したパイプラインに戻ってfor_eachを追加
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/3405ac80-b3d0-85ee-0fcb-e7e95de38307.png)
項目
```
@activity('Filter1').output.value
```
5.パイプライン呼び出しを for_each内に形成。各種のパラメータ内容は変数などにすると管理が楽かもしれません
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/522eeadf-cdf3-199c-fd2d-e134117d98d5.png)
tenant_id: サービスプリンシパル情報から取得
client_id: サービスプリンシパル情報から取得
client_secret: サービスプリンシパル情報から取得(secretはkeyvaultから取れるようになってほしいですね
tenant_name: [tenant_name].sharepoint.com 形式のURLから取得
file_path:
```
@item().パス
```
file_name:
```
@item().名前
```
distination_path: ファイルを出力したフォルダ名。今回の例なら冒頭に作成したレイクハウスのフォルダ名からsharepoint
directory:
```
@pipeline().parameters.directory
```
6.実行すると、フォルダ内のファイル3点すべて連携されました。ファイル数が多い場合に時間がかかりそうなのが心配なので、標準機能でバルクなファイルコピーできるようになるのを期待
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/abf7148f-74df-c4d8-f6a1-568debd6c835.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/dc41dd83-43e5-8bdb-cefa-7073a756e642.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/89d8f422-cc3e-03b4-e234-1ff7104ae810.png)

## はまったところメモ

### ACSの有効化

既定で無効となっているので有効化する必要がある
>2018 年 11 月 7 日より後に構築されたテナントの場合、ACS は既定で無効になっています。

https://learn.microsoft.com/en-us/azure/data-factory/connector-troubleshoot-sharepoint-online-list

なお、ACSは廃止されるらしいので EntraID API許可でつないだほうがよさそう。サイトレベルのアクセス許可にはGraphAPIでの操作が必要ぽいけど要検証

https://qiita.com/mnrst/items/4315fdbe80c9cb0e5640#%E6%A4%9C%E8%A8%BC%E7%94%A8%E3%81%AE%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E3%83%97%E3%83%AA%E3%83%B3%E3%82%B7%E3%83%91%E3%83%AB%E3%82%92%E4%BD%9C%E6%88%90%E3%81%97%E7%92%B0%E5%A2%83%E5%A4%89%E6%95%B0%E3%82%92%E8%A8%AD%E5%AE%9A



## MSGraph API によるアクセストークン取得とSharepont API使用

2024-04-08追記

できたので備忘メモ（当分はやる必要なしなので自分用）

graph api 用のアクセストークン取得(Post)する。Web V2 コネクタ(https://login.microsoftonline.com/)

URL
```
@concat(pipeline().parameters.tenant_id,'/oauth2/v2.0/token')

```

body
```
@concat(
    'grant_type=client_credentials&client_id=',
    pipeline().parameters.client_id,
    '@',
    pipeline().parameters.tenant_id,
    '&client_secret=',
    pipeline().parameters.client_secret,
    '&scope=https://graph.microsoft.com/.default'
)

```

siteId をgetする。Web V2 コネクタ(https://graph.microsoft.com/)

URL
```
v1.0/sites/pipeline().parameters.tenant_name:/sites/{sitename}

```

nameでフィルタして、Web コネクタ(https://graph.microsoft.com/)で取得

```

v1.0/sites/pipeline().parameters.tenant_name,
    '.sharepoint.com,{siteId}/drive/root:/General/{fileName}:/content
```
利用したAPI https://learn.microsoft.com/ja-jp/graph/api/driveitem-get?view=graph-rest-1.0&tabs=http

メモ：サイトを絞る場合 https://qiita.com/mnrst/items/4315fdbe80c9cb0e5640