【TypeScript】【Python】【Golang】AWS-SDKのpaginatorを使ってIAM roleの一覧を取得する
はじめに
awsでデータの一覧を取得するときnext tokenやcursorを指定したforループでページごとにデータを取得することがあると思います。しかしaws sdkにはpaginationをいい感じに扱える関数があるので、これを利用すると簡単にデータを取得できます。
今回は、IAM Roleの一覧を取得するコードを言語ごとに書いてみようと思います。
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
バージョン | |
---|---|
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
バージョン | |
---|---|
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