Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

s3 SignedUrl x-amz-security-token

const AWS = require('aws-sdk');

export function main (event, context, callback) {
  const s3 = new AWS.S3();
  const data = JSON.parse(event.body);`

  const s3Params = {
    Bucket: process.env.mediaFilesBucket,
    Key: data.name,
    ContentType: data.type,
    ACL: 'public-read',
  };

  const uploadURL = s3.getSignedUrl('putObject', s3Params);

  callback(null, {
    statusCode: 200,
    headers: {
      'Access-Control-Allow-Origin': '*'
    },
    body: JSON.stringify({ uploadURL: uploadURL }),
  })
}

When I test it locally it works fine, but after deployment it x-amz-security-token, and then I get access denied response. How can I get rid of this x-amz-security-token?

like image 782
Ivan Baranov Avatar asked Oct 19 '18 03:10

Ivan Baranov


People also ask

How do I authenticate to Amazon S3?

For Amazon S3 request authentication, use your AWS secret access key ( YourSecretAccessKey ) as the key, and the UTF-8 encoding of the StringToSign as the message. The output of HMAC-SHA1 is also a byte string, called the digest. The Signature request parameter is constructed by Base64 encoding this digest.

What is X AMZ expiration?

X-Amz-Expires is only used with query string authentication, not with the Authorization: header. There is no default value with query string authentication. It is a required parameter, and the service will reject a request if X-Amz-Algorithm=AWS4-HMAC-SHA256 is present in the query string but X-Amz-Expires=... is not.

What is the X AMZ security token?

X-Amz-Security-TokenThe temporary security token that was obtained through a call to AWS Security Token Service (AWS STS). For a list of services that support temporary security credentials from AWS Security Token Service, go to AWS Services That Work with IAM in the IAM User Guide.

How do I get AWS authentication token?

An authentication token is used to access any Amazon ECR registry that your IAM principal has access to and is valid for 12 hours. To obtain an authorization token, you must use the GetAuthorizationToken API operation to retrieve a base64-encoded authorization token containing the username AWS and an encoded password.


1 Answers

I was having the same issue. Everything was working flawlessly using serverless-offline but when I deployed to Lambda I started receiving AccessDenied issues on the URL. When comparing the URLs returned between the serverless-offline and AWS deployments I noticed the only difference was the inclusion of the X-Amz-Security-Token in the URL as a query string parameter. After some digging I discovered the token being assigned was based upon the assumed role the lambda function had. All I had to do was grant the appropriate S3 policies to the role and it worked.

like image 128
Sean McMillan Avatar answered Oct 18 '22 15:10

Sean McMillan