PowerShellでposh-awspをつかいaws-cliのprofileをいい感じに切り替える

`aws-cli`で複数の`profile`を運用していると、数が少ない場合はそこまで問題にはなりませんが。
数が多くなってくると切り替えの煩雑さを感じるかと思います。

`Shell`上で`aws-cli`の`profile`を切り替える便利ツールとしては、[johnnyopao/awsp](https://github.com/johnnyopao/awsp)が有名かと思いますが。

`PowerShell`で似たような事をする実装として、[posh-awsp](https://github.com/johnnyopao/awsp)があります。

`PowerShell`で複数の`profile`を切り替える場合、`posh-awsp`を利用するといい感じになるので紹介します。

## PowerShell Galleryとかリポジトリとか

- [PowerShell Gallery - posh-awsp](https://www.powershellgallery.com/packages/posh-awsp)
- [jonscheiding/posh-awsp](https://github.com/jonscheiding/posh-awsp)

## 本資料で利用する環境

- PowerShell 7.3.0-preview.1
- posh-awsp v0.8.0

## インストール

`posh-awsp`は`PowerShell Gallery`で公開されている`PowerShell`モジュールとなるため、下記コマンドでモジュールをインストールできます。

インストールするユーザスコープは各環境にあわせてどうぞ。

```pwsh:posh-awspをユーザスコープにインストール
# ユーザスコープにインストール
Install-Module -Name posh-awsp -Scope CurentUser

# インストールされたバージョンを確認
Get-Module -ListAvailable posh-awsp
```

## README.mdに記載されている例をためしてみる

[posh-git/README.md](https://github.com/jonscheiding/posh-awsp/blob/master/README.md)に`~/.aws/config`と`~/.aws/credentials`の例として下記が出ているため、今回の説明ではこちらに設定した際の動作について説明します。

```config:~/.aws/config
[profile development]
region = us-east-1
[profile development/other-region]
source_profile = development
region = us-east-2
[profile development/assumed-role]
source_profile = development
role_arn = arn:aws:iam:123456789000:role/SomeAssumedRole
[profile production]
region = us-east-1
[default]
region = us-east-1
```

```credentials:~/.aws/credentials
[development]
aws_access_key_id=AKIAIOSFODNNEXAMPLE1
aws_secret_access_key = wJalrXUtnFEMI/K7MDENG/bPxRfiCEXAMPLEKEY1
[production]
aws_access_key_id=AKIAIOSFODNNEXAMPLE2
aws_secret_access_key = wJalrXUtnFEMI/K7MDENG/bPxRfiCEXAMPLEKEY2
[default]
aws_access_key_id=AKIAIOSFODNNEXAMPLE3
aws_secret_access_key = wJalrXUtnFEMI/K7MDENG/bPxRfiCEXAMPLEKEY3
```

`config`にプロファイルとして、下記5種類設定されている。

- development
- development/other-region
- development/assumed-role
- production
- default

`development`、`production`、`default`は`aws configure`で設定されるような基本的な設定。

それ以外の2つは`source_profile`と`role_arn`を使用したパターンとなっており、それぞれ。

`development/other-region`は、`source_profile`でdevelopmentを指定し、`development`とは別リージョンを設定。

`development/assumed-role`は、`source_profile`でdevelopmentを指定し、`role_arn`でスイッチするロールを設定。

この設定方法の詳細については、[aws-cli/設定ファイルと認証情報ファイルの設定](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-configure-files.html)に記載があります。

## posh-awspをつかってみる

`posh-awsp`をインストールすると下記コマンドレットとエイリアスが追加されます。

モジュールをインポートすると追加されるコマンドとエイリアス

- Get-AWSAvailableProfiles
- Get-AWSCurrentProfile
- Set-AWSCurrentProfile
- Switch-AWSProfile(alias awsp)

上記が追加されますが、基本的に利用するのは`awsp`のみです。
（`awsp`は`Swith-AWSProfile`の`alias`となっている）

README.mdでサンプルとして記載されている`config`と`credentials`を設定した環境で`awsp`を実行すると。
下記画面のように`config`の設定に応じたprofileの一覧が表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/7ec6c29e-45b8-6e6a-709d-54e619a99f5d.png)

ここでスイッチしたい対象profileを選択してEnterを実行すると、選択したプロファイルを環境変数`AWS_PROFILE`に設定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/fe5ec1e1-29ce-c15f-050a-37000b51c1a7.png)

`aws-cli`では[構成設定と優先順位](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-configure-quickstart.html#cli-configure-quickstart-precedence)のドキュメントに記載があるように、複数の場所で接続設定と認証設定を宣言する事ができますが。

`posh-awsp`では環境変数`AWS_PROFILE`に設定することで、選択したプロファイルを有効にしています。

画像の例では、`Oh My Posh`と呼ばれるPowerShellプロンプトをカスタマイズするPowerShellモジュールを導入しており、このモジュールのAWSセグメント表示の機能で選択しているprofileが表示されており、いい感じになっているかと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/5deabd8c-a3b2-b827-b6ed-56ba600510d6.png)

## 総評

`aws-cli`のプロファイルを選択する際に、[コマンド補完機能](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-configure-completion.html)を有効にし、プロファイルの入力補完機能をつかって入力する方法もありますが。

実際につかってみると、入力補完よりも個人的には便利に感じました。

また`Oh My Posh`のAWSセグメント表示とあいまっていい感じになっているかと思います。

なおソースも読んでみましたが[posh-awsp.psm1](https://github.com/jonscheiding/posh-awsp/blob/master/posh-awsp.psm1)、`PowerShell`でメニューハンドリングこうやって実装したんだみたいな学びが個人的にありました。（`Read-MenuSelection`）