🗝️
aws-sdk-goでCognitoからUserのsubを取得する方法
経緯
デモ環境の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