[アップデート] AWS IAM Identity CenterのAPIがユーザーとグループの作成・更新・削除に対応したのでAWS CLIで試してみた
AWS IAM Identity Center (旧 AWS Single Sign-on) にユーザーやグループの作成・更新・削除を行う API が追加されたため、AWS CLI で試してみました。
これまでは AWS IAM Identity Center 内の ID ストアを利用している場合はマネジメントコンソールからユーザーの作成等を行う必要がありましたが、今回のアップデートにより AWS CLI や SDK を用いてユーザー管理を自動化できるようになりました。
今回のアップデート内容は AWS のブログでも紹介されています。このブログではユーザー管理のためのサンプルスクリプト aws-samples/iam-identitycenter-identitystoreapi-operations が紹介されています。
API リファレンスのページです。
Welcome to the Identity Store API Reference - Identity Store
AWS CLI のページです。
identitystore — AWS CLI 2.7.29 Command Reference
identitystore — AWS CLI 1.25.67 Command Reference
AWS CLI で試してみた
AWS IAM Identity Center には AWS Single Sign-on だった頃から次の AWS CLI があり、AWS IAM Identity Center に名前変更された後も下位互換性維持のために変更されていません。
(参考)IAM Identity Center とは - AWS IAM Identity Center (successor to AWS Single Sign-On)
今回のアップデートは AWS IAM Identity Center 内の ID ストアを管理するidentitystore
コマンドに関するものであり、新しくユーザーやグループの追加・更新・削除ができるようになりました。identitystore
コマンド自体はこれまでもありましたが、アップデート以前はユーザーやグループの作成・更新・削除はできませんでした。
本ブログでは、ID ストアとして Identity Center ディレクトリを利用する環境で、グループとユーザーを作成した後に更新し、最後に削除する流れで試してみます。
AWS CLI のバージョンは 2.7.29 を使用します。
$ aws --version aws-cli/2.7.29 Python/3.9.11 Linux/4.14.287-215.504.amzn2.x86_64 exec-env/CloudShell exe/x86_64.amzn.2 prompt/off
2022 年 9 月 3 日時点では、AWS CloudShell で利用する場合は AWS CLI のバージョンアップが必要になります。アップデートは次の方法でできます。
$ curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip" $ unzip awscliv2.zip $ sudo ./aws/install --update You can now run: /usr/local/bin/aws --version $ aws --version aws-cli/2.7.29 Python/3.9.11 Linux/4.14.287-215.504.amzn2.x86_64 exec-env/CloudShell exe/x86_64.amzn.2 prompt/off
まずはidentitystore
で利用できるコマンドを確認してみます。以前は、describe-group
,describe-user
,list-groups
,list-users
,help
の5つだけでしたが、増えています。
$ aws identitystore ? usage: aws [options] <command> <subcommand> [<subcommand> ...] [parameters] To see help text, you can run: aws help aws <command> help aws <command> <subcommand> help aws: error: argument operation: Invalid choice, valid choices are: create-group | create-group-membership create-user | delete-group delete-group-membership | delete-user describe-group | describe-group-membership describe-user | get-group-id get-group-membership-id | get-user-id is-member-in-groups | list-group-memberships list-group-memberships-for-member | list-groups list-users | update-group update-user | help
グループとユーザーの作成と関連付け
始めに、下記のコマンドでグループを作成してみます。
aws identitystore create-group \ --identity-store-id d-123456a7890 \ --display-name test-group
グループ作成と参照の実行結果です。
$ aws identitystore create-group --identity-store-id d-123456a7890 --display-name test-group { "GroupId": "37d4ba58-6051-7062-5dfc-bd96792cf7be", "IdentityStoreId": "d-123456a7890" } $ aws identitystore describe-group --identity-store-id d-123456a7890 --group-id 37d4ba58-6051-7062-5dfc-bd96792cf7be { "GroupId": "37d4ba58-6051-7062-5dfc-bd96792cf7be", "DisplayName": "test-group", "IdentityStoreId": "d-123456a7890" }
次に、下記のコマンドでユーザーを作成します。ユーザーの属性情報として表示名、名、姓、E メールアドレスを指定しています。名、姓はname (structure)
で指定し、E メールアドレスはemails (list)
で指定します。
aws identitystore create-user \ --identity-store-id d-123456a7890 \ --user-name test-user1 \ --display-name 'Test User1' \ --name '{"FamilyName":"User1","GivenName":"Test"}' \ --emails '[{"Value":"test-user1@example.com","Type":"Work","Primary":true}]'
ユーザー作成と参照の実行結果です。
$ aws identitystore create-user --identity-store-id d-123456a7890 --user-name test-user1 --display-name 'Test User1' --name '{"FamilyName":"User1","GivenName":"Test"}' --emails '[{"Value": "test-user1@example.com","Type": "Work","Primary": true }]' { "UserId": "37a43ab8-70a1-7089-7c5c-453169bc8ccd", "IdentityStoreId": "d-123456a7890" } $ aws identitystore describe-user --identity-store-id d-123456a7890 --user-id 37a43ab8-70a1-7089-7c5c-453169bc8ccd { "UserName": "test-user1", "UserId": "37a43ab8-70a1-7089-7c5c-453169bc8ccd", "Name": { "FamilyName": "User1", "GivenName": "Test" }, "DisplayName": "Test User1", "Emails": [ { "Value": "test-user1@example.com", "Type": "Work", "Primary": true } ], "IdentityStoreId": "d-123456a7890" }
ユーザーを参照するdescribe-user
ではユーザー ID を指定する必要があります。ユーザー ID はget-user-id
コマンドによりユーザー名から取得することもできます。
$ aws identitystore get-user-id --identity-store-id d-123456a7890 --alternate-identifier '{"UniqueAttribute":{"AttributePath":"userName","AttributeValue":"test-user1"}}' { "UserId": "37a43ab8-70a1-7089-7c5c-453169bc8ccd", "IdentityStoreId": "d-123456a7890" }
alternate-identifier
オプションでUserName
属性のパスであるuserName
を指定しています。
{ "UniqueAttribute": { "AttributePath": "userName", "AttributeValue": "test-user1" } }
パス情報は次のページに情報があります。他に一覧が掲載されているページがあるかもしれませんが、見つけられませんでした。
属性マッピング - AWS IAM Identity Center (successor to AWS Single Sign-On)
試しに AttributePath としてdisplayName
を指定してget-user-id
コマンドを実行したところ、ユニークな属性ではないということでエラーとなりました。
$ aws identitystore get-user-id --identity-store-id d-123456a7890 --alternate-identifier '{"UniqueAttribute":{"AttributePath":"displayName","AttributeValue":"Test User1"}}' An error occurred (ValidationException) when calling the GetUserId operation: The attribute displayName is not a unique attribute
作成したユーザーをマネジメントコンソールで確認した画面です。E メール検証が必要となりますが、今回はテスト用のドメインなのでこのままにしておきます。
次に、グループとユーザーの関連付けを行います。
下記の構成でグループとユーザーの関連付けを行いたいため、test-user2 を追加で作成します。
- test-group
- test-user1
- test-user2
$ aws identitystore create-user --identity-store-id d-123456a7890 --user-name test-user2 --display-name 'Test User2' --name '{"FamilyName":"User2","GivenName":"Test"}' --emails '[{"Value": "test-user2@example.com","Type":"Work","Primary":true}]' { "UserId": "77c46ae8-60c1-708c-fce4-e1f7ee21d4df", "IdentityStoreId": "d-123456a7890" }
create-group-membership
コマンドで関連付けを行います。
$ aws identitystore create-group-membership --identity-store-id d-123456a7890 --group-id 37d4ba58-6051-7062-5dfc-bd96792cf7be --member-id '{"UserId":"37a43ab8-70a1-7089-7c5c-453169bc8ccd"}' { "MembershipId": "27345a28-e0c1-7054-1221-b78d4427ea59", "IdentityStoreId": "d-123456a7890" } $ aws identitystore create-group-membership --identity-store-id d-123456a7890 --group-id 37d4ba58-6051-7062-5dfc-bd96792cf7be --member-id '{"UserId":"77c46ae8-60c1-708c-fce4-e1f7ee21d4df"}' { "MembershipId": "27e4da38-2001-7077-ad46-26c2be671291", "IdentityStoreId": "d-123456a7890" }
member-id
オプションの値は次の形式で指定しています。
{ "UserId": "37a43ab8-70a1-7089-7c5c-453169bc8ccd" }
list-group-memberships
コマンドを用いることでグループ ID を指定して所属しているユーザーを確認できます。
$ aws identitystore list-group-memberships --identity-store-id d-123456a7890 --group-id 37d4ba58-6051-7062-5dfc-bd96792cf7be { "GroupMemberships": [ { "IdentityStoreId": "d-123456a7890", "MembershipId": "27345a28-e0c1-7054-1221-b78d4427ea59", "GroupId": "37d4ba58-6051-7062-5dfc-bd96792cf7be", "MemberId": { "UserId": "37a43ab8-70a1-7089-7c5c-453169bc8ccd" } }, { "IdentityStoreId": "d-123456a7890", "MembershipId": "27e4da38-2001-7077-ad46-26c2be671291", "GroupId": "37d4ba58-6051-7062-5dfc-bd96792cf7be", "MemberId": { "UserId": "77c46ae8-60c1-708c-fce4-e1f7ee21d4df" } } ] }
describe-group-membership
コマンドでは、メンバーシップ ID を指定してグループとユーザーの関連付け情報を確認できます。
$ aws identitystore describe-group-membership --identity-store-id d-123456a7890 --membership-id 27345a28-e0c1-7054-1221-b78d4427ea59 { "IdentityStoreId": "d-123456a7890", "MembershipId": "27345a28-e0c1-7054-1221-b78d4427ea59", "GroupId": "37d4ba58-6051-7062-5dfc-bd96792cf7be", "MemberId": { "UserId": "37a43ab8-70a1-7089-7c5c-453169bc8ccd" } }
マネジメントコンソールで確認したところ、ユーザーとグループの関連付けを確認できました。
グループとユーザーの関連付けを確認するコマンドは、上記で試したlist-group-memberships
コマンド以外にもあります。
list-group-memberships-for-member
はユーザー ID を指定してユーザーが所属しているグループを調べるコマンドです。
$ aws identitystore list-group-memberships-for-member --identity-store-id d-123456a7890 --member-id '{"UserId":"37a43ab8-70a1-7089-7c5c-453169bc8ccd"}' { "GroupMemberships": [ { "IdentityStoreId": "d-123456a7890", "MembershipId": "27345a28-e0c1-7054-1221-b78d4427ea59", "GroupId": "37d4ba58-6051-7062-5dfc-bd96792cf7be", "MemberId": { "UserId": "37a43ab8-70a1-7089-7c5c-453169bc8ccd" } } ] }
is-member-in-groups
は指定した複数のグループに対して指定したユーザーが存在するかどうかを返答するコマンドです。次の例ではtest-group
にtest-user1
が含まれるためMembershipExists
がtrue
で返されています。
$ aws identitystore is-member-in-groups --identity-store-id d-123456a7890 --member-id '{"UserId":"37a43ab8-70a1-7089-7c5c-453169bc8ccd"}' --group-ids 37d4ba58-6051-7062-5dfc-bd96792cf7be { "Results": [ { "GroupId": "37d4ba58-6051-7062-5dfc-bd96792cf7be", "MemberId": { "UserId": "37a43ab8-70a1-7089-7c5c-453169bc8ccd" }, "MembershipExists": true } ] }
グループとユーザーを作成した後は、従来通りsso-admin
コマンドを用いてアクセス許可セットの作成やアクセス許可セットとグループの関連付け設定を行う流れとなります。
sso-admin — AWS CLI 2.7.29 Command Reference
今回は、アクセス許可セットの作成や関連付けは行わずに作成したグループとユーザーの更新と削除を行いたいと思います。
グループとユーザーの更新
グループの設定変更を試します。
update-group
コマンドでtest-group
の表示名をtest-group-changed
に変更します。
$ aws identitystore update-group --identity-store-id d-123456a7890 --group-id 37d4ba58-6051-7062-5dfc-bd96792cf7be --operations '[{"AttributePath":"displayName","AttributeValue":"test-group-changed"}]'
operations
オプションで指定している内容は次の通りです。
[ { "AttributePath": "displayName", "AttributeValue": "test-group-changed" } ]
変更されていることを確認できました。
$ aws identitystore describe-group --identity-store-id d-123456a7890 --group-id 37d4ba58-6051-7062-5dfc-bd96792cf7be { "GroupId": "37d4ba58-6051-7062-5dfc-bd96792cf7be", "DisplayName": "test-group-changed", "IdentityStoreId": "d-123456a7890" }
次に、update-user
コマンドでユーザーtest-user1
の表示名をTest User1 Changed
に変更してみます。
$ aws identitystore update-user --identity-store-id d-123456a7890 --user-id 37a43ab8-70a1-7089-7c5c-453169bc8ccd --operations '[{"AttributePath":"displayName","AttributeValue":"Test User1 Changed"}]'
operations
オプションで指定している内容です。
[ { "AttributePath": "displayName", "AttributeValue": "Test User1 Changed" } ]
変更されていることを確認できました。
$ aws identitystore describe-user --identity-store-id d-123456a7890 --user-id 37a43ab8-70a1-7089-7c5c-453169bc8ccd { "UserName": "test-user1", "UserId": "37a43ab8-70a1-7089-7c5c-453169bc8ccd", "Name": { "FamilyName": "User1", "GivenName": "Test" }, "DisplayName": "Test User1 Changed", "Emails": [ { "Value": "test-user1@example.com", "Type": "Work", "Primary": true } ], "IdentityStoreId": "d-123456a7890" }
ユーザーに対して次の2つの属性(タイムゾーンとロケール)の追加を試してみます。
[ { "AttributePath": "timezone", "AttributeValue": "Asia/Tokyo" }, { "AttributePath": "locale", "AttributeValue": "Japan" } ]
属性を追加します。
$ aws identitystore update-user --identity-store-id d-123456a7890 --user-id 37a43ab8-70a1-7089-7c5c-453169bc8ccd --operations '[{"AttributePath":"timezone","AttributeValue":"Asia/Tokyo"},{"AttributePath":"locale","AttributeValue":"Japan"}]'
Locale
とTimezone
の属性追加を確認できました。
$ aws identitystore describe-user --identity-store-id d-123456a7890 --user-id 37a43ab8-70a1-7089-7c5c-453169bc8ccd { "UserName": "test-user1", "UserId": "37a43ab8-70a1-7089-7c5c-453169bc8ccd", "Name": { "FamilyName": "User1", "GivenName": "Test" }, "DisplayName": "Test User1 Changed", "Emails": [ { "Value": "test-user1@example.com", "Type": "Work", "Primary": true } ], "Locale": "Japan", "Timezone": "Asia/Tokyo", "IdentityStoreId": "d-123456a7890" }
ロケール属性の削除も試してみます。削除は AttributeValue を指定しないことで実現できそうです。
[ { "AttributePath": "locale" } ]
属性削除を実行します。
$ aws identitystore update-user --identity-store-id d-123456a7890 --user-id 37a43ab8-70a1-7089-7c5c-453169bc8ccd --operations '[{"AttributePath": "locale"}]'
Locale
属性の削除を確認できました。
$ aws identitystore describe-user --identity-store-id d-123456a7890 --user-id 37a43ab8-70a1-7089-7c5c-453169bc8ccd { "UserName": "test-user1", "UserId": "37a43ab8-70a1-7089-7c5c-453169bc8ccd", "Name": { "FamilyName": "User1", "GivenName": "Test" }, "DisplayName": "Test User1 Changed", "Emails": [ { "Value": "test-user1@example.com", "Type": "Work", "Primary": true } ], "Timezone": "Asia/Tokyo", "IdentityStoreId": "d-123456a7890" }
グループとユーザーの削除
最後にこれまで作成したグループとユーザーの削除を試してみます。
まず、delete-group-membership
コマンドでメンバーシップを削除します。
$ aws identitystore list-group-memberships --identity-store-id d-123456a7890 --group-id 37d4ba58-6051-7062-5dfc-bd96792cf7be --query 'GroupMemberships[].MembershipId' [ "27345a28-e0c1-7054-1221-b78d4427ea59", "27e4da38-2001-7077-ad46-26c2be671291" ] $ aws identitystore delete-group-membership --identity-store-id d-123456a7890 --membership-id 27345a28-e0c1-7054-1221-b78d4427ea59 $ aws identitystore delete-group-membership --identity-store-id d-123456a7890 --membership-id 27e4da38-2001-7077-ad46-26c2be671291 $ aws identitystore list-group-memberships --identity-store-id d-123456a7890 --group-id 37d4ba58-6051-7062-5dfc-bd96792cf7be { "GroupMemberships": [] }
次に、delete-user
コマンドでユーザーを削除します。
$ aws identitystore list-users --identity-store-id d-123456a7890 --query 'Users[].UserId' [ "37a43ab8-70a1-7089-7c5c-453169bc8ccd", "77c46ae8-60c1-708c-fce4-e1f7ee21d4df" ] $ aws identitystore delete-user --identity-store-id d-123456a7890 --user-id 37a43ab8-70a1-7089-7c5c-453169bc8ccd $ aws identitystore delete-user --identity-store-id d-123456a7890 --user-id 77c46ae8-60c1-708c-fce4-e1f7ee21d4df $ aws identitystore list-users --identity-store-id d-123456a7890 { "Users": [] }
最後に、delete-group
コマンドでグループを削除します。
$ $ aws identitystore list-groups --identity-store-id d-123456a7890 --query 'Groups[].GroupId' [ "37d4ba58-6051-7062-5dfc-bd96792cf7be" ] $ aws identitystore delete-group --identity-store-id d-123456a7890 --group-id 37d4ba58-6051-7062-5dfc-bd96792cf7be $ aws identitystore list-groups --identity-store-id d-123456a7890 { "Groups": [] }
以上で、作成したグループとユーザーの削除は完了です。
さいごに
これまで、AWS IAM Identity Center におけるユーザーの作成等はマネジメントコンソールで行う必要がありましたが、API のアップデートにより AWS CLI や SDK を用いてユーザーとグループの作成・更新・削除ができるようになりました。ユーザー管理の自動化に繋がるうれしいアップデートでした。
グループとユーザーの情報を参照するコマンドも増えているので、外部 ID プロバイダーと連携した環境でもできることが増えています。
最後に余談ですが、AWS IAM Identity Center に名称変更した際に用語も変わっています。ユーザーのことは「ワークフォースユーザー」または「ユーザー」との用語定義なので、このブログでは「ユーザー」と呼ぶことにしました。
(参考)IAM Identity Center とは - AWS IAM Identity Center (successor to AWS Single Sign-On)