我希望我的 Amazon CloudFront 分配将日志从一个 AWS 账户发送到另一个账户中的 Amazon Simple Storage Service (Amazon S3) 存储桶。但是,当我尝试配置跨账户日志记录目标时,我收到了 Access Denied (403) 错误消息。
简短描述
要解决“Access Denied”错误并正确配置跨账户日志记录,您必须授予 CloudFront 将日志写入您的 S3 存储桶的权限。
**重要事项:**如果您在同一个账户中使用 S3 存储桶,则无需设置跨账户日志记录。CloudFront 会自动创建所需的 S3 存储桶策略。
解决方法
**注意:**如果您在运行 AWS 命令行界面 (AWS CLI) 命令时收到错误,请参阅排查 AWS CLI 错误。此外,请确保您使用的是最新版本的 AWS CLI。
在以下解决方法中,账户 A 是您的 CloudFront 分配所在的账户。账户 B 是您的 S3 存储桶所在的目标账户。
要设置跨账户日志记录并授予 CloudFront 将日志写入您的 S3 存储桶的权限,请完成以下步骤:
- 在账户 A 中,设置标准日志记录 (v2)。
**注意:**要激活标准日志,您必须使用专业版计划或按实际使用量付费计划。有关详细信息,请参阅 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 存储桶。
**注意:**日志可能需要几分钟才能显示在存储桶中。
相关信息
跨账户传输示例