1PasswordでAWS MFAコードを自動入力！AWSume + 1Password CLIでAWS認証をワンライナー化する手順

# はじめに
- 大分前でしたが、いつもお世話になっているDeveloper IOにて、awsumeという認証に強いツールが紹介されていました
    - [マネコン起動もできるAWSのスイッチロール用CLIツール「AWSume」の紹介](https://dev.classmethod.jp/articles/awsume/)
- 時間が空いたので早速使ってみよう...としたのですが、仕様が地味に変わったのか、ご紹介されていた手順が少し異なっていたため、最新版として整理をしてみました

# やりたいこと
- AWS CLIでMFA認証を含めたIAMユーザーのログインをワンライナーで実行する
- MFA認証に1Passwordを用いる

# 前提
- 1Passwordを契約し、1PasswordでMFAの設定をしている
    - 1Passwordに設定したAWSコンソールのID/Passwordは使用しませんので、MFAだけ設定されていれば最低OKです
    - [[初心者向け] IAMユーザーのMFAを1Passwordで設定する方法について](https://dev.classmethod.jp/articles/aws-1password-mfa_202306/)
- 1Passwordの項目名を控えておくこと(この後使用)
    - 以下の赤四角箇所
    ![1Password_設定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1276335/0a99d191-77c4-4324-b3fc-f486aa98f611.png)

# 手順
1. awsumeをpipインストールする
    ```
    # awsumeのインストール
    pip install awsume

    # バージョン確認
    awsume --version
    ```

    <details><summary>実行例</summary>

    ```
    PS > pip install awsume
    Collecting awsume
    Downloading awsume-4.5.4-py3-none-any.whl.metadata (772 bytes)
    Requirement already satisfied: colorama in c:\users\xxxxx\appdata\local\programs\python\python312\lib\site-packages (from awsume) (0.4.6)
    Requirement already satisfied: boto3 in c:\users\xxxxx\appdata\local\programs\python\python312\lib\site-packages (from awsume) (1.35.49)
    Collecting psutil (from awsume)
    Downloading psutil-7.0.0-cp37-abi3-win_amd64.whl.metadata (23 kB)
    Requirement already satisfied: pluggy in c:\users\xxxxx\appdata\local\programs\python\python312\lib\site-packages (from awsume) (1.6.0)
    Requirement already satisfied: pyyaml in c:\users\xxxxx\appdata\local\programs\python\python312\lib\site-packages (from awsume) (6.0.2)
    Requirement already satisfied: botocore<1.36.0,>=1.35.49 in c:\users\xxxxx\appdata\local\programs\python\python312\lib\site-packages (from boto3->awsume) (1.35.99)
    Requirement already satisfied: jmespath<2.0.0,>=0.7.1 in c:\users\xxxxx\appdata\local\programs\python\python312\lib\site-packages (from boto3->awsume) (1.0.1)
    Requirement already satisfied: s3transfer<0.11.0,>=0.10.0 in c:\users\xxxxx\appdata\local\programs\python\python312\lib\site-packages (from boto3->awsume) (0.10.4)
    Requirement already satisfied: python-dateutil<3.0.0,>=2.1 in c:\users\xxxxx\appdata\local\programs\python\python312\lib\site-packages (from botocore<1.36.0,>=1.35.49->boto3->awsume) (2.9.0.post0)
    Requirement already satisfied: urllib3!=2.2.0,<3,>=1.25.4 in c:\users\xxxxx\appdata\local\programs\python\python312\lib\site-packages (from botocore<1.36.0,>=1.35.49->boto3->awsume) (2.2.2)
    Requirement already satisfied: six>=1.5 in c:\users\xxxxx\appdata\local\programs\python\python312\lib\site-packages (from python-dateutil<3.0.0,>=2.1->botocore<1.36.0,>=1.35.49->boto3->awsume) (1.16.0)
    Downloading awsume-4.5.4-py3-none-any.whl (39 kB)
    Downloading psutil-7.0.0-cp37-abi3-win_amd64.whl (244 kB)
    Installing collected packages: psutil, awsume
    Successfully installed awsume-4.5.4 psutil-7.0.0
    PS > awsume --version
    4.5.4
    PS >
    ```
    </details>

    :::note warn
    いくつかのドキュメントではHomebrewコマンドを用いたインストールを提案している場合があります
    ただし、後続する1PasswordのプラグインがHomebrew版のawsumeだとインストールエラーが出るため、pip版をインストールするようにしてください

2. 1Passwordのプラグインをインストールする
    ```
    # awsume-1password-pluginのインストール
    pip install awsume-1password-plugin

    # 1passwordのインストール確認
    awsume --list-plugins
    ```

    <details><summary>実行例</summary>

    ```
    PS > pip install awsume-1password-plugin
    Collecting awsume-1password-plugin
    Downloading awsume_1password_plugin-1.2.4-py3-none-any.whl.metadata (263 bytes)
    Downloading awsume_1password_plugin-1.2.4-py3-none-any.whl (4.1 kB)
    Installing collected packages: awsume-1password-plugin
    Successfully installed awsume-1password-plugin-1.2.4
    PS > awsume --list-plugins
    1password
    PS >
    ```
    </details>

3. 1Password CLIをインストールする
    ```
    # 1Password CLI
    winget install 1password-cli

    # Powershellを再起動

    # 1passwordのインストール確認
    op --version
    ```

    <details><summary>実行例</summary>

    ```
    PS > winget install 1password-cli
    見つかりました 1Password CLI [AgileBits.1Password.CLI] バージョン 2.31.1
    このアプリケーションは所有者からライセンス供与されます。
    Microsoft はサードパーティのパッケージに対して責任を負わず、ライセンスも付与しません。
    インストーラーハッシュが正常に検証されました
    アーカイブを展開しています...
    アーカイブが正常に展開されました
    パッケージのインストールを開始しています...
    パス環境変数が変更されました; 新しい値を使用するにはシェルを再起動してください。
    コマンド ライン エイリアスが追加されました: "op"
    インストールが完了しました
    PS >

    PS > op --version
    2.31.1
    PS >
    ```
    </details>


4. アクセスキー設定
    - 未設定の場合のみ
    ```
    # 設定コマンド
    aws configure

    # 設定ファイル確認
    cat $HOME\.aws\credentials
    cat $HOME\.aws\config
    ```

    <details><summary>実行例</summary>

    ```
    PS > aws configure
    AWS Access Key ID [********************]:********************
    AWS Secret Access Key [********************]:********************
    Default region name [ap-northeast-1]:ap-northeast-1
    Default output format [json]:json
    PS >

    PS > cat $HOME\.aws\credentials
    [awsume-mfa-user]
    aws_access_key_id = ********************
    aws_secret_access_key = ****************************************
    PS > cat $HOME\.aws\config
    [profile awsume-mfa-user]
    region = ap-northeast-1
    output = json
    PS >
    ```
    </details>

5. MFA設定する
    ```
    notepad $HOME\.aws\config

    以下を追加
    mfa_serial = <MFAデバイスのARN>
    ```

    <details><summary>実行例</summary>

    ```
    PS > cat $HOME\.aws\config
    [profile awsume-mfa-user]
    mfa_serial = arn:aws:iam::xxxxxxxxxxxxxx:mfa/awsume-mfa-user
    region = ap-northeast-1
    output = json
    PS >
    ```
    </details>

6. awsume設定する
    ```
    notepad $HOME\.awsume\config.yaml

    # 以下を追加
    1password: 
      "<MFAデバイスのARN>": "<1Passwordの項目名>"
    ```

    <details><summary>実行例</summary>

    ```
    PS > cat $HOME\.awsume\config.yaml
    colors: true
    fuzzy-match: false
    role-duration: 0

    1password:
      "arn:aws:iam::xxxxxxxxxxxxxx:mfa/awsume-mfa-user": "AWS(awsume-mfa-user)" 
    PS >
    ```
    </details>

7. awsume設定する
    - 設定項目
        - サインインアドレス
        - メールアドレス
        - シークレットキー
        - 1Passwordのパスワード(いつも使っているやつ)
    - 設定項目の入手工程(1PasswordをDesktopにインストールしている場合)
        1. 1Password Desktopを開く
        2. 画面左上、「アカウント」をクリック
        3. リストされているアカウント名をクリック
        4. 必要な値をコピーしておく
    ```
    # 認証する
    Invoke-Expression $(op signin)

    # 認証を確認する
    op whoami
    ```

    <details><summary>実行例</summary>

    ```
    PS > Invoke-Expression $(op signin)
    No accounts configured for use with 1Password CLI.

    You can either:
    - Turn on the 1Password desktop app integration to sign in with the accounts you've added to the app: https://developer.1password.com/docs/cli/app-integration/ for details.
    - Add an account manually with 'op account add' and sign in by entering your password on the command line. See 'op account add --help' for details.
    - Authenticate using a 1Password service account by setting the 'OP_SERVICE_ACCOUNT_TOKEN' environment variable to your service account token. Learn more: https://developer.1password.com/docs/service-accounts/
    - Use 1Password CLI with a Connect server by setting the 'OP_CONNECT_HOST' and 'OP_CONNECT_TOKEN' environment variables to your Connect host and token, respectively. Learn more: https://developer.1password.com/docs/connect/

    Do you want to add an account manually now? [Y/n] Y  ←※入力項目
    Enter your sign-in address (example.1password.com): https://xxx.1password.com/  ←※入力項目
    Enter the email address for your account on my.1password.com/: xxxxxxxxx@xxxxx.xxxxx  ←※入力項目
    Enter the Secret Key for xxxxxxxxx@xxxxx.xxxxx on my.1password.com: xx-xxxxxx-xxxxxx-xxxxxx-xxxxxx-xxxxxx-xxxxxx  ←※入力項目
    Enter the password for xxxxxxxxx@xxxxx.xxxxx at my.1password.com:  ←※入力項目
    PS > op whoami
    URL:          https://xxx.1password.com/
    Email:        xxxxxxxxx@xxxxx.xxxxx
    User ID:      XXXXXXXXXXXXXXXXXXXXX
    User Type:    HUMAN
    PS >
    ```
    </details>

8. ログインで使用するプロファイル名を確認する
    ```
    awsume --list-profiles
    ```

    <details><summary>実行例</summary>

    ```
    PS > awsume --list-profiles
    Listing...

    ===============================AWS Profiles===============================
    PROFILE          TYPE  SOURCE  MFA?  REGION          PARTITION  ACCOUNT
    awsume-mfa-user  User  None    Yes   ap-northeast-1  aws        xxxxxxxxxxxxxx
    PS >
    ```
    </details>

9.  接続する
    ```
    # 接続コマンド
    awsume <プロファイル名>

    # 接続できたことの確認
    aws sts get-caller-identity
    ```

    <details><summary>実行例</summary>

    ```
    PS > awsume awsume-mfa-user
    Obtained MFA token from 1Password item: AWS(awsume-mfa-user)
    Session token will expire at 2025-06-23 08:15:11
    PS >

    PS > aws sts get-caller-identity
    {
        "UserId": "AIDA3VAYNP5DAFNC5SZZM",
        "Account": "xxxxxxxxxxxxxx",
        "Arn": "arn:aws:iam::xxxxxxxxxxxxxx:user/awsume-mfa-user"
    }

    PS >
    ```
    </details>

# おわりに
- 今回はアクセスキー/シークレットーキーをローカルに設定する方法でご紹介しました
- ただし、昨今はこのスタイルは非推奨となっています
- SSO(Identity Center)を認証として使うawsumeのコマンドがあるそうなので、この辺りも近いうち調査をしてみたいなぁと考えていますのでお楽しみに！！

# 参考
- [[初心者向け] IAMユーザーのMFAを1Passwordで設定する方法について](https://dev.classmethod.jp/articles/aws-1password-mfa_202306/)
- [マネコン起動もできるAWSのスイッチロール用CLIツール「AWSume」の紹介](https://dev.classmethod.jp/articles/awsume/)
- [AWSumeの「1PasswordからMFAを自動取得するプラグイン」を使ってみる](https://dev.classmethod.jp/articles/use-awsume-1password-plugin/)
- [AWSumeを使ってAWS CLIをIAM Identity Center(SSO)で認証する](https://dev.classmethod.jp/articles/awsume-aws-cli-iam-identity-center-sso-authentication/)
- [Get started with 1Password CLI](https://developer.1password.com/docs/cli/get-started/#install)