How to upload files from EKS to S3 bucket without creating IAM user?

12/9/2021

I have a pod deployed in Kubernetes environment and created service account to access my S3 bucket with full access. I want to upload my logs to s3 bucket.

module.exports.uploadFile = () => {
const s3 = new AWS.S3();
const fileContent = fs.readFileSync(path.resolve(__dirname,'../logger/MyLogFile.log'))
const params = {
    Bucket: 'MYBUCKETNAME',
    Key: 'MyLogFile.log',
    Body: fileContent
};

s3.putObject(params, function(err, data) {
    if (err) {
        console.log(err)
        logger.error('file upload error')
        throw err;
    }
    logger.info(`File uploaded successfully. ${data.Location}`);
})}

This is the error I am getting...

Error CredentialsError: Missing credentials in config, if using AWS_CONFIG_FILE, set AWS_SDK_LOAD_CONFIG=1 at Timeout.connectTimeout as _onTimeout at listOnTimeout (internal/timers.js:557:17) at processTimers (internal/timers.js:500:7) { code: 'CredentialsError', time: 2021-12-09T10:43:29.712Z, retryable: true, originalError: { message: 'Could not load credentials from any providers', code: 'CredentialsError', time: 2021-12-09T10:43:29.705Z, retryable: true, originalError: { message: 'EC2 Metadata roleName request returned error', code: 'TimeoutError', time: 2021-12-09T10:43:29.705Z, retryable: true, originalError: { message: 'Socket timed out without establishing a connection', code: 'TimeoutError', time: 2021-12-09T10:43:29.705Z, retryable: true } } } }

-- Joshua
amazon-eks
amazon-s3
aws-sdk
kubernetes
node.js

1 Answer

12/15/2021

Creating a service Account from EKS side to my application resolved the problem.

After creating the service account my file changes will be

1.) aws.yml

serviceAccount:
enabled: true
name: MY_SERVICE_ACC_NAME

2.) my AWS.S3 object creation will not have any changes

  const s3 = new AWS.S3();

Now the AWS.S3 object will be filled with mandatory parameters automatically.

-- Joshua
Source: StackOverflow