我正在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) 我正在学习 Golang 使用 AWS-SDK-GO-V2 连接 dynamodb 但我不明白如何通过密钥获取一项。
我看到的所有示例都使用 v1,但我需要 V2。
我正在尝试转换简单的 DynamoDB 对象字符串:
{
"Item": {
"Id": {
"S": "db31"
},
"CreateTime": {
"N": "1647882237618915000"
}
}
Run Code Online (Sandbox Code Playgroud)
到任一dynamodb.AttributeValue映射到 go 对象(go 类型结构)或转换为简单的 JSON go 对象。
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() …
我在我的应用程序中使用一些 aws-sdk-go 功能,它会创建要请求的 DNS 样式主机,例如somebucket.mys3.com. 但我有一些 DNS 问题,并且希望以路径样式接收请求,例如mys3.com/somebucket. 如何配置 SDK 以路径样式模式生成请求?
我有 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 的速率限制?
我正在尝试使用 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从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 有办法做到这一点吗?
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) 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) aws-sdk-go ×10
go ×7
amazon-s3 ×3
aws-lambda ×2
aws-sdk ×2
amazon-sqs ×1
aws-fargate ×1
consumer ×1
json ×1