¿Cómo hacer públicos todos los objetos en el bucket de AWS S3 de forma predeterminada?

151

Estoy usando una biblioteca PHP para cargar un archivo en mi bucket. He configurado la ACL en lectura-escritura pública y funciona bien, pero el archivo sigue siendo privado.

Descubrí que si cambio el Beneficiario a Todos hace público el archivo. Lo que quiero saber es cómo hago que el concesionario predeterminado en todos los objetos en mi depósito se establezca en "Todos" . ¿O hay otra solución para hacer públicos los archivos de forma predeterminada?

El código que estoy usando está abajo:

public static function putObject($input, $bucket, $uri, $acl = self::ACL_PRIVATE, $metaHeaders = array(), $requestHeaders = array()) {
    if ($input === false) return false;
    $rest = new S3Request('PUT', $bucket, $uri);

    if (is_string($input)) $input = array(
        'data' => $input, 'size' => strlen($input),
        'md5sum' => base64_encode(md5($input, true))
    );

    // Data
    if (isset($input['fp']))
        $rest->fp =& $input['fp'];
    elseif (isset($input['file']))
        $rest->fp = @fopen($input['file'], 'rb');
    elseif (isset($input['data']))
        $rest->data = $input['data'];

    // Content-Length (required)
    if (isset($input['size']) && $input['size'] >= 0)
        $rest->size = $input['size'];
    else {
        if (isset($input['file']))
            $rest->size = filesize($input['file']);
        elseif (isset($input['data']))
            $rest->size = strlen($input['data']);
    }

    // Custom request headers (Content-Type, Content-Disposition, Content-Encoding)
    if (is_array($requestHeaders))
        foreach ($requestHeaders as $h => $v) $rest->setHeader($h, $v);
    elseif (is_string($requestHeaders)) // Support for legacy contentType parameter
        $input['type'] = $requestHeaders;

    // Content-Type
    if (!isset($input['type'])) {
        if (isset($requestHeaders['Content-Type']))
            $input['type'] =& $requestHeaders['Content-Type'];
        elseif (isset($input['file']))
            $input['type'] = self::__getMimeType($input['file']);
        else
            $input['type'] = 'application/octet-stream';
    }

    // We need to post with Content-Length and Content-Type, MD5 is optional
    if ($rest->size >= 0 && ($rest->fp !== false || $rest->data !== false)) {
        $rest->setHeader('Content-Type', $input['type']);
        if (isset($input['md5sum'])) $rest->setHeader('Content-MD5', $input['md5sum']);

        $rest->setAmzHeader('x-amz-acl', $acl);
        foreach ($metaHeaders as $h => $v) $rest->setAmzHeader('x-amz-meta-'.$h, $v);
        $rest->getResponse();
    } else
        $rest->response->error = array('code' => 0, 'message' => 'Missing input parameters');

    if ($rest->response->error === false && $rest->response->code !== 200)
        $rest->response->error = array('code' => $rest->response->code, 'message' => 'Unexpected HTTP status');
    if ($rest->response->error !== false) {
        trigger_error(sprintf("S3::putObject(): [%s] %s", $rest->response->error['code'], $rest->response->error['message']), E_USER_WARNING);
        return false;
    }
    return true;
}
condo1234
fuente

Respuestas:

299

Vaya a http://awspolicygen.s3.amazonaws.com/policygen.html Complete los detalles como: ingrese la descripción de la imagen aquí En acción seleccione "GetObject" Seleccione "Agregar declaración" Luego seleccione "Generar política"

Copie el ejemplo de texto:

{
  "Id": "Policy1397632521960",
  "Statement": [
    {
      "Sid": "Stmt1397633323327",
      "Action": [
        "s3:GetObject"
      ],
      "Effect": "Allow",
      "Resource": "arn:aws:s3:::bucketnm/*",
      "Principal": {
        "AWS": [
          "*"
        ]
      }
    }
  ]
}

Ahora vaya a su consola AWS S3. En el nivel de depósito, haga clic en Propiedades, Expanda permisos, luego seleccione Agregar política de depósito. Pegue el código generado anteriormente en el editor y presione guardar.

Todos sus artículos en el cubo serán públicos por defecto.

jaxxbo
fuente
8
Esta es la respuesta correcta. A diferencia de la respuesta anterior, esta publicación también me enseñó cómo crear políticas y qué hacen. Después de leer esto, puedo escribir una política manualmente.
Jason Cheladyn
2
Voté esta respuesta por la misma razón que @liyicky, las instrucciones detalladas fueron una buena introducción en lugar de simplemente recibir la respuesta.
Brendo
Igual que aquí. AWS tiende a ser opaco a veces y probablemente por muy buenas razones. Esta forma de respuesta es útil desde la zona cero.
Jerome
Esto funciona cuando agrega nuevos archivos al depósito, pero necesito cambiar los archivos que ya existen en el depósito para que sean públicos.
Radenko Zec
137

Si desea que todos los objetos sean públicos de forma predeterminada, la forma más sencilla es hacerlo a través de una Política de depósito en lugar de las Listas de control de acceso (ACL) definidas en cada objeto individual.

ingrese la descripción de la imagen aquí

Puede usar el Generador de políticas de AWS para generar una política de depósito para su depósito.

Por ejemplo, la siguiente política permitirá que cualquier persona lea cada objeto en su depósito S3 (simplemente reemplácelo <bucket-name>con el nombre de su depósito):

{
  "Id": "Policy1380877762691",
  "Statement": [
    {
      "Sid": "Stmt1380877761162",
      "Action": [
        "s3:GetObject"
      ],
      "Effect": "Allow",
      "Resource": "arn:aws:s3:::<bucket-name>/*",
      "Principal": {
        "AWS": [
          "*"
        ]
      }
    }
  ]
}

La Política de depósito contiene una lista de Statementsy cada declaración tiene un Effect(o Allowo Deny) para una lista de Actionsque son realizados por Principal(el usuario) en el especificado Resource(identificado por un Amazon Resource Nameo ARN).

El Ides sólo un ID de política opcional y el Sides un único ID opcional comunicado.

Para las Políticas de cubo de S3, los ARN de recursos toman la forma:

arn:aws:s3:::<bucket_name>/<key_name>

El ejemplo anterior permite que ( Effect: Allow) cualquiera ( Principal: *) acceda ( Action: s3:GetObject) a cualquier objeto en el depósito ( Resource: arn:aws:s3:::<bucket-name>/*).

dcro
fuente
¿No hay alguna manera con el panel de control?
ianaz
2
@ianaz Puede agregar esta política de depósito a un depósito a través de la consola de AWS (panel de control)
dcro
@ianaz mira mi respuesta a continuación.
jaxxbo
También tenga en cuenta que hay un enlace de "políticas de ejemplo" en el enlace anterior que proporciona la información exacta necesaria para cortar y pegar en el generador de políticas. A medida que aws actualiza las API, es más probable que se mantenga correcto. Funcionó como un encanto para mí esta mañana.
keithpjolley
Principal: *me ayudo mucho. ¡Gracias!
iedmrc
2

Mi problema era ligeramente diferente, pero como esta pregunta está en la parte superior de la búsqueda de Google, dejaré mi solución, tal vez ayude a alguien.

Ya había tenido acceso completo al cubo S3 antes, pero un día comenzó a volver Access Denieda todos mis archivos. La solución fue sencilla y simple.

  1. Ir a Services-S3
  2. Haga clic en su cubo S3
  3. Cambie a la Permissionspestaña, luego vaya a la Bucket Policypestaña
  4. Y haz clic en el Savebotón.

Debería reasignar el permiso en todos sus archivos.

ingrese la descripción de la imagen aquí

De todos modos, aquí está completo lo bucket policyque permite hacer públicos todos los objetos

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowPublicRead",
            "Effect": "Allow",
            "Principal": {
                "AWS": "*"
            },
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::enter-here-your-media-bucket-name/*"
        }
    ]
}
Serhii Popov
fuente