An error occurred (AccessDenied) when calling the ListObjects operation: Access Denied in lambda

I keep receiving this S3 error

A client error (AccessDenied) occurred when calling the ListObjects operation: Access Denied

I've rechecked my credentials and did do some research as well but couldn’t find anything. I edited my bucket policy to add an s3:ListBucket action, but to no avail. When I do so, it just returns a similar message:

A client error (AccessDenied) occurred when calling the ListBuckets operation: Access Denied

Always returns the same error. Any kind of help is appreciated.

I have created a Lambda Python function through AWS Cloud 9 but have hit an issue when trying to write to an S3 bucket from the Lambda Function. When I test in Cloud 9 the Python codes runs fine and writes to the S3 bucket perfectly. When I push this to the Lambda function and it runs I think get the error. This makes me think there is a permission different between the roles used to run the application in Could 9, and that when the Lambda function runs.

The below error is given and I am looking for some advise on what I could be missing, below the error I have described the setup:

[ERROR] ClientError: An error occurred (AccessDenied) when calling the PutObject operation: Access Denied Traceback (most recent call last): File "/var/task/index.py", line 22, in handler s3.Bucket(bucket_name).put_object(Key=s3_path, Body=encoded_string) File "/var/runtime/boto3/resources/factory.py", line 520, in do_action response = action(self, *args, **kwargs) File "/var/runtime/boto3/resources/action.py", line 83, in __call__ response = getattr(parent.meta.client, operation_name)(**params) File "/var/runtime/botocore/client.py", line 320, in _api_call return self._make_api_call(operation_name, kwargs) File "/var/runtime/botocore/client.py", line 623, in _make_api_call raise error_class(parsed_response, operation_name)

The code I have is as follows:

import json import datetime from botocore.vendored import requests import boto3 def handler(event, context): print("Start:") response = requests.get('https://##########') data = response.json() for i in data: print (i) encoded_string = json.dumps(i).encode("utf-8") bucket_name = "data" file_name = str(i['id']) + ".txt" lambda_path = "/tmp/" + file_name s3_path = "testBucket/" + file_name s3 = boto3.resource("s3") s3.Bucket(bucket_name).put_object(Key=s3_path, Body=encoded_string) ...rest of code ...

The .yml file with the necessary permissions is as follows:

AWSTemplateFormatVersion: 2010-09-09 Transform: - AWS::Serverless-2016-10-31 - AWS::CodeStar Parameters: ProjectId: Type: String Description: CodeStar projectId used to associate new resources to team members CodeDeployRole: Type: String Description: IAM role to allow AWS CodeDeploy to manage deployment of AWS Lambda functions Stage: Type: String Description: The name for a project pipeline stage, such as Staging or Prod, for which resources are provisioned and deployed. Default: '' Globals: Function: AutoPublishAlias: live DeploymentPreference: Enabled: true Type: Canary10Percent5Minutes Role: !Ref CodeDeployRole Resources: HelloWorld: Type: AWS::Serverless::Function Properties: Handler: index.handler Runtime: python3.7 Timeout: 10 Role: Fn::GetAtt: - LambdaExecutionRole - Arn Events: GetEvent: Type: Api Properties: Path: / Method: get PostEvent: Type: Api Properties: Path: / Method: post LambdaExecutionRole: Description: Creating service role in IAM for AWS Lambda Type: AWS::IAM::Role Properties: RoleName: !Sub 'CodeStar-${ProjectId}-Execution${Stage}' AssumeRolePolicyDocument: Statement: - Effect: Allow Principal: Service: [lambda.amazonaws.com] Action: sts:AssumeRole Path: / ManagedPolicyArns: - arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole PermissionsBoundary: !Sub 'arn:${AWS::Partition}:iam::${AWS::AccountId}:policy/CodeStar_${ProjectId}_PermissionsBoundary'

The role the Lambda function executes with is as follows: IAM Role

Any advice as to where this could be going wrong. I understand that I need to provide the correct access but I am unsure as to where else I need to specify the correct access (I really do not want to make my S3 public just so my Lambda function can access it). In Lambda it shows that S3 has been added as a resource the functions role has access to but yet receiving the above error.

AWS S3 ListObjects Access Denied error can be resolved easily with these troubleshooting tips by our experts.

At Bobcares, we offer solutions for every query, big and small, as a part of our AWS Support Services.

Let’s take a look at how our AWS Support Team is ready to help customers troubleshoot AWS S3 ListObjects Access Denied.

All about AWS S3 ListObjects Access Denied Error

Have you been coming across the following error while trying to access your AWS S3 bucket?

An error occurred (AccessDenied) when calling the ListObjects operation: Access Denied

Each time an AWS S3 sync command is run, it leads to the Amazon S3 listing the source and destination in order to verify the object exists.

In other words, it results in the following API calls: CopyObject, ListObjectsV2, PutObject, and GetObject.

An error occurred (AccessDenied) when calling the ListObjects operation: Access Denied in lambda

  • CopyObject API call for the bucket to bucket operation
  • PutObject API for local to bucket operation
  • GetObject API for the bucket to local operation

The Access Denied error occurs due to not having the required permissions to perform actions on the bucket. Fortunately, there is an easy resolution AWS S3 ListObjects operation Access Denied error.

How to resolve AWS S3 ListObjects Access Denied

According to our AWS experts, the fix for this specific issue involves configuring the IAM policy.

To begin with, we have to ensure that we have permission to list objects in the bucket as per the IAM and bucket policies if the IAM user or role belongs to another AWS account.

However, if the user or role belongs to the bucket owner’s account, we need permission only from IAM or the bucket policy.

Additionally, our AWS experts suggest checking other policy statements for explicit denial of action.

For instance, here is a sample IAM policy that offers permission to s3:ListBucket

s3:ListBucket- Name of the permission that permits a user to list objects in the bucket.

ListObjectsV2- Name of the API call that lists objects in the bucket.

"Action": "s3:ListBucket", "Effect": "Allow", "Resource": "arn:aws:s3:::AWSDOC-SAMPLE-BUCKET" }] }

Moreover, here is a sample bucket policy that offers user arn:aws:iam::202204295674:user/user1 access to s3:ListBucket:

{ "Id": "Policy1546414473940", "Version": "2012-10-17", "Statement": [{ "Sid": "Stmt1546414471931", "Action": "s3:ListBucket", "Effect": "Allow", "Resource": "arn:aws:s3:::AWSDOC-SAMPLE-BUCKET", "Principal": { "AWS": [ "arn:aws:iam::202204295674:user/user1" ] } }] }

Checking ListObjectV2 permission

If the Request Pays is enabled and our bucket belongs to another user, we have ot check whether the IAM and bucket policies both offer ListObjectsV2 permissions. If yes, verify the sync command syntax. In fact, one of our customers came across the AWS S3 Access Denied ListObjects error due to an incorrect sync command syntax.

Here is a quick look at the sync command syntax when Request Pays is enabled:

aws s3 sync ./ s3://requester-pays-bucket/ --request-payer requester

However, if we are still facing the error, it is time to attach a policy that permits ListBucket action on the bucket as well as GetObject action on bucket objects to the IAM user or role with S3 bucket access.

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:GetObject" ], "Resource": [ "arn:aws:s3:::OUR_BUCKET/*" ] }, { "Effect": "Allow", "Action": [ "s3:ListBucket" ], "Resource": [ "arn:aws:s3:::OUR_BUCKET" ] } ] }

Alternatively, our AWS experts suggest verifying that the policy does not restrict access to GetObject or ListObject action. Furthermore, check if there is a condition that permits only a particular IP range to access bucket objects.

[Need assistance with another query? We are available 24/7.]

Conclusion

In a nutshell, our skilled AWS Support Engineers at Bobcares demonstrated how to troubleshoot and resolve AWS S3 ListObjects Access Denied error.

PREVENT YOUR SERVER FROM CRASHING!

Never again lose customers to poor server speed! Let us help you.

Our server experts will monitor & maintain your server 24/7 so that it remains lightning fast and secure.

GET STARTED

Why am I getting an access denied error when I use Lambda function to upload files to an Amazon S3 bucket?

If the permissions between a Lambda function and an Amazon S3 bucket are incomplete or incorrect, then Lambda returns an Access Denied error.

How do I allow Lambda function to access S3 bucket?

Resolution.
Follow the steps in Creating an execution role in the IAM console..
From the list of IAM roles, choose the role that you just created..
In the Permissions tab, choose Add inline policy..
Choose the JSON tab..
Enter a resource-based IAM policy that grants access to your S3 bucket. ... .
Choose Review policy..

Why is my S3 bucket Access Denied?

If you're getting Access Denied errors on public read requests that are allowed, check the bucket's Amazon S3 Block Public Access settings. Review the S3 Block Public Access settings at both the account and bucket level. These settings can override permissions that allow public read access.

When calls the ListObjectsV2 Operation Access Denied AWS?

To solve the "(AccessDenied) when calling the ListObjectsV2 operation" error attach a policy that allows the ListBucket action on the bucket itself and the GetObject action on all of the bucket's objects to the IAM entity (user or role) that is trying to access the S3 bucket.