跳至内容

如何将 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 命令行界面 (AWS CLI) 命令时收到错误,请参阅 AWS CLI 错误故障排除。此外,请确保您使用的是最新版本的 AWS CLI

在以下解决方法中,账户 A 是您的 CloudFront 分配所在的账户。账户 B 是您的 S3 存储桶所在的目标账户。

要设置跨账户日志记录并授予 CloudFront 将日志写入您的 S3 存储桶的权限,请完成以下步骤:

  1. 在账户 A 中,设置标准日志记录 (v2)
    **注意:**最佳做法是使用标准日志记录 (v2) 而不是传统的标准日志记录 (v1)。
  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 存储桶。
    **注意:**日志可能需要几分钟才能显示在存储桶中。

相关信息

跨账户传输示例

AWS 官方已更新 7 个月前