AWS Tools for PowerShell ことはじめ

# AWS Tools for PowerShell ことはじめ

想像以上に~~不人気~~(記事が少なかった)だったため調べたメモ代わりに置いておきます。
AWS Powershell モジュールを利用すると、aws cliと同様の操作がPowershellの強力なシェル機能を用いて利用できます。

## AWS Powershell が強いところ
1. コマンドの補完が完璧なので、ターミナルの入力が高速
    コマンド名の補完に加えて、オプションも補完してくれるので手間が少ない

2. エディタ「Visual Studio Code」との親和性
    Powershellのインテリセンスが充実しているので、ささっと書けるしタイポも少ない  

3. Powershell特有のオブジェクト操作
    Getコマンドの実行結果が基本的にPowershell Objectで返されるので、パイプやフィルター等が利用できる。
    こちらに関しては後述します。
  
4. エラーハンドリングでログファイルを出力したりイベントログを吐かせやすい
    コマンドの実行は例外の捕捉が可能なので可読性高いスクリプトが書ける。

## AWS Powershell が弱いところ
1. Powershell がないと動かない ~~(不人気の理由)~~

## 実行環境
```
PS > $PSVersionTable
Name                           Value
----                           -----
PSVersion                      5.1.17134.228
PSEdition                      Desktop
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0...}
BuildVersion                   10.0.17134.228
CLRVersion                     4.0.30319.42000
WSManStackVersion              3.0
PSRemotingProtocolVersion      2.3
SerializationVersion           1.1.0.1
```

# AWS Powershellのインストール&インポート
AWSからインストーラをダウンロードしてインストールする方法もありますが、コンソールからもインストールできます。

```
PS > Install-Module AWSPowershell
PS > Import-Module AWSPowershell
PS > Get-Module -Name AWSPowershell

ModuleType Version    Name            ExportedCommands
---------- -------    ----            ----------------
Binary     3.3.343.0  AWSPowerShell   {Add-AASScalableTarget, Add-ACMCertificateTag, Add-ADSConfigurationItemsToApplication, Add-AGResourceTag...}
```

AWS Powershellは基本的にaws cliで使用しているコマンドに対応するコマンドが存在します。

## 実行ユーザの紐付け
IAMからユーザを作成し、アクセストークンを発行します。
※ユーザに割り当てるロールには操作対象のリソースに対するアクセス権(ポリシー)をアタッチしておきます。  
  
他の記事でたくさん説明されているので、ここでは詳しく取り上げません。

### IAMユーザでAWSにアクセスする
AWSに接続するためのCredential情報を保持するプロファイルを作成します。
デフォルトでは以下に存在します。なければ作成して下さい。

```
C:\Users\<User>\.aws\credentials
[default]
aws_access_key_id = "*********************"
aws_secret_access_key = "*****************************"
```

プロファイルを指定してAWSに接続します。

```
PS > Initialize-AWSDefaults -ProfileName "default" -ProfileLocation "C:\Users\<User>\.aws\credentials" -Region "ap-northeast-1" 
```

## コマンドの調べ方
詳細なコマンドリファレンスはこちらにあります。これを見たらだいたいのことは分かります。
https://docs.aws.amazon.com/powershell/latest/reference/Index.html

ここではリファレンスを見るのが面倒な人向けにチートコマンドを紹介しておきます。

```
PS > Get-AWSCmdletName -AwsCliCommand "aws ec2 describe-vpcs"

CmdletName ServiceOperation ServiceName                  CmdletNounPrefix
---------- ---------------- -----------                  ----------------
Get-EC2Vpc DescribeVpcs     Amazon Elastic Compute Cloud EC2
```

上記より、"aws ec2 describe-vpcs" に対応する Powersell コマンドは CmdletName プロパティにある "Get-EC2Vpc" であるとわかります。

# コマンド利用例
## デフォルトVPCを取得
リソースが持つプロパティを "-Filter" オプションを利用してフィルターすることができます。  

### フォーマット
-Filter @{Name="[PropertyName]"; Values="[Parametor]"}

```
PS > $vpc = Get-EC2Vpc -Region "ap-northeast-1" -Filter @{Name="isDefault"; Values="True"}
PS > $vpc

    CidrBlock                   : 172.31.0.0/16
    CidrBlockAssociationSet     : {vpc-cidr-assoc-xxxxxx}
    DhcpOptionsId               : dopt-xxxxxxxx
    InstanceTenancy             : default
    Ipv6CidrBlockAssociationSet : {}
    IsDefault                   : True
    State                       : available
    Tags                        : {}
    VpcId                       : vpc-xxxxxxxx

PS > $vpc.VpcId
    vpc-xxxxxxxx
```
この場合、$vpc は System.Object が入っており、各プロパティにアクセスして値を利用できます。
JSONにして操作する部分が不要な分、ライトには扱いやすいと思います。
値を出力する際はJSON、CSV等に変換してあげるとよいかと。

## パイプを利用した操作
パイプを利用して取得したインスタンスをそのまま削除します。

```
PS > Get-EC2-Instance -InstanceId "********" | Remove-EC2-Instance -Force
```

おそらく一番つまりやすいのは実行ユーザの認証まわりかなーと思います。
また気分次第で追記するかもしれません。