Skip to content

【TypeScript】【Python】【Golang】AWS-SDKのpaginatorを使ってIAM roleの一覧を取得する

はじめに

awsでデータの一覧を取得するときnext tokenやcursorを指定したforループでページごとにデータを取得することがあると思います。しかしaws sdkにはpaginationをいい感じに扱える関数があるので、これを利用すると簡単にデータを取得できます。

今回は、IAM Roleの一覧を取得するコードを言語ごとに書いてみようと思います。

TypeScript

バージョン
TypeScript5.0.3
@aws-sdk/client-iam3.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を見ることで調べることができます。

typescript-api-reference-top

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

参考

Golang

バージョン
Golang1.19
aws-sdk-go-v2v1.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を探します。 golang-api-reference-top

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

参考

python

バージョン
python3.10.9
boto31.26.103
import boto3
import pprint
from mypy_boto3_iam.client import IAMClient
from 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リファレンスを見ていきます。

python-api-reference-top

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

参考

まとめ

今回は、3つの言語でpaginatorと調べ方について書いてみました。
使ったコードはkntks/blog-code/2023/04/aws-client-paginationに置いています。

paginatorの関数名がわかれば、あとはChatGPTに渡すとサンプルコードを書いてくれます。

もしChatGPTにサンプルコードを書かせる場合は、バージョンの指定をしていた方が良いです。

バージョン1 gpt-aws-sdk-go-v1

バージョン2 gpt-aws-sdk-go-v2