azdがCI・AIエージェントで即時失敗する理由と自動非対話モードの対処法

CI/CDパイプラインやAIコーディングエージェントからAzure Developer CLI(azd)を実行した際、これまで表示されていた確認画面や選択プロンプトが出ず、そのままエラー終了することがあります。

結論として、これはazd 1.29.0で導入された意図的な動作です。azdがCI/CDまたはAIエージェント環境を検出すると、--no-prompt相当の自動非対話モードが有効になります。既存の設定値や既定値で処理できる場合は続行し、必要な入力を解決できない場合は、入力待ちを続けず即時失敗します。対処の基本は、環境名、Azureサブスクリプション、リージョン、Bicepパラメーターなどをコマンド実行前に渡すことです。どうしても対話動作が必要な場合は、OSまたはパイプラインの環境変数としてAZD_NON_INTERACTIVE=falseを設定します。(Microsoft for Developers)

目次

CIやコーディングエージェントでazdがプロンプトを出さず失敗する理由

2026年7月30日に公開されたAzure Developer CLIのロールアップでは、1.27.0、1.27.1、1.28.0、1.28.1、1.29.0の5リリースがまとめられています。

このうち、CI/CD環境を検出して自動的に非対話モードへ切り替える変更は、PR #9125によってazd 1.29.0に追加されました。AIエージェント環境の自動検出はすでに存在しており、1.29.0ではCI/CDにも同じ考え方が拡張され、挙動が統一されています。(Microsoft for Developers)

主な変化は次のとおりです。

実行環境以前起こり得た動作1.29.0以降の基本動作
ローカルの通常ターミナル必要に応じてプロンプトを表示原則として従来どおり対話実行
GitHub ActionsやAzure Pipelines入力待ち、EOFによる中断、既定値と異なる判定自動的に非対話モードへ切り替え
AIコーディングエージェントエージェント検出時は非対話モードCI/CDと共通の動作として明確化
必須入力が不足している場合プロンプト表示や入力待ちになる場合があった不足項目を示して即時失敗
プロンプトに既定値がある場合非TTY環境で既定値を正しく扱えない場合があった利用可能な既定値を採用

PR #9125では、CI上で標準入力がEOFになったとき、既定値がtrueの確認プロンプトでも誤ってfalseとして処理される問題も修正されています。確認プロンプトや複数選択では、空行やEOFに到達した場合に設定済みの既定値が尊重されるようになりました。(GitHub)

自動非対話モードは「必ず失敗するモード」ではない

自動非対話モードが有効になっても、すべてのコマンドが失敗するわけではありません。

azdは、次の順序で必要な値を解決します。

状態結果
フラグや環境設定に値が存在するその値を使って続行
プロンプトに利用可能な既定値がある既定値を使って続行
必須入力に値も既定値もないエラーを返して即時終了
複数候補から人間の判断が必要選択できないため即時終了

値を解決できない場合、azdはPromptRequiredErrorを返します。エラーには、不足している入力名と、フラグ、環境変数、設定値など、入力を提供できる方法が含まれる設計です。つまり、即時失敗は単なる処理中断ではなく、「自動実行に必要な情報が揃っていない」ことを明確にするための動作です。

非対話モードが有効になる条件と優先順位

azdの自動非対話モードは、明示的な設定がない場合に限り、CI/CDまたはAIエージェントの検出結果から有効になります。

優先順位を整理すると、次のようになります。

設定または実行環境動作
--no-promptを指定非対話モードを明示的に有効化
AZD_NON_INTERACTIVE=true非対話モードを明示的に有効化
明示設定なしでCI/CDを検出非対話モードを自動的に有効化
明示設定なしでAIエージェントを検出非対話モードを自動的に有効化
AZD_NON_INTERACTIVE=falseCI・AIエージェントによる自動有効化を無効化
通常のローカルターミナル原則として対話モード

明示的なコマンドラインフラグは、AZD_NON_INTERACTIVEより優先されます。また、AZD_NON_INTERACTIVEに指定できる値はtrue、false、1、0などの有効な真偽値です。yesのような解析できない値は警告付きで無視され、CIまたはAIエージェントの自動検出が引き続き適用されます。

実務では、次のように考えると分かりやすくなります。

明示的な設定がある
  └─ その設定を優先

明示的な設定がない
  ├─ CIまたはAIエージェントを検出 → 非対話モード
  └─ 検出しない → 通常の対話モード

即時失敗したときに確認する入力

azd upは通常、初回実行時に少なくとも環境名、Azureサブスクリプション、リージョンを必要とします。さらに、プロジェクトによってはBicepパラメーター、Terraform変数、拡張機能の選択、カスタムフックの入力なども必要です。(Microsoft Learn)

非対話モードで失敗した場合は、次の項目を順番に確認します。

確認項目事前に渡す方法の例
azd環境名-eまたは--environment
Azureサブスクリプション--subscription、既存環境のAZURE_SUBSCRIPTION_ID
Azureリージョン--location、既存環境のAZURE_LOCATION
Bicepの必須パラメーターazd env config set infra.parameters.<名前> <値>
${VARIABLE_NAME}で参照する値azd env set <名前> <値>
テンプレートや拡張機能の選択ID、ソース、対象名をコマンド引数で明示
削除や上書きの確認コマンド固有の--forceなどを必要に応じて指定
Azure認証サービスプリンシパル、フェデレーション、マネージドIDなどで事前認証

azd upとazd provisionには、環境名、サブスクリプション、リージョンを明示するためのフラグが用意されています。また、Bicepのカスタムパラメーターは、環境単位のconfig.jsonにinfra.parametersとして保存できます。(Microsoft Learn)

環境名・サブスクリプション・リージョンを渡す例

CI/CDで新しい環境にデプロイする場合は、少なくとも次の値を明示します。

azd up \
  --environment "$AZURE_ENV_NAME" \
  --subscription "$AZURE_SUBSCRIPTION_ID" \
  --location "$AZURE_LOCATION" \
  --no-prompt

azd 1.29.0以降の認識済みCI環境では、--no-promptを省略しても自動非対話モードになります。ただし、長期間運用するパイプラインでは、意図を明確にするために--no-promptを明示しておく方法も有効です。

明示しておけば、CIサービスの変更やローカルスクリプトへの転用があっても、常に同じ非対話動作を維持できます。

azd環境を先に作成する例

複数の設定値を登録してからデプロイしたい場合は、先に名前付き環境を作成します。

azd env new "$AZURE_ENV_NAME" \
  --subscription "$AZURE_SUBSCRIPTION_ID" \
  --location "$AZURE_LOCATION" \
  --no-prompt

azd env newでは、環境名に加えてサブスクリプションとリージョンを指定できます。作成した環境は既定の環境として選択されます。(Microsoft Learn)

ただし、永続的なセルフホストランナーなどで同じ環境がすでに存在する場合は、毎回azd env newを実行するのではなく、azd env select <環境名>または各コマンドの-eを使用します。

Bicepの必須パラメーターを事前設定する

Bicepに既定値のない必須パラメーターがある場合、通常の対話実行ではazdが入力を求めます。非対話モードでは値を入力できないため、事前設定が必要です。

たとえば、次のようなBicepパラメーターがあるとします。

@allowed([
  'dev'
  'staging'
  'prod'
])
param environmentType string

param projectOwner string

CI用の値は、次のように登録できます。

azd env config set \
  infra.parameters.environmentType \
  "prod" \
  --environment "$AZURE_ENV_NAME"

azd env config set \
  infra.parameters.projectOwner \
  "ci-bot" \
  --environment "$AZURE_ENV_NAME"

その後、azd upまたはazd provisionを実行します。

azd up \
  --environment "$AZURE_ENV_NAME" \
  --subscription "$AZURE_SUBSCRIPTION_ID" \
  --location "$AZURE_LOCATION" \
  --no-prompt

Microsoftのドキュメントでも、CI/CDでカスタムプロンプトを回避する方法として、infra.parametersへ値を事前設定してから非対話実行する手順が案内されています。必須パラメーターが不足している場合は、不足しているパラメーターと設定方法がエラーに表示されます。(Microsoft Learn)

azd環境変数を使って値を渡す

main.parameters.jsonで${VARIABLE_NAME}形式の参照を使用しているプロジェクトでは、azd env setで値を登録します。

azd env set \
  CUSTOM_TEAM_NAME \
  "platform-engineering" \
  --environment "$AZURE_ENV_NAME"

main.parameters.json側では、次のように参照します。

{
  "parameters": {
    "customTeamName": {
      "value": "${CUSTOM_TEAM_NAME}"
    }
  }
}

azdの環境変数は、通常、プロジェクト内の.azure/<環境名>/.envに保存されます。AZURE_LOCATIONやAZURE_SUBSCRIPTION_IDのほか、テンプレート固有の構成値も環境単位で管理できます。(Microsoft Learn)

機密値については、平文の.envに直接保存するのではなく、パイプラインのシークレット機能、Azure Key Vault、フェデレーション認証などを利用します。

Azure認証は非対話モードとは別に準備する

入力値が揃っていても、Azureへの認証が対話方式のままではCI/CDで実行できません。

azd auth loginは、次のような非対話認証をサポートしています。

  • クライアントID、テナントID、クライアントシークレットを使うサービスプリンシパル
  • GitHub、Azure Pipelines、OIDCによるフェデレーション
  • システム割り当てまたはユーザー割り当てマネージドID
  • クライアント証明書による認証

認証方法に必要な値を渡さずにazd auth loginを実行すると、ブラウザーやデバイスコードによる対話認証に進もうとするため、CIでは失敗します。パイプラインでは、デプロイコマンドより前に非対話認証を完了させてください。(Microsoft Learn)

AIコーディングエージェントでは失敗内容を次の入力に変える

AIコーディングエージェントからazdを使う場合、自動非対話モードは不便な制限ではなく、エージェント向けの安全装置として考えられます。

エージェントが選択プロンプトで停止すると、ユーザーが気付くまで処理が進みません。また、確認画面に対してエージェントが推測で回答すると、誤ったサブスクリプションやリージョンへデプロイする危険があります。

AIエージェントには、次の順序で処理させるのが安全です。

  1. azd versionで実行バージョンを確認する
  2. 使用する環境名、サブスクリプション、リージョンを確定する
  3. 必須のinfra.parametersと環境変数を設定する
  4. --no-prompt付きでコマンドを実行する
  5. promptRequired相当のエラーが出たら、同じコマンドを繰り返さず、不足値を追加して再実行する

たとえば、エージェントへの作業指示には次の条件を入れておくと安定します。

azdを実行する前に、環境名、AzureサブスクリプションID、
リージョン、必須のBicepパラメーターを確認してください。

入力不足で失敗した場合は同じコマンドを繰り返さず、
エラーに示された不足項目を設定してから再実行してください。

サブスクリプションやリージョンを推測して選択しないでください。

この運用にすると、AIエージェントが対話画面を無理に操作するのではなく、エラーを不足情報の一覧として利用できます。

対話モードへ戻す公式の方法

CI/CDまたはAIエージェントの自動検出を無効化し、対話動作へ戻す公式の方法は、AZD_NON_INTERACTIVE=falseを設定することです。(Microsoft for Developers)

Bash・shの場合

AZD_NON_INTERACTIVE=false azd up

複数のコマンドに適用する場合は、環境変数としてエクスポートします。

export AZD_NON_INTERACTIVE=false

azd up

PowerShellの場合

$env:AZD_NON_INTERACTIVE = "false"

azd up

現在のPowerShellプロセスから削除する場合は、次のように実行します。

Remove-Item Env:AZD_NON_INTERACTIVE

GitHub Actionsなどのパイプラインの場合

env:
  AZD_NON_INTERACTIVE: "false"

AZD_NON_INTERACTIVEは、azdの起動直後にプロセス環境から読み取られます。そのため、自動検出を無効化する目的では、シェルの環境変数、GitHub Actionsのenv、Azure Pipelinesの変数などとして設定するのが確実です。プロジェクト固有の値を保存するazd env setとは用途を分けて考えてください。

AZD_NON_INTERACTIVE=falseを常用しない方がよい理由

AZD_NON_INTERACTIVE=falseは正式な回避策ですが、通常のCI/CDでは最初に選ぶ対処方法ではありません。

CIランナーに人間が入力できるTTYや標準入力が存在しなければ、対話モードへ戻してもプロンプトに回答できません。その結果、再び入力待ち、EOF、既定値による処理など、環境に依存する動作が発生します。

基本的な使い分けは次のとおりです。

状況推奨する対応
本番CI/CD必須値を事前設定し、非対話モードで実行
AIエージェントによる自動デプロイ不足値をエラーから取得し、設定して再実行
ローカルで原因を確認したい一時的にAZD_NON_INTERACTIVE=false
TTY付きの対話デバッグ環境AZD_NON_INTERACTIVE=falseを利用可能
人間が操作できないCIランナーfalseではなく入力値の事前設定で解決

なお、公式ドキュメントでは、AZD_NON_INTERACTIVE=falseを設定しても、一部のコマンドはCI/CD環境で設計上プロンプトを回避する場合があると説明されています。すべてのコマンドが必ず対話動作へ戻るとは限りません。

よくある失敗と対処法

AZD_NON_INTERACTIVE=yesを設定する

yesは有効な真偽値として扱われません。

export AZD_NON_INTERACTIVE=yes

この値は警告付きで無視されます。CIまたはAIエージェント環境では、自動非対話モードが引き続き有効になります。

次のいずれかを使用してください。

export AZD_NON_INTERACTIVE=true
export AZD_NON_INTERACTIVE=false
export AZD_NON_INTERACTIVE=1
export AZD_NON_INTERACTIVE=0

無効な値が自動検出を打ち消さない設計になっているため、入力ミスによってCIが意図せず対話モードへ戻ることはありません。(GitHub)

ローカルでは成功するのにCIだけ失敗する

ローカルには、過去の実行で選択した環境、サブスクリプション、リージョンが保存されている可能性があります。一方、毎回初期化されるCIランナーには、その設定が存在しません。

ローカル環境に依存せず、CI内で次の値を明示してください。

azd up \
  --environment "$AZURE_ENV_NAME" \
  --subscription "$AZURE_SUBSCRIPTION_ID" \
  --location "$AZURE_LOCATION" \
  --no-prompt

必要に応じて、azd env config setやazd env setもパイプライン内で実行します。

対話モードを有効にすれば解決すると考える

不足している値が分かっている場合は、AZD_NON_INTERACTIVE=falseでプロンプトを復活させるより、値を明示した方が安全です。

特にAzureサブスクリプションや本番リージョンの選択を人間の入力に依存させると、再実行時に異なる値が選ばれる可能性があります。CI/CDでは、同じコミットを同じ設定で再実行できる状態を優先してください。

Azure認証とazd環境設定を混同する

AZURE_SUBSCRIPTION_IDやAZURE_LOCATIONを設定しても、それだけでAzure認証が完了するわけではありません。

次の2つを別々に準備します。

Azureへ接続する資格情報
  └─ サービスプリンシパル、OIDC、マネージドIDなど

どこへデプロイするかを示す設定
  └─ 環境名、サブスクリプションID、リージョンなど

認証済みでもデプロイ先が未指定なら入力不足で失敗し、デプロイ先を指定していても認証されていなければAzureへの接続で失敗します。

azd更新後に確認すべきチェックポイント

azdを1.29.0以降へ更新した後、既存のCI/CDやAIエージェントの処理が失敗する場合は、次の順序で確認します。

  1. azd versionで実際に使われているバージョンを確認する
  2. エラーが認証エラーか入力不足エラーかを切り分ける
  3. 環境名を-eまたは--environmentで指定する
  4. サブスクリプションを--subscriptionで指定する
  5. リージョンを--locationで指定する
  6. 必須Bicepパラメーターをazd env config setで登録する
  7. ${VARIABLE_NAME}参照の値をazd env setで登録する
  8. コマンド固有の選択肢をIDやフラグで明示する
  9. 本番パイプラインでは--no-promptを明示する
  10. 対話デバッグが必要な場合だけAZD_NON_INTERACTIVE=falseを使う

azdの自動非対話モードは、CI/CDやAIエージェントからプロンプトを排除し、処理を再現可能にするための変更です。更新後にコマンドが即時失敗した場合は、以前表示されていたプロンプトの代わりに、必要な入力をフラグや環境設定へ移すことが基本的な解決策になります。

この記事を書いた人

実務の現場で詰まりがちなポイントを地図にするITブログ「IT trip」を運営。Windows/Office(Teams・Excel)からSQL、サーバ運用、ガジェットまで、再現性のある手順と“なぜそうなるか”を丁寧に解説します。読んだらすぐ試せること、そして迷った人の次の一歩が見えることを大切にしています。

コメント

コメントする

目次