【TypeScript】【Python】【Golang】AWS-SDKのpaginatorを使ってIAM roleの一覧を取得する
awsでデータの一覧を取得するときnext tokenやcursorを指定したforループでページごとにデータを取得することがあると思います。しかしaws sdkにはpaginationをいい感じに扱える関数があるので、これを利用すると簡単にデータを取得できます。
今回は、IAM Roleの一覧を取得するコードを言語ごとに書いてみようと思います。
TypeScript
Section titled “TypeScript”| バージョン | |
|---|---|
| TypeScript | 5.0.3 | 
| @aws-sdk/client-iam | 3.303.0 | 
まずはサンプルコードです。
import { IAMClient, paginateListRoles } from "@aws-sdk/client-iam";
async function main() {  const paginator = paginateListRoles(    {      client: new IAMClient({        credentials: {          accessKeyId: process.env.AWS_ACCESS_KEY_ID || "",          secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY || "",          sessionToken: process.env.AWS_SESSION_TOKEN || "",        },        region: "ap-northeast-1",      }),    },    {      PathPrefix: "/",    }  );
  for await (const p of paginator) {    console.log(p.Roles);  }}
main().catch((e) => console.error(e));今回はRoleの一覧なのでpaginateListRolesを使っています。どんなpaginateの関数があるかを調べるには、AWS SDK for JavaScript v3 - API Referenceを見ることで調べることができます。

上の画像にある赤枠部分をクリックすると@aws-sdk/client-iamのページに行きます。右側のサイドバーにPaginatorsとあるので、ここから使用できそうな関数を見つけます。

参考
Golang
Section titled “Golang”| バージョン | |
|---|---|
| Golang | 1.19 | 
| aws-sdk-go-v2 | v1.17.7 | 
type Role struct {  Arn                      string  Path                     string  RoleId                   string  RoleName                 string  AssumeRolePolicyDocument string}
func generator() <-chan Role {  cfg, err := config.LoadDefaultConfig(context.TODO(), config.WithRegion("ap-northeast-1"))  if err != nil {    log.Fatalf("unable to load SDK config, %v", err)  }
  client := iam.NewFromConfig(cfg)  paginator := iam.NewListRolesPaginator(client, nil)
  ch := make(chan Role)  go func() {    defer close(ch)
    for paginator.HasMorePages() {
      output, err := paginator.NextPage(context.TODO())      if err != nil {        log.Print(err)        return      }
      for _, role := range output.Roles {        ch <- Role{          Arn:                      *role.Arn,          Path:                     *role.Path,          RoleId:                   *role.RoleId,          RoleName:                 *role.RoleName,          AssumeRolePolicyDocument: *role.AssumeRolePolicyDocument,        }      }    }  }()
  return ch}
func main() {
  for role := range generator() {    bytes, err := json.MarshalIndent(role, "", " ")    if err != nil {      log.Println(err)    }    fmt.Printf("%s\n", string(bytes))  }}go言語もTypeScript同様、paginatorを探すためにAPIリファレンスを見ていきます。
APIリファレンスの下の方に”service”と書いてある折りたたみがあるので、ここからIAMを探します。

少し調べづらいので、ページ内検索で”paginator”で調べると見つけることができます。

参考
python
Section titled “python”| バージョン | |
|---|---|
| python | 3.10.9 | 
| boto3 | 1.26.103 | 
import boto3import pprintfrom mypy_boto3_iam.client import IAMClientfrom mypy_boto3_iam.paginator import ListRolesPaginator
iam_client: IAMClient = boto3.client('iam', region_name='ap-northeast-1')paginator: ListRolesPaginator = iam_client.get_paginator('list_roles')
def all_roles():  for res in paginator.paginate():    for role in res["Roles"]:      yield role
for x in all_roles():  pprint.pprint(x)pythonのpaginatorも同じくAPIリファレンスを見ていきます。

自分が使いたいAWSサービスを検索します。“Paginators”をクリックすると以下の画像のページに行くので、ここから関数を調べることができます。

参考
今回は、3つの言語でpaginatorと調べ方について書いてみました。
使ったコードはkntks/blog-code/2023/04/aws-client-paginationに置いています。
paginatorの関数名がわかれば、あとはChatGPTに渡すとサンプルコードを書いてくれます。
もしChatGPTにサンプルコードを書かせる場合は、バージョンの指定をしていた方が良いです。
バージョン1

バージョン2
