Estoy buscando una manera de agregar mediante programación metadatos específicos a un conjunto de objetos S3. Recientemente actualicé el código en mi proyecto para configurar el 'Control de caché: edad máxima' y 'Caduca' al cargar objetos en S3, pero ahora estoy tratando de configurar esos valores para mis objetos S3 existentes. No quiero que cambie nada más, como la ACL o cualquier otro metadato.
Intenté usar la AWS CLI para lograr esto, pero me encontré con un par de problemas. Mi depósito tiene objetos públicos y no públicos, por lo que no puedo configurar la ACL en "lectura pública". Quiero que la ACL permanezca sin cambios, pero si no configuro nada, todos se vuelven privados. Además, quiero agregar metadatos, pero mantener intactos los metadatos existentes. Aquí está la llamada cli que había intentado:
aws s3 cp s3://my-bucket s3://my-bucket --acl public-read --recursive --metadata-directive=REPLACE --cache-control max-age=2592000 --expires 'Wed, 29 July 2020 00:00:01 GMT'
Estoy usando el SDK de PHP de AWS, pero estoy abierto a otros métodos.
Para mantener los mismos metadatos, intenté usar headObject para obtener datos de encabezado existentes... pero devuelve muchos valores. Puedo iterar sobre ellos, pero no sé cuáles necesitaría volver a configurar para mantener todo.
Para mantener la misma ACL, intenté usar getObjectAcl seguido de putObjectAcl ... pero estoy bastante seguro de que esto no funcionará en todos los casos (estoy bastante seguro de que mi lógica para establecer el valor de ACL como public-read o private no es lo suficientemente robusto para todos los casos...).
$acl_result = $s3->getObjectAcl([ 'Bucket' => $bucket, 'Key' => $object_key ]); $grants = $acl_result->get('Grants'); $owner = $acl_result->get('Owner'); ... $public = false; foreach($grants as $grant){ if(isset($grant['Grantee']['URI']) && $grant['Grantee']['URI'] == 'http://acs.amazonaws.com/groups/global/AllUsers' && $grant['Permission'] == 'READ'){ $public = true; } } $object = [ 'Bucket' => $bucket, 'Key' => $object_key, 'ACL' => ($public ? 'public-read' : 'private'), 'AccessControlPolicy' => [ 'Owner' => $owner, 'Grants' => $grants, ], ]; $s3->putObjectAcl($object);Cualquier ayuda es apreciada. ¡Gracias!