
AWSの認証情報を平文で保存しないように、1Password CLIに移行してみた (1PasswordをMFAデバイスにしない版)
以下のブログエントリに沿って設定することで、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







