Azure AD 連携された AWS アカウントで aws-cli を利用する

# はじめに
AWS への認証が Azure AD で SSO 行われている環境で aws-cli を利用するため `aws-azure-login` というツールを試してみました。

https://github.com/aws-azure-login/aws-azure-login


# 事前準備
`aws-azure-login` は **node.js** のパッケージとしてインストールを行うため **nvm** をインストールしておきます。

## nvm インストール
ここでは curl を使って nvm のインストールスクリプトをダウンロードし、そのまま bash で実行しています。
```zsh:インストール
% curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.34.0/install.sh | bash
```

## 有効化
nvm のインストールディレクトリを `NVM_DIR` という環境変数に設定します。
```zsh:環境変数設定
% export NVM_DIR="$HOME/.nvm"
```
nvm のスクリプト (nvm.sh) が存在していれば、それを読み込んで nvm を有効化します。
```zsh:有効化
% [ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"
```
nvm の Bash 保管機能 (bash_completion) を読み込みます。
```zsh:保管機能設定
% [ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion"
```

:::note info
### nvm とは？
- Node.js のバージョン管理ツール(Node Version Manager)です。
- 複数の Node.js のバージョンを簡単に切り替えられます。
- 例えば、以下のように nvm を使って Node.js のバージョンを変更できます：
```zsh:sh
nvm install 18   # Node.js 18 をインストール
nvm use 18       # Node.js 18 を使用
```
:::

# node 最新化
以下のコマンドを実行し node のバージョンを最新化しておきます。

```zsh:最新化
% nvm install --lts
% nvm --version
```

:::note warn
node のバージョンは最新化されますが nvm コマンドのバージョンが最新化されるわけではないです。
:::

nvm の最新化を行いたい場合は以下のリポジトリを確認し、最新のバージョンで **[nvm インストール](https://qiita.com/drafts/0f47b1621e71737fab17/edit#nvm-%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB)** を行います。

https://github.com/nvm-sh/nvm


# aws-azure-login の設定
事前準備ができたらここから aws-azure-login をインストールして設定をしていきます。
## インストール
**npm** を使って `aws-azure-login` パッケージをインストールします。

```zsh:インストール
% npm install -g aws-azure-login
```

:::note
### npm とは？
- Node.js のパッケージマネージャ (Node Package Manager)。
- JavaScript のライブラリやツールを管理するためのツール。
- Node.js をインストールすると自動的に npm もインストールされる。
:::

## aws 環境設定
aws へログインするための環境設定を行います。
修正するファイルは普段 **aws-cli** で利用する config ファイルです。

```zsh:aws config設定
% vim ~/.aws/config
```
```config:config
[default]
azure_tenant_id="************************""
azure_app_id_uri="************************" 
azure_default_username="test@example.com"
azure_default_role_arn=arn:aws:iam::***********:role/AzureLoginRole
azure_default_duration_hours=8
```

### 項目について
|項目                          |説明                                                  |
|:----------------------------|:-----------------------------------------------------|
|azure_tenant_id              |Azure AD のテナント ID                                  |
|azure_app_id_uri             |Azure AD で AWS SSO に関連づけられたアプリケーション ID URI |
|azure_default_username       |AWS にログインする際の Azure AD のデフォルトユーザー名       |
|azure_default_role_arn       |AWS にログインする際のデフォルト IAM ロール ARN             |
|azure_default_duration_hours |AWS SSO ログインのデフォルト有効時間(セッション持続時間)      |

設定を行ったら先ほどインストールしたコマンドを実行します。

```zsh:認証
% aws-azure-login --mode=gui
Logging in with profile 'default'...
Using AWS SAML endpoint https://signin.aws.amazon.com/saml
Please complete the login in the opened window
```

するとブラウザが立ち上がり、ログイン画面が表示されるため **メールアドレス** を入力して `[Next]` をクリックします。
![azure01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82090/b772b752-d353-48d0-84c2-b2ed8d084b57.png)

次に **パスワード** を入力し `[Sign in]` をクリックします。
![azure02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82090/996a3a2d-5928-4894-b57e-8d32ea7a90c0.png)

`[Yes]` をクリックします。
![azure03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82090/307fa9e7-7f5a-4e00-9391-64f145cfa2a0.png)

先ほどのコンソールの続きで以下のような表示が出力されたら成功です。
```zsh:ログイン
Assuming role arn:aws:iam::***********:role/AzureLoginRole in region ap-northeast-1...
```

# 確認
S3 のバケット一覧表示など、ログインロールに付与されている権限を実行してみてください。
```zsh:
% aws s3 ls
```

# おわりに
Azure AD 連携 でコマンドを利用するのはハードルが高そうだなと思っていましたが、いざ試してみるとすごく簡単でした。
また、Node について改めて整理することができてよかったです。