【问题标题】:DynamoDB list all backups using AWS GoLang SDKDynamoDB 使用 AWS GoLang SDK 列出所有备份
【发布时间】:2019-06-04 17:28:08
【问题描述】:

基于 API Operation Pagination without Callbacks 链接中给出的示例 https://aws.amazon.com/blogs/developer/context-pattern-added-to-the-aws-sdk-for-go/ 我正在尝试列出 dynamodb 中的所有备份。但似乎分页不起作用,它只是检索第一页而不是下一页

package main

    import (
        "context"
        "fmt"

        "github.com/aws/aws-sdk-go/aws"
        "github.com/aws/aws-sdk-go/aws/request"

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

    func main() {

        sess, sessErr := session.NewSession()

        if sessErr != nil {
            fmt.Println(sessErr)
            fmt.Println("Cound not initilize session..returning..")
            return
        }
        // Create DynamoDB client
        dynamodbSvc := dynamodb.New(sess)

        params := dynamodb.ListBackupsInput{}
        ctx := context.Background()

        p := request.Pagination{
            NewRequest: func() (*request.Request, error) {
                req, _ := dynamodbSvc.ListBackupsRequest(&params)
                req.SetContext(ctx)
                return req, nil
            },
        }

        for p.Next() {
            page := p.Page().(*dynamodb.ListBackupsOutput)
            fmt.Println("Received", len(page.BackupSummaries), "objects in page")
            for _, obj := range page.BackupSummaries {
                fmt.Println(aws.StringValue(obj.BackupName))
            }
        }
        //return p.Err()
    } //end of main

【问题讨论】:

    标签: amazon-web-services go amazon-dynamodb


    【解决方案1】:

    有点晚了,但我会把它放在这里以防万一我能帮助到别人。

    例子:

    var exclusiveStartARN *string
    var backups []*dynamodb.BackupSummary
        for {
            backup, err := svc.ListBackups(&dynamodb.ListBackupsInput{
                ExclusiveStartBackupArn:exclusiveStartARN,
            })
    
            if err != nil {
                fmt.Println(err)
                os.Exit(1)
            }
    
            backups = append(backups, backup.BackupSummaries...)
            if backup.LastEvaluatedBackupArn != nil {
                exclusiveStartARN = backup.LastEvaluatedBackupArn
                //max 5 times a second so we dont hit the limit
                time.Sleep(200 * time.Millisecond)
                continue
            }
            break
        }
        fmt.Println(len(backups))
    

    说明:

    分页的方式是通过 ListBackupsRequest 中的ExclusiveStartBackupArn。如果有更多页面,ListBackupsResponse 返回 LastEvaluatedBackupArn,如果是最后/唯一页面,则返回 nil。

    【讨论】:

      【解决方案2】:

      这可能是你在使用 API 时有点吃不消

      您每秒最多可以调用 ListBackups 5 次。

      p.HasNextPage() 在您的p.Next() 循环中的值是多少?

      【讨论】:

      • 您确定还有其他页面吗?我知道这听起来很愚蠢,但值得问一下,确保你知道那里有多少页。
      • 是的,我确信有很多备份。所以应该有更多的页面。似乎是 api 的一些错误?
      • 也许吧。 golang AWS SDK 的最大问题之一是分页 API 之间的不一致 - 我什至无法在 github 上找到其他人使用此功能来引用自己。我建议尝试相同的代码,但指定表格,并查看您的里程是否有所不同。如果没有,也许他们的问题跟踪器可能是一个更好的位置。不幸的是,这似乎非常非常具体。
      • 感谢您的调查。
      猜你喜欢
      • 2022-11-04
      • 1970-01-01
      • 1970-01-01
      • 2014-06-16
      • 1970-01-01
      • 2021-07-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多