たれみみの備忘録

たれみみの備忘録です。仕事と酒がメインになりそう。

パイプライン実行時のサービスプリンシパルエラーについて

パイプライン実行時にサービスプリンシパル絡みのエラーが出る場合の対処法。
開発中にこのエラーが 2 回も出てきてしまい、お客さんへ説明がつかないので、中の人に聞いてみた。

コレはちょっと恥ずかしかったな。。。
Azure AD の設定&Azure Data Factory でリンクされたサービスまではお客さん側だったから、絶対ウチの責では無いと思ってた。まぁ、結局は MS の責なんだが。
夜間定期実行分にも、手動実行分にも、再実行処理を入れてなかったからな。。。
クラウドの原則を忘れていたよ。。。


以下、詳細。


<エラー内容>

エラーコード:2200
詳細:UserErrorFaildToGetAccessTokenByServicePrincipal …

<現象>

  • 上記エラーが不定期に出る。エラーなのでパイプライン処理は実行されていない。
  • 上記エラーが出た後、何も修正せずに再度パイプラインを実行すると、問題無くパイプラインが成功する。
  • 再現性が不明。


<対処法>

Azure Data Factory のアクティビティに再実行処理を入れる。
再実行処理を入れると、通常のサービスプリンシパルの認証処理が最初から実施されるため、上記エラーになった際でももう一度最初から認証処理を実施できる。

項目 説明
再試行(Retry) リトライ回数。
再試行間隔(Retry interval) 再試行の間隔(秒)。エラー発生後、再試行間隔で設定した秒後に再試行する。


<原因>

本件のサービスプリンシパルエラーは、『サービスプリンシパルの認証を利用、かつ、最新でないセルフホステッド IR を使ったとき』に生じることが確認できている不具合とのこと。
認証処理時のライブラリが、初回認証時とリトライ認証時で異なることに起因している。

一時的なクラウドの障害等に対応するため、Azure Data Factory はサービスプリンシパルの認証が失敗した際に、内部でサービスプリンシパルの認証リトライ処理を実施している。
セルフホステッド IR の認証リトライ時に、1 度目の認証処理時に使用したライブラリとは異なる認証ライブラリを使用しているため、上記のエラーとなる。

認証ライブラリを統一するという話もあったようだが、結果的に「クラウドで生じうる一時的なエラーの 1 つ」と判断され、ライブラリ統一は見送った模様。
理由:リトライ処理さえ組み入れてくれたら両方とも使えるから。今のアーキテクチャを変更するメリットが無いからかも。
【参考:一時的な障害の処理

認証 ライブラリ
初回認証 Microsoft Authentication Library(MSAL)
リトライ認証 Active Directory Authentication Library(ADAL)


※MSAL の方が新しい。ADAL を使っている場合、MSAL に移行しないとやばそう。ADF 内では今後どうなるんだろう?

ADAL → MSAL に移行しないとヤバいよという注意
ADAL → MSAL への移行案内


<特記事項>

  • このエラーは Azure AD に対して API を使用した認証を実施した際、数%以下の確率で起こる。
    →ということは、あたくし、SSR を 2 日連続で引いたってことになるね!

  • Azure Data Factory 内部のリトライ処理は、1 度目の認証処理の失敗直後に実施される。認証処理は Azure Data Factory で扱うデータ量とは相関が無いため、処理時間の長さによる影響は無い。

  • サービスプリンシパル認証利用時に上記エラーが起こる可能性があるということは、マネージド ID 認証でも同様の可能性がある。
    →マネージド ID 認証も内部ではサービスプリンシパル認証を使っているため。
    SQL 認証なら上記エラーは出ないかも・・・?(未検証)セキュリティの観点でリスクはあるけど。

  • Azure Data Factory の機能として、パイプラインをまとめて再実行する機能は無い。パイプラインを構成するアクティビティごとに再実行を設定すること。
    例)パイプラインにアクティビティ 1、アクティビティ 2、アクティビティ 3 があり、アクティビティ 2 でコケた場合、
      アクティビティ 2 の再実行が実施される。
      アクティビティ 1 は完了扱いとなる。




これはなかなか勉強になったな。
文面だけじゃなく、Teams でも直接打合せして説明してくれたから、とても分かりやすかったし印象深いわ。