Amazon Cloudfront con S3. Acceso denegado

91

Estamos tratando de distribuir los cubos S3 a través de Cloudfront, pero por alguna razón la única respuesta es un documento XML AccessDenied como el siguiente:

<Error>
    <Code>AccessDenied</Code>
    <Message>Access Denied</Message>
    <RequestId>89F25EB47DDA64D5</RequestId>
    <HostId>Z2xAduhEswbdBqTB/cgCggm/jVG24dPZjy1GScs9ak0w95rF4I0SnDnJrUKHHQC</HostId>
</Error>

Aquí está la configuración que estamos usando:

Configuraciones de distribución Configuraciones de origen

Y aquí está la política para el cubo

{
    "Version": "2008-10-17",
    "Id": "PolicyForCloudFrontPrivateContent",
    "Statement": [
        {
            "Sid": "1",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity *********"
            },
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::x***-logos/*"
        }
    ]
}
Jordan Adams
fuente
Configuración de comportamiento de caché - imgur.com/JBZqrRm
Jordan Adams
Asegúrese de que Cloudfront pueda leer desde el bucket de S3.
Nathan C
¿Cómo habilitaría o verificaría esto?
Jordan Adams
Configuración de origen, última opción. Mira tu captura de pantalla. :)
Nathan C
Creo que intenté esto antes y no funcionó, pero lo he cambiado nuevamente y está en proceso de distribución. Agregaré la política del cubo a mi publicación :)
Jordan Adams

Respuestas:

91

Si accede a la raíz de su distribución de CloudFront, debe establecer un objeto raíz predeterminado: http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/DefaultRootObject.html

Para especificar un objeto raíz predeterminado utilizando la consola de CloudFront:

  • Inicie sesión en la consola de administración de AWS y abra la consola de Amazon CloudFront en https://console.aws.amazon.com/cloudfront/ .

  • En la lista de distribuciones en el panel superior, seleccione la distribución para actualizar.

  • En el panel Detalles de distribución , en la pestaña General , haga clic en Editar .

  • En el cuadro de diálogo Editar distribución , en el campo Objeto raíz predeterminado , ingrese el nombre del archivo del objeto raíz predeterminado.

    Ingrese solo el nombre del objeto, por ejemplo index.html,. No agregue un / antes del nombre del objeto.

  • Para guardar sus cambios, haga clic en Sí, Editar .

Kousha
fuente
En mi caso, esta configuración no ha resuelto el problema. Todavía recibo el error de acceso denegado
KurioZ7
53

Acabo de tener el mismo problema y, si bien la respuesta de Kousha resuelve el problema de index.html en la ruta raíz, mi problema también fue con los subdirectorios, ya que usé los combinados con index.html para obtener "urls bonitas" (ejemplo .com / something / en lugar de "feo" example.com/something.html)

En parte, también es culpa de Amazon, porque cuando configura la distribución de CloudFront, le ofrecerá cubetas S3 para elegir, pero si elige una de ellas, usará la URL de la cubeta en lugar de la URL estática de alojamiento del sitio web como back-end.

Entonces, para solucionar el problema:

  • Habilite el alojamiento de sitios web estáticos para el depósito
  • Establezca el documento de índice (y quizás error ) de forma adecuada
  • Copiar URL de punto final : puede encontrarlo junto a la configuración anterior. Debería tener un aspecto similar a: <bucket.name> .s3-website- <aws-region> .amazonaws.com
  • Use esa URL como su origen de distribución de CloudFront. (Esto también hará que la configuración del Objeto raíz predeterminado de CF sea innecesaria, pero no está de más establecerla de todos modos)
Miroslav
fuente
Respuesta perfecta a la fecha de este comentario.
Sai Ramachandran
Eso fue para mí también. Ya tenía otro sitio web funcionando y pensé que había configurado el nuevo de manera idéntica. Tan fácil pasar por alto esto.
Günther Eberl
También debe agregar permisos públicos GetObject y ListObjects al depósito.
Georges
8

Tuve el mismo problema que @Cezz, aunque la solución no funcionaría en mi caso.

Tan pronto como se habilite el alojamiento de sitios web estáticos para el depósito, significa que los usuarios pueden acceder al contenido a través de la URL de Cloudfront o la URL de S3, lo que no siempre es deseable. Por ejemplo, en mi caso, la distribución de Cloudfront está habilitada para SSL, y los usuarios no deberían poder acceder a ella a través de una conexión que no sea SSL.

La solución que encontré fue:

  • mantener el alojamiento web estático deshabilitado en el bucket de S3
  • mantener el origen de distribución de Cloudfront como un ID de S3
  • establezca "Restringir el acceso al depósito" a "Sí" (y para facilitar, permita que CloudFront actualice automáticamente la política del depósito)
  • en "Páginas de error", cree una respuesta personalizada y asigne el código de error "403: Prohibido" a la página de respuesta deseada, es decir /index.html, con un código de respuesta de 200

Sin embargo, tenga en cuenta que, en mi caso, estoy sirviendo una aplicación de JavaScript de una sola página donde todas las rutas se resuelven mediante index.html. Si tiene rutas que se resuelven a diferentes objetos en su depósito S3, esto no funcionará.

Jonny Green
fuente
1
Gracias por tu respuesta. Este me funcionó. Yo tenía el mismo problema que tú. No quería que las personas accedan a mi bucket de S3, por lo que necesitaba restringir el acceso al origen de S3, que solo funciona cuando se completa el origen según lo sugerido por el autocompletado en Cloudfront. Sin embargo, una nota al margen, no tiene que deshabilitar el alojamiento de sitios web estáticos. Simplemente eliminar la política de cubo que permite el acceso público es suficiente.
Torsten
Esto fue realmente útil, el mensaje prohibido proviene de S3 del que no me di cuenta al principio, por lo que debe captarlo con una página de error personalizada para que su SPA funcione.
Ivan
4

En mi caso, estaba usando orígenes múltiples con comportamientos de "Patrón de ruta" junto con una Ruta de origen en mi bucket S3:

Mala configuración:

Comportamiento CloudFront: /images/*->My-S3-origin

My-S3-origin: Ruta de origen: /images

Archivos S3: /images/my-image.jpg

Solicitud GET: /images/my-image.jpg -> 403

Lo que estaba sucediendo era que toda la solicitud GET de CloudFront se enviaba al origen: con el /image/my-image.jpgprefijo Ruta de origen: /imagespor lo que la solicitud en S3 parece /images/images/my-image.jpgque no existe.

Solución

eliminar Ruta de origen.

Esto me permitió acceder al depósito con una identidad de acceso de origen y permisos de depósito y permisos de archivos individuales restringidos.

Scott Jungwirth
fuente
1

En mi caso, configuré la ruta 53 incorrectamente. Creé un Alias ​​en mi dominio, pero lo apunté al S3 Bucket en lugar de a la distribución de CloudFront.

También omití el objeto raíz predeterminado. La consola realmente podría mejorarse si agregan un poco de información al texto del signo de interrogación sobre las posibles consecuencias de omitirla.

toon81
fuente