Direkt zum Inhalt

Wie sende ich CloudFront-Protokolle von einem Konto an einen Amazon S3-Bucket in einem anderen Konto?

Lesedauer: 3 Minute
0

Ich möchte, dass meine Amazon CloudFront-Distribution Protokolle von einem AWS-Konto an einen Amazon Simple Storage Service (Amazon S3)-Bucket sendet, der sich in einem anderen Konto befindet. Ich erhalte jedoch eine Fehlermeldung „Access Denied (403)“, wenn ich versuche, das kontoübergreifende Protokollierungsziel zu konfigurieren.

Kurzbeschreibung

Um den Fehler "Access Denied" zu beheben und die kontoübergreifende Protokollierung korrekt zu konfigurieren, musst du CloudFront die Erlaubnis erteilen, Protokolle in den S3-Bucket zu schreiben.

Wichtig: Wenn du einen S3-Bucket in demselben Konto verwendest, musst du keine kontoübergreifende Protokollierung einrichten. CloudFront erstellt automatisch die erforderliche S3-Bucket-Richtlinie.

Lösung

Hinweis: Wenn du beim Ausführen von AWS Command Line Interface (AWS CLI)-Befehlen Fehlermeldungen erhältst, findest du weitere Informationen dazu unter Problembehandlung bei der AWS CLI. Stelle außerdem sicher, dass du die neueste Version der AWS CLI verwendest.

In der folgenden Lösung ist Konto A das Konto, in dem sich die CloudFront-Distribution befindet. Konto B ist das Zielkonto, in dem sich der S3-Bucket befindet.

Gehe wie folgt vor, um die kontoübergreifende Protokollierung einzurichten und CloudFront die Erlaubnis zu erteilen, Protokolle in den S3-Bucket zu schreiben:

  1. Richte in Konto A die Standardprotokollierung (v2) ein.
    Hinweis: Es hat sich bewährt, die Standardprotokollierung (v2) anstelle der Legacy-Standardprotokollierung (v1) zu verwenden.
  2. Führe in Konto A den folgenden AWS-CLI-Befehl put-delivery-source aus, um eine Lieferquelle mit der CloudFront-Distribution zu erstellen:
    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
    Hinweis: Ersetze DELIVERY_SOURCE_NAME, SOURCE_ACCOUNT_ID, DISTRIBUTION_ID und ACCESS_LOGS durch deine Werte.
  3. Füge in Konto B die folgende Bucket-Richtlinie zum S3-Bucket hinzu, damit der Service-Prinzipal von delivery.logs.amazonaws.com Protokolle hochladen kann:
    {
        "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"
                    }
                }
            }
        ]
    }
    **Hinweis:**Ersetze BUCKET_NAME, PREFIX, SOURCE_ACCOUNT_ID und DELIVERY_SOURCE_NAME durch deine Werte.
  4. Führe in Konto B den folgenden Befehl put-delivery-destination aus, um das Lieferziel zu erstellen:
    aws logs put-delivery-destination \
    --name DELIVERY_DESTINATION_NAME \
    --delivery-destination-configuration destinationResourceArn=arn:aws:s3:::BUCKET_NAME/PREFIX \
    --region us-east-1
    **Hinweis:**Ersetze DELIVERY_DESTINATION_NAME, BUCKET_NAME und PREFIX durch deine Werte. Konto B erstellt eine Lieferzielrichtlinie für das neue Lieferziel. Die Richtlinie erteilt Konto A die Erlaubnis, eine Protokollzustellung zu erstellen.
  5. Verwende den bevorzugten JSON-Editor, um die folgende Zielrichtlinie zu erstellen:
    {
        "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"
        }]
    }
    Hinweis: Ersetze SOURCE_ACCOUNT_ID, DESTINATION_ACCOUNT_ID und DELIVERY_DESTINATION_NAME durch deine Werte.
  6. Benenne die Richtlinie destination-policy-s3.json und speichere die Datei dann auf dem lokalen Computer.
  7. Führe in Konto B den folgenden Befehl put-delivery-destination-policy aus, um die Richtlinie destination-policy-s3.json zum Lieferziel hinzuzufügen:
    aws logs put-delivery-destination-policy \
    --delivery-destination-name DELIVERY_DESTINATION_NAME  \
    --delivery-destination-policy file://destination-policy-s3.json \
    --region us-east-1
    Hinweis: Ersetze DELIVERY_DESTINATION_NAME durch deinen Wert.
  8. Führe in Konto A den folgenden Befehl create-delivery aus, um die Lieferquelle in Konto A mit dem Lieferziel in Konto B zu verbinden:
    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
    Hinweis: Ersetze DESTINATION_ACCOUNT_ID und DELIVERY_DESTINATION_NAME durch deine Werte.
  9. Führe in Konto A einen Vorgang für die CloudFront-Distribution durch, um zu überprüfen, ob die Distribution Protokolle an den S3-Bucket in Konto B übermittelt hat.
    Hinweis: Es kann mehrere Minuten dauern, bis die Protokolle im Bucket erscheinen.

Ähnliche Informationen

Beispiel für kontoübergreifende Lieferung

AWS OFFICIALAktualisiert vor 8 Monaten