0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

IAM Identity Center での AWS CLI ログインを最速化する

0
Posted at

IAM Identity Center を使うようになってから、組織内のメンバーアカウントに SSO ログインできて非常に便利になりました。
ただし慣れてくると、ログインの反復動作はできるだけ早く終えたくなるのが人間の性。
CLI ログイン用に bash でファンクション化しておきました。

単なる短縮ではなく、「入力削減」「誤操作防止」「プロファイルの明示性維持」を同時に満たすことを目指しました。

IAM Identity Center を使ってマルチアカウント運用している方で、CLI 利用が日常になってきた方には共感いただけるかもしれません。

1. 結論

bash ファイルに以下を追加します。

追加するファンクション
.bashrc
function aws-profiles() {
  command -v aws >/dev/null 2>&1 || { echo "aws CLI not found"; return 127; }
  aws configure list-profiles
}

function aws-login() {
  if [ -z "$1" ]; then
    echo "Usage: aws-login <profile-name>"
    echo "Tip: run aws-profiles to list your AWS profiles"
    return 2
  fi
  command -v aws >/dev/null 2>&1 || { echo "aws CLI not found"; return 127; }

  if ! aws sso login --profile "$1"; then
    return 1
  fi

  export AWS_PROFILE="$1"
  aws-who
}

function aws-who() {
  command -v aws >/dev/null 2>&1 || { echo "aws CLI not found"; return 127; }

  if [ -z "$AWS_PROFILE" ]; then
    printf "\nAWS_PROFILE -> ❌\n"
  else
    printf "\nAWS_PROFILE -> %s\n" "$AWS_PROFILE"
  fi

  local REGION
  if [ -n "$AWS_PROFILE" ]; then
    REGION=$(aws configure get region --profile "$AWS_PROFILE" 2>/dev/null)
  else
    REGION=$(aws configure get region 2>/dev/null)
  fi

  if [ -z "$REGION" ]; then
    REGION="${AWS_REGION:-$AWS_DEFAULT_REGION}"
  fi

  if [ -z "$REGION" ]; then
    printf "AWS_REGION  -> ❌\n"
  else
    printf "AWS_REGION  -> %s\n" "$REGION"
  fi

  if [ -n "$AWS_PROFILE" ]; then
    aws sts get-caller-identity --profile "$AWS_PROFILE"
  else
    aws sts get-caller-identity
  fi

  printf "\n"
}

function aws-unset() {
  unset AWS_PROFILE AWS_DEFAULT_PROFILE
  unset AWS_ACCESS_KEY_ID AWS_SECRET_ACCESS_KEY AWS_SESSION_TOKEN
  unset AWS_REGION AWS_DEFAULT_REGION
  aws-who
}

2. 正規ルート

AWS CLI で IAM Identity Center に接続する公式手順はこちらです。

おおまかに以下の手順となります。

  • SSO セッションとアカウントプロファイルを ~/.aws/config に設定します
  • aws sso login --profile <プロファイル名> でログインします
  • aws sts get-caller-identity --profile <プロファイル名> で認証情報を確認します
  • プロファイルを指定しつつ aws コマンドを実行します

素晴らしく便利なのですが、コマンドを短縮したいのと、プロファイル指定を省略したくなる気持ちが芽生えます。

その上で、アカウントの取り違えなど誤操作もできるだけ防げるような仕組みにしたい。
そしてデフォルトのプロファイルに頼らない設計も維持したい。

と色々と構想が膨らんでいきました。

3. ファンクションの使い方

bash ファイルに記述を追加すると、以下のファンクションが使えるようになります。
入力文字数の削減だけでなく、プロファイルの明示性を保ちながら安全に切り替えられる点がポイントです。

~/.aws/config の設定は完了している前提です。

aws-profiles

登録しているプロファイルを一覧で出せます。
以下を実行しているだけではあります。

aws configure list-profiles

aws-login <プロファイル名>

プロファイル名を指定するとログインできます。
SSO ログインが済んでいない場合はブラウザが開きますので、AWS アクセスポータルにログインして認証します。
次の aws-who が同時に実行され、プロファイル名、リージョン、AWS アカウント、ロール名が出力されるのがミソです。

すでに有効な SSO セッションがある場合は再認証なしで終了し、AWS_PROFILE が切り替わります。

aws-who

プロファイル名、リージョン、AWS アカウント、ロール名を出力します。
間違った情報でログインしていないか、いつでも確認できます。

AWS_PROFILE -> TT-dev-readonly
AWS_REGION  -> ap-northeast-1
{
    "UserId": "AXXXX:tadokoro",
    "Account": "123456789012",
    "Arn": "arn:aws:sts::123456789012:assumed-role/AWSReservedSSO_ReadOnlyAccess_xxxxx/tadokoro"
}

aws-unset

AWS ログイン関連の環境変数をひと通り消去します。
SSO セッション自体はキャッシュに残りますが、AWS_PROFILE を解除することで CLI からの利用を停止できます。

まとめ

小さな工夫ですが、マルチアカウント運用では どのアカウントに入っているかを常に意識できる仕組み が重要だと改めて感じました。
効率化に繋がるものは何でも積極的に取り入れていきたいですね。

今日も小さな学びを。

IAM Identity Center 関連記事

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?