ばーろぐわにる

SIerからWEB系?インフラエンジニアにジョブチェンジした見習いの備忘録。投稿内容は私個人の意見であり、所属企業・部門見解を代表するものではありません。

aws-sdk-goでpaginate

なにこれ

  • aws-sdk-goでpaginateするサンプル
    • paginateとは一度のリクエストで全ての結果を出力できない際、NextTokenを引数にしてリクエストすることでページ割して全ての結果を取得することだと思ってる
    • boto3であればPaginatorsというのを使うと上記の処理をうまくやってくれる

aws-sdk-goの場合

  • paginateできるAPIHogehogePagesWithContext みたいな関数が用意されているのでこれを使う

サンプル

今回の場合、 ecs.DescribeContainerInstances の引数として渡すインスタンスのARNリストを ecs.ListContainerInstancesPagesWithContext で取得する。引数で渡すARNの上限となる100ずつでページ分割する。

package main

import (
    "context"
    "fmt"

    "github.com/aws/aws-sdk-go/aws"
    "github.com/aws/aws-sdk-go/aws/session"
    "github.com/aws/aws-sdk-go/service/ecs"
)

const ClusterName = "your-cluster-name"

func main() {
    var instancesList [][]string

    sess := session.Must(session.NewSessionWithOptions(session.Options{
        SharedConfigState: session.SharedConfigEnable,
    }))
    svc := ecs.New(sess)
    ctx := context.Background()

    err := svc.ListContainerInstancesPagesWithContext(ctx, &ecs.ListContainerInstancesInput{
        Cluster: aws.String(ClusterName),
        MaxResults: aws.Int64(100), // DescribeContainerInstances limitation
    }, func(p *ecs.ListContainerInstancesOutput, b bool) bool {
        var instances []string
        for _, arn := range p.ContainerInstanceArns {
            instances = append(instances, aws.StringValue(arn))
        }
        instancesList = append(instancesList, instances)
        return true
    })

    if err != nil {
        panic(fmt.Sprintf("failed to list container instances for cluster %s: %v", ClusterName, err))
    }

    fmt.Println("Container instances list: ", instancesList)
}
  • ListContainerInstancesPagesWithContext の引数について
    • ctx
      • groutineのキャンセル、タイムアウトなどで利用。このへんまだわかってない
    • ecs.ListContainerInstancesInput
      • ListCOntainerInstancesのインプット。MaxResultsを100にすることで各ページ100ずつ出力してくれる
    • func
      • 各ページ毎で実行する処理を各。今回は上限100ずつのArnのSliceをappendする

参考

https://github.com/aws/aws-sdk-go#api-request-pagination-and-resource-waiters