AWSでIAMユーザを作成すると、セキュリティ認証情報のアクセスキーの項目に 「ベストプラクティスとして、アクセスキーなどの長期的な認証情報は使用しないようにしてください。代わりに、短期的な認証情報を提供するツールを使用してください。」 というようなことが書かれている。

そして、その方法として AWS CloudShell を使うということらしい。
https://docs.aws.amazon.com/IAM/latest/UserGuide/security-creds-programmatic-access.html#security-creds-alternatives-to-long-term-access-keys

なので CloudShell 上で一時認証情報を取得して、その情報を利用してクライアントPCで AWS CLI を使えるようにする。
(もちろん CloudShell 上で出来る作業なら、そのまま CloudShell で作業すれば良い)

IAMロールを作成する

マネジメントコンソールから assume-role する対象のロールを作成する。

今回はこの設定。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::{AWSアカウントID}:root"
            },
            "Action": "sts:AssumeRole",
            "Condition": {}
        }
    ]
}

作成したロールのARNを控えておく。

IAMユーザの権限を編集

マネジメントコンソールにログインしたIAMユーザの権限でCloudShellを開くので、CloudShellを起動できる権限が必要。
あと assume-role するために sts:AssumeRole が必要。

前者は AWSCloudShellFullAccess をつけておけばOK。
後者はインラインポリシーだとこんな感じ。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": "sts:AssumeRole",
            "Resource": "arn:aws:iam::{アカウントID}:role/PowerUserRole"
        }
    ]
}

CloudShellでコマンドを実行

これで準備が整ったので、IAMユーザでマネジメントコンソールにログインし、CloudShellを起動する。

CloudShellターミナル上で以下のコマンドを実行する。

ROLE_ARN={作成したロールのARN}
SESSION_NAME={任意のセッション名}
aws sts assume-role --role-arn "$ROLE_ARN" --role-session-name "$SESSION_NAME" \
  --query 'Credentials.[AccessKeyId,SecretAccessKey,SessionToken]' --output text \
  | awk -v e="export AWS_" '{print e"ACCESS_KEY_ID="$1"\n" e"SECRET_ACCESS_KEY="$2"\n" e"SESSION_TOKEN="$3}'

成功すると、一時認証情報が記載された環境変数設定コマンドが出力されるので、
手動でコピーしてクライアントPCのターミナルにそのままペーストすればAWS CLIが使えるようになる。
(※Windowsユーザの場合は、exportコマンドを$Envに読み替えてください)

aws sts get-caller-identity

クライアントPCターミナル上でこのコマンドを実行すれば、利用してるアカウント情報を確認できる。

ちなみに、この方法で得られた一時認証情報の有効期限は1時間なので、期限を超えて利用したい場合は再度 assume-role すること。

参考