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

Dat*_*ray 5 amazon-s3 go amazon-web-services aws-sdk aws-lambda

我正在尝试使用 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
}
Run Code Online (Sandbox Code Playgroud)

由 lambda 生成的 URL 很长,对于我的应用程序,我期待一个没有 X-Amz-Security-Token 的较短 URL

Olu*_*ule 5

当该函数在您的命令行中运行时,它会生成带有 IAM 凭证的预签名 URL,可能存储在环境变量或~/.aws/config.

临时凭证被分配给相关的IAM角色1在AWS LAMBDA环境调用时用的功能。

AWS 要求使用临时凭证发出的请求包含x-amz-security-token标头。2

我不认为 URL 的长度是一个问题。

如果您希望在本地和 Lambda 函数环境中保持一致的行为,一个简单的方法是在 Lambda 函数的环境中设置 AWS 凭证。

  • @BrianLeishman 这个评论帮助我解决了我的问题。当使用 SAM 本地调用生成签名 url 时,sam 似乎正在使用我的本地凭据,但在部署 lambda 后,我收到了 403 错误。我将 S3ReadPolicy 添加到 lambda,这解决了我的问题。谢谢! (2认同)