「ユーザー作成/削除」または「ユーザー棚卸し」といった 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ストア ID
や IAM Identity StoreのインスタンスARN
が必要になってきます。
list-instances を使って値を取得しておきましょう。
STORE_ID=$(aws sso-admin list-instances --query "Instances[0].IdentityStoreId" --output text)
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)
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
作成したユーザーのIDは get-user-id で取得できます。
STORE_ID=$(aws sso-admin list-instances --query "Instances[0].IdentityStoreId" --output text)
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)
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)
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
作成したグループのIDは get-group-id で取得できます。
STORE_ID=$(aws sso-admin list-instances --query "Instances[0].IdentityStoreId" --output text)
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)
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
以下複数人をグループに所属させるスクリプト例です。
STORE_ID=$(aws sso-admin list-instances --query "Instances[0].IdentityStoreId" --output text)
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
(補足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)
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)
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)
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)
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だと探すのに一手間かかりますね。うまくスクリプト化して、効率していきましょう。
以上、参考になれば幸いです。