Azure DevOpsからApp ServiceへDockerイメージをデプロイしようとしたら、突然のエラー。
Invalid clientid or client secret.
昨日まで動いていたのになぜ?
原因はサービス接続(Service Connection)の裏側にある「アプリの登録」の有効期限切れでした。
今回は、今後二度と期限切れに悩まされない「Workload Identity Federation」を使った最新の修正方法をまとめます。
1. 発生したエラー:Build and Push Web Imageで失敗
まずは、私が発生したエラーログを共有します。
• ##[error]error from registry: Invalid clientid or client secret.
• ##[error]The process '/usr/bin/docker' failed with exit code 1
一見するとApp Service側の問題に見えますが、実はAzure Container Registry (ACR) へのログイン失敗が原因でした。
2. 原因:サービス接続(サービスプリンシパル)の有効期限切れ
Azure DevOpsの「サービス接続」は、裏側でAzure Entra ID(旧Azure AD)の「アプリの登録」を利用しています。
インフラ管理画面(Entra ID > アプリの登録 > 証明書とシークレット)を確認したところ、シークレットの有効期限がバッチリ切れていました。
3. 解決策:Workload Identity Federation (automatic) で再作成
シークレットを更新しても直りますが、また数年後に同じエラーが起きます。
今回は、Microsoftが推奨している「パスワードレス」な方式、Workload Identity Federation を使って作り直しました。
設定の手順:
• Project Settings > Service connections > New service connection
• Azure Resource Manager > Workload Identity Federation (automatic) を選択
• 対象のサブスクリプションとリソースを選択して保存
4. YAMLファイルの修正と承認(Permit)
接続を新しく作った後は、azure-pipelines.yml の containerRegistry や azureSubscription の名前を新しいものに書き換えます。
初回実行時は、パイプライン画面で 「Permit(許可)」 ボタンを押すのを忘れないようにしましょう。
※パイプライン実行した後、しばらくしてサイト見てみたら表示できなくて、焦ってパイプライン状況をみたら途中で止まっててびっくりしました。許可が必要だなんて知らなかった、、、