Azure CLIのインストールとログイン設定|az loginとサービスプリンシパルで自動化に備える方法

宮崎智広 この記事の監修:宮崎智広(Linux実務・教育歴20年以上・受講者3,100名超)
HOMELinux技術 リナックスマスター.JP(Linuxマスター.JP)Azure > Azure CLIのインストールとログイン設定|az loginとサービスプリンシパルで自動化に備える方法
「AzureをCLIで操作したいのに、毎回ブラウザログインが必要で自動化できない」
「az ad sp create-for-rbacは名前だけ知っているが、実際のオプションや作成後の使い方が分からない」

この記事では、Azure CLIのインストールからaz loginによる対話ログイン、サービスプリンシパルの作成・非対話ログイン、環境変数による認証設定まで、CI/CDやシェルスクリプトで通用するazure cli サービスプリンシパルの構成を一気通貫で解説します。
実行環境はRHEL 9.4 / Ubuntu 24.04 LTSで動作確認済みです。

この記事のポイント

・az ad sp create-for-rbacでサービスプリンシパルとシークレットを同時生成できる
・az login --service-principalで非対話ログインしてスクリプト自動化に備える
・AZURE_CLIENT_ID等の環境変数でCI/CDパイプラインから認証情報を参照できる
・本番VMにはManaged Identityへの移行を推奨(この記事で移行パスも押さえる)


「このままじゃマズい」と感じていませんか?
参考書を開く気力もない、同年代に取り残される不安——
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
図解60P/登録10秒/解除も3秒 / 詳細はこちら

Azure CLIとは何か(インストールが必要な理由)

AzureのリソースはWebブラウザから操作できるAzureポータルが手軽ですが、「1コマンドで複数VMにタグを付ける」「GitHub ActionsからVMを自動デプロイする」といった繰り返し作業やCI/CD統合には、コマンドラインツールのAzure CLIが不可欠です。

Azure CLIはazコマンドでAzureのほぼすべてのリソースを操作できるMicrosoft公式ツールです。Linux・Windows・macOSで同一の構文が使えます。

開発・検証:az loginで対話ログインし、コマンドでリソースを操作する
CI/CDパイプライン:サービスプリンシパル認証でGitHub ActionsやJenkinsから非対話実行する
定期バッチ・シェルスクリプト:cronジョブやデプロイスクリプトに認証処理を組み込む

本記事では対話ログインと自動化の両方の認証設定を順番に解説します。

Azure CLIのインストール手順

1. RHEL 9 / Rocky Linux 9 へのインストール

RHEL 9系では、MicrosoftのDNFリポジトリを追加してインストールします。

# Microsoftリポジトリキーをインポート $ sudo rpm --import https://packages.microsoft.com/keys/microsoft.asc # Microsoftリポジトリ設定を追加 $ sudo dnf install -y https://packages.microsoft.com/config/rhel/9.0/packages-microsoft-prod.rpm # Azure CLIをインストール $ sudo dnf install -y azure-cli # バージョン確認 $ az --version azure-cli 2.61.0 core 2.61.0 telemetry 1.1.0

2. Ubuntu 24.04 LTS へのインストール

Ubuntuには公式インストールスクリプトが用意されており、1コマンドで完了します。

# 公式インストールスクリプトで一括インストール $ curl -sL https://aka.ms/InstallAzureCLIDeb | sudo bash # バージョン確認 $ az --version azure-cli 2.61.0

3. Windowsへのインストール(参考)

WindowsではwingetまたはMSIインストーラーを使います。

# wingetでインストール(Windows 10/11) > winget install -e --id Microsoft.AzureCLI # バージョン確認 > az --version

az loginでインタラクティブログイン

インストール後の最初のステップはaz loginです。コマンドを実行するとブラウザが起動し、Microsoftアカウントでサインインします。

1. ブラウザを使ったログイン

$ az login # ブラウザが自動で起動してMicrosoftアカウントのサインイン画面が表示される # サインイン成功後、ターミナルにJSON形式でサブスクリプション情報が出力される [ { "cloudName": "AzureCloud", "homeTenantId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", "id": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", "isDefault": true, "name": "my-azure-subscription", "state": "Enabled", "tenantId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", "user": { "name": "user@example.com", "type": "user" } } ]

2. ブラウザなし環境でのデバイスコードログイン

SSHで接続したサーバーなどブラウザを起動できない環境では、--use-device-codeオプションを使います。表示されたURLに自分のPCでアクセスし、コードを入力してサインインします。

$ az login --use-device-code To sign in, use a web browser to open the page https://microsoft.com/devicelogin and enter the code XXXXXXXX to authenticate.

3. ログイン状態と複数サブスクリプションの確認

# ログイン中のアカウントを確認 $ az account show { "environmentName": "AzureCloud", "id": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", "isDefault": true, "name": "my-azure-subscription", "state": "Enabled", "tenantId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", "user": { "name": "user@example.com", "type": "user" } } # 複数サブスクリプションがある場合は一覧を表示 $ az account list --output table Name CloudName SubscriptionId TenantId State IsDefault --------------------- ----------- ---------------- ---------- ------- ----------- my-azure-subscription AzureCloud xxxx-... xxxx-... Enabled True dev-subscription AzureCloud xxxx-... xxxx-... Enabled False # デフォルトサブスクリプションを切り替える $ az account set --subscription dev-subscription

サービスプリンシパルの作成と認証設定(az ad sp create-for-rbac)

az loginはブラウザを使った対話認証が必要なため、CI/CDパイプラインやcronスクリプトでは使えません。こうした自動化シナリオで使うのがサービスプリンシパルです。

サービスプリンシパルとは、Azureにおけるアプリケーションやスクリプトのためのサービスアカウントです。人間のユーザーアカウントとは独立して発行でき、ロール(Contributor、Readerなど)で権限範囲を明確に制限できます。
セミナーでよく受ける質問のひとつが「サービスプリンシパルにどの権限を与えればいいか分からない」というものです。最小権限の原則を基本に、最初はリソースグループ単位でContributorを付与し、必要に応じて権限を追加するアプローチを推奨しています。

1. サービスプリンシパルを作成する

# サブスクリプションIDを変数に取得 $ SUBSCRIPTION_ID=$(az account show --query id -o tsv) # サービスプリンシパルを作成(Contributorロール・サブスクリプション全体) $ az ad sp create-for-rbac --name myAutomationSP --role Contributor --scopes /subscriptions/${SUBSCRIPTION_ID} # 出力例(passwordはこの1回限り。必ず安全な場所に保存すること) { "appId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", "displayName": "myAutomationSP", "password": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", "tenant": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" }

出力値のそれぞれの意味は次のとおりです。
appId:クライアントID。後でAZURE_CLIENT_IDに設定する値
password:クライアントシークレット。AZURE_CLIENT_SECRETに設定する値(再表示不可)
tenant:テナントID。AZURE_TENANT_IDに設定する値

注意: passwordはこの画面でしか確認できません。出力をそのまま安全な場所(Azure Key Vault等)に保管してください。紛失した場合は後述のシークレット再作成で対応します。

2. 権限スコープを特定リソースグループに絞り込む(本番推奨)

Contributorをサブスクリプション全体に付与するのは検証用の設定です。本番環境では権限を最小化し、必要なリソースグループのみに絞ります。

# 特定リソースグループのみに権限を限定する場合 $ az ad sp create-for-rbac --name myAutomationSP --role Contributor --scopes /subscriptions/${SUBSCRIPTION_ID}/resourceGroups/rg-production

3. シークレットの有効期限と再作成

デフォルトではシークレットの有効期限は1年です。期限切れでパイプラインが突然止まらないよう、定期的な更新サイクルを設けてください。

# 既存サービスプリンシパルのappIdを確認 $ az ad sp list --display-name myAutomationSP --query "[].{name:displayName, appId:appId}" -o table # 新しいシークレットを生成(有効期限を2年に設定) $ az ad sp credential reset --id --years 2

サービスプリンシパルを使った非対話ログイン(az login --service-principal)

作成したサービスプリンシパルの認証情報でAzureに非対話ログインします。

1. az login --service-principalで認証する

# サービスプリンシパルでログイン $ az login --service-principal --username --password --tenant # 成功時の出力(userのtypeが servicePrincipal になっていることを確認) [ { "cloudName": "AzureCloud", "id": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", "isDefault": true, "name": "my-azure-subscription", "state": "Enabled", "tenantId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", "user": { "name": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", "type": "servicePrincipal" } } ] # ログイン確認 $ az account show --query user { "name": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", "type": "servicePrincipal" }

2. シェル履歴にシークレットを残さない方法

コマンドラインにシークレットを直接書くとシェル履歴(~/.bash_history)に残ります。本番環境では@ファイルパスでファイルからパスワードを読み込む方法を使います。

# シークレットをファイルに保存し、権限を制限 $ echo "xxxxxxxxxxxxxxxxxxxxxx" > ~/.azure/sp-secret.txt $ chmod 400 ~/.azure/sp-secret.txt # @ファイルパスでシークレットを読み込んでログイン $ az login --service-principal --username --password @~/.azure/sp-secret.txt --tenant

環境変数で自動化に備える(AZURE_CLIENT_ID等)

GitHub ActionsやJenkins等のCI/CDパイプラインでは、環境変数からAzureの認証情報を渡すパターンが標準的です。Azure CLIは以下の環境変数を自動で認識します。

AzureのazコマンドでVNetやLinux VMを実際に操作してみたい方は、認証設定が完了した後に「AzureのVNetとLinux VMをazコマンドで構築する手順」も参照してください。
現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、20年以上の運用経験を持つ現役エンジニアが基礎から教えます。
Azure対応セミナーの詳細を見る >>

1. 必要な環境変数の一覧

環境変数名 対応する値(az ad sp create-for-rbacの出力)
AZURE_CLIENT_ID appId(クライアントID)
AZURE_CLIENT_SECRET password(クライアントシークレット)
AZURE_TENANT_ID tenant(テナントID)
AZURE_SUBSCRIPTION_ID az account show --query id で取得したサブスクリプションID

2. シェルスクリプトでの設定例

# 環境変数を設定してサービスプリンシパルでログイン export AZURE_CLIENT_ID="xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" export AZURE_CLIENT_SECRET="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" export AZURE_TENANT_ID="xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" export AZURE_SUBSCRIPTION_ID="xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" az login --service-principal --username "${AZURE_CLIENT_ID}" --password "${AZURE_CLIENT_SECRET}" --tenant "${AZURE_TENANT_ID}" az account set --subscription "${AZURE_SUBSCRIPTION_ID}"

注意: ~/.bashrcへの直接書き込みは開発環境の一時利用にとどめてください。本番環境ではAzure Key VaultやCI/CDツールのシークレット管理機能を使ってシークレットを保管し、実行時に取得するパターンを採用します。

3. GitHub Actionsでの設定例

GitHub ActionsではSecretsに登録した値を環境変数として渡します。GitHubリポジトリの「Settings > Secrets and variables > Actions」から登録します。

# .github/workflows/azure-deploy.yml steps: - name: Azure CLI ログイン run: | az login --service-principal --username "${{ secrets.AZURE_CLIENT_ID }}" --password "${{ secrets.AZURE_CLIENT_SECRET }}" --tenant "${{ secrets.AZURE_TENANT_ID }}" az account set --subscription "${{ secrets.AZURE_SUBSCRIPTION_ID }}" - name: リソースグループ一覧表示(動作確認) run: az group list --output table

サービスプリンシパルからManaged Identityへの発展

サービスプリンシパルはシークレットの管理が必要です。「シークレットをGitHubに誤ってプッシュしてしまった」「有効期限切れでパイプラインが突然止まった」というトラブルは現場でも珍しくありません。

Azure VM上で動くスクリプトやアプリからAzureリソースにアクセスする場合、より安全な選択肢としてManaged Identityがあります。VMにアイデンティティを割り当てることで、シークレットを一切コード内に持たずに認証できます。

サービスプリンシパル:シークレット管理が必要。GitHub Actions等のVM外からの認証に向く
Managed Identity:シークレット不要。Azure VM上で動くスクリプトやアプリに推奨

詳しい設定手順は「AzureのManaged IdentityでLinux VMから鍵なしにリソースへアクセスする方法」で解説しています。

よくあるエラーと対処法

1. 「AADSTS70011: The provided value for the input parameter scope is not valid」

--scopesに指定したパスのサブスクリプションIDが誤っている場合に発生します。

# まずサブスクリプションIDを正確に確認 $ az account show --query id -o tsv xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx # 確認したIDを使ってサービスプリンシパルを作成 $ az ad sp create-for-rbac --name myAutomationSP --role Contributor --scopes /subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

2. 「Insufficient privileges to complete the operation」

サービスプリンシパルが対象リソースに対してContributorやOwnerのロールを持っていない場合のエラーです。

# 現在のロール割り当てを確認 $ az role assignment list --assignee --output table # Contributorロールを追加する $ az role assignment create --assignee --role Contributor --scope /subscriptions/${SUBSCRIPTION_ID}

3. 「AADSTS7000215: Invalid client secret provided」

シークレットの有効期限切れ、またはコピーミスが原因です。az ad sp credential resetで新しいシークレットを発行し、環境変数やSecretsの値を更新してください。

本記事のまとめ

やりたいこと コマンド
Azure CLIをRHEL 9にインストール sudo dnf install -y azure-cli
Azure CLIをUbuntuにインストール curl -sL https://aka.ms/InstallAzureCLIDeb | sudo bash
インタラクティブログイン az login
デバイスコードログイン(ブラウザなし) az login --use-device-code
ログイン中のアカウントを確認 az account show
サービスプリンシパルを作成 az ad sp create-for-rbac --name SP名 --role Contributor --scopes /subscriptions/ID
サービスプリンシパルでログイン az login --service-principal --username appId --password secret --tenant tenantId
シークレットを再作成 az ad sp credential reset --id appId --years 2
ロール割り当てを確認 az role assignment list --assignee appId --output table

VNetへのSSH接続をセキュアに保つためのNSG設定は「AzureのNSGとSSH公開鍵認証でLinux VMを安全に保護する方法」を参照してください。

現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、20年以上の運用経験を持つ現役エンジニアが基礎から教えます。
Azure対応セミナーの詳細を見る >>

無料メルマガで学習を続ける

Linuxの実践スキルをメールで毎週お届け。
登録は1分、解除もいつでも可。

登録無料・いつでも解除できます

暗記不要・1時間後にはサーバーが動く

3,100名以上が実践した「型」を無料で公開中

プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。

登録10秒/合わなければ解除3秒 / 詳細はこちら

Linux無料マニュアル(図解60P) 名前とメールで30秒登録
宮崎 智広

この記事を書いた人

宮崎 智広(みやざき ともひろ)

株式会社イーネットマーキュリー代表。現役のLinuxサーバー管理者として20年以上の実務経験を持ち、これまでに累計3,100名以上のエンジニアを指導してきたLinux教育のプロフェッショナル。「現場で本当に使える技術」を体系的に伝えることをモットーに、実践型のLinuxセミナーの開催や無料マニュアルの配布を通じてLinux人材の育成に取り組んでいる。

趣味は、キャンプにカメラ、トラウト釣り。好きな食べ物は、ラーメンにお酒。休肝日が作れない、酒量を減らせないのが悩み。最近、ドラマ「フライトエンジェル」を観て涙腺が崩壊しました。