Estoy tratando de llamar a una función lambda que enviará algunos mensajes al depósito s3. Pero cada vez que llamo a la función lambda obtengo el siguiente error
ClientError: An error occurred (AccessDenied) when calling the PutObject operation: Access DeniedA continuación se muestra mi código lambda
import json import boto3 def lambda_handler(event, context): s3 = boto3.client("s3") #data = json.loads(event["Records"][0]["body"]) data = event["Records"][0]["body"] s3.put_object(Bucket="sqsmybucket",Key="data.json", Body=json.dumps(data)) #print(event) return { 'statusCode': 200, 'body': json.dumps('Hello from Lambda!') } Estoy usando una cuenta de usuario que también tiene la función de acceder al S3 
Verifiqué el permiso del depósito s3 y todos los accesos públicos están abiertos para él.
Pero recibo repetidamente el siguiente mensaje de error en el registro de CloudWatch
2020-06-05T23:48:20.920+05:30 [ERROR] ClientError: An error occurred (AccessDenied) when calling the PutObject operation: Access Denied Traceback (most recent call last): File "/var/task/lambda_function.py", line 9, in lambda_handler s3.put_object(Bucket="sqsmybucket",Key="data.json", Body=json.dumps(data)) File "/var/runtime/botocore/client.py", line 316, in _api_call return self._make_api_call(operation_name, kwargs) File "/var/runtime/botocore/client.py", line 626, in _make_api_call raise error_class(parsed_response, operation_name)Por favor, ayuda, no tengo ni idea de la situación. Gracias de antemano.
Asegúrese de que el rol adjunto a la función lambda tenga el permiso s3:PutObject .
Por ejemplo, el privilegio/permiso mínimo necesario es
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "s3:PutObject", "Resource": "arn:aws:s3:::<bucket-name>/*" } ] } Observe el /* al final de la cadena de recursos. La razón por la que se necesita /* es que, según el documento , la acción PutObject tiene un tipo de recurso de objeto . Esta es la definición del tipo de recurso de objeto. Básicamente, * hace coincidir todas las posibles claves de objetos de S3, y lo que está a la izquierda de / limita su alcance a un único depósito de S3.
Aparentemente, tuve el mismo problema, no solo tiene que usar el ARN del depósito, sino también incluir "/ *" al final. Es importante usar siempre el patrón de privilegios mínimos al otorgar permisos.