こんにちは、クラウドインテグレーション部 技術1課 宮形 です。
PowerShell を AWS CloudShell で操作する機会がありましたので、本BLOGでご紹介します。
概要
PowerShell は Windows で使えるシェルですね。説明は割愛します。
AWS CloudShell は、AWSマネージメントコンソールのブラウザ上から AWS コマンドラインインターフェース (AWS-CLI) が実行できる機能です。 ライバル製品の Microsoft Azure ですと、けっこう前から存在していたのですが AWS では採用したのは割と最近で、2020年12月にリリースされています。
「どういった時に使うのか?」とメリットを考えてみると、「保守用パソコンを用意する必要がない」ことが思いあたります。例えば Windows しか持っていない場合、AWS-CLI を使うためには WSL(Windows の上で動くLinux環境)のセットアップが必要でしたが、これが不要となります。実際に使ってみると、他にもセキュリティ的に望ましいメリットがあることもわかりました。
経緯
今回の業務での要件は、過去資産のAWS制御 PowerShell の実行になります。私は Microsoft Surface Pro を BYOD で業務PCとして持ち込む Microsoft信者(?!)です。自身の業務PCの環境を整えてから 過去資産のPowerShell を実行すればよいのですが、クラウドエンジニアリングの基本は「すでに出来上がっているものを使う」なので AWS CloudShell を使うこととしました。
利用手順と解説
AWS マネージメントコンソール にサインインすると、上段右上に AWS CloudShell のアイコンがあるのでクリックします。
「Creating the environment...」のメッセージが表示されます。使えるようになるまで、数分待ちます。 内部的には Amazon Linux 2 の EC2 が起動してきているような感じです。しばらくすると「Welcome to AWS CloudShell」のポップアップが表示されますので、「Close」ボタンで応答します。
このような感じで、ブラウザ上から CLI が実行できるようになります。
AWS CloudShell は bash での操作となります。普段から Redhat 系 Linux を操作している方であれば、慣れた感じでご利用可能かと思います。今回は PowerShell を使いますので pwsh と実行します。PowerShellが開始します。本ブログ執筆時点(2022/01/24) では $PSVersionTable で確認する PowerShell のバージョンは 7.1.4 でした。Microsoft からは より新しい PowerShell 7.2 が GA されています。yum コマンドで 7.1 → 7.2 へバージョンアップも可能でしたので、本BLOG文末でご紹介します。
> echo $SHELL /bin/bash > pwsh PS> $PSVersionTable Name Value ---- ----- PSVersion 7.1.4 PSEdition Core GitCommitId 7.1.4 OS Linux 4.14.252-195.483.amzn2.x86_64 #1 SMP Mon Nov 1 20:58:46 UTC 2021 Platform Unix PSCompatibleVersions {1.0, 2.0, 3.0, 4.0…} PSRemotingProtocolVersion 2.3 SerializationVersion 1.1.0.1 WSManStackVersion 3.0
Windows で PowerShell を使い慣れた方だと、実行ポリシーが気になるところかと思います。 Get-ExecutionPolicy の結果は、Unrestricted でした。一番セキュリティがゆるい設定です。Microsoft のマニュアルによると、ExecutionPolicy は Windows 限定とのことです。
Windows 以外のプラットフォームでの PowerShell の相違点 - PowerShell | Microsoft Docs
Windows 以外のプラットフォームで PowerShell を実行する場合、-ExecutionPolicy パラメーターは無視されます。 Linux と macOS では Get-ExecutionPolicy により [制限なし] が返されます。 Linux/macOS では Set-ExecutionPolicy で何も起きません。
PS > Get-ExecutionPolicy Unrestricted
Get-Module の結果はこんな感じです。
PS > Get-Module -ListAvailable ModuleType Version PreRelease Name PSEdition ExportedCommands ---------- ------- ---------- ---- --------- ---------------- Binary 4.1.15.0 AWSPowerShell.NetCore Desk Manifest 1.2.5 Microsoft.PowerShell.Archive Desk {Compress-Archive, Expand-Archive} Manifest 7.0.0.0 Microsoft.PowerShell.Host Core {Start-Transcript, Stop-Transcript} Manifest 7.0.0.0 Microsoft.PowerShell.Management Core {Add-Content, Clear-Content, Clear-ItemProperty, Join-Path…} Manifest 7.0.0.0 Microsoft.PowerShell.Security Core {Get-Credential, Get-ExecutionPolicy, Set-ExecutionPolicy, ConvertFrom-SecureString…} Manifest 7.0.0.0 Microsoft.PowerShell.Utility Core {Export-Alias, Get-Alias, Import-Alias, New-Alias…} Script 1.4.7 PackageManagement Desk {Find-Package, Get-Package, Get-PackageProvider, Get-PackageSource…} Script 2.2.5 PowerShellGet Desk {Find-Command, Find-DSCResource, Find-Module, Find-RoleCapability…} Script 2.1.0 PSReadLine Desk {Get-PSReadLineKeyHandler, Set-PSReadLineKeyHandler, Remove-PSReadLineKeyHandler, Get-PSReadLineOption…} Binary 2.0.3 ThreadJob Desk Start-ThreadJob
AWS を制御する AWS PowerShell.NetCore が最初から用意されているので Import-Module します。これで AWS の制御が出来るようになります。
PS > Import-Module AWSPowerShell.NetCore
ちなみに インストールするタイプの AWSPowerShell というパッケージや、AWS.Tools.* といった機能毎に分割されたパッケージも存在しており、選択して導入することが可能です。
Windows への AWS Tools for PowerShell のインストール - AWS Tools for PowerShell
AWSPowerShell.NetCore と AWSPowerShell では機能数が多すぎて、初期ロードが時間がかかってしまうので、対策として AWS.Tools.* が存在しているようです
早速使ってみます。AWS マニュアルのサンプルを参考に、EC2 の状態を取得してみたいと思います。
Windows PowerShell を使用した Amazon EC2 インスタンスの起動 - AWS Tools for PowerShell
私は Windows より Visual Studio Code で ps1 ファイルを作成しました。作成した ps1 ファイルを AWS CloudShell へアップロードします。 AWS CloudShell の右上 「Action」>「Upload File」をクリックします。操作しているパソコンからファイルをアップロードできます。
ls コマンドで確認すると、ファイルがアップロードされていることがわかります。
アップロードした ps1 ファイルを実行します。無事、EC2 の情報を取得できました。
もし Windows パソコンなどからリモートで操作する場合は、Initialize-AWSDefaults や Set-AWSCredential で アクセスキー、シークレットキーの登録が必要ですが、AWS CloudShell であれば必要ありません。アクセスキー、シークレットキーは流出リスクがありますので、環境によっては利用NGの場合があると思います。この点は AWS CloudShell のメリットと言えます。(AWS マネージメントコンソールにログインしたIAMユーザーの権限で AWS PowerShell は動作します。権限の管理は適切に行いましょう。)
なお、下記のように日本語の注釈などが文字化けする場合、ps1ファイルのエンコードが SJIS(ASCII)になっている可能性があります。UTF-8 で作り直すると解消すると思われます。Windows 環境の資産を流用する場合に注意が必要ですね。
AWS CloudShell は「CTRL-C」「CTRL-V」でのテキスト コピー&ペースト がそのまま使えるので、Windows 系エンジニアにも優しいです。複数行貼り付けの場合も、TeraTerm のように注意喚起してくれます。
AWS CloudShell を終了する場合は、「Actions」>「Delete AWS CloudShell home directory」をクリックすると、アップロードしたファイルや一時的に生成したログ、操作履歴(上下キーで出てくる) などを削除できます。 消えて困るファイルは「Download file」で、作業パソコンにダウンロードすることもできます。
まとめ
PowerShell をクラウド上の Linux で使うと聞くと「いろいろ手間がかかる?」かと想像しましたが、実際は Windows のパソコンで行う場合とくらべて手間や考慮が少なくすんだので、結果的に楽することができました。 下記2つのメリットは恩恵が大きいと思います。無料利用枠もありますので、AWS CloudShell は積極的に活用するとよいのではないでしょうか。
- クラウド保守用の専用パソコンを用意、維持する必要が無い
- アクセスキー、シークレットキーが無くても AWS をコマンドラインで制御できる
おまけ PowerShell のバージョンを 7.1 → 7.2 へ更新
下記のように実行すれば、AWS CloudShell で実行する PowerShell をバージョンアップできましたので、記録しておきます。
参考
General Availability of PowerShell 7.2 - PowerShell Team
CentOS への PowerShell のインストール - PowerShell | Microsoft Docs
> curl https://packages.microsoft.com/config/rhel/7/prod.repo | sudo tee /etc/yum.repos.d/microsoft.repo > sudo yum update powershell > pwsh PS > $PSVersionTable Name Value ---- ----- PSVersion 7.2.1 PSEdition Core GitCommitId 7.2.1 OS Linux 4.14.252-195.483.amzn2.x86_64 #1 SMP Mon Nov 1 20:58:46 UTC 2021 Platform Unix PSCompatibleVersions {1.0, 2.0, 3.0, 4.0…} PSRemotingProtocolVersion 2.3 SerializationVersion 1.1.0.1 WSManStackVersion 3.0