IAM Identity Center のユーザー・グループ操作で役立つAWS CLIエイリアスを作ってみる

2023.07.14

IAM Identity Center の ユーザー・グループ操作を楽にすべく、 AWS CLI のエイリアスを作ってみました。

以降で作ったエイリアスと使用例を紹介します。

なお、以降はIAM Identity Center の独自IDストアを使っている前提で進めます。

前提: そもそも AWS CLIのエイリアスとは

エイリアスを使うことでコマンドやスクリプトのショートカットを作成できます。 頻繁に使うコマンドがある場合に役立ちます。

設定ファイル ~/.aws/cli/alias を編集することで適用できます。

例えば以下のような alias ファイルを作成すると、 aws whoami コマンドが使えるようになります。

~/.aws/cli/alias

[toplevel]
whoami = sts get-caller-identity
$ aws whoami
{
    "UserId": "AROAEXAMPLE:cm-kawahara.masahiro",
    "Account": "111111111111",
    "Arn": "arn:aws:sts::111111111111:assumed-role/cm-kawahara.masahiro/cm-kawahara.masahiro"
}

詳細は以下ドキュメントを御覧ください。

作成したエイリアス

以下のようなエイリアスを作成しました。 ( Gist に同じものを上げています )

~/.aws/cli/alias

[toplevel]
whoami = sts get-caller-identity

### IAM Identity Center(SSO)
sso-store-id = sso-admin list-instances \
  --query "Instances[0].IdentityStoreId" --output text

sso-user-id =
  !f() {
  store_id="$1"
  user_email="$2"
  aws identitystore get-user-id --output text \
    --identity-store-id "$store_id" \
    --alternate-identifier "{\"UniqueAttribute\":{\"AttributePath\":\"emails.value\",\"AttributeValue\":\"${user_email}\"}}" \
    --query "UserId"
  };f

sso-group-id =
  !f() {
    store_id="$1"
    group_name="$2"
    aws identitystore get-group-id --output text \
      --identity-store-id "$store_id" \
      --alternate-identifier "{\"UniqueAttribute\":{\"AttributePath\":\"displayName\",\"AttributeValue\":\"${group_name}\"}}" \
      --query "GroupId"
  };f

sso-create-membership =
  !f () {
    store_id="$1"
    group_name="$2" 
    user_email="$3" 
    group_id=$(aws sso-group-id "$store_id" "$group_name")
    user_id=$(aws sso-user-id "$store_id" "$user_email")
    if [ "$group_id" != "" ] && [ "$user_id" != "" ]; then
      aws identitystore create-group-membership \
        --identity-store-id "$store_id" \
        --group-id "$group_id" \
        --member-id UserId="$user_id"
    fi
  };f

sso-membership =
  !f () {
    store_id="$1"
    group_name="$2"
    user_email="$3"
    group_id=$(aws sso-group-id "$store_id" "$group_name")
    user_id=$(aws sso-user-id "$store_id" "$user_email")
    if [ "$group_id" != "" ] && [ "$user_id" != "" ]; then
      aws identitystore get-group-membership-id --output text \
        --identity-store-id "$store_id" \
        --group-id "$group_id" \
        --member-id UserId="$user_id" \
        --query "MembershipId"
    fi
  };f

sso-delete-membership =
  !f () {
    store_id="$1"
    group_name="$2" 
    user_email="$3" 
    membership_id=$(aws sso-membership "$store_id" "$group_name" "$user_email")
    if [ "$membership_id" != "" ];then
      aws identitystore delete-group-membership \
        --identity-store-id "$store_id" \
        --membership-id "$membership_id"
    fi
  };f

以降で作ったコマンドと使用例を紹介します。

sso-store-id (Identity Store ID を取得)

sso-store-id = sso-admin list-instances \
  --query "Instances[0].IdentityStoreId" --output text

ユーザー・グループ周りの操作は、ほぼほぼ Identity Store ID がパラメータに必要になってきます。それを簡単に取得します。

▼ 使用例

$ aws sso-store-id
d-example

sso-user-id (メールアドレスからユーザーIDを取得)

sso-user-id =
  !f() {
  store_id="$1"
  user_email="$2"
  aws identitystore get-user-id --output text \
    --identity-store-id "$store_id" \
    --alternate-identifier "{\"UniqueAttribute\":{\"AttributePath\":\"emails.value\",\"AttributeValue\":\"${user_email}\"}}" \
    --query "UserId"
  };f

メールアドレスからユーザーIDを取得します。

▼ 使用例

$ aws sso-user-id $(aws sso-store-id) tanaka.taro@example.com
8774example-1111-2222-3333-444444444

sso-group-id (グループ表示名からグループIDを取得)

sso-group-id =
  !f() {
    store_id="$1"
    group_name="$2"
    aws identitystore get-group-id --output text \
      --identity-store-id "$store_id" \
      --alternate-identifier "{\"UniqueAttribute\":{\"AttributePath\":\"displayName\",\"AttributeValue\":\"${group_name}\"}}" \
      --query "GroupId"
  };f

グループ表示名からグループIDを取得します。

▼ 使用例

$ aws sso-group-id $(aws sso-store-id) ExampleGroup
0754daf8-1111-2222-f66a-afdexample

sso-membership (ユーザーのグループ所属IDを取得)

sso-membership =
  !f () {
    store_id="$1"
    group_name="$2"
    user_email="$3"
    group_id=$(aws sso-group-id "$store_id" "$group_name")
    user_id=$(aws sso-user-id "$store_id" "$user_email")
    if [ "$group_id" != "" ] && [ "$user_id" != "" ]; then
      aws identitystore get-group-membership-id --output text \
        --identity-store-id "$store_id" \
        --group-id "$group_id" \
        --member-id UserId="$user_id" \
        --query "MembershipId"
    fi
  };f

ユーザーがグループに所属している場合の、所属ID(membership id) を取得します。 所属IDはグループからの所属解除などのコマンドのパラメータとして必要になってきます。

前提として sso-user-idsso-group-id が必要です。

▼ 使用例

$ aws sso-membership $(aws sso-store-id) ExampleGroup tanaka.taro@example.com
b704cab8-1111-2222-ec1b-2286example

sso-create-membership (ユーザーをグループに所属させる)

sso-create-membership =
  !f () {
    store_id="$1"
    group_name="$2" 
    user_email="$3" 
    group_id=$(aws sso-group-id "$store_id" "$group_name")
    user_id=$(aws sso-user-id "$store_id" "$user_email")
    if [ "$group_id" != "" ] && [ "$user_id" != "" ]; then
      aws identitystore create-group-membership \
        --identity-store-id "$store_id" \
        --group-id "$group_id" \
        --member-id UserId="$user_id"
    fi
  };f

ユーザーをグループに所属させます。

前提として sso-user-idsso-group-id が必要です。

▼ 使用例

$ aws sso-create-membership $(aws sso-store-id) ExampleGroup tanaka.taro@example.com
IdentityStoreId: d-example
MembershipId: b754aa18-1111-2222-e421-9c65example

sso-delete-membership (ユーザーをグループから脱退させる)

sso-delete-membership =
  !f () {
    store_id="$1"
    group_name="$2" 
    user_email="$3" 
    membership_id=$(aws sso-membership "$store_id" "$group_name" "$user_email")
    if [ "$membership_id" != "" ];then
      aws identitystore delete-group-membership \
        --identity-store-id "$store_id" \
        --membership-id "$membership_id"
    fi
  };f

ユーザーをグループから脱退させます。

前提として sso-membership が必要です。

▼ 使用例

$ aws sso-delete-membership $(aws sso-store-id) ExampleGroup tanaka.taro@example.com

# 脱退させたので以下コマンドはエラーになる
$ aws sso-membership $(aws sso-store-id) ExampleGroup tanaka.taro@example.com
An error occurred (ResourceNotFoundException) when calling the GetGroupMembershipId operation: Group membership not found for given Pool/Group/Member.

おわりに

以上、AWS CLIのエイリアスを使って IAM Identity Center 周りのショートカットを作ってみました。

参考になれば幸いです。

参考