Skip to content

Instantly share code, notes, and snippets.

@wakusei-meron-
Forked from TAKEDA-Takashi/aws-iam-user-key-rotation.sh
Last active October 6, 2021 08:26
Show Gist options
  • Save wakusei-meron-/9349d27819b9a2879cfc9e83875c000c to your computer and use it in GitHub Desktop.
Save wakusei-meron-/9349d27819b9a2879cfc9e83875c000c to your computer and use it in GitHub Desktop.
指定したAWSプロファイルのアクセスキー をローテーションするスクリプト。
# profile一覧の確認
cat ~/.aws/credentials

# profileがdefaultのクレデンシャルを更新
PROFILE=default ;curl -sf https://gist.githubusercontent.com/wakusei-meron-/9349d27819b9a2879cfc9e83875c000c/raw/5ba5be5278a4f436b1ec64b7104df1566ea57c6f/aws-iam-user-key-rotation.sh | sh -s $PROFILE

# 意図しない更新をした場合、クレデンシャルのバックアップの確認
cat ~/.aws/credentials.bak
#!/bin/bash -euo pipefail
#
# Usage:
# $ aws-iam-user-key-rotation.sh [profile] [credential_file]
#
declare -x AWS_DEFAULT_PROFILE=${1:-default}
declare credential_file=${2:-~/.aws/credentials}
declare -x AWS_SHARED_CREDENTIALS_FILE=$credential_file
echo "${AWS_DEFAULT_PROFILE} プロファイルのアクセスキーをローテーションします。"
declare iam_user_name
iam_user_name=$(aws iam get-user | jq -r '.User.UserName')
declare current_access_keys
current_access_keys=$(aws iam list-access-keys)
echo "対象のIAMユーザーは ${iam_user_name} です。"
# AWSのアクセスキーは一度に2個までしか作成できないため先にチェックしておく
if (( $(echo "$current_access_keys" | jq '.AccessKeyMetadata | length') == 2 )); then
echo "アクセスキーが2個存在しています。使用していないアクセスキーを削除してから再実行してください。" 1>&2
exit 1
fi
cp "$credential_file"{,.bak}
declare new_credentials
new_credentials=$(aws iam create-access-key --user-name "$iam_user_name")
echo "新規アクセスキーを作成しました。"
declare response_text="$(echo "$new_credentials" | jq -r '.AccessKey.AccessKeyId')
$(echo "$new_credentials" | jq -r '.AccessKey.SecretAccessKey')
"
echo "$response_text" | aws configure > /dev/null
echo "クレデンシャルファイルを更新しました。"
declare updated_access_keys
echo "新しいアクセスキーで試行します。"
set +e
while :; do
echo "5秒待機します..."
sleep 5s
# このコマンドは新しいアクセスキーで実行される
updated_access_keys=$(aws iam list-access-keys 2> /dev/null)
(( $? == 0 )) && break
done
set -e
# ここがfalseになることはないはず
if (( $(echo "$updated_access_keys" | jq '.AccessKeyMetadata | length') != 2 )); then
echo "アクセスキーが2個存在していません。何かおかしいようです。" 1>&2
exit 1
fi
aws iam delete-access-key --user-name "$iam_user_name" --access-key-id "$(echo "$current_access_keys" | jq -r '.AccessKeyMetadata[0].AccessKeyId')"
echo "古いアクセスキーを削除しました。"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment