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-go
は aws 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
コマンドが使えるようになった。