AppFlowでSharePointをS3へ連携しようとしたらいっぱいエラーに遭遇したので対処方法をまとめます
はじめに
皆様こんにちは、あかいけです。
最近、Microsoft SharePoint OnlineからAmazon S3へのデータ連携方式を検討する機会があり、以下の記事でAmazon AppFlowというサービスを知り、Microsoft SharePoint Onlineコネクタを実際に触ってみることにしました。
公式ドキュメントの手順に沿って進めてみたのですが、実際に自分の手を動かしてみると、ドキュメントだけでは読み取れないエラーに次々と遭遇しました。
同じ場所でハマる方の助けになればと思い、遭遇したエラーとその対処方法、そして実際にフローを動かしてみた結果までをまとめておきます。
前提条件
- Microsoft SharePoint Onlineが有効なMicrosoft 365テナントを保有していること
- AppFlowを利用するAWSアカウントを保有していること
- Azure ADのアプリ登録に対する管理者権限を持っていること
AppFlowについて
Amazon AppFlowは、SalesforceやSlackといった様々なSaaSアプリケーションのデータを、コードを書かずにAWSサービスへ連携できるフルマネージドサービスです。
今回はこのAppFlowを使って、Microsoft SharePoint OnlineのドキュメントをAmazon S3へ連携してみます。
フロー作成までにやったこと
ざっくりした流れは公式ドキュメント通りです。
EntraID アプリ
まずはEntra ID(旧Azure AD)側でAppFlow用のアプリを登録します。

リダイレクトURLは公式ドキュメントに記載あるものを指定します。
リージョンはAppFlowを作るリージョンを指定します。

公式ドキュメント指定の以下権限をAPIアクセス許可に追加します。
- offline_access
- Sites.Read.All
- User.Read


テナントIDとクライアントIDをメモしておきます。

クライアントシークレットも作成してメモしておきます。

SharePoint サイト
続いて、S3へ連携する対象となるSharePointサイトを作成しておきます。

動作確認用に、転送するためのフォルダとファイルも用意しておきます。
今回はhogehoge-XXのフォルダを3つ作りました。

それぞれのフォルダにmd、png、txtのファイルを入れておきます。
後述のフィルター機能の動作確認にも使います。

AppFlow
準備ができたので、AppFlow側のフローを作成していきます。
フロー名は任意のもので進めます。
データ暗号化はデフォルト(カスタマイズなし)で進めます。


フローにて新規接続を作成し、EntraIDアプリの情報を入れます。

- カスタム認証トークンのURL:テナントID
- カスタム認証コードのURL:テナントID
- クライアントID:クライアントシークレットのシークレット ID
- クライアントシークレット:クライアントシークレットの値

そしてここからがエラーの連続でした。
エラー①:AADSTS700016
AADSTS700016: Application with identifier 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxa' was not found in the directory 'yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy'. This can happen if the application has not been installed by the administrator of the tenant or consented to by any user in the tenant. You may have sent your authentication request to the wrong tenant.

解消方法
原因はクライアントIDの指定間違いでした。
「クライアントシークレットのシークレットID」ではなく、「クライアントID(アプリケーションID)」を指定するのが正解でした。


エラー②:AADSTS50011
クライアントIDを直したら、今度は別のエラーが出ました。
AADSTS50011: The redirect URI 'https://3rdp.oauth.console.api.aws' specified in the request does not match the redirect URIs configured for the application 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx'. Make sure the redirect URI sent in the request matches one added to your application in the Azure portal. Navigate to https://aka.ms/redirectUriMismatchError to learn more about how to fix this.

解消方法
エラーメッセージに表示されていたリダイレクトURI(https://3rdp.oauth.console.api.aws)を、Azure側のリダイレクトURIとして追加したところ解消しました。
公式ドキュメントに記載されているリダイレクトURI(https://region.console.aws.amazon.com/appflow/oauth)とは別に、こちらも登録しておく必要があるようです。


(詳細は調べていませんが、もしかしたらEntraID(SharePoint)側で仕様変更があったのかもしれません)
エラー③:500 (Internal Server Error)
認証自体は通るようになったのですが、今度はサイト一覧の取得でエラーになりました。
認証中 でエラーが発生しました
Error while communicating to connector: The request failed because the service Source Microsoft SharePoint Online returned the following error: Details: The request failed with status code 500 (Internal Server Error)..

まずSharePointライセンスが有効か確認してみましたが、こちらは問題なさそうです。
az rest --method get --uri "https://graph.microsoft.com/v1.0/subscribedSkus"
{
"servicePlanId": "e95bec33-7c88-4a70-8e19-b10bd9d0c014",
"servicePlanName": "SHAREPOINTWAC",
"provisioningStatus": "Success"
},
{
"servicePlanId": "c7699d2e-19aa-44de-8edf-1736da088ca1",
"servicePlanName": "SHAREPOINTSTANDARD",
"provisioningStatus": "Success"
}
次に、AppFlowの画面には出てこない対象のSharePointサイトを、検索を使わずグループ経由で直接取得できないか試してみました。
az rest --method get --uri "https://graph.microsoft.com/v1.0/groups/{group-id}/sites/root"
{
"displayName": "hogehoge-site",
"webUrl": "https://XXXXX.sharepoint.com/sites/hogehoge-site"
}
こちらはあっさり成功しました。
ライセンスも有効、サイトも実際に存在していて直接取得もできる。それなのにAppFlowの画面には出てこない。
ここで調査を切り上げ、原因が分からないままとりあえず時間を置いてみることにしました。
解消方法
その後時間を置いたら解消しました。
具体的には、原因の切り分けに疲れてふて寝して8時間ほど放置していたら、いつの間にか一覧に表示されるようになっていました。
なお最初は自動生成される「コミュニケーション サイト」だけしか見えていませんでしたが、

しばらくしたら冒頭で作成したサイトも見えるようになりました。

Microsoft Q&Aでも似た事例に対して、新規作成したサイトが反映されるまで時間がかかることがある、という趣旨の回答が寄せられていました。
今回も新規にテナント・サイトを作成した直後だったので、反映に時間がかかっていたのかもしれません。(AIによる回答なので、どこまで裏付けが取れているかは正直わかりませんが、症状としては一致していました)
Wait for Propagation: Sometimes, newly created sites may take some time to propagate and become visible in Microsoft Graph. If the site was created very recently, you may need to wait a little while before it shows up.
送信元の指定
サイトが選択できるようになったので、残りの設定を進めていきます。
転送元の指定はフォルダ単位で、今回は特定のフォルダだけを指定してみました。

送信先の指定
送信先はAmazon S3を指定します。
転送先のパスは以下の形式になるようです。
- S3://<バケット名>/<バケットプレフィックス>/<フロー名>

フロートリガー
トリガーは3種類ありますが、SharePoint Onlineコネクタで使えるのはオンデマンドとスケジュール実行の2つのようです。

今回はスケジュール実行を選択し、増分転送を試してみます。
なお開始日と開始時間は、コネクタ作成時より未来を指定する必要がありました。

データフィールド マッピング
データフィールドのマッピングは全てのフィールドを指定します。


フィルター
せっかくなのでフィルター機能も試してみます。
「File Type」フィールドに対して、mdとpngをOR条件で指定してみました。

フロー アクティブ化
ここまで設定したらフローを作成して、

最後にフローをアクティブ化すれば設定は完了です。

転送の様子
初回転送
初回は指定したフォルダのファイルが全て転送されます。

S3側を見てみると、フロー実行ごとの実行IDを名前に持つフォルダの配下に、転送されたファイルが格納される仕様のようです。

実際に転送されたファイルを確認すると、フィルターで指定したmdとpngのファイルだけが転送されており、txtファイルは除外されていました。
フィルター機能、ちゃんと効いています。

増分がある場合
その後hogehoge-01の01.mdを更新し、新たに001.mdを追加してみます。

差分があるファイルだけがちゃんと転送されており、

2回目の実行では、1回目とは別の実行IDのフォルダが新規に作成され、その下にファイルが格納されていました。

中身を見ても、差分があるファイルだけが転送されています。

なお前回の初回転送のフォルダ内は何も変わっていませんでした。

増分がない場合
その後差分がない状態で実行すると、実行履歴には記録が残るものの、

実際には何も転送されませんでした。

さいごに
以上、Amazon AppFlowでMicrosoft SharePoint OnlineからAmazon S3へのデータ連携を試してみました。
いっぱいエラーに遭遇してちょっと苦労しましたが、検証したかったフォルダ単位での転送対象指定、拡張子によるフィルター、差分転送については問題なく動作することは確認できたので満足しました。
SharePoint OnlineからS3への連携を検討されている方の参考になれば幸いです。








