Search code examples
node.jsamazon-web-servicesamazon-s3aws-sdk-js

Error: Unable to create a POST object policy without a bucket, region, and credentials


I am trying to generate a PresignedPost URL using AWS javascript sdk,
I am getting the following error -

Error: Unable to create a POST object policy without a bucket, region, and credentials

I have AWS credentials configured on my local with S3 access,
In the code am setting the region while creating the S3 Client,
While passing the bucket name as a param to the client method.

Following is the code snippet -

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

let s3Client = new AWS.S3({
    region: 'us-east-1'
});

let postSignedUrl = async () => {

    try {
        let postSigningParams = {
            Expires: 60,
            Bucket: "some-bucket-name,
            Conditions: [["content-length-range", 100, 10000000]],
            Fields: {
                key: 'test/image.jpg'
            }
        }

        let s3createPresignedPost = util.promisify(s3Client.createPresignedPost).bind(s3Client);
        let postSignedUrl = await s3createPresignedPost('putObject',postSigningParams);

        console.log('postSigningParams => ', postSignedUrl);
    } catch (error) {
        console.error(error);
    }
}

postSignedUrl();

Error stack trace -

Error: Unable to create a POST object policy without a bucket, region, and credentials
    at features.constructor.preparePostFields (/Users/aniruddhanarendraraje/Documents/work/pocs/node-crud-app/snippets/node_modules/aws-sdk/lib/servi
ces/s3.js:943:13)
    at finalizePost (/Users/aniruddhanarendraraje/Documents/work/pocs/node-crud-app/snippets/node_modules/aws-sdk/lib/services/s3.js:906:22)
    at /Users/aniruddhanarendraraje/Documents/work/pocs/node-crud-app/snippets/node_modules/aws-sdk/lib/services/s3.js:923:24
    at finish (/Users/aniruddhanarendraraje/Documents/work/pocs/node-crud-app/snippets/node_modules/aws-sdk/lib/config.js:349:7)
    at /Users/aniruddhanarendraraje/Documents/work/pocs/node-crud-app/snippets/node_modules/aws-sdk/lib/config.js:367:9
    at SharedIniFileCredentials.get (/Users/aniruddhanarendraraje/Documents/work/pocs/node-crud-app/snippets/node_modules/aws-sdk/lib/credentials.js:
127:7)
    at getAsyncCredentials (/Users/aniruddhanarendraraje/Documents/work/pocs/node-crud-app/snippets/node_modules/aws-sdk/lib/config.js:361:24)
    at Config.getCredentials (/Users/aniruddhanarendraraje/Documents/work/pocs/node-crud-app/snippets/node_modules/aws-sdk/lib/config.js:381:9)
    at features.constructor.createPresignedPost (/Users/aniruddhanarendraraje/Documents/work/pocs/node-crud-app/snippets/node_modules/aws-sdk/lib/ser
vices/s3.js:918:14)
    at Promise (internal/util.js:274:30)

I tried the following, but didn't work -

AWS.config.update({region:'us-east-1'});
let s3Client = new AWS.S3();

A similar AWS S3 sdk method works -

let presignedUrl = async () => {

    let signingParams = {
        Bucket: 'some-bucket-name',
        Key: 'test/image.jpg',
        Expires: 60
    }

    let s3GetSignedUrl = util.promisify(s3Client.getSignedUrl).bind(s3Client);
    let signedUrl = await s3GetSignedUrl('putObject',signingParams);

    console.log('signedUrl => ', signedUrl);
} 

Solution

  • Did a stupid mistake,
    was passing in putObject as param in createPresignedPost method call by mistake

    let postSignedUrl = await s3createPresignedPost('putObject',postSigningParams);
    

    should be just -

    let postSignedUrl = await s3createPresignedPost(postSigningParams);