Azure PowerShell のジョブ実行

先ほどのログイン自動化に続いて、Azure PowerShell 4.4.0 以降で使える便利な TIPS をもう一つ。

各コマンドレットに AzureRmContext というオプションが追加されて、PSJob 内に認証情報を渡せるようになっています。

Start-Job {

   # ArgumentList で渡した Context を引数 ($ctx) として使用して、
    param ($ctx)

    # 並列実行したいコマンドを $ctx の認証情報で実行
    Get-AzureRMVM -AzureRmContext $ctx

} -ArgumentList (Get-AzureRmContext)


# ジョブの一覧を表示
Get-Job

Id     Name            PSJobTypeName   State         HasMoreData     Location             Command
--     ----            -------------   -----         -----------     --------             -------
1      Job1            BackgroundJob   Completed     True            localhost            ...


# ジョブの実行結果を表示 (↑で State が Running の場合は待つべし)
Receive-Job 1 # Job ID

ResourceGroupName       Name  Location VmSize OsType NIC ProvisioningState Zone
-----------------       ----  -------- ------ ------ --- ----------------- ----
SHUDA1215         shuda1215a japaneast                           Succeeded
SHUDA1215         shuda1215b japaneast                           Succeeded
SHUDA1221         shuda1221a japaneast                           Succeeded
SHUDA1221         shuda1221b japaneast                           Succeeded

これの何がうれしいかというと、PSJob を使いこなすことで時間のかかるコマンドをパラレル実行できるようになるので、作成に時間のかかるリソース (Gateway とか) を複数作るときや、サブスクリプションをまたいで並列処理をしたいときに大変はかどります。

例えば、こんな感じでサブスクリプションを切り替えて、全サブスクリプションの VM 一覧を取得したりとか。

Get-AzureRmSubscription | foreach{

    # サブスクリプションを切り替えて
    Select-AzureRmSubscription -SubscriptionId $_.SubscriptionID

    # ジョブを実行
    Start-Job{
        param($ctx)

        Get-AzureRmVM -AzureRmContext $ctx
    } -ArgumentList (Get-AzureRmContext)
}

# 各サブスクリプションに対してジョブが実行される
Get-Job

Id     Name            PSJobTypeName   State         HasMoreData     Location             Command
--     ----            -------------   -----         -----------     --------             -------
1      Job1            BackgroundJob   Completed     True            localhost            ...
3      Job3            BackgroundJob   Completed     True            localhost            ...
5      Job5            BackgroundJob   Completed     True            localhost            ...
7      Job7            BackgroundJob   Completed     True            localhost            ...
9      Job9            BackgroundJob   Completed     True            localhost            ..

ということで、去年までは「口を動かす前に、手を動かせ」が口癖でしたが、今年は手を動かす手間さえも省きたいと思います。

 

Azure PowerShell (ARM) で毎回ログインしなくて済む方法

Azure PowerShell で毎回ログイン (Login-AzureRmAccount) するの面倒ですよね。

Ver 4.4.0 (Ignite Release) から認証情報を保存できるコマンドレットが増えてるので、皆さん今すぐ使ってください。

Enable-AzureRmContextAutosave
Login-AzureRmAccount #一回だけログインすれば、以降は保存した Context を使ってくれます。

以上。

P.S. Azure PowerShell は月に一度くらいの頻度で更新されるので、毎月リリース情報チェックして最新版にしましょう。

 

Azure DNS でゾーンの委任を試してみる

年末年始は Office 365 のテナント引っ越しとか、どこのご家庭にもあるドメコンを整理していたのですが、Azure DNS 周りも多少いじったのでメモ程度に。

App Service ドメイン (Preview) で Azure ポータルからドメインが買える

つい先日まで知らなかったんですが、Azure で独自ドメインも買えるそうで、shuda.org を検証用に購入しました。(裏側は GoDaddy ?)

最近お名前.com の広告メールが多すぎでイライラしていたので、今後はこっちでいいかもしれません。

 

[詳細管理] をクリックすると、secureserver.net なるドメインのサイト (GoDaddy 系?) に飛びます。

Azure DNS を使うために、レジストラ側で NS レコードを作成しようとしたら、すでに Azure DNS を向いています。

 

App Service ドメインで独自ドメインを買うと、自動的に Azure DNS も作ってくれるんですね。便利。

 

ということで、shuda.org が Azure DNS に委任されたので、Azure 上で管理ができるようになりました。

nslookup すると、当然ですが NS レコードは Azure DNS のサーバー群を返しますし、Azure DNS 上に適当なレコードを作ればクライアント端末から名前解決できるようになっています。

(ちなみに豆知識ですが、203.0.113.0/24 などは RFC5737 でドキュメントにおける例示用の IP アドレス帯として予約されています)

C:\Users\Syuhei>nslookup
既定のサーバー: setup.netvolante.jp
Address: 192.168.0.1

> set type=NS
> shuda.org
サーバー: setup.netvolante.jp
Address: 192.168.0.1

権限のない回答:
shuda.org nameserver = ns4-08.azure-dns.info
shuda.org nameserver = ns1-08.azure-dns.com
shuda.org nameserver = ns2-08.azure-dns.net
shuda.org nameserver = ns3-08.azure-dns.org

ns1-08.azure-dns.com internet address = 40.90.4.8
ns1-08.azure-dns.com AAAA IPv6 address = 2603:1061::8
ns2-08.azure-dns.net internet address = 64.4.48.8
ns2-08.azure-dns.net AAAA IPv6 address = 2620:1ec:8ec::8
ns3-08.azure-dns.org internet address = 13.107.24.8
ns3-08.azure-dns.org AAAA IPv6 address = 2a01:111:4000::8
ns4-08.azure-dns.info internet address = 13.107.160.8
ns4-08.azure-dns.info AAAA IPv6 address = 2620:1ec:bda::8

> set type=A
> www.shuda.org
サーバー:  setup.netvolante.jp
Address:  192.168.0.1

権限のない回答:
名前:    www.shuda.org
Address:  203.0.113.1

サブドメインも Azure DNS に委任してみる

ドメインの管理をしていると、shuda.org だけではなく、corp.shuda.org のようにサブドメインを Azure DNS で管理したい場面もあると思うので、実際に試してみます。

既に作成済みの shuda.org とは別に、新たに corp.shuda.org の DNS ゾーンを作成します。

 

この状態では corp.shuda.org は Azure DNS に委任されていませんので、shuda.org に corp という NS レコードを作成し、新規作成した corp.shuda.org 側のネームサーバーを指定します。

(corp.shuda.org のネームサーバー x4 をメモ)

(shuda.org 側に corp という NS レコードを作成)

 

この状態で NS レコードを引くと Azure DNS に委任されていることが確認できます。

C:\Users\Syuhei>nslookup
既定のサーバー: setup.netvolante.jp
Address: 192.168.0.1

> set type=NS
> corp.shuda.org
サーバー: setup.netvolante.jp
Address: 192.168.0.1

権限のない回答:
corp.shuda.org nameserver = ns2-06.azure-dns.net
corp.shuda.org nameserver = ns3-06.azure-dns.org
corp.shuda.org nameserver = ns4-06.azure-dns.info
corp.shuda.org nameserver = ns1-06.azure-dns.com

ns1-06.azure-dns.com internet address = 40.90.4.6
ns1-06.azure-dns.com AAAA IPv6 address = 2603:1061::6
ns2-06.azure-dns.net internet address = 64.4.48.6
ns2-06.azure-dns.net AAAA IPv6 address = 2620:1ec:8ec::6
ns3-06.azure-dns.org internet address = 13.107.24.6
ns3-06.azure-dns.org AAAA IPv6 address = 2a01:111:4000::6
ns4-06.azure-dns.info internet address = 13.107.160.6
ns4-06.azure-dns.info AAAA IPv6 address = 2620:1ec:bda::6

 

最後に corp.shuda.biz 側に console.corp.shuda.biz などのレコードを登録してみます。

 

これでサブドメイン (corp.shuda.biz ゾーン) も Azure DNS に委任が完了して、クライアント端末上で console.corp.shuda.org も名前解決ができることが確認できました。

C:\Users\Syuhei>nslookup
既定のサーバー: setup.netvolante.jp
Address: 192.168.0.1

> set type=A
> console.corp.shuda.org
サーバー: setup.netvolante.jp
Address: 192.168.0.1

権限のない回答:
名前: console.corp.shuda.org
Address: 203.0.113.2

 

Azure DNS といっても、結局は普通の DNS と同じなので何も難しいことはないですね。

App Service や Traffic Manager とも組み合わせていろいろ遊びましょう。

[Advent Calendar 2017 Day16] ネットワーク構成図を自動で生成したい

Microsoft Azure Tech Advent Calendar 2017 の 16 日目です。

 

タイトルの通り、Azure のネットワーク構成図を自動生成したいなーと思って、PowerShell を少し書いてみました。

数時間で走り書きした感じなので、まだ VNET と Gateway、Connection ぐらいしか描画できていませんが、今後に期待ということで。

いつぞやの Get-SubscriptionDetails と同様に Get コマンドで各種リソースの情報を取得して、無理やり SVG を生成している感じです。

Azure のアイコンは SVG でも提供されているので、年末年始の暇な時期にでも VNet Peering やら ExpressRoute を含めて実装をして、一通り出来上がったら見た目も改善しようと思います。

ということで、インフラ野郎や Azure Infrastructure as Code 隊の皆さんも、冬の夜長は PowerShell を書いてみてはいかがでしょうか。

クラシック環境のネットワーク構成変更

Azure クラシック ポータルのリタイアが続きますが、10/5 からはネットワークも新ポータルのみになりました。

クラシック環境のネットワークは xml で定義されているので、マルチサイトと VPN を張る際に編集が必要になったりしますが、私の知る限り新ポータルに xml のエクスポート・インポートの UI がありませんので、Azure PowerShell でやる方法をメモっておきます。

# エクスポート
Get-AzureVNetConfig -ExportToFile "<XMLファイルのパス>"

# インポート
Set-AzureVNetConfig -ConfigurationPath "<XMLファイルのパス>"

Application Gateway の証明書更新

Application Gateway の証明書更新の手順が公式のドキュメントとして用意されていないので、中の人として GitHub に PR を投げたにもかかわらず 3 カ月たっても Approve してもらえないんで、こっちに手順だけメモっておきます。

https://github.com/ShuheiUda/azure-docs.ja-jp/blob/66c94ab4ff9ffee63bfc5fa90b03f6de3513c250/articles/application-gateway/application-gateway-update-ssl-certificate-arm.md

 

Azure PowerShell から以下のような感じでサクっとやりましょう。

# Azure アカウントにログインします。
Login-AzureRmAccount
# アカウントのサブスクリプションを確認します。
Get-AzureRmSubscription

# 使用する Azure サブスクリプションを選択します。
Select-AzureRmSubscription -Subscriptionid "サブスクリプション ID"

# 既存の Application Gateway の構成情報を取得します。
$appgw = Get-AzureRmApplicationGateway -Name "<Application Gateway 名>" -ResourceGroupName "<リソース グループ名>"

# 既存の証明書名と同一の名称で、更新する証明書ファイルを設定します。
$appgw = Set-AzureRmApplicationGatewaySslCertificate -Name "existing certificate name" -ApplicationGateway $appgw -CertificateFile "<更新する証明書のフルパス>" -Password "<証明書のパスワード>"

# Set-AzureRmApplicationGateway コマンドを使用して、新しい構成を保存します。
Set-AzureRmApplicationGateway -ApplicationGateway $appgw