まず、サーバーを立てるにはそのためのインフラ基盤を作る必要があります。AWS の固有名詞で言い換えると、EC2 インスタンスを構築するにはそのための VPC ( 仮想プライベートクラウド ) を構築する必要があります。AWS コンソールから手動でポチポチすれば構築できますが、今それを記事にしても面白くないですし、有効性も特に感じられません。そこで今回は、AWS Tools for PowerShell を使ってコマンドラインベースで VPC を構築してみたいと思います。CloudFormation ではなく、PowerShell でやります。執筆時点での AWS Tools for PowerShell 最新バージョンは 4.1.0.0 です。この一連の記事は以下のような方には役に立つかもしれません。
作業環境は以下です。
作業マシン | PowerShell バージョン |
---|---|
Windows 10 Pro 2004 | Windows PowerShell 5.1 (.NET Framework 4.8) |
実際には OS によって以下のいずれかが必要なようです。後述しますが、これは最新モジュールである「AWS.Tools」をインストールした場合の条件です。
OS | モジュール |
---|---|
Windows | Windows PowerShell 5.1 (.NET Framework 4.7.2 以上 ) |
Windows, macOS, Linux | PowerShell Core 6.0 以降 |
PowerShell のバージョンは$PSVersionTable
で確認します。.NET Framework のバージョン確認方法についてはこちらの記事が参考になりました。
この記事ではInstall-Module
コマンドで PSGallery からモジュールをインポートします。もしかしたら「インストールしたいけどインターネットプロキシがホワイトリストモードでガチガチになっていてコマンドが通らない」等の事情があるかもしれません。私の職場がまさにそうです。その場合はこちらから Zip で落とすしかなさそうです。
PowerShell スクリプトを実行するための初期設定が済んでいない場合は、管理者権限で以下のコマンドを実行します。
PS C:\WINDOWS\system32> Set-ExecutionPolicy -ExecutionPolicy RemoteSigned
実行ポリシーの変更
実行ポリシーは、信頼されていないスクリプトからの保護に役立ちます。実行ポリシーを変更すると、
about_Execution_Policies のヘルプ トピック (https://go.microsoft.com/fwlink/?LinkID=135170)
で説明されているセキュリティ上の危険にさらされる可能性があります。実行ポリシーを変更しますか ?
[Y] はい (Y) [A] すべて続行 (A) [N] いいえ (N) [L] すべて無視 (L) [S] 中断 (S) [?] ヘルプ ( 既定値は "N"): y
PS C:\WINDOWS\system32> Get-ExecutionPolicy
RemoteSigned
Windows に AWS Tools for PowerShell をインストールするための AWS 公式ドキュメントはこちらです。これに沿って前準備を行います。選択肢として、現時点で3種類のモジュールがあるようです。噛み砕くと、ざっくり以下の感じかと思います。
モジュール | 特徴 |
---|---|
AWS.Tools | AWS サービスごとにモジュールが細分化された最新バージョン |
AWSPowerShell.NetCore | 単体ですべての AWS サービスを扱える大きなモジュール |
AWSPowerShell | AWSPowerShell.NetCore のレガシーバージョン |
以下は対応プラットフォームのまとめです。ほぼほぼ公式のコピペですが、自分の整理のために残しておきます。
モジュール | プラットフォーム |
---|---|
AWS.Tools | .NET Framework 4.7.2 以降を搭載した Windows 上の Windows PowerShell 5.1 以降 Window, macOS, Linux 上でインストールできる PowerShell Core 6.0 以降 |
AWSPowerShell.NetCore | .NET Framework 4.7.2 以降を搭載した Windows 上の Windows PowerShell 3.0 以降 Window, macOS, Linux 上でインストールできる PowerShell Core 6.0 以降 |
AWSPowerShell | Windows PowerShell 2.0 以降 |
検討したのですが、「AWSPowerShell.NetCore」と「AWSPowerShell」はモジュールが大きすぎ、かつアップデート方法が少々面倒でした。よって最新版である「AWS.Tools」を使い、必要に応じて各サービスモジュールをインストールしていく方針とします。「AWS.Tools」のモジュールには3種類あります。
種類 | モジュール | 用途 |
---|---|---|
インストーラーモジュール | AWS.Tools.Installer | サービスモジュールをインストール、更新、削除するモジュール |
共通モジュール | AWS.Tools.Common | サービス固有でない設定や認証に関するモジュール |
サービスモジュール | 上記以外の AWS.Tools.* | 各サービスを操作するモジュール |
管理者権限で PowerShell を起動し、インストーラーモジュールをインストールします。
PS C:\WINDOWS\system32> Install-Module -Name AWS.Tools.Installer
NuGet プロバイダーをまだインストールしていない場合は以下のような警告が出ます。y を返して続行しましょう。
PS C:\WINDOWS\system32> Install-Module -Name AWS.Tools.Installer
続行するには NuGet プロバイダーが必要です
PowerShellGet で NuGet ベースのリポジトリを操作するには、'2.8.5.201' 以降のバージョンの NuGet プロバイダーが必要です。NuGet
プロバイダーは 'C:\Program Files\PackageManagement\ProviderAssemblies' または
'C:\Users\ 実際のユーザー \AppData\Local\PackageManagement\ProviderAssemblies' に配置する必要があります。'Install-PackageProvider
-Name NuGet -MinimumVersion 2.8.5.201 -Force' を実行して NuGet プロバイダーをインストールすることもできます。今すぐ
PowerShellGet で NuGet プロバイダーをインストールしてインポートしますか ?
[Y] はい (Y) [N] いいえ (N) [S] 中断 (S) [?] ヘルプ ( 既定値は "Y"): y
以下のようなダイアログが出た場合も y を返して続行しましょう。
PS C:\WINDOWS\system32> Install-Module -Name AWS.Tools.Installer
信頼されていないリポジトリ
信頼されていないリポジトリからモジュールをインストールしようとしています。このリポジトリを信頼する場合は、Set-PSRepository
コマンドレットを実行して、リポジトリの InstallationPolicy の値を変更してください。'PSGallery'
からモジュールをインストールしますか ?
[Y] はい (Y) [A] すべて続行 (A) [N] いいえ (N) [L] すべて無視 (L) [S] 中断 (S) [?] ヘルプ ( 既定値は "N"): y
ついでに PSGallery リポジトリを信頼しておきます。
PS C:\WINDOWS\system32> Set-PSRepository -Name PSGallery -InstallationPolicy Trusted
PS C:\WINDOWS\system32> Get-PSRepository
Name InstallationPolicy SourceLocation
---- ------------------ --------------
PSGallery Trusted https://www.powershellgallery.com/api/v2
利用可能となったコマンドを確認します。以下3つのコマンドが利用可能になったことがわかります。
PS C:\WINDOWS\system32> Get-Command -Module AWS.Tools.Installer
CommandType Name Version Source
----------- ---- ------- ------
Function Install-AWSToolsModule 1.0.2.0 AWS.Tools.Installer
Function Uninstall-AWSToolsModule 1.0.2.0 AWS.Tools.Installer
Function Update-AWSToolsModule 1.0.2.0 AWS.Tools.Installer
最初のサービスモジュールをインストールする際に、共通モジュールであるAWS.Tools.Common
も同時にインストールされます。が、今回は明示的にインストールしてみます。共通モジュールや各サービスモジュールをインストールする際、スコープを気にせず実行すると管理者権限での実行であっても$Home\Documents\WindowsPowerShell\Modules
にインストールされます。つまり現在のユーザーにしかインストールされません。すべてのユーザーに対してインストールする場合は、スコープにAllUsers
を明示的につける必要があります。
Install-AWSToolsModule AWS.Tools.Common -Scope AllUsers
少し待つとインストールが完了します。試しに引数なしで打てるコマンドを実行してみます。リージョン一覧が返ってくれば成功です。
Get-AWSRegion
今回の目的に合致しそうなサービスモジュールをインストールします。VPC 関連のコマンドはAWS.Tools.EC2
に含まれています。複数インストールするときはカンマで区切ります。今回必要かどうかはわかりませんが、ついでに IAM のモジュールもインストールしました。
Install-AWSToolsModule AWS.Tools.EC2, AWS.Tools.IdentityManagement -CleanUp -Scope AllUsers
Get-Module -ListAvailable
公式ドキュメントにアップデート方法についても記載があります。今回採用した「AWS.Tools」の場合は簡単で、コマンド一発で依存関係を考慮した更新ができるようです。便利ですね。
Update-AWSToolsModule -CleanUp
「AWSPowerShell.NetCore」「AWSPowerShell」の場合は、少し面倒です。モジュールをアンインストールしてから入れなおします。
Uninstall-Module -Name AWSPowerShell.NetCore -AllVersions
Install-Module -Name AWSPowerShell.NetCore
自分の端末にインストールされた AWS Tools for PowerShell のバージョンと PSGallery にある AWS Tools for PowerShell のバージョンを定期的に比較しなければならず、面倒です。
さきほどインストールしたコマンドを使ってみます。まず使えるコマンドを調べます。
Get-Command -Module AWS.Tools.*
大量のコマンドが出てきますね。警告は出ますが、AWS CLI のコマンドから正引きすることもできます。
PS C:\WINDOWS\system32> Get-AWSCmdletName -AwsCliCommand "aws ec2 describe-instances"
警告 : パラメーター 'AwsCliCommand' は最新ではありません。This parameter is deprecated and will be removed in a future version. Use Service and ApiOperation instead.
CmdletName ServiceOperation ServiceName ModuleName
---------- ---------------- ----------- ----------
Get-EC2Instance DescribeInstances Amazon Elastic Compute Cloud (EC2) AWS.Tools.EC2
例として、IAM ユーザーを取得してみます。
PS C:\WINDOWS\system32> Get-IAMUser -UserName "test-user" -Region "ap-northeast-1"
Get-IAMUser : No credentials specified or obtained from persisted/shell defaults.
発生場所 行 :1 文字 :1
+ Get-IAMUser -UserName test-user -Region ap-northeast-1
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (Amazon.PowerShe...etIAMUserCmdlet:GetIAMUserCmdlet) [Get-IAMUser]、InvalidOperationException
+ FullyQualifiedErrorId : InvalidOperationException,Amazon.PowerShell.Cmdlets.IAM.GetIAMUserCmdlet
「資格情報が指定されていないか、永続化 / シェルのデフォルトから取得されていません」と怒られてしまいました。AWS Tools for PowerShell を使う場合、資格情報を登録する必要があります。まず IAM でアクセスキーを取得する必要がありますが、本記事ではその手順については割愛します。公式ドキュメントに記載がありますので、必要に応じて参照してください。IAM でアクセスキーを取得したら、資格情報として登録します。
Set-AWSCredential -AccessKey AKIA0123456787EXAMPLE -SecretKey wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY -StoreAs default
このコマンドを実行すると${env:LOCALAPPDATA}\AWSToolkit\RegisteredAccounts.json
に暗号化された資格情報がストアされます。なお-StoreAs default
とした場合、その資格情報がデフォルトプロファイルとして登録され、自動で検索対象になります。公式ドキュメントでも推奨されていますので、そのようにしておきます。資格情報の登録を確認するには以下のコマンドを実行します。
Get-AWSCredential -ListProfileDetail
以下は例ですが、AWS Tools for PowerShell でなにかやる場合は基本的に対象のリージョンを指定してコマンドを実行します。
Get-EC2Instance -Region "ap-northeast-1" | Select-Object -ExpandProperty Instances
コマンドを打つたびにリージョンを指定するのは、補完が利くとはいえやはり面倒です。そこで、現在のセッション内のすべてのコマンドにデフォルトのリージョンを指定できます。永続性はありません。
Set-DefaultAWSRegion -Region "ap-northeast-1"
デフォルトリージョが設定されているかどうかは以下のコマンドで確認できます。
PS C:\WINDOWS\system32> Get-DefaultAWSRegion
Region Name IsShellDefault
------ ---- --------------
ap-northeast-1 Asia Pacific (Tokyo) True
ここまでで、前振りがようやく終わりました。次回は VPC を構築していきます。記事を書く粒度がわからず、手順書のようになってしまいましたが、自分があとで見返したときに疑問点の残らないようにはできたかなと思います。当初は VPC 構築までひとつの記事で走りきる想定でしたが、とても無理でした。