とあるPowerShell使いから見たAWS CloudShell #reinvent

PowerShellおじさんがAWS CloudShellでPowerShell 7およびAWS Tools for PowerShellを試してみました
2020.12.19

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

しばた a.k.a. PowerShellおじさんです。

re:Invent 2020 先日のWerner VogelsさんのキーノートでAWS CloudShellのリリースが発表されました。

AzureやGCPといった他社クラウドには同様の機能がすでにあったため待ち望んでいた方も多かったのではないかと思います。
私も以前からAzure Cloud Shellを利用していたのでAWSに実装されることをずっと待ち望んでおり非常に嬉しい限りです。

既に弊社社員による「試してみた」記事がいくつか公開されていますが、本記事ではひとりのPowerShell使いから見たAWS CloudShellについて述べていきたいと思います。

AWS CloudShellの基本

AWS CloudShellの基本的なところは先述の記事をご覧いただきたいのですが、本記事では

  • Amazon Linux 2のコンテナ環境
  • ユーザーには $HOME が 1GB 与えられておりこのディレクトリのデータのみ永続される
    • 他のディレクトリのデータは永続しない
    • ただし120日間アクセスが無い場合は $HOME も初期化される
  • インターネットへのアウトバウンドアクセスは可能

の点を押さえておいてください。

PowerShell on AWS CloudShell

AWS CloudShellにはデフォルトでPowerShell 7がインストールされており下図の様に利用することが可能です。

インストールされているバージョンは現時点でPowerShell 7.0.3と最新のStable版(7.1.0)でなくLTS版がインストールされています。

AWS CloudShellにインストールされるPowerShellのバージョンに対する方針は表明されていませんが、おそらくはLTSリリースを随時更新していくものと予想されます。

プロファイル設定

AWS CloudShellのPowerShellのプロファイル(~/.config/powershell/Microsoft.PowerShell_profile.ps1)は以下の様にカスタマイズされており、AWS CLIのコマンドに対するCompleterの設定がなされています。

Microsoft.PowerShell_profile.ps1

Register-ArgumentCompleter -Native -CommandName aws -ScriptBlock {
    param($commandName, $wordToComplete, $cursorPosition)
        $env:COMP_LINE=$wordToComplete
        $env:COMP_POINT=$cursorPosition
        aws_completer | ForEach-Object {
            [System.Management.Automation.CompletionResult]::new($_, $_, 'ParameterValue', $_)
        }
        Remove-Item Env:\COMP_LINE     
        Remove-Item Env:\COMP_POINT    
}

この設定によりPowerShell上でもBashと同様にAWS CLIに対する入力補完が利用可能です。

なお、先述の通り$HOME配下のみ永続化されるため、$PSHOME配下にあるAllUsersなプロファイルは使えませんのでご注意ください。
(書き込みはできるが次回起動時に消失する)

更新通知

※2020年12月21日追記

PowerShellの起動画面に最新Stableバージョンへの更新を促す表示が出ていますが、これはPowerShell 7からの新機能になります。

POWERSHELL_UPDATECHECK環境変数をoffに設定するとオプトアウトできますので~/.bashrcにでも追記しておくと良いでしょう。

~/.bashrc

# POWERSHELL_UPDATECHECK環境変数の設定を追記してPowerShellの更新チェックを無効に
export POWERSHELL_UPDATECHECK=off

変更後はAWS CloudShellを再起動するかsource ~/.bashrcするなどして環境変数を反映させておいてください。

AWS Tools for PowerShell on AWS CloudShell

AWS CloudShellにはデフォルトでAWS CLIがインストールされていますが、AWS Tools for PowerShellはインストールされていません。
この点について明確な理由は説明されていないものの、私が以前いくつか記事を書いている様にAWS Tools for PowerShellは現在最新のVersion 4からサービスごとのモジュールに分割され必要なぶんだけインストールして利用する方針に変わったためだと推測されます。

というわけでAWS Tools for PowerShellを使いたい場合はAWS.Tools.Installerモジュールを使って必要なモジュールをインストールしてやります。

# 実行例
# インストーラーモジュールを最初にインストール
Install-Module -Name AWS.Tools.Installer -Force
# 古いバージョンのモジュールを削除し、 EC2, S3 用の最新モジュールをインストール場合のコマンド
Install-AWSToolsModule AWS.Tools.EC2, AWS.Tools.S3 -CleanUp -Force

【2021/1/7追記】AWS Tools for PowerShell 4.1.7 以降の場合

先日リリースされたAWS Tools for PowerShell 4.1.7でAWS CloudShellでデフォルトで認証情報が連動する様に対応されました。
細かい話は以下の記事をご覧ください。

本記事を最初に公開した際に書いた以下のプロファイル設定手順は一切不要です。

【2021/1/7更新】AWS Tools for PowerShell 4.1.6 以前の場合

ただ、残念ながらAWS Tools for PowerShellではAWS CLIの様にデフォルトで認証情報が連動してくれない様です。
最初に本記事を書いた時点、AWS Tools for PowerShell 4.1.6以前のバージョンを使っている場合はデフォルトで認証情報が連動してくれません。

(AWS Tools for PowerShellのコマンドレットを実行しようとすると認証情報の初期設定を求められてしまう...)

この点について、現状良い解決策が思いつかないのですが、以下のトラブルシュートを参考にPowerShell用のプロファイルpwshを作ることで回避可能ではあります。

以下の様にして~/.aws/configファイルを作成し、エディタで編集、

mkdir ~/.aws
touch ~/.aws/config
vim ~/.aws/config

~/.aws/configファイルの中身は以下の様にしてpwshプロファイルを作成。
(~/.aws/configはAWS CLIとも共有するのでdefaultプロファイルにはしない事)

~/.aws/config

[profile pwsh]
credential_process = bash -c 'curl -H "X-aws-ec2-metadata-token: $AWS_CONTAINER_AUTHORIZATION_TOKEN" -v $AWS_CONTAINER_CREDENTIALS_FULL_URI | jq "{AccessKeyId: .AccessKeyId, SecretAccessKey: .SecretAccessKey, SessionToken: .Token, Expiration: .Expiration, Version: 1"}'

最後にPowerShellのプロファイル(~/.config/powershell/Microsoft.PowerShell_profile.ps1)に以下のコードを追記すればOK。

Microsoft.PowerShell_profile.ps1

# ~/.config/powershell/Microsoft.PowerShell_profile.ps1 に以下の行を追記
Set-AWSCredential -ProfileName pwsh

これでPowerShell起動時にpwshプロファイルが読み込まれますので、無事認証情報の設定がなされてコマンドレットの実行が上手くいく様になります。

【おまけ】無理やりStable版 PowerShell 7.1をインストールして使ってみる

AWS CloudShellはsudo可能なため無理やりStable版のPowerShell 7.1をインストールすることも可能です。

# CentOS 7向けのインストール手順でAmazon Linux 2にPowerShell 7.1はインストール可能
#  * https://docs.microsoft.com/ja-jp/powershell/scripting/install/installing-powershell-core-on-linux?view=powershell-7.1#centos-7
curl https://packages.microsoft.com/config/rhel/7/prod.repo | sudo tee /etc/yum.repos.d/microsoft.repo
sudo yum install -y powershell

もちろん永続化されず次回起動時には消滅してしまいます...
永続化したい場合はZipファイル版のPowerShell 7.1を$HOME配下にインストールして利用すると良いでしょう。

最後に

以上となります。
やっぱりCloudShellは便利ですね。

PowerShellもデフォルトでインストールされているのは本当に嬉しい限りです。

ただ、モジュールの特性のせいでもありますがAWS Tools for PowerShellがデフォルトでインストールされていないのは残念です。
私の様なPowerShell使いにとっては環境構築はなんら苦になりませんが、たとえば顧客向けにAWS CloudShellを使った環境構築手順を提供するといった場合は手順の多さが致命的になることもあるでしょう。
こういった場合は無理にPowerShellを使う必要はないですし使うべきでもないです。

たとえAWS Tools for PowerShellが無くてもPowerShellはスクリプティング環境として非常に強力ですので、私としてはAWS CLI on PowerShellという使い方も十分にアリだと考えています。
先述の様なケースでも提供者はPowerShellの強力なスクリプティング機能を使ったスクリプトを作成し顧客はただスクリプトを実行するだけという使い方でもPowerShellを十分に生かせるでしょう。

用途や好みに合わせてAWS CloudShellでつかうシェルを決めていくのが良いと思います。