Windows環境でAWS CLIを使えるようにする手順+エラーケース。

# はじめに

タイトルの通りです。備忘録として残しておきます。

AWS CLIのインストール手順自体は、公式ドキュメントに記載されています。

https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/install-cliv2-windows.html

「AWS CLIっていまいち分からない！」という方は、なんだかんだ言ってブラックベルトを見るのが手っ取り早いと思います。

>公式動画
>[[AWS Black Belt Online Seminar] AWS Command Line Interface](youtube.com/watch?v=1FexvzegG3o)

本記事の対象環境は以下となります。
・Windows10
・Windows PowerShell、VScodeなどのローカル環境からの利用。

手順は以下となります。

|順番|内容|  
|:---|:--|
|1.|Python3をインストール|
|2.|AWS CLIをインストール|
|3.|AWS CLIの初期設定|



# 1. Python3をインストール

既にインストールされている方は、飛ばして下さい。
本記事でPython3のインストール方法は解説しませんが、こちらの記事などが参考になると思います。

https://qiita.com/ayuchiy/items/82d6d2dfcf1acc3bec00

Python2は既にサポートが終了しているため、古いバージョンがインストールされている場合は、Python3へのバージョンアップを行いましょう。

# 2. AWS CLIをインストール

冒頭にも記載したこちらのページから、AWS CLIをインストールします。

https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/install-cliv2-windows.html

インストーラーに従っていけば大丈夫です。

# 3. AWS CLIの初期設定

AWS CLIのセットアップを行います。
IAMユーザーのアクセスキーとシークレットキーが必要です。
なお、シークレットキーはユーザー作成時にしか確認できない（CSVを取得できない）ので、注意しましょう。

アクセスキーとシークレットキーの用意ができたら、ターミナルを開きます。
`aws configure`と入力し、以下の設定を行います。

```
aws configure

# 例
AWS Access Key ID [None]: hogehogehoge
AWS Secret Access Key [None]: hogehogehoge
Default region name [None]: ap-northeast-1
Default output format [None]: json
```

バージョン2からは、出力フォーマットにyamlの指定なども可能となったようです。
設定を行えば、`yq`コマンドも使用可能です。

>参考
>[AWS CLI 出力フォーマットの設定](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-usage-output-format.html)

再設定を行う場合も、`aws configure`と入力します。

AWS CLIの設定自体はこれで完了です。
コマンドが使えるかどうか、確かめてみてください。

```
# 例:EC2インスタンスのidを取得
aws ec2 describe-instances --query 'Reservations[].Instances[].[InstanceId, 
InstanceType, State.Name]' --output table
```

::: note alert
念の為書いておきますが、アクセスキーとシークレットキーを外部に公開するのは絶対にやめましょう。
「不正アクセスされて膨大な請求が！」なんて話はよくネットで見かけます。
:::


以下、windows環境で想定されるエラーケースを記載します。

# エラーケース① <>が使えない 


例えばこんなコマンドを入力したとして、

```
# EC2インスタンスの停⽌
aws ec2 stop-instances --instance-ids <インスタンスID>
```

こんなエラーが返ってきます。

```
The '<' operator is reserved for future use.　#演算子は将来の使用のために予約されています。
    + CategoryInfo          : ParserError: (:) [], ParentContainsErrorRecordException
    + FullyQualifiedErrorId : RedirectionNotSupported
```

powershellでは、`<>（演算子）`は予約されているので使えないとのこと。
解決方法としては、コマンドの<>を外すだけで大丈夫です。

```
# EC2インスタンスの停⽌
× aws ec2 stop-instances --instance-ids <インスタンスID>
○ aws ec2 stop-instances --instance-ids インスタンスID
```

# エラーケース② スクリプトを実行できない

スクリプトを実行したとして、こんなエラーが想定されます。

```
+ CategoryInfo          : SecurityError: (:) [], PSSecurityException
+ FullyQualifiedErrorId : UnauthorizedAccess
```

原因は、powershellの実行ポリシーです。

https://docs.microsoft.com/ja-jp/powershell/module/microsoft.powershell.core/about/about_execution_policies?view=powershell-7.2#see-also

windows powershellの規定の実行ポリシーは、`Restricted`となっています。
コマンドは許可し、スクリプトは許可しない設定です。
マルウェアの実行を防ぐためなど、セキュリティに配慮した設定となっています。

実際に、ターミナルから実行ポリシーを確かめてみましょう。

```
# 実行ポリシーの確認
Get-ExecutionPolicy 
```


実行ポリシーの変更方法としては、以下の記事が参考になります。
>参考
>[PowerShellの実行ポリシー変更](https://qiita.com/earthdiver1/items/b3f529c81f5892972a72#fn1)

個人的には、不用意に実行ポリシーを変更したくないので、セッション中のみスクリプトの実行を許可するよう変更する、以下のコマンドがおすすめです。

```
Set-ExecutionPolicy RemoteSigned -Scope Process -Force
```

以下のコマンドで、スコープごとの実行ポリシーの確認ができます。

```
Get-ExecutionPolicy -List
```

# おわりに

AWS Toolkitなどの拡張機能も用意されているので、気になる方は是非試してみて下さい。

この記事が少しでも参考になれば幸いです。