1Password の AWS shell plugin は大変便利なのだが、AWS_SESSION_TOKEN に対応していないので aws sso login が必要な環境では、そのままでは利用が難しい。
短命のトークンとはいえ、 ~/.aws/sso/cache にクレデンシャルを保存したくないので、なんとか 1Password に保存して 1Password CLI で利用したい。 …という背景もあり https://github.com/mrtc0/aws-sso-go を作った。

aws-sso-goaws sso login 相当の処理を実行して、取得した認証情報を標準出力に出力するだけの小さいツール。AWS CLI だと認証情報を標準出力することができそうになかったので、自前で作った。
出力された認証情報を、次のようなスクリプトに食わせることで指定した 1Password のアイテムに保存することができる。

#!/bin/bash

# update-1password-aws-credentials.sh
#
# This script is save aws-sso-go results to 1Password.
#
# Usage: aws-sso-go | update-1password-aws-credentials.sh <1Password item name>
#   e.g. aws-sso-go | update-1password-aws-credentials.sh aws-credentials
#
# You can handle AWS credentials by running `op run --env-file .env` with a `.env` file like:
#   AWS_ACCESS_KEY_ID="op://Private/aws-credentials/access key id"
#   AWS_SECRET_ACCESS_KEY="op://Private/aws-credentials/secret access key"
#   AWS_SESSION_TOKEN="op://Private/aws-credentials/session token"

while read -r line; do
    AWS_SECRET_ACCESS_KEY=$(echo $line | jq -r '.SecretAccessKey')
    AWS_ACCESS_KEY_ID=$(echo $line | jq -r '.AccessKeyId')
    AWS_SESSION_TOKEN=$(echo $line | jq -r '.SessionToken')

    op item edit "$1" "secret access key=$AWS_SECRET_ACCESS_KEY" "access key id=$AWS_ACCESS_KEY_ID" "session token=$AWS_SESSION_TOKEN"
done

使い方としては、こんな感じ。1Password AWS shell plugin を使えればきれいなのだが、前述したように AWS_SESSION_TOKEN に対応していないため、op run --env-file で利用する。

$ aws-sso-go --profile my-aws | update-1password-aws-credentials.sh my-aws-credentials

$ cat .env
AWS_ACCESS_KEY_ID="op://Private/my-aws-credentials/access key id"
AWS_SECRET_ACCESS_KEY="op://Private/my-aws-credentials/secret access key"
AWS_SESSION_TOKEN="op://Private/my-aws-credentials/session token"

$ op run --env-file .env -- aws s3 ls

これで ~/.aws/sso/cache にクレデンシャルを保存することなく、aws コマンドが使えるようになった。

AWS  SSO  1Password  Go