ビュー:

Azure Cloud Shellの代わりにローカルのMacターミナルを使用してデプロイできますか?

複数のリージョンにわたってAzure管理グループにデプロイする際に、Azure Cloud Shellの代わりとしてMacターミナルを設定します。

問題

Azure Cloud Shellを介して複数のリージョンにデプロイする際、Cloud Shellの制限によってエラーが発生することがあります。再試行することで問題が解決することもありますが、より確実な回避策は、ローカルのMacターミナルからデプロイすることです。
Macのターミナルをデプロイメント用に設定するための手順を完了してください。

ソリューション

  1. bashをアップグレードしてください。
    macOSには古いバージョンのbashが搭載されています。最新バージョンをインストールしてください。
    brew install bash
    新しいbashを許可されたシェルのリストに追加します (Homebrewがbashを/opt/homebrew/bin/bashにインストールしたと仮定します):
    sudo bash -c 'echo /opt/homebrew/bin/bash >> /etc/shells'
  2. 新しいbashをデフォルトのシェルとして設定します。
    chsh -s /opt/homebrew/bin/bash
  3. 新しいターミナルを開き、bashのバージョンを確認してください。
    which bash
    bash --version
    出力は次のようになります:
    /opt/homebrew/bin/bash
    
    GNU bash, version 5.2.37(1)-release (aarch64-apple-darwin24.0.0)
  4. timeoutコマンドをインストールしてください。timeoutコマンドは、macOSではデフォルトで利用できません。
    coreutilsパッケージをインストールします。
    brew install coreutils
    gtimeoutコマンドが利用可能であることを確認してください。
    gtimeout --version
    timeoutgtimeoutにマッピングするエイリアスを追加します。~/.zprofile(またはデフォルトのシェルとしてbashを使用している場合は~/.bash_profile) を開き、次の行を追加してください。
    alias timeout=gtimeout
    アクティブなターミナルセッションを更新してください。
    source ~/.zprofile
  5. Azure CLIをインストールしてサインインしてください。
    brew update && brew install azure-cli
    az login
Macのターミナルはデプロイの準備が整いました。インストールディレクトリからterraform applyを実行してください。

ローカルのLinuxターミナルを使用してAzure Cloud Shellの代わりにデプロイできますか?

複数のリージョンにわたってAzure管理グループにデプロイする際に、LinuxターミナルをAzure Cloud Shellの代替として構成します。

問題

Azure Cloud Shellを使用して複数のリージョンにデプロイする際、Cloud Shellの制限によってエラーが発生する可能性があります。より信頼性の高い回避策は、ローカルのLinux端末 (Ubuntu/Debian) からデプロイすることです。
Linuxターミナルをデプロイ用に設定するために、次の手順を完了してください。

ソリューション

  1. Azure CLIをインストールする:
    sudo apt update
    curl -sL https://aka.ms/InstallAzureCLIDeb | sudo bash
  2. Terraformをインストールする:
    sudo apt-get install -y gnupg software-properties-common
    wget -O- https://apt.releases.hashicorp.com/gpg | gpg --dearmor | sudo tee /usr/share/keyrings/hashicorp-archive-keyring.gpg > /dev/null
    echo "deb [signed-by=/usr/share/keyrings/hashicorp-archive-keyring.gpg] https://apt.releases.hashicorp.com $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/hashicorp.list
    sudo apt-get update && sudo apt-get install -y terraform
  3. 必須ツールをインストールします。
    sudo apt-get install -y unzip jq
  4. Azureに認証する:
    az login --use-device-code
    画面の指示に従ってブラウザーを使用して認証を完了してください。プロンプトが表示されたら対象のサブスクリプションを選択してください。
Linuxターミナルのデプロイ準備が整いました。インストールディレクトリからterraform applyを実行してください。

デプロイ中に同期手順が失敗した場合、関数アプリを手動で同期するにはどうすればよいですか?

手動同期スクリプトを使用して、Azure管理グループのデプロイ中に失敗したサブスクリプションの関数アプリトリガー同期を再試行します。

問題

Terraformのデプロイが完了すると、最後の手順で管理グループ内の各サブスクリプションの関数アプリトリガーを同期します。この手順が失敗した場合、次のような出力が表示されることがあります。
module.sync-function-trigger[0].null_resource.sync_triggers (local-exec): Failed to call function app xxxx after 3 attempts

module.sync-function-trigger[0].null_resource.sync_triggers (local-exec): WARNING: Calling updater functions failed for one or more functions, but continuing due to management group deployment mode

module.sync-function-trigger[0].null_resource.sync_triggers (local-exec): Check failure log: terraform-sync-logs/xxxxxxxxxxxxxxxxx_sync_failures.log

Apply complete! Resources: 120 added, 5 changed, 2 destroyed.
同期が失敗すると、ファンクションアプリが期待通りにトリガーされない場合があります。失敗したサブスクリプションは、インストールディレクトリ内のterraform-sync-logsフォルダにログファイルとして記録され、ファイル名は<subscription_id>_sync_failures.log形式です。

前提条件

  • Azure CLIがインストールされ、az loginでサインイン済み
  • ターゲットサブスクリプションで関数アプリを管理するための適切な権限
  • インストールディレクトリにterraform-sync-logsフォルダが存在します (展開中に自動的に作成されます)

ソリューション

manual-sync-failed-subscriptions.shスクリプトをインストールディレクトリ (terraform-sync-logsフォルダが含まれている同じディレクトリ) にコピーし、次の手順を完了してください。
  1. スクリプトを実行可能にする:
    chmod +x manual-sync-failed-subscriptions.sh
  2. スクリプトを実行してください。スクリプトは自動的にterraform-sync-logsフォルダをスキャンし、すべての失敗したサブスクリプションを同期します。
    ./manual-sync-failed-subscriptions.sh
    スクリプトは次の処理を完了します。
    • terraform-sync-logsをスキャンして障害ログを確認
    • 失敗したサブスクリプションをすべて一覧表示し、確認を求めます
    • 各サブスクリプションのために関数トリガー (アップデーター、パターンアップデーター、vnetウォッチャー) を同期します
    • トリガーが安定するのを待っています
    • 関数 (パターンアップデーター、vnetウォッチャー、アップデーター) を呼び出します
    • terraform-sync-logs/manual-sync.logに結果を記録します
    注意
    注意
    すべての失敗したサブスクリプションではなく特定のサブスクリプションを同期するには、-s または --subscription フラグを使用し、サブスクリプションIDのカンマ区切りリストを指定してください。
    ./manual-sync-failed-subscriptions.sh -s sub-id-1,sub-id-2
    すべてのチェックポイントをクリアして最初からやり直すには、--reset フラグを使用してください。
    ./manual-sync-failed-subscriptions.sh --reset
  3. スクリプトが完了した後、結果を確認してください。
    • 要約出力を確認してください—スクリプトは、成功、スキップ、および失敗した同期の数を示す要約を表示します。
    • 詳細な結果についてはterraform-sync-logs/manual-sync.logを確認してください。
    • terraform-sync-logs/sync-success/フォルダを確認してください—各<subscription_id>.doneファイルは同期の成功を確認します。
    • サブスクリプションがまだ失敗している場合は、スクリプトを再実行して残りの失敗を再試行してください。

スクリプトオプションレファレンス

オプション
説明
(引数なし)
terraform-sync-logsからすべての失敗したサブスクリプションを同期します
-s, --subscription <id1,id2,...>
特定のサブスクリプションを同期
-r, --reset
すべてのチェックポイントをクリアし、最初から再同期します
-h, --help
ヘルプメッセージを表示