跳至內容

如何將 CloudFront 日誌從一個帳戶傳送到另一個帳戶中的 Amazon S3 儲存貯體?

2 分的閱讀內容
0

我希望 Amazon CloudFront 分佈能將日誌從一個 AWS 帳戶傳送到位於另一個帳戶中的 Amazon Simple Storage Service (Amazon S3) 儲存貯體。但是,當我嘗試設定跨帳戶日誌記錄目的地時,收到 Access Denied (403) 錯誤訊息。

簡短說明

若要解決 "Access Denied" 錯誤並正確設定跨帳戶日誌記錄,您必須授予 CloudFront 將日誌寫入 S3 儲存貯體的權限。

**重要事項:**如果您在同一個帳戶中使用 S3 儲存貯體,則無需設定跨帳戶日誌記錄。CloudFront 會自動建立所需的 S3 儲存貯體政策。

解決方法

**注意:**如果您在執行 AWS Command Line Interface (AWS CLI) 命令時收到錯誤訊息,請參閱 Troubleshooting errors for the AWS CLI (對 AWS CLI 錯誤進行疑難排解)。此外,請務必使用最新版 AWS CLI

在下列解決方案中,帳戶 A 是您的 CloudFront 發佈項目所在的帳戶,帳戶 B 是您 S3 儲存貯體所在的目的地帳戶。

若要設定跨帳戶日誌記錄,並授予 CloudFront 將日誌寫入 S3 儲存貯體的權限,請完成下列步驟:

  1. 在帳戶 A 中,設定標準日誌記錄 (v2)
    **注意:**若要啟用標準日誌,您必須使用專業方案或按使用量付費方案。如需更多資訊,請參閱 Amazon CloudFront pricing (Amazon CloudFront 定價)。
  2. 在帳戶 A 中,執行以下 put-delivery-source AWS CLI 命令,以使用您的 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
    **注意:**請將 DELIVERY_SOURCE_NAMESOURCE_ACCOUNT_IDDISTRIBUTION_IDACCESS_LOGS 替換為您的值。
  3. 在帳戶 B 中,將以下儲存貯體政策新增至 S3 儲存貯體,以允許 delivery.logs.amazonaws.com 服務主體上傳日誌:
    {
        "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"
                    }
                }
            }
        ]
    }
    **注意:**請將 BUCKET_NAMEPREFIXSOURCE_ACCOUNT_IDDELIVERY_SOURCE_NAME 替換為您的值。
  4. 在帳戶 B 中,執行以下 put-delivery-destination 命令來建立傳送目的地:
    aws logs put-delivery-destination \
    --name DELIVERY_DESTINATION_NAME \
    --delivery-destination-configuration destinationResourceArn=arn:aws:s3:::BUCKET_NAME/PREFIX \
    --region us-east-1
    **注意:**請將 DELIVERY_DESTINATION_NAMEBUCKET_NAMEPREFIX 替換為您的值。帳戶 B 在您的新傳送目的地中建立傳送目的地政策。此政策授予帳戶 A 建立日誌傳送的權限。
  5. 使用您偏好的 JSON 編輯器建立以下目的地政策:
    {
        "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"
        }]
    }
    **注意:**請將 SOURCE_ACCOUNT_IDDESTINATION_ACCOUNT_IDDELIVERY_DESTINATION_NAME 替換為您的值。
  6. 將此政策命名為 destination-policy-s3.json,然後將該檔案儲存到本機電腦。
  7. 在帳戶 B 中,執行以下 put-delivery-destination-policy 命令,將 destination-policy-s3.json 政策新增到傳送目的地:
    aws logs put-delivery-destination-policy \
    --delivery-destination-name DELIVERY_DESTINATION_NAME  \
    --delivery-destination-policy file://destination-policy-s3.json \
    --region us-east-1
    **注意:**請將 DELIVERY_DESTINATION_NAME 替換為您的值。
  8. 在帳戶 A 中,執行以下 create-delivery 命令,將帳戶 A 中的傳送來源連線到帳戶 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
    **注意:**請將 DESTINATION_ACCOUNT_IDDELIVERY_DESTINATION_NAME 替換為您的值。
  9. 在帳戶 A 中,對您的 CloudFront 分佈執行一項作業,以確認您的分佈是否已將日誌傳送到帳戶 B 中的 S3 儲存貯體。
    **注意:**日誌可能需要幾分鐘才會顯示在儲存貯體中。

相關資訊

Cross-account delivery example (跨帳戶傳送範例)

AWS 官方已更新 1 年前