AWSの認証情報を平文で保存しないように、1Password CLIに移行してみた (1PasswordをMFAデバイスにしない版)

AWSの認証情報を平文で保存しないように、1Password CLIに移行してみた (1PasswordをMFAデバイスにしない版)

2025.12.01

以下のブログエントリに沿って設定することで、AWSの認証情報を平文で保存しないように、1Password CLIに移行できます。

これにより、よりセキュアにAWSを使用できます。

が、 profileの指定をした場合がうまくいかなかった

上記エントリの最下段にprofile指定(--profile hoge)をしたい人向けの設定も案内されていましたが、私の環境ではこれが動作しませんでした。

記載されていた、先頭にバックスラッシュを付ける方法はエラーになります。(もちろん ~/.aws/config の修正は実施済です)

% \aws sts get-caller-identity --profile kazue-sandboxes

The source profile "default" must have credentials.

バックスラッシュを外してみると違うエラーになります。

% aws sts get-caller-identity --profile kazue-sandboxes
[ERROR] 2025/12/01 17:08:30 could not run plugin AWS CLI: failed to provision credentials, encountered error(s):
MFA failed: MFA serial "arn:aws:iam::555555555555:mfa/cm-kazue.masaki" was detected on the associated item or in the config file for the selected profile, but no 'One-Time Password' field was found.
Learn how to add an OTP field to your item:
https://developer.1password.com/docs/cli/shell-plugins/aws/#optional-set-up-multi-factor-authentication

私はMFAデバイスを1passwordに登録していない(したくない)ため、そのせいかと思い登録後に再度試してみましたが、以下エラーになりました。

  • 補足: MFAデバイス登録はこちらを参考にしましたが、項目名を「ワンタイムパスワード」から「One-Time Password」に変更しないと前述の「but no 'One-Time Password' field was found.」のままになりました。
% aws sts get-caller-identity --profile kazue-sandboxes 
[ERROR] 2025/12/01 17:26:37 could not run plugin AWS CLI: failed to provision credentials, encountered error(s):
Credential Process Authentication is not yet supported by the AWS Shell Plugin. If you would like for this feature to be supported, upvote or take on its issue: https://github.com/1Password/shell-plugins/issues/213

別の方法で動いた

少し違う実装で私の環境では動きましたので共有します。この方法ですと以下メリットがあります。

  • MFAデバイスを1passwordにしなくて良い
  • ターミナルのランコマンドファイル(zshなら.zshrc、bashなら.bashrc)に追記不要

ただ、デメリットとしてコマンド実行時間がやや(1〜2秒程度)遅くなります。おそらく毎回 opコマンドを実行しているからでしょう。このあたりは改良余地がありそうです。

前提条件

jq コマンドのインストールが必要です。(最後のJSON整形を自前でやるなら不要ですが)

1. 「AWS認証情報を追加する」までやる

もとのエントリの 「AWS認証情報を追加する」 までは同じように実施します。

2. スイッチロール元のIAMユーザーの profileに credential_process を追加

  [default]
  output=json
  region=ap-northeast-1
+ credential_process = sh -c "$HOME/.aws/get-default-cred.sh"

3. スクリプト作成

上記プロファイルから呼ばれる ~/.aws/get-default-cred.sh を作成します。(アイテム名)の部分に登録した1Passwordのアイテム名を記入してください。

#!/bin/bash

IFS=',' read -r key secret <<< "$(op item get --reveal --fields label="access key id","secret access key" (アイテム名))"

jq -n \
  --arg key "$key" \
  --arg secret "$secret" \
  '{Version: 1, AccessKeyId: $key, SecretAccessKey: $secret}'

スクリプト解説

$(op item get --reveal --fields label="access key id","secret access key" (アイテム名))

このコマンドを実行すると1Passwordのアイテムの値を取得できます。 --revealオプションがないと secret access keyの値が取得できません。また --fieldsオプションで出力する項目を必要なもののみに絞っています。

IFS=',' read -r key secret <<<

前述の op item get結果をふたつのシェル変数に格納しています。コマンド結果はカンマ区切りで出力されるので、IFS=','で区切り文字をカンマと定義して、ふたつのシェル変数key secretにカンマで分割した前後の値を格納します。

jq

AWS CLI の credential_process が読み取れる形式の JSONデータを作成(出力) しています。 (参考)

JSONの整形を自前でやるとつまらない構文エラーでハマったりするので私はjqで整形するのが好きです。

4. 実行権限付与

% chmod +x ~/.aws/get-default-cred.sh

動作確認

% aws sts get-caller-identity             
{
    "UserId": "AIDAJV3FTJ6OK5DQYUVRQ",
    "Account": "555555555555",
    "Arn": "arn:aws:iam::555555555555:user/cm-kazue.masaki"
}
% aws sts get-caller-identity --profile kazue-sandboxes
Enter MFA code for arn:aws:iam::555555555555:mfa/cm-kazue.masaki: 
{
    "UserId": "AROAJCLR52DWF5OI72OI2:botocore-session-1764580273",
    "Account": "999999999999",
    "Arn": "arn:aws:sts::999999999999:assumed-role/cm-kazue.masaki/botocore-session-1764580273"
}

~/.aws/credentialsファイルの削除を忘れずに!

補足: スイッチロール先IAM Role profileの設定

[profile kazue-sandboxes]
source_profile=default
role_arn=arn:aws:iam::999999999999:role/cm-kazue.masaki
mfa_serial=arn:aws:iam::555555555555:mfa/cm-kazue.masaki

この記事をシェアする

FacebookHatena blogX

関連記事