Passer au contenu

Comment envoyer les journaux CloudFront d'un compte vers un compartiment Amazon S3 d'un autre compte ?

Lecture de 4 minute(s)
0

Je souhaite que ma distribution Amazon CloudFront envoie les journaux d'un compte AWS vers un compartiment Amazon Simple Storage Service (Amazon S3) qui se trouve dans un autre compte. Cependant, je reçois un message d'erreur Access Denied (403) lorsque j'essaie de configurer la destination de journalisation intercompte.

Brève description

Pour résoudre l'erreur "Access Denied" et configurer correctement la journalisation intercompte, vous devez autoriser CloudFront à écrire des journaux dans votre compartiment S3.

Important : Si vous utilisez un compartiment S3 dans le même compte, il n’est pas nécessaire de configurer la journalisation intercompte. CloudFront crée automatiquement la politique de compartiment S3 requise.

Résolution

Remarque : Si des erreurs surviennent lorsque vous exécutez des commandes de l'interface de la ligne de commande AWS (AWS CLI), consultez la section Résoudre des erreurs liées à l’AWS CLI. Vérifiez également que vous utilisez bien la version la plus récente de l'AWS CLI.

Dans la résolution suivante, le compte A est le compte sur lequel se trouve votre distribution CloudFront. Le compte B est le compte de destination sur lequel se trouve votre compartiment S3.

Pour configurer la journalisation intercompte et autoriser CloudFront à écrire des journaux dans votre compartiment S3, procédez comme suit :

  1. Dans le compte A, configurez la journalisation standard (v2).
    Remarque : Il est recommandé d'utiliser la journalisation standard (v2) au lieu de l'ancienne journalisation standard (v1).
  2. Dans le compte A, exécutez la commande put-delivery-source de l'AWS CLI suivante pour créer une source de diffusion avec votre distribution 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
    Remarque : Remplacez DELIVERY_SOURCE_NAME, SOURCE_ACCOUNT_ID, DISTRIBUTION_ID et ACCESS_LOGS par vos valeurs.
  3. Dans le compte B, ajoutez la politique de compartiment suivante au compartiment S3 afin de permettre au principal du service delivery.logs.amazonaws.com de charger les journaux :
    {
        "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"
                    }
                }
            }
        ]
    }
    Remarque : Remplacez BUCKET_NAME, PREFIX, SOURCE_ACCOUNT_ID et DELIVERY_SOURCE_NAME par vos valeurs.
  4. Dans le compte B, exécutez la commande put-delivery-destination suivante pour créer la destination de diffusion :
    aws logs put-delivery-destination \
    --name DELIVERY_DESTINATION_NAME \
    --delivery-destination-configuration destinationResourceArn=arn:aws:s3:::BUCKET_NAME/PREFIX \
    --region us-east-1
    Remarque : Remplacez DELIVERY_DESTINATION_NAME, BUCKET_NAME et PREFIX par vos valeurs. Le compte B crée une politique de destination de diffusion dans votre nouvelle destination de diffusion. La politique autorise le compte A à créer une diffusion de journaux.
  5. Utilisez votre éditeur JSON préféré pour créer la politique de destination suivante :
    {
        "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"
        }]
    }
    Remarque : Remplacez SOURCE_ACCOUNT_ID, DESTINATION_ACCOUNT_ID et DELIVERY_DESTINATION_NAME par vos valeurs.
  6. Attribuez un nom à la politique destination-policy-s3.json, puis enregistrez le fichier sur votre ordinateur local.
  7. Dans le compte B, exécutez la commande put-delivery-destination-policy suivante pour ajouter la politique destination-policy-s3.json à la destination de diffusion :
    aws logs put-delivery-destination-policy \
    --delivery-destination-name DELIVERY_DESTINATION_NAME  \
    --delivery-destination-policy file://destination-policy-s3.json \
    --region us-east-1
    Remarque : Remplacez DELIVERY_DESTINATION_NAME par votre valeur.
  8. Dans le compte A, exécutez la commande create-delivery suivante pour connecter la source de diffusion du compte A à la destination de diffusion du compte 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
    Remarque : Remplacez DESTINATION_ACCOUNT_ID et DELIVERY_DESTINATION_NAME par vos valeurs.
  9. Dans le compte A, effectuez une opération sur votre distribution CloudFront pour vérifier que votre distribution a transmis des journaux au compartiment S3 du compte B.
    Remarque : L'affichage des journaux dans le compartiment peut prendre plusieurs minutes.

Informations connexes

Exemple de diffusion intercompte

AWS OFFICIELA mis à jour il y a 9 mois