【AWS IAM Identity Center】ユーザー管理でよく使いそうな作成/削除系操作をAWS CLIでやってみる

2023.01.23

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

「ユーザー作成/削除」または「ユーザー棚卸し」といった IAM Identity Center の日々の運用作業は、 マルチアカウント環境がスケールするにつれて増えてくると思います。 だんだんマネジメントコンソールで作業することが辛くなってくるのでは無いでしょうか。

そんな運用の辛さを軽減するために、ぜひAPIは活用していきたいです。 以下アップデートから、 AWS IAM Identity Center (旧 AWS Single-Sign On) の IDストアに対してAPIから参照・更新ができるようになっています。

本ブログではユーザーやグループ、割り当ての 新規作成または削除を AWS CLIで実施 するサンプルを紹介します。

(参考) IAM Identity Center のユーザー/グループ/割り当てなどの棚卸しスクリプトを書いていました。合わせて参考ください

前提環境

今回はOrganizations管理アカウントにて、 AWS CloudShell を使ってCLIを実行しました。

aws --version
# aws-cli/2.9.15 Python/3.9.11 Linux/4.14.255-291-231.527.amzn2.x86_64 exec-env/CloudShell exe/x86_64.amzn.2 prompt/off

echo $SHELL
# /bin/bash

事前準備(IDストア、インスタンスARN)

諸操作をするにあたってパラメータに Identityストア IDIAM Identity StoreのインスタンスARN が必要になってきます。

list-instances を使って値を取得しておきましょう。

STORE_ID=$(aws sso-admin list-instances --query "Instances[0].IdentityStoreId" --output text --no-paginate)
echo "Identity Store ID: ${STORE_ID}"
# Identity Store ID: d-example

INSTANCE_ARN=$(aws sso-admin list-instances --query "Instances[0].InstanceArn" --output text)
echo "Instance ARN: ${INSTANCE_ARN}"
# Instance ARN: arn:aws:sso:::instance/ssoins-77example

作成系

以下ケースのサンプルを紹介します。

  • ユーザーの作成
  • グループの作成
  • ユーザーのグループへの所属
  • AWSアカウントへの割当作成

ユーザーの作成

create-user を使ってIAM Identity Store ユーザーを作成します。

以下 1ユーザー作成のサンプルです。※ユーザー名や表示名の規則は適当です

STORE_ID=$(aws sso-admin list-instances --query "Instances[0].IdentityStoreId" --output text --no-paginate)

FAMILY_NAME="KURAMESO"
GIVEN_NAME="TARO"
COMPANY="CM"
EMAIL="kurameso.taro@example.com"
USER_NAME="${EMAIL}"
DISP_NAME="${COMPANY}_${GIVEN_NAME}_${FAMILY_NAME}"

aws identitystore create-user --output yaml \
  --identity-store-id "${STORE_ID}" \
  --user-name "${USER_NAME}" \
  --display-name "${DISP_NAME}" \
  --name FamilyName="${FAMILY_NAME}",GivenName="${GIVEN_NAME}" \
  --emails Value="${EMAIL}",Type=work,Primary=true

# IdentityStoreId: d-example
# UserId: f123456-80f1-70c1-b66c-example

img

作成したユーザーのIDは get-user-id で取得できます。

STORE_ID=$(aws sso-admin list-instances --query "Instances[0].IdentityStoreId" --output text --no-paginate)

USER_NAME="kurameso.taro@example.com"

USER_ID=$(aws identitystore get-user-id --output text \
  --identity-store-id "${STORE_ID}" \
  --alternate-identifier "{\"UniqueAttribute\":{\"AttributePath\":\"userName\",\"AttributeValue\":\"${USER_NAME}\"}}" \
  --query "UserId")
echo "${USER_NAME} ID: ${USER_ID}"
# kurameso.taro@example.com ID: f123456-80f1-70c1-b66c-example

複数ユーザーを一括作成する場合は、CSVなどをインプットにして作成すると良さそうです。 以下カンマ区切りの入力を使って複数ユーザーを作成するサンプルです。

STORE_ID=$(aws sso-admin list-instances --query "Instances[0].IdentityStoreId" --output text --no-paginate)

echo "KURAMESO,TARO,CM,kurameso.taro@example.com
PURIZUMA,HANAKO,PZ,purizuma.hanako@example.com
DEBEKYAN,TUYOSHI,BC,debekyan.tuyoshi@example.com" \
| while read line; do
  FAMILY_NAME=$(echo "${line}" | cut -d , -f 1)
  GIVEN_NAME=$(echo "${line}" | cut -d , -f 2)
  COMPANY=$(echo "${line}" | cut -d , -f 3)
  EMAIL=$(echo "${line}" | cut -d , -f 4)
  USER_NAME="${EMAIL}"
  DISP_NAME="${COMPANY}_${GIVEN_NAME}_${FAMILY_NAME}"
  # ユーザー作成
  aws identitystore create-user --output yaml \
    --identity-store-id "${STORE_ID}" \
    --user-name "${USER_NAME}" \
    --display-name "${DISP_NAME}" \
    --name FamilyName="${FAMILY_NAME}",GivenName="${GIVEN_NAME}" \
    --emails Value="${EMAIL}",Type=work,Primary=true
done

グループの作成

create-group コマンドでIAM Identity Center グループを作成します。

STORE_ID=$(aws sso-admin list-instances --query "Instances[0].IdentityStoreId" --output text --no-paginate)

GROUP_NAME="EXAMPLE_GROUP"
GROUP_DESCRIPTION="example"

aws identitystore create-group --output yaml \
  --identity-store-id "${STORE_ID}" \
  --display-name "${GROUP_NAME}" \
  --description "${GROUP_DESCRIPTION}"

# GroupId: 27example-5081-70a5-63f9-a8fe93c81ac9
# IdentityStoreId: d-example

img

作成したグループのIDは get-group-id で取得できます。

STORE_ID=$(aws sso-admin list-instances --query "Instances[0].IdentityStoreId" --output text --no-paginate)
GROUP_NAME="EXAMPLE_GROUP"

GROUP_ID=$(aws identitystore get-group-id --output text \
  --identity-store-id "${STORE_ID}" \
  --alternate-identifier "{\"UniqueAttribute\":{\"AttributePath\":\"displayName\",\"AttributeValue\":\"${GROUP_NAME}\"}}" \
  --query "GroupId")
echo "${GROUP_NAME} ID: ${GROUP_ID}"
# EXAMPLE_GROUP ID: 27example-5081-70a5-63f9-a8fe93c81ac9

ユーザーのグループへの所属

create-group-membership を使ってユーザーをグループに所属させます。 それぞれ(ユーザー/グループ)のIDが必要です。

STORE_ID=$(aws sso-admin list-instances --query "Instances[0].IdentityStoreId" --output text --no-paginate)

USER_ID="f123456-80f1-70c1-b66c-example"
GROUP_ID="27example-5081-70a5-63f9-a8fe93c81ac9"

aws identitystore create-group-membership --output yaml \
  --identity-store-id "${STORE_ID}" \
  --group-id "${GROUP_ID}" \
  --member-id UserId="${USER_ID}"

# IdentityStoreId: d-example
# MembershipId: d77example-f061-7027-a599-d619baf12e0c

img

以下複数人をグループに所属させるスクリプト例です。

STORE_ID=$(aws sso-admin list-instances --query "Instances[0].IdentityStoreId" --output text --no-paginate)

GROUP_ID="27example-5081-70a5-63f9-a8fe93c81ac9"

echo "87example-2061-7055-7441-4d67de
f7example-80f1-70c1-b66c-fc5452ea25
95example-4616ebb8-b0f2-84bc-2361f8" \
| while read user_id; do
  aws identitystore create-group-membership --output yaml \
    --identity-store-id "${STORE_ID}" \
    --group-id "${GROUP_ID}" \
    --member-id UserId="${user_id}"
done

AWSアカウントへの割当作成

AWSアカウントへの割当は AWSアカウント(ID)許可セット(ARN)グループ or ユーザー (ID) の組み合わせです。

以下、グループに対する割当作成のサンプルです。 create-account-assignmen を使っています。

INSTANCE_ARN=$(aws sso-admin list-instances --query "Instances[0].InstanceArn" --output text)

ACCOUNT_ID="123456789012"
PS_ARN="arn:aws:sso:::permissionSet/ssoins-77example/ps-c9example"
GROUP_ID="27example-5081-70a5-63f9-a8fe93c81ac9"

### 割当作成
aws sso-admin create-account-assignment --output yaml \
  --instance-arn "${INSTANCE_ARN}" \
  --target-id "${ACCOUNT_ID}" \
  --target-type "AWS_ACCOUNT" \
  --permission-set-arn "${PS_ARN}" \
  --principal-id "${GROUP_ID}" \
  --principal-type "GROUP"
# AccountAssignmentCreationStatus:
#   PermissionSetArn: arn:aws:sso:::permissionSet/ssoins-77example/ps-59example
#   PrincipalId: c7example-a0d1-70d3-76db-7f4a5987a026
#   PrincipalType: GROUP
#   RequestId: 50example-2bc3-446a-b01b-3bf2d99ab9a4
#   Status: IN_PROGRESS
#   TargetId: '123456789012'
#   TargetType: AWS_ACCOUNT

img

(補足1) 厳密に作成完了したところまで確認したい場合は、describe-account-assignment-creation-status を使用します

(補足2) AWSアカウント一覧は list-accounts で確認できます。

aws organizations list-accounts --output table --query "Accounts[].[Name, Id]"
# ----------------------------------
# |          ListAccounts          |
# +---------------+----------------+
# |  AAA          |  111111111111  |
# |  BBB          |  222222222222  |
# |  CCC          |  333333333333  |
# +---------------+----------------+

(補足3) 許可セット一覧の確認コマンドも以下に記載します。list-permission-sets および describe-permission-set を活用します。

INSTANCE_ARN=$(aws sso-admin list-instances --query "Instances[0].InstanceArn" --output text)

# Permission Set のARNリストを取得
aws sso-admin list-permission-sets --output text \
  --instance-arn "${INSTANCE_ARN}" \
| while read line; do
  ps_arn=$(echo "${line}" | cut -f 2)
  # Permission Set の情報(名前)を取得
  ps_name=$(aws sso-admin describe-permission-set --output text \
    --instance-arn "${INSTANCE_ARN}" \
    --permission-set-arn "${ps_arn}" \
    --query "PermissionSet.Name")
  # 出力
  echo "${ps_name} ${ps_arn}"
done
# AWSAdministratorAccess arn:aws:sso:::permissionSet/ssoins-77example/ps-1dexample
# AWSServiceCatalogEndUserAccess arn:aws:sso:::permissionSet/ssoins-77example/ps-02example
# AWSPowerUserAccess arn:aws:sso:::permissionSet/ssoins-77example/ps-f7example
# AWSOrganizationsFullAccess arn:aws:sso:::permissionSet/ssoins-77example/ps-b4example
# AWSReadOnlyAccess arn:aws:sso:::permissionSet/ssoins-77example/ps-59example
# AWSServiceCatalogAdminFullAccess arn:aws:sso:::permissionSet/ssoins-77example/ps-8dexample

削除系

以下ケースのサンプルを紹介します。

  • AWSアカウントへの割当削除
  • ユーザーのグループ所属への削除
  • グループの削除
  • ユーザーの削除

AWSアカウントへの割当削除

delete-account-assignment を使って、グループの割当を削除してみます。

INSTANCE_ARN=$(aws sso-admin list-instances --query "Instances[0].InstanceArn" --output text)

ACCOUNT_ID="123456789012"
PS_ARN="arn:aws:sso:::permissionSet/ssoins-77example/ps-c9example"
GROUP_ID="27example-5081-70a5-63f9-a8fe93c81ac9"

### 割当削除
aws sso-admin delete-account-assignment --output yaml \
  --instance-arn "${INSTANCE_ARN}" \
  --target-id "${ACCOUNT_ID}" \
  --target-type "AWS_ACCOUNT" \
  --permission-set-arn "${PS_ARN}" \
  --principal-id "${GROUP_ID}" \
  --principal-type "GROUP"
# AccountAssignmentDeletionStatus:
#   PermissionSetArn: arn:aws:sso:::permissionSet/ssoins-77example/ps-59example
#   PrincipalId: c7example-a0d1-70d3-76db-7f4a5987a026
#   PrincipalType: GROUP
#   RequestId: f3c62988-9cd1-48bb-b133-1c2228df929d
#   Status: IN_PROGRESS
#   TargetId: '123456789012'
#   TargetType: AWS_ACCOUNT

(補足) 厳密に削除完了したところまで確認したい場合は、describe-account-assignment-deletion-status を使用します

ユーザーのグループ所属への削除

delete-group-membership を使います。グループ所属の削除には membership-id パラメータが必要です。

以下サンプルです。

STORE_ID=$(aws sso-admin list-instances --query "Instances[0].IdentityStoreId" --output text --no-paginate)

MEMBERSHIP_ID="d7example-f061-7027-a599-d619baf12e0c"

aws identitystore delete-group-membership --output yaml \
  --identity-store-id "${STORE_ID}" \
  --membership-id "${MEMBERSHIP_ID}"

(補足) 特定グループのメンバーシップ洗い出しには list-group-memberships が利用できます。 以下特定グループの ユーザー名 メンバーシップID をリストするスクリプト例です。

STORE_ID=$(aws sso-admin list-instances --query "Instances[0].IdentityStoreId" --output text --no-paginate)

GROUP_ID="c7example-a0d1-70d3-76db-7f4a5987a026"

aws identitystore list-group-memberships --output text \
  --identity-store-id "${STORE_ID}" \
  --group-id "${GROUP_ID}" \
  --query "GroupMemberships[].[MembershipId, MemberId.UserId]" \
| while read line; do
  membership_id=$(echo "${line}" | cut -f 1)
  user_id=$(echo "${line}" | cut -f 2)
  # ユーザー名を取得
  user_name=$(aws identitystore describe-user --output text\
    --identity-store-id "${STORE_ID}" \
    --user-id "${user_id}" \
    --query "UserName")
  # 出力
  echo "${user_name} ${membership_id}"
done

# kurameso.taro@example.com d77example-f061-7027-a599-d619baf12e0c
# purizuma.hanako@example.com b7example-5021-7081-f495-2390f6360b30
# debekyan.tetsuo@example.com d7example-f051-7083-4e58-e2c1c62561a4

グループの削除

delete-group を使います。以下サンプルです。

STORE_ID=$(aws sso-admin list-instances --query "Instances[0].IdentityStoreId" --output text --no-paginate)

GROUP_ID="c7example-a0d1-70d3-76db-7f4a5987a026"

aws identitystore delete-group --output yaml \
  --identity-store-id "${STORE_ID}" \
  --group-id "${GROUP_ID}"

ユーザーの削除

delete-user を使います。以下サンプルです。

STORE_ID=$(aws sso-admin list-instances --query "Instances[0].IdentityStoreId" --output text --no-paginate)

USER_ID="f7042a58-80f1-70c1-b66c-fc5452ea25c9"

aws identitystore delete-user --output yaml \
  --identity-store-id "${STORE_ID}" \
  --user-id "${USER_ID}"

おわりに

以上、IAM Identity Center のユーザー管理をAWS CLIで実施してみました。 ユーザーやグループ、許可セットのID/ARNは機械的な文字列なので、 CLIだと探すのに一手間かかりますね。うまくスクリプト化して、効率していきましょう。

以上、参考になれば幸いです。

参考