AWS CloudShellにプリインストールされるPowerShellモジュールが変更されました
しばたです。
本日AWSより以下のアナウンスがあり、AWS CloudShellにプリインストールされているPowerShellモジュールが従来のAWSPowerShell.NetCoreモジュールから、サービス毎のAWS.Tools.*なモジュールに変更されました。
本記事ではこの更新について解説していきます。
どういうことか?
過去に記事を書きましたが、AWS CloudShellはデフォルトシェルのBash以外にPowerShellも利用可能です。
このCloudShellのPowerShell環境にはこれまでAWS Tools for PowerShellのAWSPowerShell.NetCore
モジュールがプリインストールされていました。
ただ、このAWSPowerShell.NetCore
モジュールは公開されるコマンドレット数が多すぎるため自動ロードに失敗する既知の問題があるのと、現在最新のAWS Tools for PowerShell v4系ではこのモジュールではなくAWSサービス毎に分割されたAWS.Tools.*
なモジュールを使うことが推奨されています。
今回やっとAWS.Tools.*
なモジュールがCloudShellにプリインストールされることになりロードに関する問題が改善されました。
確認してみた
具体的な実装については実際に試しながら確認していきます。
私の検証用AWSアカウントの東京リージョンで試しています。
AWS CloudShellを起動し、そこからさらにPowerShell(pwsh
)を起動してインストール済みモジュールの情報を確認すると下図の通りとなりました。
ぱっと見でAWS Tools for PowerShellはどこにもいない様に見えますが、-ListAvailable
オプションを付けてコマンドを実行しなおすとAWS.Tools.*
なモジュールが全て(本日時点では330モジュール)インストールされていることが分かります。
これらのモジュールは$PSHOME
配下の/opt/microsoft/powershell/7/Modules/
に保存されており、CloudShell環境の一部となっています。
PS /home/cloudshell-user> dir /opt/microsoft/powershell/7/Modules/
Directory: /opt/microsoft/powershell/7/Modules
UnixMode User Group LastWriteTime Size Name
-------- ---- ----- ------------- ---- ----
drwxr-xr-x root root 1/13/2023 13:53 1024 AWS.Tools.AccessAnalyzer
drwxr-xr-x root root 1/13/2023 13:53 1024 AWS.Tools.Account
drwxr-xr-x root root 1/13/2023 13:53 1024 AWS.Tools.ACMPCA
drwxr-xr-x root root 1/13/2023 13:53 1024 AWS.Tools.AlexaForBusiness
drwxr-xr-x root root 1/13/2023 13:53 1024 AWS.Tools.Amplify
・・・(後略)・・・
非常にシンプルな対応で純粋にPowerShell標準のモジュールパスに必要な全モジュールを突っ込んでいるだけでありそれ以外の特別な仕込みはありませんでした。
ただ、これでもモジュール自動ロードの問題は解消されておりImport-Module
の事前実行無しにAWS Tools for PowerShellの各種コマンドレットを即実行可能です。
(PowerShell起動後いきなりGet-EC2Instance
コマンドを実行しても問題なし)
初回実行時は少し時間がかかるものの、以前の8-10秒よりは遥かに短い時間で済む様になっています。
やっとストレスなくCloudShell上でAWS Tools for PowerShellを使える様になっており非常に良い感じです。
補足1 : コマンドレット実行後にロードされるモジュール
ちなみにこの状態でGet-Module
コマンドを実行すると以下の様にAWS.Tools.Common
、AWS.Tools.EC2
とロードされたモジュールだけリストアップされる様になります。
PS /home/cloudshell-user> Get-Module
ModuleType Version PreRelease Name ExportedCommands
---------- ------- ---------- ---- ----------------
Binary 4.1.249 AWS.Tools.Common {Add-AWSLoggingListener, Clear-AWSCredential, Clear-AWSDefaultConfiguration, Clear-AWSHistor…
Binary 4.1.249 AWS.Tools.EC2 {Add-EC2CapacityReservation, Add-EC2ClassicLinkVpc, Add-EC2InternetGateway, Add-EC2NetworkIn…
Script 0.0 ImportGuard
Manifest 7.0.0.0 Microsoft.PowerShell.Management {Add-Content, Clear-Content, Clear-Item, Clear-ItemProperty…}
Manifest 7.0.0.0 Microsoft.PowerShell.Utility {Add-Member, Add-Type, Clear-Variable, Compare-Object…}
Script 2.2.6 PSReadLine {Get-PSReadLineKeyHandler, Get-PSReadLineOption, Remove-PSReadLineKeyHandler, Set-PSReadLine…
ImportGuard
はAWS.Tools.Common
の内部モジュールでAWSPowerShell.NetCore
モジュールとのロード競合を防ぐためのものです。
補足2 : AWSPowerShell.NetCoreモジュールのロードエラー
従来のAWSPowerShell.NetCore
モジュールはもう存在しないため、古いPowerShellスクリプトでImport-Module -Name AWSPowerShell.NetCore
を実行している場合はエラーが出ますのでご注意ください。
PS /home/cloudshell-user> Import-Module -Name AWSPowerShell.NetCore
Import-Module: The specified module 'AWSPowerShell.NetCore' was not loaded because no valid module file was found in any module directory.
基本的にImport-Module
の1行を除外するだけで問題は解決するはずですが、モジュールごとで互換性の方針が若干異なるためAWS.Tools.*
なモジュール固有の問題が起きることも少しだけあります。
その場合は適宜スクリプトを修正してください。
余談 : 実は以前のバージョンから問題無かった?
今回の対応はストレートに標準のモジュールパスに全モジュールを突っ込んでいるだけであり、個人的には「これで問題が解決するんだ!?」と結構驚きがあります。
そこでCloudShell以外で、Windows環境で同様のモジュール配置を行ったり古いバージョンのモジュールを配置してみましたが、どちらも問題なくAWS Tools for PowerShellを利用できました。
結果論ではありますが、実は「昔からこの対応していれば何の問題も無かった」気がします。
どうやらAWS.Tools.*
なモジュールを大量にインストールした際に起きる問題の根本は全てPowerShellGetにあり、PowerShellGetを介さないインストールであれば問題無かった様です。
すべてのAWS.Tools.*
なモジュールをまとめたZipファイルが以下のURLで公開されていますので、全モジュールをまとめてインストールしたい場合はこちらを使うと良いでしょう。
- 最新バージョン :
https://sdk-for-net.amazonwebservices.com/ps/v4/latest/AWS.Tools.zip
- 個別バージョン :
https://sdk-for-net.amazonwebservices.com/ps/releases/AWS.Tools.4.x.y.z.zip
最後に
以上となります。
これで安心してCloudShellでAWS Tools for PowerShellが使えます。
少数派かもしれませんがPowerShell使いにとっては朗報ですね。