我正在将 aws-sdk-go 用于 dynamodb。我需要从我的数据库收集一些项目。过滤条件为deviceid: xyz, time >= 10 and time <= 20。
time是我的数据库的排序键,deviceid是主键。我知道我必须使用BETWEEN来实现我的目标。我的实施不成功,如下:
var queryInput = &dynamodb.QueryInput{
TableName: aws.String(dbName),
KeyConditions: map[string]*dynamodb.Condition{
"deviceid": {
ComparisonOperator: aws.String("EQ"),
AttributeValueList: []*dynamodb.AttributeValue{
{
S: aws.String("xyz"),
},
},
},
"time": {
ComparisonOperator: aws.String("BETWEEN"),
AttributeValueList: []*dynamodb.AttributeValue{
{
N: aws.String("10"),
N: aws.String("20"),
},
},
},
},
}
Run Code Online (Sandbox Code Playgroud)
我在这里犯了哪些错误?
我正在尝试使用 golang sdk 将对象上传到 AWS S3,而无需在我的系统中创建文件(尝试仅上传字符串)。但我很难做到这一点。谁能给我一个例子,说明如何在不需要创建文件的情况下上传到 AWS S3?
如何上传文件的 AWS 示例:
// Creates a S3 Bucket in the region configured in the shared config
// or AWS_REGION environment variable.
//
// Usage:
// go run s3_upload_object.go BUCKET_NAME FILENAME
func main() {
if len(os.Args) != 3 {
exitErrorf("bucket and file name required\nUsage: %s bucket_name filename",
os.Args[0])
}
bucket := os.Args[1]
filename := os.Args[2]
file, err := os.Open(filename)
if err != nil {
exitErrorf("Unable to open file %q, %v", err)
}
defer …Run Code Online (Sandbox Code Playgroud) 我在 Go 中使用服务器端身份验证刷新 AWS Cognito 令牌时遇到问题。我能够得到id_token,access_token并refresh_token使用该cognitoidentityprovider.AdminInitiateAuth方法。我创建了一个带有机密的用户池客户端,所以我必须SECRET_HASH在AuthParameters.
这在登录时一切正常,但在刷新令牌时相同的秘密哈希不起作用。我已经tripple检查了代码并验证了我在登录和刷新令牌时发送的秘密哈希是相同的(它应该是相同的,因为它使用不变的用户名、clientID和clientSecret)。
AWS API 返回以下错误:
{
"error": "NotAuthorizedException: Unable to verify secret hash for client myClientIdHere\n\tstatus code: 400, request id: c186ecf2-57a7-11e8-a01e-f97ed64650c9"
}
Run Code Online (Sandbox Code Playgroud)
我已经检查过设备跟踪是否关闭,因为文档提到在服务器端刷新令牌时这是一个问题(注意“管理员身份验证流程”,https://docs.aws.amazon.com/cognito/latest/ developerguide/amazon-cognito-user-pools-authentication-flow.html#amazon-cognito-user-pools-server-side-authentication-flow)。
我的刷新代码是:
AWSRefreshToken := aws.String(refreshToken)
secretHash := secretHash(email, auth.Config.ClientID, auth.Config.ClientSecret)
AWSUserPoolID := aws.String(auth.Config.UserPoolID)
input := cognitoidentityprovider.AdminInitiateAuthInput{
AuthFlow: aws.String("REFRESH_TOKEN_AUTH"),
AuthParameters: map[string]*string{
"REFRESH_TOKEN": AWSRefreshToken,
"SECRET_HASH": &secretHash,
},
ClientId: &auth.Config.ClientID,
UserPoolId: AWSUserPoolID,
}
output, err := auth.AWSCognitoIdentityProvider.AdminInitiateAuth(&input)
Run Code Online (Sandbox Code Playgroud)
秘密哈希码(来自/sf/answers/3231438241/):
func …Run Code Online (Sandbox Code Playgroud) 我正在使用aws-sdk-go和aws-lambda-go构建一个aws lambda ,我遇到了一个小问题.
我想测试我的lambda处理程序.为此,我需要模拟一个有效的context.Context,它包含lamdacontext.LambdaContext的有效属性并且满足lambdacontext.FromContext.
我似乎无法找到建立这样的模拟的方法,因为lambdacontext.FromContext总是回报我_, false.
这是我的主要内容,在events.SNSEvent事件上有一个简单的处理程序:
package main
import (
"context"
"github.com/aws/aws-lambda-go/events"
"github.com/aws/aws-lambda-go/lambda"
"github.com/aws/aws-lambda-go/lambdacontext"
)
func main() {
lambda.Start(handleRequest)
}
func handleRequest(ctx context.Context, snsEvent events.SNSEvent) error {
lc, ok := lambdacontext.FromContext(ctx); if !ok {
// Always false
...
return someErr
}
. . .
return nil
}
Run Code Online (Sandbox Code Playgroud)
这是我的测试handleRequest:
package main
import (
"context"
"github.com/aws/aws-lambda-go/events"
"github.com/aws/aws-lambda-go/lambdacontext"
"github.com/stretchr/testify/assert"
"gitlab.easy-network.it/meg/aml-rekognition/testdata"
"testing"
)
const imgMock …Run Code Online (Sandbox Code Playgroud) 你好 StackOverflow AWS Gophers,
我正在使用spf13 中出色的cobra/viper 软件包实现CLI 。我们有一个以 API 网关端点为前端的 Athena 数据库,该端点通过 IAM 进行身份验证。
也就是说,为了使用 Postman 与其端点进行交互,我必须定义AWS SignatureAuthorization 方法,定义相应的 AWS id/secret,然后在 Headers 中会有X-Amz-Security-Token等等。没有异常,按预期工作。
由于我是 Go 的新手,我有点震惊地看到没有示例可以用它aws-sdk-go本身来执行这个简单的 HTTP GET 请求......我正在尝试使用共享凭据提供程序 ( ~/.aws/credentials),如来自 re:Invent 2015 的S3 客户端Go 代码片段:
req := request.New(nil)
Run Code Online (Sandbox Code Playgroud)
我如何才能在 2019 年完成这个看似简单的壮举,而不必求助于自煮net/http,因此必须手动阅读~/.aws/credentials或更糟,使用os.Getenv其他丑陋的黑客?
任何作为客户端交互的 Go 代码示例 都会非常有帮助。请不要提供 Golang Lambda/服务器示例,那里有很多示例。
默认情况下,sdk 将time.Time值编组为 RFC3339 字符串。您如何选择以其他方式编组和解组,例如自纪元以来的毫秒数?
SDK 提到了 Marshaler 和 Unmarshaler 接口,但没有解释如何使用它们。
package main
import (
"fmt"
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/aws/session"
"github.com/aws/aws-sdk-go/service/route53"
)
func main() {
sess := session.Must(session.NewSession())
client := route53.New(sess)
zones, err := client.ListHostedZones(&route53.ListHostedZonesInput{
MaxItems: aws.String("100"),
})
if err != nil {
fmt.Printf("Error occurred")
}
fmt.Printf("%v", zones)
if zones.IsTruncated {
fmt.Printf("%v", zones.NextMarker)
}
}
Run Code Online (Sandbox Code Playgroud)
由于以下条件,上面的代码失败。
if zones.IsTruncated {
fmt.Printf("%v", zones.NextMarker)
}
Run Code Online (Sandbox Code Playgroud)
结果是
non-bool zones.IsTruncated (type *bool) used as if condition
Run Code Online (Sandbox Code Playgroud)
我想知道的是为什么常规类型(bool)和类型(*bool)之间存在差异。我知道一个是指针值,但是条件应该仍然有用。
这是一个没有条件的输出的尾部片段
IsTruncated: true,
MaxItems: "100",
NextMarker: "Wouldn'tYouLikeToKnow"
}
Run Code Online (Sandbox Code Playgroud) 我正在尝试将S3的预签名URL与强制使用的Content-MD5一起使用.因此,我基本上试图效仿他们的文档.显然我做错了什么.
这是我尝试上传的文件的校验和:
? md5 testfile.txt
MD5 (testfile.txt) = ce0a4a83c88c2e7562968f03076ae62f
Run Code Online (Sandbox Code Playgroud)
这是代码:
func main() {
sess, err := session.NewSession(&aws.Config{
Region: aws.String("eu-central-1")},
)
svc := s3.New(sess)
resp, _ := svc.PutObjectRequest(&s3.PutObjectInput{
Bucket: aws.String("bucket"),
Key: aws.String("testfile.txt"),
})
md5 := "ce0a4a83c88c2e7562968f03076ae62f" // hard coded & pasted from "$ md5 testfile.txt"
md5s := base64.StdEncoding.EncodeToString([]byte(md5))
resp.HTTPRequest.Header.Set("Content-MD5", md5s)
url, err := resp.Presign(15 * time.Minute)
if err != nil {
fmt.Println("error presigning request", err)
return
}
fmt.Printf("curl -XPUT -H \"Content-MD5: %s\" %s --upload-file %s\n\n", md5s, url, "testfile.txt")
} …Run Code Online (Sandbox Code Playgroud) 我们目前正在从 Google 存储过渡到 Amazon S3 存储。
在 Google Storage 上,我使用此函数https://godoc.org/cloud.google.com/go/storage#Writer.Write来写入文件。它基本上使用 io.Writer 接口将数据字节流式传输到文件中,并在 writer 上调用 Close() 时保存文件。这使我们能够全天将数据流式传输到文件中,并在一天结束时完成它,而无需创建文件的本地副本。
我检查了 godoc 上的 aws-sdk-go s3 文档,似乎找不到类似的函数,该函数允许我们将数据流式传输到文件,而无需先在本地创建文件。我发现的只是从现有本地文件(如 PutObject())传输数据的函数。
所以我的问题是:有没有一种方法可以使用 aws-sdk-go 将数据流式传输到 amazon s3 文件,类似于 google storage Write() 方法?
amazon-s3 go amazon-web-services google-cloud-storage aws-sdk-go
编辑问题:尝试更新我的 map[] 接口字段时收到错误 400。
使用 UpdateItem 时,我一直在更新 DynamoDB 中的数组对象,特别是在我的数组对象上(在本例中为 Authors 字段)。
&awserr.requestError{awsError:(*awserr.baseError)(0xc000204140), statusCode:400, requestID:"QU2MMAJVDRM0JHJEPOE93VJPSVVV4KQNSO5AEMVJF66Q9ASUAAJG", bytes:[]uint8(nil)}
Run Code Online (Sandbox Code Playgroud)
使用具有相同结构的 PutItem 时,我没有遇到任何问题。我不确定我错过了什么,而且 AWS 给出的错误对我来说也不太清楚。
结构:
type Book struct {
Id int `json:":id"`
Title string `json:":title"`
Photo Photo `json:":photo"`
Authors []Author `json:":authors"`
}
type Author struct {
Id int `json:":id"`
Name string `json:":name"`
}
Run Code Online (Sandbox Code Playgroud)
我已经尝试过更新代码:
input := &dynamodb.UpdateItemInput{
TableName: aws.String("books"),
Key: key,
UpdateExpression: aws.String(updateExp),
ExpressionAttributeValues: value,
}
Run Code Online (Sandbox Code Playgroud)
更新表达式:
"SET title = :title, photo = :photo, authors = list_append(authors, :authors)"
Run Code Online (Sandbox Code Playgroud)
我也已经尝试过了
authors = :authors
Run Code Online (Sandbox Code Playgroud)
因为我计划每次都替换整个作者值,但我似乎可以完成这项工作。 …
aws-sdk-go ×10
go ×10
amazon-s3 ×3
aws-sdk ×2
aws-lambda ×1
cognito ×1
go-cobra ×1
unit-testing ×1