Solución:
¡Un acertijo muy interesante! Afortunadamente, hay una solución.
Primero, un resumen:
- Cubo A en la cuenta A
- Cubo B en la cuenta B
- El usuario de la cuenta A copia objetos en el depósito B (habiendo recibido los permisos adecuados para hacerlo)
- Los objetos en el depósito B todavía pertenecen a la cuenta A y no se puede acceder a la cuenta B
Logré reproducir esto y puedo confirmar que los usuarios de la cuenta B no pueden acceder al archivo, ¡ni siquiera el usuario root de la cuenta B!
Afortunadamente, las cosas se pueden arreglar. los aws s3 cp
El comando en la AWS Command-Line Interface (CLI) puede actualizar los permisos en un archivo cuando se copia con el mismo nombre. Sin embargo, para activar esto, también debe actualizar algo más, de lo contrario, obtendrá este error:
Esta solicitud de copia es ilegal porque intenta copiar un objeto a sí mismo sin cambiar los metadatos, la clase de almacenamiento, la ubicación de redireccionamiento del sitio web o los atributos de cifrado del objeto.
Por tanto, los permisos se pueden actualizar con este comando:
aws s3 cp s3://my-bucket/ s3://my-bucket/ --recursive --acl bucket-owner-full-control --metadata "One=Two"
- Debe ser ejecutado por un usuario de Cuenta A que tenga permisos de acceso a los objetos (por ejemplo, el usuario que originalmente copió los objetos en el Depósito B)
- El contenido de los metadatos no es importante, pero es necesario para forzar la actualización.
-
--acl bucket-owner-full-control
otorgará permiso a la cuenta B para que pueda usar los objetos con normalidad
Resultado final: ¡Un cubo que puedes usar!
aws s3 cp s3://account1/ s3://accountb/ --recursive --acl bucket-owner-full-control
Para configurar correctamente los permisos adecuados para los archivos recién agregados, agregue esta política de depósito:
[...]
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::123456789012::user/their-user"
},
"Action": [
"s3:PutObject",
"s3:PutObjectAcl"
],
"Resource": "arn:aws:s3:::my-bucket/*"
}
Y configure ACL para archivos recién creados en código. Ejemplo de Python:
import boto3
client = boto3.client('s3')
local_file_path="/home/me/data.csv"
bucket_name="my-bucket"
bucket_file_path="exports/data.csv"
client.upload_file(
local_file_path,
bucket_name,
bucket_file_path,
ExtraArgs={'ACL':'bucket-owner-full-control'}
)
fuente: https://medium.com/artificial-industry/how-to-download-files-that-others-put-in-your-aws-s3-bucket-2269e20ed041 (descargo de responsabilidad: escrito por mí)