🗝️

aws-sdk-goでCognitoからUserのsubを取得する方法

2020/10/31に公開

経緯

デモ環境のDynamoDBのデータを定期的に削除したいが、テーブルそのものはAppSyncで管理している都合上、「DynamoDBテーブルを別のツールを使って定期的に作り直す」ようなことはしたくなかった。
テーブルではユニークな値としてCognitoのsubを用いているので、それを使って対象環境に紐づくユーザー一覧を取得し、そのユーザーに紐づくデータを削除するようにしようと思った。
そのため、Cognitoの特定のUserPoodIdに紐づくsub一覧を取得する方法を調べたのでメモをしておく。

サンプルコードはyu-croco/GolangCognitoSampleに掲載しているので、ご自由にお使いください。
*前提としてAWS Lambda上で実行したいのでserverless frameworkの構成になってる

結論

実装サンプルはAWS公式がサンプルコードを出してくれているので、以下を参考にするのが良いと思います。

実装

上記のサンプルコードを元に、userPoolIDに紐づくユーザーのsub一覧を取得するコードは以下の感じ

// Cognitoのセッション
func newCognitoSession()*cognitoidentityprovider.CognitoIdentityProvider {
	sess := session.Must(session.NewSessionWithOptions(session.Options{
		SharedConfigState: session.SharedConfigEnable,
	}))

	return cognitoidentityprovider.New(sess)
}

// userPoolIdを元にそれに紐づくUser一覧を取得する
func findUsersByPoolId(userPoolId string) (*cognitoidentityprovider.ListUsersOutput, error) {
	return newCognitoSession().
		ListUsers(&cognitoidentityprovider.ListUsersInput{UserPoolId: &userPoolId})
}

// CognitoのUser情報一覧からsubの一覧を取得する
func findSubs(userList *cognitoidentityprovider.ListUsersOutput) []string {
	var userSubs []string

	for _, user := range userList.Users {
		for _, attr := range user.Attributes {
			if *attr.Name == "sub" {
				userSubs = append(userSubs, *attr.Value)
			}
		}
	}
	return userSubs
}

func main() error {
	// ここに対象のuserPoolIdを入れる
	userPoolId := "ADD ME!!"

	userList, cognitoErr := findUsersByPoolId(userPoolId)
	if cognitoErr != nil {
		return cognitoErr
	}

	userSubs := findSubs(userList)

	fmt.Println("userSubs: ", userSubs)

	return nil
}

Discussion