【AWS IAM Identity Center】ユーザー管理でよく使いそうな作成/削除系操作をAWS CLIでやってみる
「ユーザー作成/削除」または「ユーザー棚卸し」といった 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 --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
作成したユーザーの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
作成したグループの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
以下複数人をグループに所属させるスクリプト例です。
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
(補足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だと探すのに一手間かかりますね。うまくスクリプト化して、効率していきましょう。
以上、参考になれば幸いです。