こんばんは、SWX3人目の熊谷(悠)です。
IAM Identity Centerについて、本稿では IdC と略します。
背景
制限を追加したいが、いきなり既存の許可セットに追加して影響が出ないように、
既存の許可セットに制限を加えた別の許可セットを作成して、既存の許可セットが割当たっているユーザー(&グループ)に追加で割り当てたいです。
ちょうど良さそうなAPIは無かったので、スクリプトを作りました。
要件
タイトルの通りです。
対象はOrganization内の全てのアカウントです。
数が多いのでAPIで対応したいです。
方針
以下のAPIを用いれば、要件を満たせそうです。
ListAccountsForProvisionedPermissionSet
ListAccountAssignments
CreateAccountAssignment
- 対象の許可セットが定義されているアカウントのリストを取得する
- 取得したアカウントのリストを用いて、アカウントに対象の許可セットで割り当てられているユーザーとグループのリストを取得する
- アカウントにユーザーと許可セットを指定して割り当てる
環境情報
EC2で動かしました。
IdCを操作できる権限を持ったIAM権限の設定と、AWSCLIのプロファイル設定も行ってください。
$ ec2-metadata --ami-id ami-id: ami-0947c48ae0aaf6781 $ cat /etc/system-release Amazon Linux release 2023 (Amazon Linux) $ aws --v aws-cli/2.9.19 Python/3.9.16 Linux/6.1.38-59.109.amzn2023.x86_64 source/x86_64.amzn.2023 prompt/off
実装
スクリプト内のUSER
指定している箇所をGROUP
に変更するとグループを対象にできます。
#!/bin/bash ######## # 設定 # ######## AWS_CLI_PROFILE_NAME='example' # Your AWS CLI Profile Name INSTANCE_ARN='arn:aws:sso:::instance/ssoins-xxxxxxxxxxxxxxxx' # TIPS:IdC>Settings>Instance ARN PROVISIONED_PERMISSIONSET_ARN='arn:aws:sso:::permissionSet/ssoins-xxxxxxxxxxxxxxxx/ps-xxxxxxxxxxxxxxxx' # 特定の許可セットARN ASSIGN_PERMISSIONSET_ARN='arn:aws:sso:::permissionSet/ssoins-xxxxxxxxxxxxxxxx/ps-0123456789abcdef' # 追加する許可セットのARN ######## # 処理 # ######## echo '許可セットが定義されているアカウントのリストを取得' accounts=`aws sso-admin list-accounts-for-provisioned-permission-set \ --instance-arn ${INSTANCE_ARN} \ --permission-set-arn ${PROVISIONED_PERMISSIONSET_ARN} \ --provisioning-status "LATEST_PERMISSION_SET_PROVISIONED" \ --profile ${AWS_CLI_PROFILE_NAME} \ --output json` # textの方が後続の処理で扱いやすいが、ログの視認性のためにjsonで出力 echo $accounts | jq . | tee provision-account_ids.json account_ids=$(echo "$accounts" | jq '.AccountIds[]') if [ -z "$account_ids" ]; then echo '対象の許可セットが定義されているアカウントはありませんでした' exit 0 fi for accountid in $(echo $accounts | jq -c -r '.AccountIds[]'); do echo "対象の許可セットでaccountid ${accountid} に割り当てられているユーザーとグループのリストを取得" principals=`aws sso-admin list-account-assignments \ --account-id ${accountid} \ --instance-arn ${INSTANCE_ARN} \ --permission-set-arn ${PROVISIONED_PERMISSIONSET_ARN} \ --profile ${AWS_CLI_PROFILE_NAME} \ --output json` echo $principals | jq . | tee -a target-principals.log for principalid in $(echo $principals | jq -r '.AccountAssignments[] | select(.PrincipalType == "USER") | .PrincipalId'); do echo "アカウントに対象principalid ${principalid} と許可セットを割り当て" aws sso-admin create-account-assignment \ --instance-arn ${INSTANCE_ARN} \ --permission-set-arn ${ASSIGN_PERMISSIONSET_ARN} \ --principal-id ${principalid} \ --principal-type "USER" \ --target-id ${accountid} \ --target-type "AWS_ACCOUNT" \ --profile ${AWS_CLI_PROFILE_NAME} # スロットリング対策 sleep 1 done done cat target-principals.log | jq -s > target-principals.json echo Script Completed!
因みに、パラメータは同じなので create-account-assignment コマンドをdelete-account-assignmentに変えれば、許可セットの削除もできます。
その場合、設定の PROVISIONED_PERMISSIONSET_ARN や ASSIGN_PERMISSIONSET_ARN の値はどちらも削除したい許可セットのARNにしてください。
参考
ListAccountsForProvisionedPermissionSet - IAM Identity Center
list-accounts-for-provisioned-permission-set — AWS CLI Command Reference
ListAccountAssignments - IAM Identity Center
list-account-assignments — AWS CLI Command Reference
CreateAccountAssignment - IAM Identity Center
create-account-assignment — AWS CLI Command Reference
DeleteAccountAssignment - IAM Identity Center
delete-account-assignment — AWS CLI Command Reference