しばたテックブログ

気分で書いている技術ブログです。

Azure Cloud ShellのPowerShellは起動時に何をしているのか

Azure Cloud ShellでPowerShellを起動した場合、通常のPowerShellの起動とは異なる初期処理が行われAzureドライブ(Azure:\で始まるドライブ)にロケーションが移動された状態で開始されます。

  • Cloud Shell(PowerShell)起動時

f:id:stknohg:20180524170552p:plain

  • Cloud Shell(Bash)からPowerShell Coreを起動した場合

f:id:stknohg:20180524170600p:plain

(PowerShellのコンテナでPowerShell Coreを起動しても同様)

本エントリではこの処理がどの様にして行われているのか解説します。

Cloud Shell(PowerShell)の場合

Cloud Shell(PowerShell)の場合、シェルの起動時に初期処理が行われています。
PowerShellの初期化処理といえばプロファイルに記述するのが一般的ですが、Cloud Shell(PowerShell)ではWindows PowerShellのプロファイルには何も記述されていません。

Cloud Shell(PowerShell)ではpowershell.exeの引数に初期化処理が記述されています。
powershell.exeの起動時引数は以下の様にすれば確認でき、

Get-CimInstance Win32_Process -Filter "processid = $PID" | Select-Object -ExpandProperty CommandLine

その結果

PS Azure:\> Get-CimInstance Win32_Process -Filter "processid = $PID" | Select-Object -ExpandProperty CommandLine
powershell.exe  -NoProfile -NoExit -NoLogo -command "Set-PSReadlineOption -TokenKind String -ForegroundColor Cyan; . ~\PSCloudShellStartup.ps1"

$env:USERPROFILE\PSCloudShellStartup.ps1を実行する様になっています。

また、PowerShell Coreのプロファイル(C:\Program Files\PowerShell\<version>\profile.ps1)は

#
# This profile script is used by PowerShell Core.
# Windows Powershell is started with -NoProfile to optimize its start time.
#

if (Test-Path $env:USERPROFILE\PSCloudShellStartup.ps1)
{
    . $env:USERPROFILE\PSCloudShellStartup.ps1
}

if (Get-Module -Name PSReadLine)
{
    # Set PSReadLine colors to be compatible with Cloud Shell UX requirements
    Set-PSReadlineOption -TokenKind String -ForegroundColor Cyan
}

と記述されており、こちらもPSCloudShellStartup.ps1を呼び出す様になっています。

Cloud Shell(Bash)の場合

Cloud Shell(Bash)の場合は、PowerShell Coreのプロファイル(/opt/microsoft/powershell/<version>/profile.ps1)に直接初期化処理が記述されており、その内容はPSCloudShellStartup.ps1と同一です。

初期化処理の詳細

現時点のPSCloudShellStartup.ps1(とprofile.ps1)の内容をGistに上げていますのでスクリプトの詳細はそちらで確認してください。

初期化処理は主に

  • Azure関連のモジュールの読み込みと認証
  • プロファイルパスの差し替え
  • prompt関数の差し替え
  • Azureドライブへの移動

を行っています。

この中でも特徴的なのがプロファイルパスの差し替えで、4つあるプロファイルの内

  • CurrentUserAllHosts
  • CurrentUserCurrentHost

のパスをそれぞれ

プロファイル Windows Ubuntu
CurrentUserAllHosts $env:USERPROFILE\CloudDrive\profile.ps1 $env:HOME/.config/PowerShell/profile.ps1
CurrentUserCurrentHost $env:USERPROFILE\CloudDrive\Microsoft.PowerShell_profile.ps1 $env:HOME/.config/PowerShell/Microsoft.PowerShell_profile.ps1

に差し替えて*1実行します。

加えて$PROFILE変数に付与されるNotePropertyからAllUsersAllHostsAllUsersCurrentHostを削除しています。
(正確には$PROFILE変数を上書き定義する際にNotePropertyの追加をしない様にしている)

Format-Listを使ってNotePropertyを確認すると以下の様になります。

PS Azure:\> $PROFILE | Format-List -Force

CurrentUserAllHosts    : C:\Users\ContainerAdministrator\CloudDrive\profile.ps1
CurrentUserCurrentHost : C:\Users\ContainerAdministrator\CloudDrive\Microsoft.PowerShell_profile.ps1
Length                 : 75

*1:細かい話をするとLinuxではパスが差し替わっていませんが、これはLinuxでは$env:HOME配下がCloud Drive上のVHDでマウントされ永続化対象となっているためです。Windowsではその様なマウントがないので永続化されるパスにプロファイルを差し替えています

「PowerShell実践ガイドブック」という本が発売されます

はい、宣伝です。

TL;DR;

ぎたぱそ先生が今月末にPowerShell Core 6.0の本を出版されます。
私もレビュアーとしてお手伝いしたので皆さんぜひ買ってくださいね。

PowerShell実践ガイドブック ~クロスプラットフォーム対応の次世代シェルを徹底解説~

PowerShell実践ガイドブック ~クロスプラットフォーム対応の次世代シェルを徹底解説~

「PowerShell実践ガイドブック」について

ぎたぱそ先生ことMVPの吉崎さんが「PowerShell実践ガイドブック」というタイトルのPowerShell Core 6.0を中心にPowerShellを解説する本を出版されます。

book.mynavi.jp

この本(以後本書と記載します)の内容についてはご本人のブログを見ていただくのが良いでしょう。

tech.guitarrapc.com

大変光栄なことに私にレビューの依頼があり、主にPowerShell Core 6.0の新機能や書籍の内容がPowerShellとして正しいかといった点を指摘、議論させていただきました。
私の他にも6名のレビュアーが様々な観点から本書をレビューしています。

僅かですが本書の内容に貢献できたことは嬉しくあり、また、私自身が新たな知識を得た部分もあり大変勉強となる良い経験ができました。

本エントリで改めてお礼申し上げます。
ありがとうございました。

そして出版おめでとうございます。

書評

レビュアーとして関わった以上べた褒めして終わりたいのですが、そこは抑えてできるだけ冷静に本書を評価したいと思います。

私の評価を一言でいうと、

本書は"PowerShell"というツールを学ぶには最適である、が、あなたを完全に満足させることは無いかもしれない。

です。

最適な点

本書は、発売される2018年5月末時点において、日本語で販売されている書籍の中では間違いなく一番詳細にPowerShellを解説しており、PowerShellの挙動や仕様を学ぶには最適な本であると断言できます。
その解説も丁寧で、PowerShellというツールの挙動や仕様を正しくおさえることでやりたいことを実践していくというスタンスになっています。

類似の書籍としては、かつて日本語版も出版されていた「PowerShell in Action」がありますが*1、吉崎さん自身も先述のブログで記載してる通り、

Windows PowerShell イン アクション も Windows PowerShell クックブックも何度か推薦するぐらい素晴らしい良著で私の大好きな本です。
 
PowerShell実践ガイドブックは、この2冊と明確に立ち位置が違います。
* PowerShell Core (現時点の最新である PowerShell 6.0) をメインとした内容になっている
* 体系的な基本機能も網羅しているが、常に実践を意識した内容になっている
* 実際にPowerShellを使うにあたっての操作や直面する課題を対象にしている

といった点が異なり、ある意味規格書*2に近いPowerShell in Actionより手に取りやすく読みやすい内容となっています。

PowerShell Core 6.0

また、本書は最新リリースであるPowerShell Core 6.0を想定環境として書かれていますが、バージョンに依らないPowerShellの機能にきちんと触れているので過去バージョンのPowerShellを扱っている方にとっても有用であり、特に問題を感じることなく読めるでしょう。

もちろんPowerShell Core 6.0の新機能について知りたい方にとっても、

  • 3章 3.2 リモーティング
  • 4章 4.9 クラス
  • 5章 5.4 .NETの相互運用
  • その他いくつかのコラム

あたりの内容は参考になると思います。

ただし、本書は機能の解説書ではないのでPowerShell Core 6.0の新機能一覧といったものはありません。
一覧が知りたければ、Docsにある

や本ブログの

を見てください。

本書はこれら一覧の理解を助けるものだと考えて頂ければ良いでしょう。

完全に満足させることは無いかもしれない、とは?

これはある意味本書の宿命的な部分であり、仕方ないのですが、書かないわけにはいかないので書きます。

本書は読者に

  • これからPowerShellを触ってみたい方(初学者)
  • システム管理者
  • 開発者

の三者を想定しています。

PowerShellはこのうちの「システム管理者」を想定して生まれたツールなのですが、現実には「開発者」やITリテラシーのさほど高くない「初学者」であるオフィスワーカーな方も使うことがごく普通にあります。
なのでこの想定自体は至極真っ当なのですが、はっきり言って間口が広い、あまりにも広い。

本書ではこの間口の広さに対応するために、最初の1~2章までは「初学者」にもわかる様に丁寧な記述を心掛け、以降の章では要求されるリテラシーが上がる構成となっています。
とはいえ、対象を絞らない万人に向く構成というのはあるわけが無く、読者のレベル感によって「最初の章の説明が冗長すぎる」逆に「後半の章の前提知識が難しすぎる」といったギャップが出てしまう可能性は残念ながらあると思っています。

ただ、想定読者と実際の読者のレベルのギャップというのは本書に限らずどの技術書でも出てしまう問題だと思います。
もしかしたら私が気にしすぎているだけかもしれません。

本書は間口の広い書籍であり、どの層の読者が読んでも得るものがあると断言できるのですが、その逆にどの層の読者にも満たされない部分が残ってしまうのではないかと危惧しており、それが「あなたを完全に満足させることは無いかもしれない」と言った理由になります。

ただしこの点については、

この本は過去の「PowerShellを触り始めた直後の自分」がほしかった本でもあり、今の自分が幅広い利用者を想定して書き出せる限界ギリギリを絞りました。

と言われている様に、できるだけ幅広い層に届く様にと敢えて意図した選択であることは補足しておきます。

本書はガイドブックでもあります。
もしこの様なギャップを感じることがあれば、読者自身のレベル感に応じて必要な部分をつまんで読み進めるのが良いでしょう。

個人的な一押しポイント

あと、私が個人的にお勧めできるポイントを紹介します。

  • 2章 2.8 パイプライン
  • 2章 2.9 フォーマッティング
  • 4章 4.5 スコープ

の内容は、わかりやすい解説がこれまでの書籍やWEB上でも少なかったので、本書の解説がきっと役に立つと思います。
特にスコープに関しては私自身体系立ててまとめることが出来ていなかった部分があり、本書をレビューしたことで理解を深めることができました。
加えて、

  • 5章 5.1 実世界のPowerShell
  • 5章 5.2 困ったときに

は本書のタイトル通り実践に即したものですのできっと読者の役に立つと思います。

最後に

ちょっとネガティブなことも書きましたが、本書はPowerShellを学ぶ上で間違いなく役に立ちます。

本ブログをご覧になる方はPowerShellに興味がある方が多いと思いますので、ぜひ一度は本書を手に取ってみて欲しいですし、できれば買って頂けると嬉しいです。


PowerShell実践ガイドブック ~クロスプラットフォーム対応の次世代シェルを徹底解説~

PowerShell実践ガイドブック ~クロスプラットフォーム対応の次世代シェルを徹底解説~

*1:残念ながら日本語版(初版)は絶版です...

*2:PowerShell in Actionの著者であるBruce PayetteさんはPowerShell Teamの人でありPowerShell founderの一人です

Azure Cloud Shell内のPowerShellの今後について

元ネタはこちら。

azure.microsoft.com

Azure Cloud Shell内のPowerShell

Azureポータル内で使えるCloud Shellですが、現在は

  • Bash
  • PowerShell (プレビュー)

の二種類選択することができます。
それぞれの実行基盤は

  • Bash : Linux Container (Ubuntu)
  • PowerShell : Windows Server Container (Server Core)

とコンテナになっており、各コンテナにおいてPowerShellは次の様に利用できます。
本エントリでは便宜上これらのコンテナを、Bashコンテナ、PowerShellコンテナと呼称します。(正式な名称ではありませんのでご注意ください)

Bashコンテナ内のPowerShell

コンテナ起動時のシェルはBash(現時点では4.3.48)。
BashからPowerShell Core 6.0(現時点では6.0.2)を呼び出し可能。

PowerShellコンテナ内のPowerShell

コンテナ起動時のシェルはWindows PowerShell 5.1
PowerShellコンソールから新たにPowerShell Core 6.0(現時点では6.0.2)を呼び出し可能。

Azure Cloud Shell内のPowerShellの今後

現状を踏まえた上で、先述のAzure BlogではAzure Cloud Shell内のPowerShellを以下の様に変更するとしています。

  • Faster startup time
  • PowerShell Core 6 as the default experience
  • Running on a Linux container
  • Persistent Tool Settings

この中で重要なのは

  • PowerShell Core 6 as the default experience
  • Running on a Linux container

の2点です。

Linux Container(Bashコンテナ)への統合

一度でもCloud Shellを利用したことがある方はわかると思いますが、ブログ内で

We are well-aware that the startup time of PowerShell in Azure Cloud Shell is well below the user’s expectation.

と触れられている様にPowerShellコンテナの起動速度ははっきり言って遅いです。

For past couple of months, the team has been working hard to make significant improvements in this area

と起動時間の改善をしている様ですが、後述の

To ensure the best command-line tools experience while using Azure Cloud Shell, the PowerShell experience will be switching to a Linux container running PowerShell Core 6.

にある様にBashコンテナに統合することで根本的な解決を図る見込みです。
(文章としては一貫性のあるツールエクスペリエンスのためとされていますが、パフォーマンスの問題が根底にあることは行間を読めば自ずと見えてくるかと思います...)

ただし、明確に「PowerShellコンテナを廃止する」とは言っていないので、今後どの様にCloud Shellが変わっていくのかは注視していきたいです。

この統合に対して、Clould Shellでの操作はAzureの管理が基本であり、PowerShell上であればOSの違いは意識する必要が無くコンテナ統合による影響は軽微かと思います。

ちなみに、Cloud Shell内のユーザーデータの保存先であるCloud Driveは両方のコンテナで共用なので、仮にPowerShellコンテナが廃止されてもユーザーデータがロストすることは無いと明記されています。

PowerShell 6.0をデフォルトに

前項のコンテナ統合もあり、クロスプラットフォームであるPowerShell Core 6.0がデフォルトになるのは自明であり、そして真っ当でしょう。
PowerShell Coreは半期リリースで随時更新されますのでCloud Shellの様なプラットフォームには最適です。

ただ、現状AzureRM.Netcoreモジュールはプレビューバージョンです。
いつGAするかに関してはまるで情報が無く今後を見守るしかない感じです。

最後に

とりあえずこんな感じです。
多くはいないと思いますが、現時点でPowerShellコンテナを使ってAzureを管理している方はPoweShell Coreへの移行を視野に入れておくと良いでしょう。