标签: aws-sdk-go

如何在Golang的AWS Lambda中支持多个触发器?

我正在Golang中构建一个AWS Lambda函数,该函数将内容从n复制到m个S3存储桶。需要支持S3触发以及从存储了所有源S3存储桶更改的SQS中获取数据。可以在这里找到代码:https : //github.com/maknahar/s3copy

我尝试了以下操作:

func main() {
    lambda.Start(ProcessIncomingS3Events)
    lambda.Start(ProcessIncomingEvents)
}

func ProcessIncomingS3Events(event events.S3Event) error {
    ...
    log.Println("Got S3 Event")
    return processS3Trigger(config, event)
}

func ProcessIncomingEvents() error {
    ...
    log.Println("Defaulting to SQS")
    return processSQSMessage(config)
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,ProcessIncomingS3Events每次都会触发第一个事件。

我也尝试跟随

func main() {
    lambda.Start(ProcessIncomingEvents)
}

func ProcessIncomingEvents(event interface{}) error {
    ...
    switch request := event.(type) {
    case events.S3Event:
        log.Println("Got S3 Event")
        return processS3Trigger(config, request)

    case types.Nil:
        log.Println("Defaulting to SQS")
        return processSQSMessage(config)

    default:
        log.Println("Could not find the event type")

    }

    return …
Run Code Online (Sandbox Code Playgroud)

amazon-s3 go amazon-web-services aws-lambda aws-sdk-go

6
推荐指数
2
解决办法
3035
查看次数

如何使用 AWS SDK v2 在 dynamodb 中按键获取项目?

我正在学习 Golang 使用 AWS-SDK-GO-V2 连接 dynamodb 但我不明白如何通过密钥获取一项。

我看到的所有示例都使用 v1,但我需要 V2。

go amazon-dynamodb aws-sdk-go

6
推荐指数
2
解决办法
5152
查看次数

将 DynamoDB JSON 转换为 AttributeValue、Go 对象或 Json

我正在尝试转换简单的 DynamoDB 对象字符串:

{
  "Item": {
    "Id": {
      "S": "db31"
    },
    "CreateTime": {
      "N": "1647882237618915000"
    }
}
Run Code Online (Sandbox Code Playgroud)

到任一dynamodb.AttributeValue映射到 go 对象(go 类型结构)或转换为简单的 JSON go 对象。

我认为,Java中有类似的答案(1、2、3 我在Golang中没有找到类似的实现。

json go amazon-dynamodb aws-sdk-go aws-sdk-go-v2

6
推荐指数
1
解决办法
1209
查看次数

如何承担跨账户角色?

AWS 的 Golang SDK 说我应该stscreds.AssumeRoleProvider用来承担跨账户角色(在这种情况下,用于从 Web 服务器查询另一个账户的 DynamoDb 表)。此代码有效:

var sess *session.Session

func init() {

  sess = session.Must(session.NewSession(&aws.Config{
    Region: aws.String("us-west-2"),
  }))

}

func getDynamoDbClient() *dynamodb.DynamoDB {

  crossAccountRoleArn := "arn:...:my-cross-account-role-ARN"

  creds := stscreds.NewCredentials(sess, crossAccountRoleArn, func(arp *stscreds.AssumeRoleProvider) {
    arp.RoleSessionName = "my-role-session-name"
    arp.Duration = 60 * time.Minute
    arp.ExpiryWindow = 30 * time.Second
  })

  dynamoDbClient := dynamodb.New(sess, aws.NewConfig().WithCredentials(creds))

  return dynamoDbClient
}
Run Code Online (Sandbox Code Playgroud)

根据文档,返回的客户端是线程安全的:

DynamoDB 方法可以安全地同时使用。

问题是,由于凭证是通过自动续订的stscreds.AssumeRoleProvider,我是否可以

  • 需要在每个请求上新建一个新客户端(以确保我有未过期的凭据),或

  • 我可以在 Web 服务器启动时新建一个 DynamoDb 客户端,并在 Web 服务器的整个生命周期中重复使用它吗?

编辑注意:

我深入研究了 Golang AWS SDK 的源代码,看起来返回的凭证stscreds.NewCredentials() …

go aws-sdk aws-sdk-go

5
推荐指数
1
解决办法
2082
查看次数

使用路径样式 amazon aws sdk go

我在我的应用程序中使用一些 aws-sdk-go 功能,它会创建要请求的 DNS 样式主机,例如somebucket.mys3.com. 但我有一些 DNS 问题,并且希望以路径样式接收请求,例如mys3.com/somebucket. 如何配置 SDK 以路径样式模式生成请求?

amazon-s3 go aws-sdk-go

5
推荐指数
1
解决办法
1774
查看次数

在 AWS API 上获取 ThrottlingException:超出速率,状态代码:400

我有 110 个 Fargate 任务正在运行(并不总是并行)。我正在尝试按照 AWS SDK 上的指导使用“ListFunctions”调用从其他 AWS 账户(通过 CrossAccountRole)获取 lambda - https://docs.aws.amazon.com/sdk-for-go/api/service/lambda/ #Lambda.ListFunctions

在进行 (SDK) API 调用时,我有时会遇到节流错误: ThrottlingException:超出速率,状态代码:400

还经历了这个解决方案 - https://docs.aws.amazon.com/general/latest/gr/api-retries.html

想了解 AWS SDK Service (lambda) 是否已经实现了它。在我的情况下,我是否需要自定义重试实现,或者只是增加 Fargate 的速率限制?

amazon-web-services aws-lambda aws-sdk-go aws-fargate

5
推荐指数
1
解决办法
3万
查看次数

将映射[string]types.AttributeValue解组到特定的业务模型/结构

我正在尝试使用 AWS SDK GO v2: https: //github.com/aws/aws-sdk-go-v2 并且似乎很难解组 dynamodb.GetItemOutput 的 Item 属性,其类型为 map[string]types .属性值。

在 AWS SDK GO v1 中,可以轻松调用dynamodbattribute.UnmarshalMap(result.Item, &data)来解组结果。但在 v2 上,我找不到任何方法来做到这一点。

有人知道该怎么做吗?

aws-sdk-go

5
推荐指数
2
解决办法
4926
查看次数

如何在 Go SDK V2 中以编程方式获取 AWS 区域列表

AWS从Go SDK V2endpoints中删除了软件包。有没有办法使用 Go SDK V2 获取 AWS 区域列表?

在 V1 中你可以这样写:

    import "github.com/aws/aws-sdk-go/aws/endpoints"
    ...
    ...
    
        partitions := endpoints.DefaultPartitions()
        for _, p := range partitions {
            for region := range p.Regions() {
                validRegions[region] = struct{}{}
            }
        }
    
    ...
    ...
Run Code Online (Sandbox Code Playgroud)

然而,这似乎不再可能了。我确实注意到一个自动生成的json似乎包含所有分区,但是我似乎无法弄清楚如何获取代码中的可用区域列表。

Go SDK V2 有办法做到这一点吗?

amazon-web-services aws-sdk aws-sdk-go

5
推荐指数
1
解决办法
2250
查看次数

SQS 上接收消息时出现 i/o 超时问题以及 https 使用内存泄漏

AWS 开发工具包版本:v1.38.19

Go版本:go1.15.7

高山3.7

我正在使用标准队列,我在我的应用程序中立即初始化 SQS 连接,如下所示;

// Connection connection to the SQS
var Connection *sqs.SQS

// InitSQS initialize the AWS SQS connection
func InitSQS() {
    sess := session.Must(session.NewSessionWithOptions(session.Options{
        SharedConfigState: session.SharedConfigEnable,
    }))

    Connection = sqs.New(sess, &aws.Config{
        Region:     aws.String("eu-west-1"),
        DisableSSL: aws.Bool(true),
    })
}
Run Code Online (Sandbox Code Playgroud)

我禁用 SSL 因为;当我在应用程序中使用 SSL 时,我遇到内存和 CPU 泄漏(我的应用程序不对世界其他地方开放,顺便说一句,它是我其他应用程序的内部服务)。

这是我用来从 SQS 读取消息的配置:

func ConsumeUpdateMessage(db *database.MySQLWrap, sqsApi queue.SQSAPI) error {
    result, err := sqsApi.ReceiveMessage(&sqs.ReceiveMessageInput{
        AttributeNames: []*string{
            aws.String(sqs.MessageSystemAttributeNameSentTimestamp),
        },
        MessageAttributeNames: []*string{
            aws.String(sqs.QueueAttributeNameAll),
        },
        QueueUrl:            &qURL,
        MaxNumberOfMessages: aws.Int64(10),
        WaitTimeSeconds:     aws.Int64(20),
    })

    if err …
Run Code Online (Sandbox Code Playgroud)

go amazon-sqs amazon-web-services consumer aws-sdk-go

5
推荐指数
1
解决办法
1032
查看次数

How can I use the AWS SDK v2 for Go with DigitalOcean Spaces?

I'm trying to use the AWS v2 SDK for Go to list all objects in a given bucket on DigitalOcean Spaces. Their documentation gives examples of how to use the v1 SDK to do this, but my app uses v2. I know I could technically use both, but I'd rather not if possible.

Here's what I've got so far:

package main

import (
    "context"
    "fmt"
    "github.com/aws/aws-sdk-go-v2/aws"
    "github.com/aws/aws-sdk-go-v2/config"
    "github.com/aws/aws-sdk-go-v2/service/s3"
)

func main() {

    customResolver := aws.EndpointResolverWithOptionsFunc(func(service, region string, options ...interface{}) …
Run Code Online (Sandbox Code Playgroud)

amazon-s3 go aws-sdk-go digital-ocean-spaces

5
推荐指数
1
解决办法
1362
查看次数