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

时间:2019-02-22 10:52:00

标签: amazon-web-services go amazon-s3 aws-lambda aws-sdk

我正在尝试使用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

2 个答案:

答案 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已经消失了!