🔐
IAM Identity Center を試してみた
最初のセットアップ
この手順を実施すればひとまずできる。
権限セットの作成
この手順を実施すればひとまずできる。
コストへのアクセス権付与
aws-vault のプロファイルを作成する
シングルアカウントの場合
~/.aws/config
[profile homelabo-sso]
sso_start_url = https://<セットアップ中に表示された値>.awsapps.com/start
sso_region = ap-northeast-1
sso_account_id = <セットアップした先のAWSアカウント番号:12桁>
sso_role_name = AdministratorAccess # <権限セットの作成で指定した名前>
region = ap-northeast-1
マルチアカウントの場合
~/.aws/config
[profile homelabo-sso]
sso_start_url=https://<セットアップ中に表示された値>.awsapps.com/start
sso_region=ap-northeast-1
sso_registration_scopes = sso:account:access
[profile homelabo-sso-admin]
sso_account_id=<スイッチ先のAWSアカウント番号:12桁>
sso_role_name = AdministratorAccess # <権限セットの作成で指定した名前>
include_profile = homelabo-sso
[profile homelabo-sso-readonly]
sso_account_id=<スイッチ先のAWSアカウント番号:12桁>
sso_role_name = ReadonlyAccess
include_profile = homelabo-sso
簡単にスイッチするためのシェル設定
aws-vaultを使っていてめんどくさいのは、awscliコマンドを実行するたびコマンドの頭にaws-vaultを追加しないといけないこと。
コマンドを実行する時だけクレデンシャル情報が後続のコマンドに渡されるためセキュアではあるんだけど不便だ。
IAM Identity Center にすることで永続的なアクセスキーは発行されなくなったので、下記のようにしてクレデンシャル情報を環境変数に設定すると捗る。
エイリアス
シェルのエイリアスを設定しておくと便利。
~/.zshrc
alias lh='export $(aws-vault exec homelabo-sso -- env | grep AWS_ | grep -v AWS_VAULT)'
関数
関数にして複数Roleに対応してもよい。
~/.zshrc
set_aws_credential(){
# クレデンシャルの初期化
unset AWS_DEFAULT_REGION
unset AWS_REGION
unset AWS_SECRET_ACCESS_KEY
unset AWS_SESSION_TOKEN_TTL
unset AWS_ACCESS_KEY_ID
unset AWS_CREDENTIAL_EXPIRATION
unset AWS_SESSION_TOKEN
if [ $# -eq 1 ]; then
role=$1
else
role=$(aws-vault list --profiles | fzf)
echo $role
fi
echo "Switch: $role"
credential=$(aws-vault exec "$role" -- env | grep ^AWS_ | grep -v AWS_VAULT)
if [ "$?" -eq 0 ]; then
while IFS='=' read -r key value; do
export "$key=$value"
done <<< "$credential"
aws sts get-caller-identity --query "Account" --output text
else
echo 'Error: Role not found.'
fi
}
~/.config/fish/function/set_aws_credential
function set_aws_credential
# クレデンシャルの初期化
set -e AWS_DEFAULT_REGION
set -e AWS_REGION
set -e AWS_SECRET_ACCESS_KEY
set -e AWS_SESSION_TOKEN_TTL
set -e AWS_ACCESS_KEY_ID
set -e AWS_CREDENTIAL_EXPIRATION
set -e AWS_SESSION_TOKEN
if test (count $argv) -eq 1
set role $argv[1]
else
set role (aws-vault list --profiles | fzf)
echo $role
end
echo "Switch: $role"
set creds (aws-vault exec $role -- env | grep ^AWS_ | grep -v AWS_VAULT)
if test $status -eq 0
for line in $creds
set key (echo $line | cut -d '=' -f1)
set value (echo $line | cut -d '=' -f2-)
set -gx $key $value
end
aws sts get-caller-identity --query "Account" --output text
else
echo "Error: Role not found."
end
end
使い方
$ set_aws_credential homelabo-sso
トラブルシューティング
久しぶりにaws-vaultの設定を行ったら、起動時にエラーが出たのでメモしておく。
gpg: error retrieving 'me@example.com' via WKD: No data
事象
aws-vault exec homelabo-sso
を実行した所、下記エラーが出力された。
Opening the SSO authorization page in your default browser (use Ctrl-C to abort)
https://device.sso.ap-northeast-1.amazonaws.com/?user_code=XXXX-XXXX
gpg: error retrieving 'me@example.com' via WKD: No data
gpg: me@example.com: skipped: No data
gpg: [stdin]: encryption failed: No data
Password encryption aborted.
aws-vault: error: exec: Failed to get credentials for homelabo-sso: exit status 1
解決策
gpg --gen-key
を実行して、me@example.com
に対応する鍵を作成する。
$ gpg --gen-key
<snip>
GnuPGはあなたの鍵を識別するためにユーザIDを構成する必要があります。
本名: <名前>
電子メール・アドレス: <ここにme@example.comを入力する>
コメント:
次のユーザIDを選択しました:
"me <me@example.com>"
もしかして
IAM Identity Centerに切り替えたことでGPGにメールアドレスが連携されるようになり、対応する鍵を探しに行くようになったため、これまでアクセスキーを暗号化するために適当な名前とメールアドレスで作っていた鍵では対応できなくなったのかもしれない。
Discussion