Azure PowerShell 1.0 のリリースを発表

このポストは、11 月 23 日に投稿された Azure PowerShell 1.0 の翻訳です。

Azure PowerShell 1.0 がリリースされ、PowerShell Gallery (英語)WebPI で公開されました。Azure PowerShell の今回のリリースの変更点は次のとおりです。

  • Azure Automation での Azure Resource Manager のサポート
  • Azure Service Management と Azure Resource Manager の機能を分離し、コマンドレットの対象となる Azure 機能を明確化
  • セマンティック バージョニングを実施し、Azure PowerShell の更新によって特定のメジャー バージョンに対するコマンドレットで互換性に影響する変更が発生することを防止
  • WebPI および PowerShell Gallery での Azure PowerShell の公開により、新機能や不具合の修正を迅速に提供
  • Azure PowerShell に関するドキュメントの品質向上と文書化の継続
  • Azure Resource Manager の証明書認証のサポート
  • Azure Key Vault による Virtual Machine のディスク暗号化
  • Azure Data Lake および Azure Notification Hubs コマンドレットの導入
  • Azure Resource Manager、Azure Web Apps、その他の多数の Azure サービスの機能強化

Azure PowerShell 1.0 と Azure PowerShell 0.9.x

WebPI では、Azure PowerShell 1.0 と Azure PowerShell 0.9.x の両方をインストールできます。これは、Azure PowerShell 0.9.x のユーザーが既存のスクリプトを Azure PowerShell 1.0 にアップグレードするための時間を確保することを目的としています。今後も不具合を修正し、Azure PowerShell 0.9.x をサポートしてまいりますが、新機能の追加は予定されていません。新機能の開発は Azure PowerShell 1.0 以上が対象となります。

PowerShell Gallery と WebPI での Azure PowerShell の提供

インストール方法としては、主に PowerShell Gallery (英語)WebPI の 2 種類があります。WebPI では、各月の第 1 火曜日に更新が行われます。一方、PowerShell Gallery では継続的に更新が行われています。PowerShell Gallery からのインストールに慣れていらっしゃる場合は、最新かつ最上位バージョンの Azure PowerShell を入手するために、PowerShell Gallery をご利用になることをお勧めします。

WebPI からの Azure PowerShell 1.0 のインストール

Azure PowerShell 1.0 以上を WebPI からインストールする方法は Azure PowerShell 0.9.x の場合と同じです (このインストール リンクをクリックしてください)。Azure PowerShell 0.9.x をインストールしている場合はアンインストールするよう要求されます。PowerShell Gallery から Azure PowerShell モジュールをインストールした場合は、Azure PowerShell 環境の一貫性を確保するため、インストール前にモジュールを削除するよう要求されます。

以前に Azure PowerShell を PowerShell Gallery からインストールし、代わりに WebPI を使用してインストールしたい場合は、WebPI からインストールする前に次のスクリプトを実行します。

 # AzureRM コンポーネント モジュールをアンインストール
Uninstall-AzureRM

# AzureRM モジュールをアンインストール
Uninstall-Module AzureRM

# Azure モジュールをアンインストール
Uninstall-Module Azure

# または、すべての Azure* モジュールをアンインストール
# Uninstall-Module Azure* -Force

メモ: WebPI からインストールする場合、PowerShell の $env:PSModulePath で既知の問題が発生します。システムの更新やその他のインストールを行うためにコンピューターを再起動する必要がある場合、$env:PSModulePath に Azure PowerShell がインストールされているパスが含まれないことがあります。この問題を修正するには、マシンを再起動するか、$env:PSModulePath のパスを Azure PowerShell に追加します。

メモ: PowerShell Gallery Azure モジュールをインストールしている場合はアンインストールするよう要求されます。これは、インストールしたモジュールの種類とその場所について混乱を防ぐためです。PowerShell Gallery モジュールは通常 %ProgramFiles%\WindowsPowerShell\Modules にインストールされます。一方、WebPI インストーラーを使用すると、Azure モジュールは %ProgramFiles%\Microsoft SDKs\Azure\PowerShell\ にインストールされます。PowerShellGet ではモジュールがアンインストールされますが、アンインストール時にモジュールの依存関係が読み込まれている場合、ロックされた .dll とそれが格納されているフォルダーは削除されずに残ります。PowerShell Gallery モジュールをアンインストールしてもインストール時にエラーが発生する場合は、%ProgramFiles%\WindowsPowerShell\Modules に含まれる Azure* フォルダーを削除してください。

PowerShell Gallery からの Azure PowerShell 1.0 のインストール

Azure PowerShell 1.0 以上を PowerShell Gallery からインストールする方法は Azure PowerShell 1.0 Preview の場合と同じです。

 # Azure Resource Manager モジュールを PowerShell Gallery からインストール
Install-Module AzureRM
Install-AzureRM

# Azure Service Management モジュールを PowerShell Gallery からインストール
Install-Module Azure

# AzureRM モジュールの特定のバージョンのマニフェストに含まれる AzureRM モジュールをインポート
Import-AzureRM

# Azure Service Management モジュールをインポート
Import-Module Azure

上記のスクリプトで実行される処理

上記のスクリプトは非常に単純に見えますが、実際には多くの処理が行われています。このモジュールの機能は、この記事の冒頭で紹介したセマンティック バージョニングの中心となる機能です。Install-Module AzureRM では、AzureRM モジュール用のブートストラップ モジュールがインストールされます。このモジュールには、AzureRM モジュールを安全かつ一貫した方法で更新、アンインストール、インポートするためのコマンドレットが含まれます。

AzureRM モジュールには、AzureRM のメジャー バージョンで互換性に影響する変更が発生しないように、モジュールのリストとバージョンの範囲 (最小、最大) が含まれています。セマンティック バージョニングの詳細については、https://semver.org/lang/ja/ を参照してください。これにより、AzureRM の特定のバージョンを使用してコマンドレットを作成できるほか、ブートストラップを使用してインストールされたすべてのモジュールで互換性に影響する変更も発生しません。

2 つ目のコマンド Install-AzureRM では、ブートストラップ モジュールで宣言されているすべてのモジュールがインストールされます。

3 つ目のコマンド Install-Module Azure では、Azure モジュールがインストールされます。このモジュールは Azure PowerShell 0.9.x の Azure Service Management モジュールで、以前のバージョンの Azure モジュールとの互換性に影響するような大きな変更はありません。

4 つ目のコマンド Import-AzureRM では、AzureRM モジュールのモジュールおよびバージョンのリストに含まれているすべてのモジュールがインポートされます。これにより、AzureRM モジュールが必要とするバージョンの範囲内の Azure PowerShell モジュールが読み込まれます。

5 つ目のコマンド Import-Module Azure では、Azure Service Management モジュールがインポートされます。Azure モジュールと AzureRM モジュールは PowerShell セッションに読み込まれ、併用することができます。

AzureRM モジュールで行われる処理の多くは、指定された最小バージョンと最大バージョンの範囲内でモジュールの依存関係を導入できるようにするための処理です。将来的には、この処理の代わりにより堅牢な PowerShellGet モジュール依存関係リゾルバーが提供される予定です。

Azure PowerShell の使用開始

Azure PowerShell はこれまで以上に簡単に使用を開始できます。Login-AzureRmAccount でログインするだけで、Azure PowerShell でスクリプトを作成、実行できます。

 # Azure Resource Manager にログイン
Login-AzureRmAccount

# 特定のテナントを使用して、さらにすばやくログインすることもできます
# Login-AzureRmAccount -TenantId xxxx

# アカウントのすべてのサブスクリプションを表示
Get-AzureRmSubscription

# 現在のセッションの既定のサブスクリプションを選択
Get-AzureRmSubscription –SubscriptionName “your sub” | Select-AzureRmSubscription

# 現在の Azure PowerShell セッション コンテキストを表示
# このセッション状態は現在のセッションのみに適用され、他のセッションには影響しません
Get-AzureRmContext

# 現在のセッションの既定のストレージ コンテキストを選択
Set-AzureRmCurrentStorageAccount –ResourceGroupName “your resource group” –StorageAccountName “your storage account name”

# 現在の Azure PowerShell セッション コンテキストを表示
# メモ: CurrentStoargeAccount はセッション コンテキストで設定されるようになりました
Get-AzureRmContext

# Azure.Storage データ プレーン モジュール (BLOB、Queue、Table) をインポート
Import-Module Azure.Storage

# すべてのアカウントのすべてのコンテナーに含まれるすべての BLOB のリストを取得
Get-AzureRmStorageAccount | Get-AzureStorageContainer | Get-AzureStorageBlob

上記で目に付くのが Get-AzureRmContext コマンドレットです。これは、Azure PowerShell 0.9.x での Azure PowerShell のスクリプト作成方法から変更された点です。Azure PowerShell 1.0 では、プロファイルを使用する代わりに現在のセッション内のコンテキストを使用してローカル状態を保持します。コンテキストは、現在の Azure 環境 (パブリック クラウドなど)、アカウント、テナント、サブスクリプション、ストレージ アカウントを管理します。その他の既定値に対してコマンドレットを実行する場合は、Set-AzureRmContext を使用します。このコマンドレットの詳細については、help Set-AzureRmContext を実行してください。

Azure Resource Manager を使用した証明書認証

Azure PowerShell に対して最も多くの要望が寄せられる機能の 1 つに、証明書認証があります。今回、Azure PowerShell ユーザーがテナント ID、クライアント ID、シークレットの代わりに証明書を使用して認証を行うようサービス プリンシパルを構成できるようになりました。この機能により、これまでサービス プリンシパル認証に対応していなかった Azure Automation などの Azure 機能をさらに活用できます。Azure Resource Manager の Azure PowerShell 証明書認証の使用を開始するには、次のスクリプトを参考にしてください。

 # Azure PowerShell にログイン
Login-AzureRmAccount

# 自己署名証明書を作成
$currentDate = Get-Date
$endDate = $currentDate.AddYears(1)
$notAfter = $endDate.AddYears(1)
$pwd = "P@ssW0rd1"
$thumb = (New-SelfSignedCertificate -CertStoreLocation cert:\localmachine\my -DnsName com.foo.bar -KeyExportPolicy Exportable -Provider "Microsoft Enhanced RSA and AES Cryptographic Provider" -NotAfter $notAfter).Thumbprint
$pwd = ConvertTo-SecureString -String $pwd -Force -AsPlainText
Export-PfxCertificate -cert "cert:\localmachine\my\$thumb" -FilePath c:\certificates\examplecert.pfx -Password $pwd

# 証明書を読み込む
$cert = New-Object System.Security.Cryptography.X509Certificates.X509Certificate("C:\certificates\examplecert.pfx", $pwd)
$keyValue = [System.Convert]::ToBase64String($cert.GetRawCertData())
$keyId = [guid]::NewGuid()
Import-Module AzureRM.Resources
$keyCredential = New-Object  Microsoft.Azure.Commands.Resources.Models.ActiveDirectory.PSADKeyCredential
$keyCredential.StartDate = $currentDate
$keyCredential.EndDate= $endDate
$keyCredential.KeyId = $keyId
$keyCredential.Type = "AsymmetricX509Cert"
$keyCredential.Usage = "Verify"
$keyCredential.Value = $keyValue

# Azure Active Directory アプリケーションを作成
$azureAdApplication = New-AzureRmADApplication -DisplayName "<Your Application Display Name>" -HomePage "<https://YourApplicationHomePage>" -IdentifierUris "<https://YouApplicationUri>" -KeyCredentials $keyCredential  

# サービス プリンシパルを作成してアプリケーションに接続
New-AzureRmADServicePrincipal -ApplicationId $azureAdApplication.ApplicationId

# サービス プリンシパルに現在のサブスクリプションの読み取りアクセス権を付与
New-AzureRmRoleAssignment -RoleDefinitionName Reader -ServicePrincipalName $azureAdApplication.ApplicationId

# サービス プリンシパルと証明書を使用して Azure PowerShell にログイン
Login-AzureRmAccount -TenantId (Get-AzureRmContext).Tenant.TenantId -ServicePrincipal -Certificate Thumbprint $thumb -ApplicationId $azureAdApplication.ApplicationId

Azure Web Apps コマンドレットの機能強化

Azure PowerShell 1.0 リリースでは Azure Web Apps モジュールも更新されました。コミュニティからのフィードバックを参考に、パイプ処理のサポートを強化し、リソース グループ全体の Web Apps のリストを取得できるようにすることで、Azure Web Apps コマンドレットの使用法を合理化しました。この変更については、言葉で説明するよりも次のスクリプトをご覧いただいた方が早いでしょう。

 # ログインしていない場合はログイン
Login-AzureRmAccount

# 新しい リソース グループを作成
New-AzureRmResourceGroup -Location westus -Name webapptestrg

# 新しい Web Apps を作成
New-AzureRmWebApp -ResourceGroupName webapptestrg -Location westus -Name djtestwebapp

# すべてのリソース グループのすべての Web Apps のリストを取得
# メモ: パイプ処理のサポートを強化しました
Get-AzureRmResourceGroup | Get-AzureRmWebApp

# すべてのリソース グループのすべての Web Apps のリストを取得
# メモ: 前のコマンドと同じ内容ですが、入力文字数が少なくて済みます
Get-AzureRmWebApp

Azure Resource Manager の機能強化

Azure PowerShell 1.0 リリースでは管理コマンドレットに対していくつかの機能強化を行いました。その他にコマンドレット名も変更されています。今回の変更点は次のとおりです。New-AzureRMResourceGroup では新しいリソース グループを作成し、New-AzureRmResourceGroupDeployment ではテンプレートをデプロイできます。パイプ処理を使用して、この 2 つのコマンドレットを併用できます。これにより、コマンドレットがわかりやすく、使いやすくなりました。またこれまで監査ログには、Get-AzureResourceProviderLog、Get-AzureResourceGroupLog、Get-AzureSubscriptionIdLog、Get-AzureResourceLog など、取得するログの種類に応じて多数のコマンドレットが使用されていました。

多くの場合、ログを取得するには、ログ コマンドレットを組み合わせて実行する必要がありましたが、これは最適な方法ではありませんでした。そこで今回、この機能が 1 つのコマンドレットに統合され、パラメーターを使用して異なる種類のログを取得できるようになりました。今後は、適切なパラメーターでログの種類を指定したうえで Get-AzureRmLog を呼び出すことができます。詳細については、「Azure Resource Manager の管理 PowerShell コマンドレットに対する変更」を参照してください。

Azure PowerShell 1.0 の入手

今回の更新内容をご覧になってご興味を持たれた方は、ぜひ WebPI から Azure PowerShell 1.0 をインストールしてください。