我正在尝试使用go sdk为我的S3存储桶中的文件创建一个预签名URL。
当我从命令行运行程序时,我获得了不包含X-Amz-Security-Token的预签名URL。
但是,如果我使用lambda函数中的相同代码,那么我总是会在URL中获得X-Amz-Security-Token。
我不确定为什么这种行为会有所不同。
这是代码-
func CreatePreSignedURL(bucketName string, path string) (string, error) {
sess, err := session.NewSession(&aws.Config{
Region: aws.String("us-east-1")},
)
svc := s3.New(sess)
req, _ := svc.GetObjectRequest(&s3.GetObjectInput{
Bucket: aws.String(bucketName),
Key: aws.String(path),
})
urlStr, err := req.Presign(60 * time.Minute)
if err != nil {
fmt.Println("error in generarting presigned URL is ", err)
return urlStr, err
}
return urlStr, nil
}
lambda生成的URL很长,对于我的应用程序,我希望它的URL较短,而没有X-Amz-Security-Token
答案 0 :(得分:1)
在命令行中运行该函数时,它将生成带有IAM凭据的预签名URL,这些URL可能存储在环境变量或~/.aws/config
中。
在AWS Lambda环境中调用时,为与该功能关联的 1 的IAM角色分配了临时凭证。
AWS必须使用临时凭据发出的请求包括x-amz-security-token
头。 2
我在这里找不到URL的长度。
如果您想在本地和Lambda函数环境中保持一致的行为,一种简单的方法是在Lambda函数的环境中设置AWS凭证。
答案 1 :(得分:1)
我有同样的问题。我正在使用aws cli生成预签名的url,但是我的IAM角色仅在12个小时内有效。根据{{3}},IAM角色至少需要7天的可用性。我所做的是创建一个新角色,该角色仅具有S3访问权限,但没有到期限制。在命令行中,我输入了
export AWS_ACCESS_KEY_ID "your_new_aws_access_key_id"
export AWS_SECRET_ACCESS_KEY "your_new_aws_secret_access_key"
然后我运行此命令
aws s3 presign "your_target_file"
它有效!很长的x-amz-security-token已经消失了!