为 Application Load Balancer 启用访问日志 - Elastic Load Balancing

为 Application Load Balancer 启用访问日志

在为负载均衡器启用访问日志时,您必须指定负载均衡器将在其中存储日志的 S3 存储桶的名称。存储桶必须具有为 Elastic Load Balancing 授予写入存储桶的权限的存储桶策略。

步骤 1:创建 S3 存储桶

在启用访问日志时,您必须为访问日志指定 S3 存储桶。您可以使用现有存储桶,也可以创建专门用于访问日志的存储桶。存储桶必须满足以下要求。

要求
  • 存储桶必须位于与负载均衡器相同的区域中。该存储桶和负载均衡器可由不同的账户拥有。

  • 唯一支持的服务器端加密选项是 Amazon S3 托管密钥 (SSE-S3) 有关更多信息,请参阅 Amazon S3 托管的加密密钥 (SSE-S3)

使用 Amazon S3 控制台创建 S3 存储桶。
  1. 通过以下网址打开 Amazon S3 控制台:https://console.aws.amazon.com/s3/

  2. 选择 Create bucket (创建存储桶)

  3. Create a bucket (创建存储桶) 页上,执行以下操作:

    1. 对于存储桶名称,请输入存储桶的名称。此名称在 Amazon S3 内所有现有存储桶名称中必须唯一。在某些区域,可能对存储桶名称有其他限制。有关更多信息,请参阅 《Amazon Simple Storage Service 用户指南》中的存储桶限制

    2. 对于 AWS 区域,选择在其中创建负载均衡器的区域。

    3. 对于默认加密,选择 Amazon S3 托管式密钥(SSE-S3)

    4. 请选择创建存储桶

步骤 2:将策略附加到 S3 存储桶

S3 存储桶必须具有为 Elastic Load Balancing 授予将访问日志写入存储桶的权限的存储桶策略。存储桶策略是 JSON 语句的集合,这些语句以访问策略语言编写,用于为存储桶定义访问权限。每个语句都包括有关单个权限的信息并包含一系列元素。

如果您正在使用具有附加策略的现有存储桶,则可以将 Elastic Load Balancing 访问日志的语句添加到该策略。如果您这样做,则建议您评估生成的权限集,以确保它们适用于需要具有对访问日志的存储桶的访问权的用户。

可用的存储桶策略

您将使用的存储桶策略取决于 AWS 区域和可用区类型。以下每个可展开的部分都包含一种存储桶策略以及有关何时使用该策略的信息。

该策略向指定的日志传送服务授予权限。将此策略用于以下区域的可用区和本地区中的负载均衡器:

  • 亚太地区(海得拉巴)

  • 亚太地区(马来西亚)

  • 亚太地区(墨尔本)

  • 加拿大西部(卡尔加里)

  • 欧洲(西班牙)

  • 欧洲(苏黎世)

  • 以色列(特拉维夫)

  • 中东(阿联酋)

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "logdelivery.elasticloadbalancing.amazonaws.com" }, "Action": "s3:PutObject", "Resource": "s3-bucket-arn" } ] }

用您的访问日志所在位置的 ARN 替换 s3-bucket-arn。您指定的 ARN 取决于您是否计划在步骤 3 中启用访问日志时包含前缀。

带前缀的 S3 存储桶 ARN 示例

存储桶名称为 amzn-s3-demo-logging-bucket,前缀为 logging-prefix,具有负载均衡器的 AWS 账户的 ID 为 111122223333

arn:aws:s3:::amzn-s3-demo-logging-bucket/logging-prefix/AWSLogs/111122223333/*
不带前缀的 S3 存储桶 ARN 示例

存储桶名称为 amzn-s3-demo-logging-bucket,具有负载均衡器的 AWS 账户的 ID 为 111122223333

arn:aws:s3:::amzn-s3-demo-logging-bucket/AWSLogs/111122223333/*
当 Effect 为 Deny 时使用 NotPrincipal

如果 Amazon S3 存储桶策略使用值为 DenyEffect 并包含 NotPrincipal(如下例所示),请确保在 Service 列表中包含 logdelivery.elasticloadbalancing.amazonaws.com

{ "Effect": "Deny", "NotPrincipal": { "Service": [ "logdelivery.elasticloadbalancing.amazonaws.com", "example.com" ] } },

该策略向指定的 Elastic Load Balancing 账户 ID 授予权限。将此策略用于以下所列 区域的可用区或 Local Zones 中的负载均衡器。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::elb-account-id:root" }, "Action": "s3:PutObject", "Resource": "s3-bucket-arn" } ] }

elb-account-id 替换为用于所在区域 Elastic Load Balancing 的 AWS 账户 的 ID:

  • 美国东部(弗吉尼亚州北部)– 127311923021

  • 美国东部(俄亥俄州)– 033677994240

  • 美国西部(北加利福尼亚)– 027434742980

  • 美国西部(俄勒冈州)– 797873946194

  • 非洲(开普敦)– 098369216593

  • 亚太地区(香港)– 754344448648

  • 亚太地区(雅加达)– 589379963580

  • 亚太地区(孟买)– 718504428378

  • 亚太地区(大阪)– 383597477331

  • 亚太地区(首尔)– 600734575887

  • 亚太地区(新加坡)– 114774131450

  • 亚太地区(悉尼)– 783225319266

  • 亚太地区(东京)– 582318560864

  • 加拿大(中部)– 985666609251

  • 欧洲(法兰克福)– 054676820928

  • 欧洲(爱尔兰)– 156460612806

  • 欧洲(伦敦)– 652711504416

  • 欧洲(米兰)– 635631232127

  • 欧洲(巴黎)– 009996457667

  • 欧洲(斯德哥尔摩)– 897822967062

  • 中东(巴林)– 076674570225

  • 南美洲(圣保罗)– 507241528517

用您的访问日志所在位置的 ARN 替换 s3-bucket-arn。您指定的 ARN 取决于您是否计划在步骤 3 中启用访问日志时包含前缀。

带前缀的 S3 存储桶 ARN 示例

存储桶名称为 amzn-s3-demo-logging-bucket,前缀为 logging-prefix,具有负载均衡器的 AWS 账户的 ID 为 111122223333

arn:aws:s3:::amzn-s3-demo-logging-bucket/logging-prefix/AWSLogs/111122223333/*
不带前缀的 S3 存储桶 ARN 示例

存储桶名称为 amzn-s3-demo-logging-bucket,具有负载均衡器的 AWS 账户的 ID 为 111122223333

arn:aws:s3:::amzn-s3-demo-logging-bucket/AWSLogs/111122223333/*
当 Effect 为 Deny 时使用 NotPrincipal

如果 Amazon S3 存储桶策略使用值为 DenyEffect 并包含 NotPrincipal(如下例所示),请确保在 Service 列表中包含 logdelivery.elasticloadbalancing.amazonaws.com

{ "Effect": "Deny", "NotPrincipal": { "Service": [ "logdelivery.elasticloadbalancing.amazonaws.com", "example.com" ] } },

该策略向指定的 Elastic Load Balancing 账户 ID 授予权限。将此策略用于以下所列 AWS GovCloud (US) 区域的可用区或 Local Zones 中的负载均衡器。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws-us-gov:iam::elb-account-id:root" }, "Action": "s3:PutObject", "Resource": "s3-bucket-arn" } ] }

elb-account-id 替换为用于 AWS GovCloud (US) 区域 Elastic Load Balancing 的 AWS 账户 的 ID:

  • AWS GovCloud(美国西部)– 048591011584

  • AWS GovCloud(美国西部)– 190560391635

用您的访问日志所在位置的 ARN 替换 s3-bucket-arn。您指定的 ARN 取决于您是否计划在步骤 3 中启用访问日志时包含前缀。

带前缀的 S3 存储桶 ARN 示例

存储桶名称为 amzn-s3-demo-logging-bucket,前缀为 logging-prefix,具有负载均衡器的 AWS 账户的 ID 为 111122223333

arn:aws-us-gov:s3:::amzn-s3-demo-logging-bucket/logging-prefix/AWSLogs/111122223333/*
不带前缀的 S3 存储桶 ARN 示例

存储桶名称为 amzn-s3-demo-logging-bucket,具有负载均衡器的 AWS 账户的 ID 为 111122223333

arn:aws-us-gov:s3:::amzn-s3-demo-logging-bucket/AWSLogs/111122223333/*
当 Effect 为 Deny 时使用 NotPrincipal

如果 Amazon S3 存储桶策略使用值为 DenyEffect 并包含 NotPrincipal(如下例所示),请确保在 Service 列表中包含 logdelivery.elasticloadbalancing.amazonaws.com

{ "Effect": "Deny", "NotPrincipal": { "Service": [ "logdelivery.elasticloadbalancing.amazonaws.com", "example.com" ] } },

以下策略向指定的日志传送服务授予权限。将此策略用于 Outposts 区域中的负载均衡器。

{ "Effect": "Allow", "Principal": { "Service": "logdelivery.elb.amazonaws.com" }, "Action": "s3:PutObject", "Resource": "s3-bucket-arn, "Condition": { "StringEquals": { "s3:x-amz-acl": "bucket-owner-full-control" } } }

用您的访问日志所在位置的 ARN 替换 s3-bucket-arn。您指定的 ARN 取决于您是否计划在步骤 3 中启用访问日志时包含前缀。

带前缀的 S3 存储桶 ARN 示例

存储桶名称为 amzn-s3-demo-logging-bucket,前缀为 logging-prefix,具有负载均衡器的 AWS 账户的 ID 为 111122223333

arn:aws:s3:::amzn-s3-demo-logging-bucket/logging-prefix/AWSLogs/111122223333/*
不带前缀的 S3 存储桶 ARN 示例

存储桶名称为 amzn-s3-demo-logging-bucket,具有负载均衡器的 AWS 账户的 ID 为 111122223333

arn:aws:s3:::amzn-s3-demo-logging-bucket/AWSLogs/111122223333/*
当 Effect 为 Deny 时使用 NotPrincipal

如果 Amazon S3 存储桶策略使用值为 DenyEffect 并包含 NotPrincipal(如下例所示),请确保在 Service 列表中包含 logdelivery.elasticloadbalancing.amazonaws.com

{ "Effect": "Deny", "NotPrincipal": { "Service": [ "logdelivery.elasticloadbalancing.amazonaws.com", "example.com" ] } },
使用 Amazon S3 控制台将访问日志的存储桶策略附加到您的存储桶
  1. 通过以下网址打开 Simple Storage Service(Amazon S3)控制台:https://console.aws.amazon.com/s3/

  2. 选择存储桶的名称以打开其详细信息页面。

  3. 选择 Permissions(权限),然后选择 Bucket policy(存储桶策略)、Edit(编辑)。

  4. 更新存储桶策略以授予所需权限。

  5. 选择 Save changes(保存更改)

步骤 3:配置访问日志

使用以下过程配置访问日志,以捕获请求信息并将日志文件传输到 S3 存储桶。

要求

存储桶必须满足第 1 步中所描述的要求,并且必须附加第 2 步中所描述的存储桶策略。如果包括前缀,前缀中不得包含字符串“AWSLogs”。

使用控制台为负载均衡器启用访问日志
  1. 通过以下网址打开 Amazon EC2 控制台:https://console.aws.amazon.com/ec2/

  2. 在导航窗格中,选择负载均衡器

  3. 选择您的负载均衡器的名称以打开其详细信息页面。

  4. 属性选项卡上,选择编辑

  5. 对于监控,打开访问日志

  6. 对于 S3 URI,输入日志文件的 S3 URI。您指定的 URI 取决于您是否使用前缀。

    • 带前缀的 URI:s3://amzn-s3-demo-logging-bucket/logging-prefix

    • 不带前缀的 URI:s3://amzn-s3-demo-logging-bucket

  7. 选择 Save changes(保存更改)

使用 AWS CLI 启用访问日志

使用 modify-load-balancer-attributes 命令。

管理保存访问日志的 S3 存储桶

要删除您配置用于访问日志的存储桶,请确保首先禁用访问日志。否则,如果在一个不属于您的 AWS 账户 中创建了具有相同名称和必要的存储桶策略的新存储桶,Elastic Load Balancing 会将您的负载均衡器的访问日志写入这个新存储桶。

步骤 4:确认存储桶权限

在为负载均衡器启用访问日志后,Elastic Load Balancing 将验证 S3 存储桶,并创建测试文件以确保存储桶策略指定所需权限。您可以使用 Amazon S3 控制台验证是否已创建测试文件。测试文件不是实际的访问日志文件;它不包含示例记录。

使用 Amazon S3 控制台验证您的存储桶中是否创建了测试文件
  1. 通过以下网址打开 Simple Storage Service(Amazon S3)控制台:https://console.aws.amazon.com/s3/

  2. 选择您指定用于访问日志的存储桶的名称。

  3. 导航到测试文件 ELBAccessLogTestFile。位置取决于您是否使用前缀。

    • 带前缀的位置:amzn-s3-demo-logging-bucket/logging-prefix/AWSLogs/123456789012/ELBAccessLogTestFile

    • 不带前缀的位置:amzn-s3-demo-logging-bucket/AWSLogs/123456789012/ELBAccessLogTestFile

故障排除

如果您遇到访问被拒绝错误,则可能的原因如下:

  • 存储桶策略没有为 Elastic Load Balancing 授予将访问日志写入存储桶的权限。确认您使用的是该区域正确的存储桶策略。确认资源 ARN 使用的存储桶名称与您在启用访问日志时指定的存储桶名称相同。如果您在启用访问日志时未指定前缀,请确认资源 ARN 不包含前缀。

  • 存储桶使用不支持的服务器端加密选项。该存储段必须使用 Amazon S3 托管密钥(SSE-S3)。