2012-02-11 16 views
38

¿Cómo se vuelve a hacer privada una carpeta pública AWS S3?S3: hacer una carpeta pública privada de nuevo?

Estaba probando algunos datos de etapas, así que publiqué toda la carpeta en un cubo. Me gustaría restringir su acceso nuevamente. Entonces, ¿cómo puedo hacer que la carpeta sea privada nuevamente?

+1

usted puede hacer esto witin la consola de gestión o por API programática – ascobol

+4

Que es lo que pensé, pero parece que no puedo encontrar la opción dentro de la consola. Parece ridículo tener que usar una API para hacer algo tan aparentemente importante. – GoodGets

+1

De hecho, la consola solo le permite eliminar el archivo de concesión en un archivo. Vea mi respuesta detallada de cómo hacer esto en Python. – ascobol

Respuesta

28

Por lo que entiendo, la opción 'Hacer público' en la consola de gestión agrega recursivamente una concesión pública para cada objeto 'en' el directorio. Puede ver esto haciendo clic derecho en un archivo, luego haga clic en 'Propiedades'. A continuación, deberá hacer clic en 'Permisos' y no debe haber una línea:

Grantee: Everyone [x] open/download [] view permissions [] edit permission. 

Si se carga un nuevo archivo en este directorio que no tiene este conjunto de acceso público y por lo tanto sea privada.

Debe eliminar el permiso de lectura pública uno por uno, ya sea manualmente si solo tiene unas pocas teclas o si usa una secuencia de comandos.

escribí un pequeño script en Python con el módulo 'boto' para eliminar de forma recursiva el atributo 'público de lectura' de todas las claves en una carpeta S3:

#!/usr/bin/env python 
#remove public read right for all keys within a directory 

#usage: remove_public.py bucketName folderName 

import sys 
import boto 

bucketname = sys.argv[1] 
dirname = sys.argv[2] 
s3 = boto.connect_s3() 
bucket = s3.get_bucket(bucketname) 

keys = bucket.list(dirname) 

for k in keys: 
    new_grants = [] 
    acl = k.get_acl() 
    for g in acl.acl.grants: 
     if g.uri != "http://acs.amazonaws.com/groups/global/AllUsers": 
      new_grants.append(g) 
    acl.acl.grants = new_grants 
    k.set_acl(acl) 

he comprobado en una carpeta con (sólo) 2 objetos y funcionó. Si tiene lotes de claves, puede tomar algún tiempo completarlas y puede ser necesario un enfoque paralelo.

+14

Respondió mi pregunta, así que acepté su respuesta. Sin embargo, esto apesta a la parte de Amazon. Tenemos que escribir guiones para hacer las cosas privadas otra vez? Simplemente terrible. ascobol, gracias por su ayuda – GoodGets

9

De hecho, me utilizaron la interfaz de usuario de Amazon siguiendo esta guía http://aws.amazon.com/articles/5050/

although it looks somewhat different than that guide

+0

Las instrucciones @ https://aws.amazon.com/articles/5050/ parecen estar desactualizadas ... desde 2011. No tengo la opción de entrar en "Propiedades "en mi cubo. El script de Python puede ser el único camino ahora :( –

43

La respuesta aceptada funciona bien - parece establecer ACL de forma recursiva en un camino s3 dado también. Sin embargo, esto también se puede hacer más fácilmente con una herramienta de terceros llamada s3cmd: la usamos mucho en mi empresa y parece ser bastante popular dentro de la comunidad de AWS.

Por ejemplo, supongamos que tiene este tipo de estructura de bucket y dir s3: s3://mybucket.com/topleveldir/scripts/bootstrap/tmp/. Supongamos ahora que ha marcado todo el «directorio» scripts como público utilizando la consola de Amazon S3.

Ahora para hacer todo el scripts "árbol de directorios" de forma recursiva (es decir, incluyendo los subdirectorios y sus archivos) privada de nuevo:

s3cmd setacl --acl-private --recursive s3://mybucket.com/topleveldir/scripts/ 

También es fácil hacer la scripts "árbol de directorios" de forma recursiva pública de nuevo si que desee:

s3cmd setacl --acl-public --recursive s3://mybucket.com/topleveldir/scripts/ 

también puede optar por establecer el permiso/ACL sólo en un "directorio" s3 dado (es decir, no de forma recursiva) por la simple emisión --recursive en los comandos anteriores.

Para s3cmd a trabajar, primero tiene que proporcionar el acceso de AWS y claves secretas a través de s3cmd s3cmd --configure (ver http://s3tools.org/s3cmd para más detalles).

+1

Estoy usando s3cmd 1.6.1 y esta sugerencia no funcionará si ya tiene 'private' en una carpeta. En nuestro caso, teníamos configuración pública y privada y configuración en privado a través de s3cmd, no elimina 'público'. Dejando aquí una nota para otros usuarios. Aquí está el resultado con --verbose - "ya sea Privado, omitiendo" – sumit

+0

¿Cómo se vería esto con material de expresiones genéricas como 's3cmd --access_key $ AWS_ACCESS_KEY_ID --secret_key $ AWS_SECRET_ACCESS_KEY setacl --acl-private -r s3: // $ S3_BUCKET_NAME/*. Map'? – metanerd

1

A partir de ahora, de acuerdo con el boto docs puede hacerlo de esta manera

#!/usr/bin/env python 
#remove public read right for all keys within a directory 

#usage: remove_public.py bucketName folderName 

import sys 
import boto 

bucketname = sys.argv[1] 
dirname = sys.argv[2] 
s3 = boto.connect_s3() 
bucket = s3.get_bucket(bucketname) 

keys = bucket.list(dirname) 

for k in keys: 
    # options are 'private', 'public-read' 
    # 'public-read-write', 'authenticated-read' 
    k.set_acl('private') 

También, usted puede considerar para eliminar cualquier política de cubo con permisos ficha de depósito de S3.

4

Para AWS CLI, es bastante sencillo.

Si el objeto es: s3://<bucket-name>/file.txt

Para único objeto:

aws s3api put-object-acl --acl private --bucket <bucket-name> --key file.txt 

Para todos los objetos en el cubo (fiesta de una sola línea):

aws s3 ls --recursive s3://<bucket-name> | cut -d' ' -f5- | awk '{print $NF}' | while read line; do 
    echo "$line" 
    aws s3api put-object-acl --acl private --bucket <bucket-name> --key "$line" 
done 
+1

funciona bien, gracias – DanH

Cuestiones relacionadas