AWS S3 预签名 URL 包含 X-Amz-Security-Token。

10

我正在尝试使用Go SDK为S3存储桶中的文件创建预签名URL。

当我从命令行运行程序时,我得到的预签名URL不包含X-Amz-Security-Token。

但是如果我从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。

你在两个主机上都设置了相同的环境变量配置文件吗? - mkopriva
如果 x-amz-security-token 不存在,这也意味着在生成它的当前环境中不需要它。我解决了这个问题,添加了一个 if 语句来检查和处理 x-amz-security-token,只有当它存在时才进行处理,我的前端代码在本地和 lambda 部署中都能正常工作。 - Mattia
2个回答

11
当在命令行中运行该函数时,它会使用存储在环境变量或~/.aws/config中的IAM凭据生成预签名URL。
在AWS Lambda环境中调用函数时,将分配与IAM角色相关联的临时凭证。
AWS要求使用临时凭证发出的请求包括x-amz-security-token头。
我认为URL的长度不是问题。
如果您想在本地和Lambda函数环境中保持一致的行为,则一种简单的方法是在Lambda函数的环境中设置AWS凭据。

1
我遇到的问题不是URL长度,而是由于某种原因Lambda调用给了我403s,而在本地运行没有令牌的预签名URL却可以正常工作。 - Brian Leishman
1
实际上,我的问题。令牌本身是存在的,无论您是否附加策略,但当我将S3策略附加到为lambda func创建的IAM角色时,403错误停止了,即使令牌保持不变。 - Brian Leishman
2
@BrianLeishman 这个评论帮助我解决了我的问题。在使用SAM本地调用生成签名URL时,似乎sam正在使用我的本地凭据,但是一旦我部署了我的lambda,我就会收到403错误。我向lambda添加了S3ReadPolicy,这解决了我的问题。谢谢! - Juan Rangel
这也帮助我最终解决了我的“访问被拒绝”的问题 - 我在~/.aws/credentials中更改了凭据,现在它可以工作了。但我不明白为什么通过 const s3Client = new S3Client({ accessKeyId: "AXXXXXXXXXXXXXXXXXXX", secretAccessKey: "mxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" });提供凭据不起作用。每当尝试访问生成的URL时,它总是产生错误,但在生成URL时没有显示错误。 - Gorgsenegger
...键需要包含在 credentials 中,例如 const s3Client = new S3Client({ credentials: { accessKeyId: "AXXXXXXXXXXXXXXXXXXX", secretAccessKey: "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" } }); - Gorgsenegger
啊哈!谢谢你,Gorgsenegger。我的凭证并没有像你说的那样包装,我的URL一直被拒绝访问。在做出这个改变之后,一切都正常了。非常感谢。 - undefined

0

我有同样的问题。我正在使用aws cli生成预签名url,但我的IAM角色仅有效期为12小时。根据文档,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已经消失了!


5
这个答案大部分是误导性的。你实际上所做的是从使用(短期)STS凭证签名切换到使用(长期)IAM用户凭证进行签名。你使用IAM用户凭证导致签名URL中缺少x-amz-security-token。 - jarmod

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接