Quiero que mi distribución de Amazon CloudFront envíe registros desde una cuenta de AWS a un bucket de Amazon Simple Storage Service (Amazon S3) que esté en otra cuenta. Sin embargo, recibo un mensaje de error Access Denied (403) cuando intento configurar el destino del registro entre cuentas.
Descripción corta
Para resolver el error "Access Denied" y configurar correctamente el registro entre cuentas, debes conceder permiso a CloudFront para escribir registros en tu bucket de S3.
Importante: Si usas un bucket de S3 en la misma cuenta, no necesitas configurar el registro entre cuentas. CloudFront crea automáticamente la política de bucket de S3 requerida.
Resolución
Nota: Si se muestran errores al ejecutar comandos de la Interfaz de la línea de comandos de AWS (AWS CLI), consulta Solución de problemas de AWS CLI. Además, asegúrate de utilizar la versión más reciente de la AWS CLI.
En la siguiente resolución, la cuenta A es la cuenta en la que se encuentra tu distribución de CloudFront. La cuenta B es la cuenta de destino en la que se encuentra el bucket de S3.
Para configurar el registro entre cuentas y conceder permiso a CloudFront para escribir registros en tu bucket de S3, sigue estos pasos:
- En la cuenta A, configura el registro estándar (v2).
Nota: Se recomienda utilizar el registro estándar (v2) en lugar del registro estándar heredado (v1).
- En la cuenta A, ejecuta el siguiente comando put-delivery-source de la AWS CLI para crear un origen de entrega con tu distribución de CloudFront:
aws logs put-delivery-source \
--name DELIVERY_SOURCE_NAME \
--resource-arn arn:aws:cloudfront::SOURCE_ACCOUNT_ID:distribution/DISTRIBUTION_ID \
--log-type ACCESS_LOGS \
--region us-east-1
Nota: Sustituye DELIVERY_SOURCE_NAME, SOURCE_ACCOUNT_ID, DISTRIBUTION_ID y ACCESS_LOGS por tus valores.
- En la cuenta B, agrega la siguiente política de bucket al bucket de S3 para permitir que la entidad principal del servicio delivery.logs.amazonaws.com cargue los registros:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AWSLogsDeliveryWrite",
"Effect": "Allow",
"Principal": {
"Service": "delivery.logs.amazonaws.com"
},
"Action": "s3:PutObject",
"Resource": "arn:aws:s3:::BUCKET_NAME/PREFIX/*",
"Condition": {
"StringEquals": {
"aws:SourceAccount": "SOURCE_ACCOUNT_ID",
"s3:x-amz-acl": "bucket-owner-full-control"
},
"ArnLike": {
"aws:SourceArn": "arn:aws:logs:us-east-1:SOURCE_ACCOUNT_ID:delivery-source:DELIVERY_SOURCE_NAME"
}
}
}
]
}
Nota: Sustituye BUCKET_NAME, PREFIX, SOURCE_ACCOUNT_ID y DELIVERY_SOURCE_NAME por tus valores.
- En la cuenta B, ejecuta el siguiente comando put-delivery-destination para crear el destino de entrega:
aws logs put-delivery-destination \
--name DELIVERY_DESTINATION_NAME \
--delivery-destination-configuration destinationResourceArn=arn:aws:s3:::BUCKET_NAME/PREFIX \
--region us-east-1
Nota: Sustituye DELIVERY_DESTINATION_NAME, BUCKET_NAME y PREFIX por tus valores. La cuenta B crea una política de destino de entrega en tu nuevo destino de entrega. La política otorga permiso a la cuenta A para crear una entrega de registros.
- Usa tu editor JSON preferido para crear la siguiente política de destino:
{
"Version": "2012-10-17",
"Statement": [{
"Sid": "AllowCreateDelivery",
"Effect": "Allow",
"Principal": {
"AWS": "SOURCE_ACCOUNT_ID"
},
"Action": [
"logs:CreateDelivery"
],
"Resource": "arn:aws:logs:us-east-1:DESTINATION_ACCOUNT_ID:delivery-destination:DELIVERY_DESTINATION_NAME"
}]
}
Nota: Sustituye SOURCE_ACCOUNT_ID, DESTINATION_ACCOUNT_ID y DELIVERY_DESTINATION_NAME por tus valores.
- Asigna a la política el nombre destination-policy-s3.json y, a continuación, guarda el archivo en tu máquina local.
- En la cuenta B, ejecuta el siguiente comando put-delivery-destination-policy para agregar la política destination-policy-s3.json al destino de entrega:
aws logs put-delivery-destination-policy \
--delivery-destination-name DELIVERY_DESTINATION_NAME \
--delivery-destination-policy file://destination-policy-s3.json \
--region us-east-1
Nota: Sustituye DELIVERY_DESTINATION_NAME por tu valor.
- En la cuenta A, ejecuta el siguiente comando create-delivery para conectar el origen de entrega de la cuenta A con el destino de entrega de la cuenta B:
aws logs create-delivery \
--delivery-source-name S3-delivery \
--delivery-destination-arn arn:aws:logs:us-east-1:DESTINATION_ACCOUNT_ID:delivery-destination:DELIVERY_DESTINATION_NAME \
--region us-east-1
Nota: Sustituye DESTINATION_ACCOUNT_ID y DELIVERY_DESTINATION_NAME por tus valores.
- En la cuenta A, realiza una operación en tu distribución de CloudFront para verificar que tu distribución entregó los registros al bucket de S3 de la cuenta B.
Nota: Es posible que los registros tarden varios minutos en aparecer en el bucket.
Información relacionada
Ejemplo de entrega entre cuentas