WindowsでのAWS CLIセットアップ手順、タブ補完の有効化手順と注意点

[JAWS-UG CLI専門支部](https://jawsug-cli.connpass.com/)などでハンズオンイベントに参加する時、よく使われるのがcloud9というサービスです

https://aws.amazon.com/jp/cloud9/

cloud9はVSCodeのようなIDEを提供してくれる素晴らしいサービスで、たまに開発環境を使う程度であれば十分すぎる代物です

ただ一方、個人的にローカルの開発環境を整えてる人に対するあこがれもありました
ハードルが高く感じてしまいなかなか手を出せていませんでしたが、連休を使ってAWS CLIをローカルで動かせるようにしてみました

結果、インストールはすぐにできたのですがセットアップで少し手こずりました
Windowsの事例がググってもあまり出てこなかったので、備忘録もかねて記事にしておきます

# 前提
OS：Windows 11
IDE：VSCode（ターミナルはPowerShell）

# AWS CLIのインストール
基本的には、公式ドキュメント通りにやればOK

https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/getting-started-install.html

1. Windows用のMSIインストーラーをダウンロードして実行する
1. VSCodeのターミナルで以下コマンドを入力して、バージョンが返ってくればインストール成功
```
aws --version
```


# 設定ファイル、認証情報ファイルの設定
## AWS CLIの設定ファイル、認証情報ファイルについて
AWS CLIの構成設定は、主に2つのファイルに格納されています
- config：設定ファイル、リージョンや出力形式の指定を格納する
- credential：認証情報ファイル、アクセスキーとシークレットアクセスキーを格納する

上記はいずれもホームディレクトリに格納されており、Windowsの場合は`C:\Users\ローカルユーザー名\.aws`に格納されているはずです

この2つを設定することで、AWSにアクセスして操作ができるようになります

https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-configure-files.html

## 設定方法
こちらも公式ドキュメントに従えばOK、特に引っかかりポイントはありませんでした

1. 事前にマネジメントコンソールで、使用するアクセスキーとシークレットアクセスキーを発行しておく
1. PowerShellで`aws configure`コマンドを入力し、アクセスキー、シークレットアクセスキー、デフォルトリージョン、出力フォーマットをそれぞれ入力する
    ```
    $ aws configure
    AWS Access Key ID [None]: AKIAIOSFODNN7EXAMPLE
    AWS Secret Access Key [None]: wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
    Default region name [None]: us-west-2
    Default output format [None]: json
    ```
1. `aws configure list`とコマンドを入力し、入力内容を確認する
```
$ aws configure list
      Name                    Value             Type    Location
      ----                    -----             ----    --------
   profile                <not set>             None    None
access_key     ****************ABCD  shared-credentials-file    
secret_key     ****************ABCD  shared-credentials-file    
    region                us-west-2             env    AWS_DEFAULT_REGION
```

https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-configure-files.html#cli-configure-files-methods

# タブ補完を有効化する
コマンドを途中まで入力し、Tabキーを押すと勝手に補完してくれる機能が「タブ補完」です
※AWSの公式ドキュメントでは「コマンド補完」と記載されています

タブ補完はデフォルトで無効になっているので、公式ドキュメントを参考にして有効化する必要があります

**実はここに、Windowsならではの引っかかりポイントがありました**

https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-configure-completion.html#cli-command-completion-windows

具体的な手順は上記ドキュメントに倣うとして、引っかかりポイントを記載しておきます

## Windowsセキュリティで拒否される
以下のコマンドを入力する手順で、コマンドを実行できませんでした
```
PS C:\> if (!(Test-Path -Path $PROFILE ))
{ New-Item -Type File -Path $PROFILE -Force }
```

よく見てみると、Windowsセキュリティの通知も一緒に飛んできていました

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1471959/12fe1d58-9086-970e-d762-47c809d2b2b6.png)
↑記載内容は違いますが、こんな感じで画面の端っこに通知が来ました

Windowsセキュリティを疑って設定を確認してみると、ランサムウェアの防止の設定で「コントロールされたフォルダーアクセス」がオンになっていました
***これをオフ、もしくはアプリの追加をするとコマンドが実行できるようになりました***
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1471959/73fd4a7a-efa2-03e7-9fc7-a3ffc82c40e5.png)

## ターミナルを再起動するとエラーが出力されてしまう

公式ドキュメントに従って以下のようなスクリプトファイルを作成したら、ターミナルを再起動させます
```
Register-ArgumentCompleter -Native -CommandName aws -ScriptBlock {
    param($commandName, $wordToComplete, $cursorPosition)
        $env:COMP_LINE=$wordToComplete
        $env:COMP_POINT=$cursorPosition
        aws_completer.exe | ForEach-Object {
            [System.Management.Automation.CompletionResult]::new($_, $_, 'ParameterValue', $_)
        }
        Remove-Item Env:\COMP_LINE     
        Remove-Item Env:\COMP_POINT  
}
```

やっとタブ補完ができるようになるとわくわくしていたら、まさかのエラー。。。
```
このシステムではスクリプトの実行が無効になっているため、ファイル hoge\hoge\hoge.ps1 を読み込むことができません。詳細については、「about_Execution_Policies」(https://go.microsoft.com/fwlink/?LinkID=135170) を参照してください。
```
（ファイルパスは適当なものに置き換えています）

調べてみると、どうやらデフォルトではPowerShellのスクリプト実行ポリシーに引っかかっているようでした

https://qiita.com/ponsuke0531/items/4629626a3e84bcd9398f

https://totech.hateblo.jp/entry/2017/09/29/162411

公式ドキュメントの手順では、タブ補完のために新しいスクリプトファイルを作成しています
タブ補完を有効化すると、ターミナルを開くたびに作成したスクリプトを実行しているみたいです

***しかし、デフォルトではスクリプトが実行できない権限になっているため、これを変更する必要があるようです***

私はRemoteSignedのポリシーをユーザーに対して割り当てました
```
Set-ExecutionPolicy -Scope CurrentUser RemoteSigned
```

上記コマンドを実行してターミナルを再起動すると、タブ補完ができるようになりました！！！

# その後
今現在はどうしているかというと***WSL2を導入しました***

ここまで頑張ったのになぜやり直したのかというと、単純にPowerShellやコマンドプロンプトが使いにくいと感じてしまったからです。。。
以下は個人的な感想です
- コマンドプロンプトは`ls`打てない、PowerShellなら打てるけど`ls -al`はダメなの！？
- PowerShellのコマンドわからない
- コマンドプロンプトとPowerShellの使い分けがわからない

会社の研修でLinuxの勉強をしていたこともあって、コマンドを打ちにくいを感じてしまいました
WSL2ならWindowsの中でLinux（Ubuntu）を動かすことができるので、泣く泣くWSL2に切り替えました。。。

Windowsの開発環境ってどうやって構築するのがベストプラクティスなのでしょうか。。。？
ご存じの方いたら教えていただけますと幸いです

# 参考情報
純粋にインストールするだけなら、こちらの記事が簡潔にまとまっていてわかりやすかったです

https://qiita.com/nonZy/items/c3c0116445883c088bb2