我希望 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 儲存貯體的權限,請完成下列步驟:
- 在帳戶 A 中,設定標準日誌記錄 (v2)。
**注意:**若要啟用標準日誌,您必須使用專業方案或按使用量付費方案。如需更多資訊,請參閱 Amazon CloudFront pricing (Amazon CloudFront 定價)。
- 在帳戶 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_NAME、SOURCE_ACCOUNT_ID、DISTRIBUTION_ID 和 ACCESS_LOGS 替換為您的值。
- 在帳戶 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_NAME、PREFIX、SOURCE_ACCOUNT_ID 和 DELIVERY_SOURCE_NAME 替換為您的值。
- 在帳戶 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_NAME、BUCKET_NAME 和 PREFIX 替換為您的值。帳戶 B 在您的新傳送目的地中建立傳送目的地政策。此政策授予帳戶 A 建立日誌傳送的權限。
- 使用您偏好的 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_ID、DESTINATION_ACCOUNT_ID 和 DELIVERY_DESTINATION_NAME 替換為您的值。
- 將此政策命名為 destination-policy-s3.json,然後將該檔案儲存到本機電腦。
- 在帳戶 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 替換為您的值。
- 在帳戶 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_ID 和 DELIVERY_DESTINATION_NAME 替換為您的值。
- 在帳戶 A 中,對您的 CloudFront 分佈執行一項作業,以確認您的分佈是否已將日誌傳送到帳戶 B 中的 S3 儲存貯體。
**注意:**日誌可能需要幾分鐘才會顯示在儲存貯體中。
相關資訊
Cross-account delivery example (跨帳戶傳送範例)