マネージド実行コマンドを使用して Windows VM でスクリプトを実行する
適用対象: ✔️ Windows VM ✔️ フレキシブル スケール セット
重要
マネージド実行コマンドは現在、Azure CLI、PowerShell、API で使用できます。 ポータル機能はまもなく利用できるようになります。
実行コマンド機能では、仮想マシン (VM) エージェントを使用して Azure Windows VM 内でスクリプトが実行されます。 これらのスクリプトは、マシンやアプリケーションの一般的な管理に使用できます。 これらを使用すれば、VM のアクセスおよびネットワークの問題を迅速に診断して修正し、VM を良好な状態に戻すことができます。
更新されたマネージド実行コマンドでは、同じ VM エージェント チャネルを使用してスクリプトを実行し、元のアクション指向実行コマンドに対して次の機能強化を実現します。
- ARM デプロイ テンプレートを介して更新された実行コマンドをサポート
- 複数のスクリプトの並列実行
- スクリプトの順次実行
- ユーザーが指定したスクリプトのタイムアウト
- 実行時間が長い (時間または日単位) のスクリプトをサポート
- 安全な方法でシークレット (パラメーター、パスワード) を渡す
前提条件
サポートされている Windows OS
Windows OS | x64 |
---|---|
Windows 10 | サポート |
Windows 11 | サポートされています |
Windows Server 2008 SP2 | サポートされています |
Windows Server 2008 R2 | サポートされています |
Windows Server 2012 | サポートされています |
Windows Server 2012 R2 | サポートされています |
Windows Server 2016 | サポートされています |
Windows Server 2016 Core | サポートされています |
Windows Server 2019 | サポートされています |
Windows Server 2019 Core | サポートされています |
Windows Server 2022 | サポートされています |
Windows Server 2022 Core | サポートされています |
実行コマンドへのアクセスの制限
実行コマンドを一覧表示したり、コマンドの詳細を表示したりするには、サブスクリプション レベルの Microsoft.Compute/locations/runCommands/read
アクセス許可が必要です。 組み込みの閲覧者ロール以上のレベルには、このアクセス許可があります。
コマンドの実行には、Microsoft.Compute/virtualMachines/runCommand/write
アクセス許可が必要です。 仮想マシンの共同作成者ロール以上のレベルには、このアクセス許可があります。
実行コマンドを使用するには、いずれかの組み込みロールを使用するか、カスタム ロールを作成します。
Azure CLI
次の例では、az vm run-command を使用して、Azure Windows VM 上でシェル スクリプトを実行します。
VM でスクリプトを実行する
このコマンドを実行すると、スクリプトが VM に配信されて実行され、キャプチャされた出力が返されます。
az vm run-command create --name "myRunCommand" --vm-name "myVM" --resource-group "myRG" --script "Write-Host Hello World!"
VM 上にデプロイされているすべての RunCommand リソースを一覧表示する
このコマンドからは、以前にデプロイされた実行コマンドと、それらのプロパティの完全な一覧が返されます。
az vm run-command list --vm-name "myVM" --resource-group "myRG"
実行の状態と結果を取得する
このコマンドを実行すると、現在の実行の進行状況 (最新の出力、開始/終了時刻、終了コード、および実行の終了状態など) が取得されます。
az vm run-command show --name "myRunCommand" --vm-name "myVM" --resource-group "myRG" --expand instanceView
注意
instanceView
の出力およびエラー フィールドは、最後の 4 KB に制限されています。
完全な出力とエラーにアクセスする場合は、Set-AzVMRunCommand
または Set-AzVMssRunCommand
を使用して実行コマンドを実行するときに、-outputBlobUri
と -errorBlobUri
パラメーターを使用して、出力およびエラー データをストレージ追加 BLOB に転送するオプションがあります。
VM から RunCommand リソースを削除する
VM に以前にデプロイされた RunCommand リソースを削除します。 スクリプトの実行がまだ進行中の場合は、実行が終了されます。
az vm run-command delete --name "myRunCommand" --vm-name "myVM" --resource-group "myRG"
PowerShell
VM でスクリプトを実行する
このコマンドを実行すると、スクリプトが VM に配信されて実行され、キャプチャされた出力が返されます。
Set-AzVMRunCommand -ResourceGroupName "myRG" -VMName "myVM" -Location "EastUS" -RunCommandName "RunCommandName" –SourceScript "echo Hello World!"
SourceScriptUri パラメーターを使用して VM でスクリプトを実行する
OutputBlobUri
と ErrorBlobUri
は省略可能なパラメーターです。
Set-AzVMRunCommand -ResourceGroupName "myRg" `
-VMName "myVM" `
-RunCommandName "RunCommandName" `
-SourceScriptUri “<SAS_URI_of_a_storage_blob_with_read_access_or_public_URI>" `
-OutputBlobUri “<SAS_URI_of_a_storage_append_blob_with_read_add_create_write_access>" `
-ErrorBlobUri “<SAS_URI_of_a_storage_append_blob_with_read_add_create_write_access>”
VM 上にデプロイされているすべての RunCommand リソースを一覧表示する
このコマンドからは、以前にデプロイされた実行コマンドと、それらのプロパティの完全な一覧が返されます。
Get-AzVMRunCommand -ResourceGroupName "myRG" -VMName "myVM"
実行の状態と結果を取得する
このコマンドを実行すると、現在の実行の進行状況 (最新の出力、開始/終了時刻、終了コード、および実行の終了状態など) が取得されます。
Get-AzVMRunCommand -ResourceGroupName "myRG" -VMName "myVM" -RunCommandName "RunCommandName" -Expand InstanceView
SourceScriptUri (ストレージ BLOB SAS URL) を使用して VM で実行コマンドを作成または更新する
PowerShell スクリプトを含むストレージ BLOB の SAS URL を使用して、Windows VM で実行コマンドを作成または更新します。 SourceScriptUri
には、ストレージ BLOB の完全な SAS URL またはパブリック URL を指定できます。
Set-AzVMRunCommand -ResourceGroupName MyRG0 -VMName MyVMEE -RunCommandName MyRunCommand -Location EastUS2EUAP -SourceScriptUri <SourceScriptUri>
注意
SAS URL は、BLOB への読み取りアクセスを提供する必要があります。 SAS URL の有効期限は 24 時間にすることをお勧めします。 SAS URL は、BLOB のオプションを使用して Azure portal で生成するか、または New-AzStorageBlobSASToken
を使用して SAS トークンを生成することができます。 New-AzStorageBlobSASToken
を使用して SAS トークンを生成する場合、SAS URL は、次のようになります。"ベース BLOB URL" + "?" + "New-AzStorageBlobSASToken
からの SAS トークン"
実行コマンドの作成または更新後に VM の実行コマンド インスタンス ビューを取得する
インスタンス ビューを使用して VM の実行コマンドを取得します。 インスタンス ビューには、実行コマンドの実行状態 (Succeeded、Failed など)、終了コード、標準出力、および実行コマンドを使用してスクリプトを実行することで生成された標準エラーが含まれます。 0 以外の ExitCode は、失敗した実行を示します。
$x = Get-AzVMRunCommand -ResourceGroupName MyRG -VMName MyVM -RunCommandName MyRunCommand -Expand InstanceView
$x.InstanceView
出力例
ExecutionState : Succeeded
ExecutionMessage :
ExitCode : 0
Output :
output : uid=0(root) gid=0(root) groups=0(root)
HelloWorld
Error :
StartTime : 10/27/2022 9:10:52 PM
EndTime : 10/27/2022 9:10:55 PM
Statuses :
InstanceView.ExecutionState
: ユーザーの実行コマンド スクリプトの状態。 スクリプトが成功したかどうかを確認するには、この状態を参照します。
ProvisioningState
: 一般的な拡張機能のプロビジョニングのエンドツーエンドの状態 (拡張機能プラットフォームが実行コマンドスクリプトをトリガーできたかどうか)。
ScriptLocalPath (ローカル スクリプト ファイル) を使用して VM で実行コマンドを作成または更新する
コマンドレットが実行されるクライアント コンピューター上にあるローカル スクリプト ファイルを使用して、VM で実行コマンドを作成または更新します。
Set-AzVMRunCommand -ResourceGroupName MyRG0 -VMName MyVMEE -RunCommandName MyRunCommand -Location EastUS2EUAP -ScriptLocalPath "C:\MyScriptsDir\MyScript.ps1"
SourceScript (スクリプト テキスト) を使用して VM で実行コマンドを作成または更新する
スクリプト コンテンツを -SourceScript パラメーターに直接渡す VM で実行コマンドを作成または更新します。 複数のコマンドを区切るには、;
を使います
Set-AzVMRunCommand -ResourceGroupName MyRG0 -VMName MyVML -RunCommandName MyRunCommand2 -Location EastUS2EUAP -SourceScript "id; echo HelloWorld"
SourceCommandId を使用して VM で実行コマンドを作成または更新する
既存の commandId を使用して、VM で実行コマンドを作成または更新します。 使用可能な commandId は、Get-AzVMRunCommandDocument を使用して取得できます。
Set-AzVMRunCommand -ResourceGroupName MyRG0 -VMName MyVMEE -RunCommandName MyRunCommand -Location EastUS2EUAP -SourceCommandId DisableWindowsUpdate
OutputBlobUri、ErrorBlobUri を使用して VM で実行コマンドを作成または更新し、標準出力と標準エラー メッセージを出力およびエラー追加 BLOB にストリーミングする
VM で実行コマンドを作成または更新し、標準出力と標準エラー メッセージを出力およびエラー追加 BLOB にストリーミングします。
Set-AzVMRunCommand -ResourceGroupName MyRG0 -VMName MyVML -RunCommandName MyRunCommand3 -Location EastUS2EUAP -ScriptLocalPath "C:\MyScriptsDir\MyScript.ps1" -OutputBlobUri <OutPutBlobUrI> -ErrorBlobUri "ErrorBlobUri
注意
出力およびエラー BLOB は AppendBlob 型である必要があり、SAS URL は BLOB への読み取り、追加、作成、書き込みアクセスを提供する必要があります。 SAS URL の有効期限は 24 時間にすることをお勧めします。 出力またはエラー BLOB が存在しない場合は、AppendBlob 型の BLOB が作成されます。 SAS URL は、BLOB のオプションを使用して Azure portal で生成するか、または New-AzStorageBlobSASToken
を使用して SAS トークンを生成することができます。
RunAsUser および RunAsPassword パラメーターを使用して別のユーザーとして VM で実行コマンドを作成または更新する
RunAsUser
および RunAsPassword
パラメーターを使用して、別のユーザーとして VM で実行コマンドを作成または更新します。 RunAs が正常に機能するには、VM の管理者にお問い合わせいただき、VM にユーザーが追加されていること、ユーザーが実行コマンド (ディレクトリ、ファイル、ネットワークなど) によってアクセスされたリソースにアクセスできること、また、Windows VM の場合は、VM で "セカンダリ ログオン" サービスが実行されていることをご確認ください。
Set-AzVMRunCommand -ResourceGroupName MyRG0 -VMName MyVMEE -RunCommandName MyRunCommand -Location EastUS2EUAP -ScriptLocalPath "C:\MyScriptsDir\MyScript.ps1" -RunAsUser myusername -RunAsPassword mypassword
SourceScriptUri (ストレージ BLOB SAS URL) を使用して、Virtual Machine Scale Sets リソースで実行コマンドを作成または更新する
PowerShell スクリプトを含むストレージ BLOB の SAS URL を使用して、Windows Virtual Machine Scale Sets リソースで実行コマンドを作成または更新します。
Set-AzVmssVMRunCommand -ResourceGroupName MyRG0 -VMScaleSetName MyVMSS -InstanceId 0 -RunCommandName MyRunCommand -Location EastUS2EUAP -SourceScriptUri <SourceScriptUri>
注意
SAS URL は、BLOB への読み取りアクセスを提供する必要があります。 SAS URL の有効期限は 24 時間にすることをお勧めします。 SAS URL は、BLOB のオプションを使用して Azure portal で生成するか、または New-AzStorageBlobSASToken
を使用して SAS トークンを生成することができます。 New-AzStorageBlobSASToken
を使用して SAS トークンを生成する場合、SAS URL 形式は次のようになります。ベース BLOB URL + "?" + New-AzStorageBlobSASToken
からの SAS トークン。
Parameter および ProtectedParameter パラメーター (スクリプト化するパブリック パラメーターと保護されたパラメーター) を使用して VM インスタンスで実行コマンドを作成または更新する
パスワード、キーなどの機密性の高い入力をスクリプトに渡すには、ProtectedParameter を使用します。
$PublicParametersArray = @([Microsoft.Azure.PowerShell.Cmdlets.Compute.Models.Api20210701.IRunCommandInputParameter]@{name='publicParam1';value='publicParam1value'},
>> [Microsoft.Azure.PowerShell.Cmdlets.Compute.Models.Api20210701.IRunCommandInputParameter]@{name='publicParam2';value='publicParam2value'})
$ProtectedParametersArray = @([Microsoft.Azure.PowerShell.Cmdlets.Compute.Models.Api20210701.IRunCommandInputParameter]@{name='secret1';value='secret1value'},
>> [Microsoft.Azure.PowerShell.Cmdlets.Compute.Models.Api20210701.IRunCommandInputParameter]@{name='secret2';value='secret2value'})
Set-AzVMRunCommand -ResourceGroupName MyRG0 -VMName MyVMEE -RunCommandName MyRunCommand -Location EastUS2EUAP -SourceScriptUri <SourceScriptUri> -Parameter $PublicParametersArray -ProtectedParameter $ProtectedParametersArray
Windows: 引数がスクリプトに渡され、次のように実行されるため、Parameter と ProtectedParameter がスクリプトに渡されます
myscript.ps1 -publicParam1 publicParam1value -publicParam2 publicParam2value -secret1 secret1value -secret2 secret2value
Linux: 名前付きパラメーターとその値は、.sh スクリプト内でアクセスできる環境構成に設定されます。 Nameless 引数の場合は、空の文字列を name 入力に渡します。 Nameless 引数はスクリプトに渡され、次のように実行されます
myscript.sh publicParam1value publicParam2value secret1value secret2value
VM から RunCommand リソースを削除する
VM に以前にデプロイされた RunCommand リソースを削除します。 スクリプトの実行がまだ進行中の場合は、実行が終了されます。
Remove-AzVMRunCommand -ResourceGroupName "myRG" -VMName "myVM" -RunCommandName "RunCommandName"
REST API
新しい実行コマンドをデプロイするには、VM 上で PUT を直接実行し、実行コマンド インスタンスに一意の名前を指定します。
PUT /subscriptions/<subscriptionId>/resourceGroups/<resourceGroupName>/providers/Microsoft.Compute/virtualMachines/<vmName>/runcommands/<runCommandName>?api-version=2023-03-01
{
"location": "<location>",
"properties": {
"source": {
"script": "Write-Host Hello World!",
"scriptUri": "<SAS URI of a storage blob with read access or public URI>",
"commandId": "<Id>"
},
"parameters": [
{
"name": "param1",
"value": "value1"
},
{
"name": "param2",
"value": "value2"
}
],
"protectedParameters": [
{
"name": "secret1",
"value": "value1"
},
{
"name": "secret2",
"value": "value2"
}
],
"runAsUser": "userName",
"runAsPassword": "userPassword",
"timeoutInSeconds": 3600,
"treatFailureAsDeploymentFailure": true,
"outputBlobUri": "< SAS URI of a storage append blob with read, add, create, write access>",
"errorBlobUri": "< SAS URI of a storage append blob with read, add, create, write access >"
}
}
Notes
- 入力ソースとして、インライン スクリプト、スクリプト URI、または組み込みのスクリプト コマンド ID を指定できます。 スクリプト URI は、読み取りアクセス権を持つストレージ BLOB SAS URI またはパブリック URI のいずれかです。
- 1 回のコマンド実行でサポートされるソース入力は 1 種類だけです。
- API バージョン 2023-03-01 以降では、 プロパティ
treatFailureAsDeploymentFailure
を true に設定することで、スクリプトにエラーが発生したときにデプロイが失敗させることができます。 false に設定すると、ProvisioningState は、実行コマンドが拡張機能プラットフォームによって実行されたかどうかのみを反映します。 スクリプトが失敗した場合、スクリプトが失敗したかどうかは示されません。 - 実行コマンドでは、outputBlobUri パラメーターと errorBlobUri パラメーターを使用したストレージ BLOB への出力とエラーの書き込みがサポートされています。これは、大きなスクリプト出力の格納に使用できます。 読み取り、追加、作成、書き込みアクセス権を持つストレージ追加 BLOB の SAS URI を使用します。 BLOB は AppendBlob 型である必要があります。 そうでない場合、スクリプト出力またはエラー BLOB の書き込みが失敗します。 BLOB が既に存在する場合は上書きされます。 存在しない場合は作成されます。
VM 上で実行中の、実行コマンドのインスタンスを一覧表示する
GET /subscriptions/<subscriptionId>/resourceGroups/<resourceGroupName>/providers/Microsoft.Compute/virtualMachines/<vmName>/runcommands?api-version=2023-03-01
特定の実行コマンドのデプロイについて出力の詳細を取得する
GET /subscriptions/<subscriptionId>/resourceGroups/<resourceGroupName>/providers/Microsoft.Compute/virtualMachines/<vmName>/runcommands/<runCommandName>?$expand=instanceView&api-version=2023-03-01
特定の実行コマンドのデプロイを削除する
実行コマンドのインスタンスを削除することもできます。
DELETE /subscriptions/<subscriptionId>/resourceGroups/<resourceGroupName>/providers/Microsoft.Compute/virtualMachines/<vmName>/runcommands/<runCommandName>?api-version=2023-03-01
順序付けられたシーケンスでスクリプトをデプロイする
スクリプトを順番にデプロイするには、デプロイ テンプレートを使用して、シーケンシャル スクリプト間に dependsOn
リレーションシップを指定します。
{
"type": "Microsoft.Compute/virtualMachines/runCommands",
"name": "secondRunCommand",
"apiVersion": "2019-12-01",
"location": "[parameters('location')]",
"dependsOn": <full resourceID of the previous other Run Command>,
"properties": {
"source": {
"script": "Write-Host Hello World!"
},
"timeoutInSeconds": 60
}
}
複数の実行コマンドを順番に実行する
デプロイ テンプレートを使用して複数の RunCommand リソースをデプロイする場合、既定では、それらは VM 上で同時に実行されます。 スクリプト同士に依存関係があり、実行の優先順序が設定されている場合は、dependsOn
プロパティを使用してそれらを順番に実行することができます。
この例では、firstRunCommand が実行されてから、secondRunCommand が実行されます。
{
"$schema":"https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
"contentVersion":"1.0.0.0",
"resources":[
{
"type":"Microsoft.Compute/virtualMachines/runCommands",
"name":"[concat(parameters('vmName'),'/firstRunCommand')]",
"apiVersion":"2023-03-01",
"location":"[parameters('location')]",
"dependsOn":[
"[concat('Microsoft.Compute/virtualMachines/', parameters('vmName'))]"
],
"properties":{
"source":{
"script":"Write-Host First: Hello World!"
},
"parameters":[
{
"name":"param1",
"value":"value1"
},
{
"name":"param2",
"value":"value2"
}
],
"timeoutInSeconds":20
}
},
{
"type":"Microsoft.Compute/virtualMachines/runCommands",
"name":"[concat(parameters('vmName'),'/secondRunCommand')]",
"apiVersion":"2019-12-01",
"location":"[parameters('location')]",
"dependsOn":[
"[concat('Microsoft.Compute/virtualMachines/', parameters('vmName'),'runcommands/firstRunCommand')]"
],
"properties":{
"source":{
"scriptUri":"http://github.com/myscript.ps1"
},
"timeoutInSeconds":60
}
}
]
}
次のステップ
VM 内でスクリプトやコマンドをリモートで実行するその他の方法については、「Windows VM でスクリプトを実行する」を参照してください。