amazon-s3 - descargar - subir archivos aws
Cómo hacer 10,000 archivos en S3 público (8)
Echa un vistazo a BucketExplorer , gestiona muy bien las operaciones masivas y es un sólido cliente S3.
Tengo una carpeta en un cubo con 10,000 archivos. Parece que no hay forma de subirlos y hacerlos públicos inmediatamente. Así que los subí a todos, son privados, y necesito hacerlos públicos.
Probé la consola Aws, solo da un error (funciona bien con las carpetas con menos archivos).
Intenté usar la organización de S3 en Firefox, lo mismo.
¿Hay algún software o script que pueda ejecutar para que todo esto sea público?
Me necesité esto, pero la cantidad de archivos hace que sea más lento hacerlo en serie. Así que escribí un script que lo hace en el servicio iron.io de IronWorker Sus 500 horas de computación gratuitas por mes son suficientes para manejar incluso grandes cantidades (y si excede eso, el precio es razonable). Dado que se realiza en paralelo, se completa en menos de un minuto para los 32,000 objetos que tenía. También creo que sus servidores se ejecutan en EC2 por lo que la comunicación entre el trabajo y S3 es rápida.
Cualquiera puede usar mi script para sus propias necesidades.
Pensarías que harían público leer el comportamiento predeterminado, ¿no? :) Compartí tu frustración al crear una API personalizada para interactuar con S3 desde una solución C #. Aquí está el fragmento que logra cargar un objeto S3 y configurarlo para acceso de lectura pública por defecto:
public void Put(string bucketName, string id, byte[] bytes, string contentType, S3ACLType acl) {
string uri = String.Format("https://{0}/{1}", BASE_SERVICE_URL, bucketName.ToLower());
DreamMessage msg = DreamMessage.Ok(MimeType.BINARY, bytes);
msg.Headers[DreamHeaders.CONTENT_TYPE] = contentType;
msg.Headers[DreamHeaders.EXPECT] = "100-continue";
msg.Headers[AWS_ACL_HEADER] = ToACLString(acl);
try {
Plug s3Client = Plug.New(uri).WithPreHandler(S3AuthenticationHeader);
s3Client.At(id).Put(msg);
} catch (Exception ex) {
throw new ApplicationException(String.Format("S3 upload error: {0}", ex.Message));
}
}
La función ToACLString (acl) devuelve public-read , BASE_SERVICE_URL es s3.amazonaws.com y la constante AWS_ACL_HEADER es x-amz-acl . Es probable que el complemento y las cosas de DreamMessage te resulten extrañas, ya que estamos utilizando el marco Dream para simplificar nuestras comunicaciones http. Esencialmente, estamos haciendo un HTTP PUT con los encabezados especificados y una firma de encabezado especial según las especificaciones de aws (consulte esta página en los documentos Aws para ver ejemplos de cómo construir el encabezado de autorización).
Para cambiar una ACL existente de 1000 objetos, podría escribir una secuencia de comandos, pero probablemente sea más fácil usar una herramienta GUI para solucionar el problema inmediato. Lo mejor que he usado hasta ahora es de una compañía llamada cloudberry para S3; parece que tienen una prueba gratuita de 15 días para al menos uno de sus productos. Acabo de verificar que le permitirá seleccionar múltiples objetos a la vez y establecer su ACL en público a través del menú contextual. Disfruta la nube!
Puede generar una política de depósito (ver ejemplo a continuación) que da acceso a todos los archivos en el depósito. La política de depósito se puede agregar a un depósito a través de la consola de AWS.
{
"Id": "...",
"Statement": [ {
"Sid": "...",
"Action": [
"s3:GetObject"
],
"Effect": "Allow",
"Resource": "arn:aws:s3:::bucket/*",
"Principal": {
"AWS": [ "*" ]
}
} ]
}
Consulte también la siguiente herramienta generadora de políticas proporcionada por Amazon.
Si está cargando por primera vez, puede establecer que los archivos sean públicos al cargarlos en la línea de comando:
aws s3 sync . s3://my-bucket/path --acl public-read
Tal como se documenta en Uso de los comandos s3 de alto nivel con la interfaz de línea de comandos de AWS
Lamentablemente, solo aplica la ACL cuando se cargan los archivos. No aplica (en mis pruebas) la ACL a los archivos ya cargados.
Si desea actualizar objetos existentes, antes pudo sincronizar el depósito, pero parece que ya no funciona.
[No funciona más] Esto se puede hacer desde la línea de comando:
aws s3 sync s3://my-bucket/path s3://my-bucket/path --acl public-read
(Entonces, esto ya no responde la pregunta, sino que deja la respuesta como referencia, ya que solía funcionar).
Tuve el mismo problema, la solución de @DanielVonFange está desactualizada, ya que la nueva versión de SDK está disponible.
Agregar un fragmento de código que me funciona ahora mismo con AWS Ruby SDK:
require ''aws-sdk''
Aws.config.update({
region: ''REGION_CODE_HERE'',
credentials: Aws::Credentials.new(
''ACCESS_KEY_ID_HERE'',
''SECRET_ACCESS_KEY_HERE''
)
})
bucket_name = ''BUCKET_NAME_HERE''
s3 = Aws::S3::Resource.new
s3.bucket(bucket_name).objects.each do |object|
puts object.key
object.acl.put({ acl: ''public-read'' })
end
Tuve que cambiar varios cientos de miles de objetos. Inicié una instancia de EC2 para ejecutar esto, lo que hace que todo vaya más rápido. Primero querrá instalar la gema aws-sdk
.
Aquí está el código:
require ''rubygems''
require ''aws-sdk''
# Change this stuff.
AWS.config({
:access_key_id => ''YOURS_HERE'',
:secret_access_key => ''YOURS_HERE'',
})
bucket_name = ''YOUR_BUCKET_NAME''
s3 = AWS::S3.new()
bucket = s3.buckets[bucket_name]
bucket.objects.each do |object|
puts object.key
object.acl = :public_read
end