node.jsamazon-s3aws-sdkadminjsadmin-bro

File upload on AWS S3 using the AdminJs


I am creating an administrator panel using AdminJs. I want to upload files on my S3 bucket. For that, I am using awsProvider.

I am getting an error Could not load credentials from any providers.

Here is the screenshot of the code.

    import model from "../models/wallpapers.model.js";
    import { mongooseDB } from "../mongoConnection.js";
    import { Components, componentLoader } from "../frontend/components.js";
    import uploadFeature, { AWSOptions } from '@adminjs/upload';

    const localProvider = {
        bucket: 'public/files',
        opts: {
            baseUrl: '/files',
        },
    };
    const awsProvider: AWSOptions = {
        accessKeyId: '<accessKey>',
        secretAccessKey: '<secret_key>',
        region: '<region>',
        bucket: '<bucket name>',
    }

    export const WallpapersResourceOptions = {
        databases: [mongooseDB],
        resource: model,
        options: {
            properties: {
                image: {
                    isVisible: { create: false, list: true, show: true },
                    components: {
                        list: Components.ImageBox,
                        show: Components.ImageBox,
                    }
                },
                file: {
                    isVisible: {
                        list: false,
                        show: false
                    }
                },
                createdAt: { isVisible: false },
                updatedAt: { isVisible: false },
                _id: { isVisible: false },
                isDeleted: { isVisible: false },
            }
        },
        features: [
            uploadFeature({
                provider: {
                    aws: awsProvider
                    // local: localProvider,
                },
                validation: { mimeTypes: ['image/png', 'image/jpg', 'image/jpeg'] },
                componentLoader: componentLoader,
                properties: {
                    key: "image",
                    mimeType: "mimeType",
                    filePath: "/files",
                },
                uploadPath: (record: any, filename: string) => {
                    const data = JSON.parse(JSON.stringify(record))
                    // const json = JSON.parse(data)
                    const folderName = data?.populated?.projectId?.title
                    return `${folderName}/${filename}`;
                },
            }),
        ],
    };

Error Log

         CredentialsProviderError: Could not load credentials from any providers
            at /Users/jaykukadiya/Desktop/Projects/Work/music-adminJs/node_modules/@aws-sdk/credential-provider-node/dist-cjs/defaultProvider.js:13:11
            at /Users/jaykukadiya/Desktop/Projects/Work/music-adminJs/node_modules/@smithy/property-provider/dist-cjs/chain.js:12:39
            at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
            at async coalesceProvider (/Users/jaykukadiya/Desktop/Projects/Work/music-adminJs/node_modules/@smithy/property-provider/dist-cjs/memoize.js:14:24)
            at async SignatureV4.credentialProvider (/Users/jaykukadiya/Desktop/Projects/Work/music-adminJs/node_modules/@smithy/property-provider/dist-cjs/memoize.js:33:24)
            at async SignatureV4.signRequest (/Users/jaykukadiya/Desktop/Projects/Work/music-adminJs/node_modules/@smithy/signature-v4/dist-cjs/SignatureV4.js:106:29)
            at async /Users/jaykukadiya/Desktop/Projects/Work/music-adminJs/node_modules/@aws-sdk/middleware-signing/dist-cjs/awsAuthMiddleware.js:16:18
            at async /Users/jaykukadiya/Desktop/Projects/Work/music-adminJs/node_modules/@smithy/middleware-retry/dist-cjs/retryMiddleware.js:27:46
            at async /Users/jaykukadiya/Desktop/Projects/Work/music-adminJs/node_modules/@aws-sdk/middleware-flexible-checksums/dist-cjs/flexibleChecksumsMiddleware.js:57:20
            at async /Users/jaykukadiya/Desktop/Projects/Work/music-adminJs/node_modules/@aws-sdk/middleware-logger/dist-cjs/loggerMiddleware.js:7:26
            at async updateRecord (file:///Users/jaykukadiya/Desktop/Projects/Work/music-adminJs/node_modules/@adminjs/upload/build/features/upload-file/factories/update-record-factory.js:75:17)
            at async file:///Users/jaykukadiya/Desktop/Projects/Work/music-adminJs/node_modules/@adminjs/express/lib/buildRouter.js:24:22

I tried fileupload using localprovider and it's working fine. I pass correct AWS S3 credentials. I cross checked with a separate Node.js project developed in Express.js.


Solution

  • Earlier we can directly assign accessKey and secreatAccessKey to the AWSProvider. The updated version must be provided in the credentials properties.

    const awsProvider = {
         credentials: {
            accessKeyId: '<accessKey>',
            secretAccessKey: '<secret_key>',
         },
         region: '<region>',
         bucket: '<bucket name>',
    }