¿Cómo buscas un cubo amazon s3?

Respuestas:

31

S3 no tiene una "búsqueda en este depósito" nativa ya que se desconoce el contenido real; además, dado que S3 se basa en clave / valor, no hay una forma nativa de acceder a muchos nodos a la vez, más almacenes de datos tradicionales que ofrecen un (SELECT * FROM ... WHERE ...) (en un SQL modelo).

Lo que tendrá que hacer es realizar ListBucketuna lista de objetos en el depósito y luego iterar sobre cada elemento que realice una operación personalizada que implemente, que es su búsqueda.

Cody Caughlan
fuente
42
Este ya no es el caso. Vea la respuesta de Rhonda a continuación: Rhonda a stackoverflow.com/a/21836343/1101095
Nate
11
Para todos los votantes del comentario anterior: el OP no indica si desean buscar los nombres de archivo o el contenido clave (por ejemplo, el contenido del archivo). Entonces la respuesta de @ rhonda aún podría no ser suficiente. Parece que, en última instancia, este es un ejercicio que le queda al consumidor, ya que el uso de la consola S3 apenas está disponible para los usuarios de su aplicación y los usuarios generales. Básicamente solo se refiere al propietario del depósito y / o los roles de IAM.
Cody Caughlan
¿Existe algún servicio de indexación como lucene.net para indexar estos documentos de depósito?
Munavvar
Seguí volviendo a esta respuesta y construí una herramienta para ayudar: bucketsearch.net - permite la búsqueda con comodines, etc.
Jon M
251

Solo una nota para agregar aquí: ahora es 3 años después, sin embargo, esta publicación está en la parte superior de Google cuando escribe "Cómo buscar un S3 Bucket".

Quizás esté buscando algo más complejo, pero si aterrizó aquí tratando de encontrar la manera de encontrar un objeto (archivo) simplemente por su título, es una locura simple:

abra el depósito, seleccione "ninguno" en el lado derecho y comience a escribir el nombre del archivo.

http://docs.aws.amazon.com/AmazonS3/latest/UG/ListingObjectsinaBucket.html

Rhonda Bradley
fuente
43
Esto es exactamente lo que estaba buscando. Terrible diseño de experiencia de usuario para tener cero señales visuales
Keith Entzeroth
2
Necesita seleccionar un archivo en el depósito y luego comenzar a escribir.
cabe56
30
Todavía solo le permite buscar por el prefijo del nombre del elemento.
Daniel Flippance
21
¡Esto es absolutamente irritante! La gente habla de algo en el lado derecho o un cuadro amarillo, pero no puedo encontrar nada. El mismo mensaje "Escriba un prefijo ...". ¿Cómo es que "Buscar cubo" no es el predeterminado? Es casi como imposible de descubrir como el software de Atlassian ...
vegather
40
¿Esta respuesta sigue vigente? No veo ningún "" ninguno "en el lado derecho" y el enlace de documentación en la respuesta ahora reenvía a una página diferente.
BiscuitBaker
112

Aquí hay una manera corta y fea de buscar nombres de archivos con la CLI de AWS :

aws s3 ls s3://your-bucket --recursive | grep your-search | cut -c 32-
Abe Voelker
fuente
1
aws s3 ls s3: // su cubo - recursivo | grep your-search Fue lo suficientemente bueno para mi búsqueda, gracias Abe Voelker.
man.2067067
3
Todos los cubos: aws s3 ls | awk '{print $ 3}' | mientras lee la línea; hacer eco $ line; aws s3 ls s3: // $ line --recursive | grep tu búsqueda; hecho
Akom
1
lo que es de corte -C 32 sin que esto también está trabajando buscar
Sunil
1
cut -c 32-simplemente corta la información de marca de tiempo y tamaño de archivo de la salida, que en mi sistema ocupa 32 caracteres. No lo necesita, pero si está canalizando la salida en otro comando, puede ser útil tener una salida "limpia".
Abe Voelker
CLI apoya include/exclude. Entonces,aws s3 ls s3://bucket --recursive --exclude '*' --include 'myfile*'
Mohnish
25

Hay (al menos) dos casos de uso diferentes que podrían describirse como "buscar en el depósito":

  1. Busque algo dentro de cada objeto almacenado en el cubo; esto supone un formato común para todos los objetos en ese depósito (por ejemplo, archivos de texto), etc. Para algo como esto, se ve obligado a hacer lo que Cody Caughlan acaba de responder. Los documentos de AWS S3 tienen un código de ejemplo que muestra cómo hacer esto con AWS SDK para Java: Listado de claves usando AWS SDK para Java (allí también encontrará ejemplos de PHP y C #).

  2. Elemento de la lista Busque algo en las claves de objeto contenidas en ese depósito; S3 hace tener parcial apoyo a esta, en la forma de permitir prefijo coincidencias exactas + colapso de partidos después de un delimitador. Esto se explica con más detalle en la Guía del desarrollador de AWS S3 . Esto permite, por ejemplo, implementar "carpetas" mediante el uso de claves de objeto como

    carpeta / subcarpeta / archivo.txt
    Si sigue esta convención, la mayoría de las GUI de S3 (como la consola de AWS) le mostrarán una vista de carpeta de su bucket.

Eduardo Pareja Tobes
fuente
documentos para usar el prefijo en rubí
James
22

AWS lanzó un nuevo servicio para consultar cubos S3 con SQL: Amazon Athena https://aws.amazon.com/athena/

hellomichibye
fuente
2
argh ... entiendo ... "Athena no está disponible en el oeste de EE. UU. (norte de California). Seleccione otra región".
Clintm
2
Es una sobrecarga con todas estas consultas SQL teniendo en cuenta que solo quería grep
Ali Gajani
44
@Clintm - cambie a us-east-1 (N. Virginia)
slocumro
21

Existen múltiples opciones, ninguna de las cuales es una solución de texto completo de "una sola toma":

  1. Búsqueda de patrón de nombre de clave : búsqueda de claves que comienzan con alguna cadena; si diseña los nombres de clave con cuidado, entonces puede tener una solución bastante rápida.

  2. Buscar metadatos adjuntos a las claves : al publicar un archivo en AWS S3, puede procesar el contenido, extraer información meta y adjuntar esta información meta en forma de encabezados personalizados en la clave. Esto le permite recuperar nombres de clave y encabezados sin necesidad de recuperar contenido completo. La búsqueda tiene que hacerse secuencialmente, no hay una opción de búsqueda "sql like" para esto. Con archivos grandes, esto podría ahorrar mucho tráfico de red y tiempo.

  3. Almacenar metadatos en SimpleDB : como punto anterior, pero almacenando los metadatos en SimpleDB. Aquí tienes declaraciones tipo sql like select. En el caso de grandes conjuntos de datos, puede alcanzar los límites de SimpleDB, que pueden superarse (metadatos de partición en múltiples dominios de SimpleDB), pero si llega muy lejos, es posible que necesite usar otro tipo de base de datos de metedata.

  4. Búsqueda secuencial de texto completo del contenido: procesando todas las claves una por una. Muy lento, si tiene demasiadas claves para procesar.

Estamos almacenando 1440 versiones de un archivo al día (una por minuto) durante un par de años, usando un cubo versionado, es fácilmente posible. Pero obtener una versión anterior lleva tiempo, ya que uno tiene que ir secuencialmente versión por versión. En algún momento utilizo un índice CSV simple con registros, que muestra el tiempo de publicación más la identificación de la versión, y teniendo esto, podría saltar a la versión anterior con bastante rapidez.

Como puede ver, AWS S3 no está diseñado para búsquedas de texto completo, es un servicio de almacenamiento simple.

Jan Vlcinsky
fuente
4

Buscar por prefijo en la consola S3

directamente en la vista de la consola de AWS.

ingrese la descripción de la imagen aquí

Copie los archivos deseados utilizando s3-dist-cp

Cuando tiene miles o millones de archivos, otra forma de obtener los archivos deseados es copiarlos en otra ubicación utilizando la copia distribuida . Ejecuta esto en EMR en un trabajo de Hadoop. Lo bueno de AWS es que proporcionan su versión S3 personalizada s3-dist-cp . Le permite agrupar archivos deseados utilizando una expresión regular en el campo groupBy. Puede usar esto, por ejemplo, en un paso personalizado en EMR

[
    {
        "ActionOnFailure": "CONTINUE",
        "Args": [
            "s3-dist-cp",
            "--s3Endpoint=s3.amazonaws.com",
            "--src=s3://mybucket/",
            "--dest=s3://mytarget-bucket/",
            "--groupBy=MY_PATTERN",
            "--targetSize=1000"
        ],
        "Jar": "command-runner.jar",
        "Name": "S3DistCp Step Aggregate Results",
        "Type": "CUSTOM_JAR"
    }
]
H6.
fuente
Parece que la vista del depósito de la consola de AWS no va archivo por archivo aplicando un filtro. Es capaz de devolver resultados extremadamente rápidos siempre que una subcadena de los archivos que estoy buscando. ¿Hay un cliente / herramienta / API que pueda usar que no sea la consola de AWS para obtener los resultados en el mismo momento oportuno? @ high6. En el pasado, intenté usar boto, pero el mejor enfoque parecía ser iterar todo el cubo aplicando sus criterios de búsqueda a cada nombre de archivo. ES DECIR. extremadamente lento
copiar y pegar el
4

Si está en Windows y no tiene tiempo para encontrar una buena grepalternativa, una forma rápida y sucia sería:

aws s3 ls s3://your-bucket/folder/ --recursive > myfile.txt

y luego haga una búsqueda rápida en myfile.txt

El bit de "carpeta" es opcional.

PD: si no tiene la CLI de AWS instalada, aquí hay una línea con el administrador de paquetes Chocolatey

choco install awscli

PPS Si no tiene el administrador de paquetes Chocolatey, ¡consígalo! Tu vida en Windows será 10 veces mejor. (No estoy afiliado a Chocolatey de ninguna manera, pero bueno, es algo imprescindible, de verdad).

Alex
fuente
Si el usuario puede instalar chows awscli, puede instalar grep, ¿no? ¿O usar el hallazgo nativo de Windows?
Dean Radcliffe el
2

Dado que está en AWS ... Creo que le gustaría usar sus herramientas de CloudSearch. Ponga los datos que desea buscar en su servicio ... haga que apunten a las teclas S3.

http://aws.amazon.com/cloudsearch/

Andrew Siemer
fuente
77
Realmente no es lo que estaba buscando el OP
Clintm
para mí significaría guardar todos los datos - duplicación de datos
BG Bruno
1

Otra opción es reflejar el bucket S3 en su servidor web y recorrerlo localmente. El truco es que los archivos locales están vacíos y solo se usan como esqueleto. Alternativamente, los archivos locales pueden contener metadatos útiles que normalmente necesitaría obtener de S3 (por ejemplo, tamaño de archivo, tipo MIME, autor, marca de tiempo, uuid). Cuando proporcione una URL para descargar el archivo, busque localmente y proporcione un enlace a la dirección S3.

Recorrer archivos locales es fácil y este enfoque para la administración de S3 es independiente del lenguaje. Recorrer archivos locales también evita mantener y consultar una base de datos de archivos o retrasos al realizar una serie de llamadas API remotas para autenticar y obtener el contenido del depósito.

Puede permitir que los usuarios carguen archivos directamente a su servidor a través de FTP o HTTP y luego transferir un lote de archivos nuevos y actualizados a Amazon en las horas pico, simplemente recurriendo a los directorios para archivos de cualquier tamaño. Al completar la transferencia de un archivo a Amazon, reemplace el archivo del servidor web con uno vacío del mismo nombre. Si un archivo local tiene algún tamaño de archivo, sírvalo directamente porque está esperando la transferencia por lotes.

Dylan Valade
fuente
Gran manera de explotar el espacio de almacenamiento de su nodo en un disco EXTFS2 / 3 si tiene millones de archivos en su bucket S3 ...
tpartee
1

La forma en que lo hice es: tengo miles de archivos en s3. Vi el panel de propiedades de un archivo en la lista. Puede ver el URI de ese archivo y lo copié y lo pegué en el navegador: era un archivo de texto y se renderizó muy bien. Ahora reemplacé el uuid en la url con el uuid que tenía a mano y ahí está el archivo.

Desearía que AWS tuviera una mejor manera de buscar un archivo, pero esto funcionó para mí.

Rosa
fuente
1

Prueba este comando:

aws s3api list-objects --bucket your-bucket --prefix sub-dir-path --output text --query 'Contents[].{Key: Key}'

Luego puede canalizar esto en un grep para obtener tipos de archivos específicos para hacer lo que quiera con ellos.

Robert Evans
fuente
1
Nota: --output textespecifica que la salida será texto plano, no JSON, etc. y --query 'Contents[].{Key: Key, Size: Size}'simplemente filtra la salida de la lista al nombre y tamaño del archivo. No busca Key: Keyni nada por el estilo.
Matt
1

Lo intenté de la siguiente manera

aws s3 ls s3://Bucket1/folder1/2019/ --recursive |grep filename.csv

Esto genera la ruta real donde existe el archivo

2019-04-05 01:18:35     111111 folder1/2019/03/20/filename.csv
Dheeraj
fuente
1

Este es un hilo un poco viejo, pero tal vez ayude a alguien que todavía busca, soy yo quien lo busca por un año.

La solución puede ser " AWS Athena ", donde puede buscar datos como este

'SELECT user_name FROM S3Object WHERE cast(age as int) > 20'

https://aws.amazon.com/blogs/developer/introducing-support-for-amazon-s3-select-in-the-aws-sdk-for-javascript/

El precio actual es de $ 5 por datos de 1 TB , por ejemplo, si su consulta busca en un archivo de 1 TB 3 veces su costo es de $ 15, pero por ejemplo si solo hay 1 columna en "formato de columna convertida" que quiere leer, pagará 1 / 3 del precio significa $ 1.67 / TB.

BG Bruno
fuente
No parece ser factible para ninguna aplicación que requiera una búsqueda intensiva ya que el costo es bastante alto ...
tnkh
@tnkh Estoy de acuerdo - Me gustaría tener más opciones con # s3 también
BG Bruno
0

Hice algo como a continuación para encontrar patrones en mi cubo

def getListOfPrefixesFromS3(dataPath: String, prefix: String, delimiter: String, batchSize: Integer): List[String] = {
    var s3Client = new AmazonS3Client()
    var listObjectsRequest = new ListObjectsRequest().withBucketName(dataPath).withMaxKeys(batchSize).withPrefix(prefix).withDelimiter(delimiter)
    var objectListing: ObjectListing = null
    var res: List[String] = List()

    do {
      objectListing = s3Client.listObjects(listObjectsRequest)
      res = res ++ objectListing.getCommonPrefixes
      listObjectsRequest.setMarker(objectListing.getNextMarker)
    } while (objectListing.isTruncated)
    res
  }

Para cubos más grandes, esto consume demasiado tiempo ya que todos los resúmenes de objetos son devueltos por Aws y no solo los que coinciden con el prefijo y el delimitador. Estoy buscando formas de mejorar el rendimiento y hasta ahora solo he descubierto que debería nombrar las claves y organizarlas en cubos correctamente.

Raghvendra Singh
fuente
0

Me enfrenté al mismo problema. Buscar en S3 debería ser mucho más fácil que la situación actual. Es por eso que implementé esta herramienta de código abierto para buscar en S3.

BÚSQUEDA es una herramienta de búsqueda completa de código abierto S3. Se ha implementado siempre teniendo en cuenta que el rendimiento es el factor crítico y, de acuerdo con los puntos de referencia, busca el depósito que contiene ~ 1000 archivos en segundos.

La instalación es simple. Solo descarga el archivo docker-compose y lo ejecuta con

docker-compose up

SSEARCH se iniciará y puede buscar cualquier cosa en cualquier bucket que tenga.

Arda Güçlü
fuente
0

Avancemos rápidamente hasta 2020, y usando aws-okta como nuestro 2fa, el siguiente comando, mientras que lento para recorrer todos los objetos y carpetas en este cubo en particular (+270,000) funcionó bien.

aws-okta exec dev -- aws s3 ls my-cool-bucket --recursive | grep needle-in-haystax.txt
jamescampbell
fuente
0

Use Amazon Athena para consultar el bucket de S3. Además, cargue datos en la búsqueda de Amazon Elastic. Espero que esto ayude.

Pregúnteme
fuente
0

No es una respuesta técnica, pero he creado una aplicación que permite la búsqueda con comodines: https://bucketsearch.net/

Indexará asincrónicamente su bucket y luego le permitirá buscar los resultados.

Es de uso gratuito (donationware).

Jon M
fuente