2021-02-05

2020-09-07

技術ノート

eyecatch
minbase.io 構築シリーズのインフラ編その1です。AWS でサーバーを立てるためのインフラ基盤を構築していきます。AWS Tools for PowerShell を使ってコマンドラインベースで構築することにしたので、まずはその環境設定です。

はじめに

まず、サーバーを立てるにはそのためのインフラ基盤を作る必要があります。AWS の固有名詞で言い換えると、EC2 インスタンスを構築するにはそのための VPC ( 仮想プライベートクラウド ) を構築する必要があります。AWS コンソールから手動でポチポチすれば構築できますが、今それを記事にしても面白くないですし、有効性も特に感じられません。そこで今回は、AWS Tools for PowerShell を使ってコマンドラインベースで VPC を構築してみたいと思います。CloudFormation ではなく、PowerShell でやります。執筆時点での AWS Tools for PowerShell 最新バージョンは 4.1.0.0 です。この一連の記事は以下のような方には役に立つかもしれません。

  • すでに AWS アカウントを所持している
  • AWS Tools for PowerShell を使って AWS のインフラ基盤を構築したことがない
  • AWS Tools for PowerShell を使って AWS のインフラ基盤を構築してみたい

AWS Tools for PowerShell を使用するための環境設定

作業環境は以下です。

作業マシン 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 構築までひとつの記事で走りきる想定でしたが、とても無理でした。