Estoy usando la biblioteca de Amazon boto3 en Python para cargar un archivo en otro grupo de usuarios. La política de depósito aplicada al depósito de otros usuarios está configurada así
{ "Version": "2012-10-17", "Statement": [ { "Sid": "DelegateS3BucketList", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::uuu" }, "Action": "s3:ListBucket", "Resource": "arn:aws:s3:::bbb" }, { "Sid": "DelegateS3ObjectUpload", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::uuu" }, "Action": [ "s3:PutObject", "s3:PutObjectAcl" ], "Resource": [ "arn:aws:s3:::bbb", "arn:aws:s3:::bbb/*" ] } ] } donde uuu es mi ID de usuario y bbb es el nombre del depósito que pertenece al otro usuario. Mi usuario y el otro usuario son cuentas de IAM que pertenecen a organizaciones diferentes . (Sé que esta política se puede escribir de manera más simple, pero la intención es agregar una verificación en la carga para bloquear objetos sin que se creen los permisos apropiados).
Luego puedo usar el siguiente código para enumerar todos los objetos en el depósito y también para cargar nuevos objetos en el depósito. Esto funciona, sin embargo, el propietario del depósito no tiene acceso al objeto debido a que Amazon hace que los objetos sean privados para el creador del objeto.
import base64 import hashlib from boto3.session import Session access_key = "value generated by Amazon" secret_key = "value generated by Amazon" bucketname = "bbb" content_bytes = b"hello world!" content_md5 = base64.b64encode(hashlib.md5(content_bytes).digest()).decode("utf-8") filename = "foo.txt" sess = Session(aws_access_key_id=access_key, aws_secret_access_key=secret_key) bucket = sess.resource("s3").Bucket(bucketname) for o in bucket.objects.all(): print(o) s3 = sess.client("s3") s3.put_object( Bucket=bucketname, Key=filename, Body=content_bytes, ContentMD5=content_md5, # ACL="bucket-owner-full-control" # Uncomment this line to generate error )Tan pronto como elimino el comentario de la opción ACL, el código genera un mensaje de error de acceso denegado. Si redirijo esto para que apunte a un depósito dentro de mi propia organización, la opción ACL tiene éxito y el propietario del depósito obtiene permiso completo para el objeto.
Ahora no puedo resolver esto, especialmente porque el propio consejo de Amazon parece ser hacerlo de la manera que he mostrado.
https://aws.amazon.com/premiumsupport/knowledge-center/s3-bucket-owner-access/
https://aws.amazon.com/premiumsupport/knowledge-center/s3-require-object-ownership/
No es suficiente tener permiso solo en las políticas de depósito.
Compruebe si a su usuario (o función) le falta el permiso s3:PutObjectAcl en IAM .
Cuando se usan los métodos de resource en boto3, se pueden realizar varias llamadas API diferentes y no siempre es obvio qué llamadas se están realizando.
En comparación, cuando se utilizan métodos de client en boto3, existe una asignación de 1 a 1 entre la llamada a la API que se realiza en boto3 y la llamada a la API que recibe AWS.
Por lo tanto, es probable que el método resource.put_object() esté llamando a una API adicional, como PutObjectAcl . Puede confirmar esto mirando en AWS CloudTrail y viendo qué llamadas a la API se están realizando desde su aplicación.
En tal caso, necesitaría el permiso adicional s3:PutObjectAcl . Esto sería necesario si el proceso de carga primero crea el objeto y luego actualiza la Lista de control de acceso del objeto.
Al usar los métodos del client para cargar un archivo, también existe la posibilidad de especificar una ACL, que creo que se aplica directamente en lugar de requerir una segunda llamada a la API. Por lo tanto, usar el método de client para crear el objeto probablemente no requiera este permiso adicional.