

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 启用应用程序负载均衡器的连接日志
<a name="enable-connection-logging"></a>

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

**Topics**
+ [步骤 1：创建 S3 存储桶](#connection-log-create-bucket)
+ [步骤 2：将策略附加到 S3 存储桶](#attach-bucket-policy-connection)
+ [步骤 3：配置连接日志](#enable-connection-logs)
+ [步骤 4：确认存储桶权限](#verify-bucket-permissions-connection)
+ [问题排查](#bucket-permissions-troubleshooting-connection)

## 步骤 1：创建 S3 存储桶
<a name="connection-log-create-bucket"></a>

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

**要求**
+ 存储桶必须位于与负载均衡器相同的区域中。该存储桶和负载均衡器可由不同的账户拥有。
+ 唯一支持的服务器端加密选项是 Amazon S3 托管密钥 (SSE-S3) 有关更多信息，请参阅 [Amazon S3 托管的加密密钥 (SSE-S3)](https://docs.aws.amazon.com/AmazonS3/latest/userguide/UsingServerSideEncryption.html)。

**使用 Amazon S3 控制台创建 S3 存储桶。**

1. 打开 Amazon S3 控制台，网址为 [https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)。

1. 选择 **Create bucket (创建存储桶)**。

1. 在 **Create a bucket (创建存储桶)** 页上，执行以下操作：

   1. 对于**存储桶名称**，请输入存储桶的名称。此名称在 Amazon S3 内所有现有存储桶名称中必须唯一。在某些区域，可能对存储桶名称有其他限制。有关更多信息，请参阅*《Amazon S3 用户指南》*中的[存储桶限制](https://docs.aws.amazon.com/AmazonS3/latest/userguide/BucketRestrictions.html)。

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

   1. 对于**默认加密**，选择 **Amazon S3 托管式密钥（SSE-S3）**。

   1. 选择 **创建存储桶 **。

## 步骤 2：将策略附加到 S3 存储桶
<a name="attach-bucket-policy-connection"></a>

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

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

### 存储桶策略
<a name="bucket-policy-logdelivery-connection"></a>

该策略向指定的日志传送服务授予权限。

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "logdelivery.elasticloadbalancing.amazonaws.com"
      },
      "Action": "s3:PutObject",
      "Resource": "arn:aws:s3:::amzn-s3-demo-bucket/prefix/AWSLogs/123456789012/*"
    }
  ]
}
```

对于 `Resource`，使用示例策略中显示的格式，输入访问日志所在位置的 ARN。请务必在 S3 存储桶 ARN 的资源路径中，包含该负载均衡器所在账户的账户 ID。这样可以确保只有来自指定账户的负载均衡器才能将访问日志写入 S3 存储桶。

您指定的 ARN 取决于您是否计划在[步骤 3](enable-access-logging.md#enable-access-logs) 中启用访问日志时包含前缀。

**带前缀的 S3 存储桶 ARN 示例**  
S3 存储桶名称为 amzn-s3-demo-logging-bucket，前缀为 logging-prefix。

```
arn:aws:s3:::amzn-s3-demo-logging-bucket/logging-prefix/AWSLogs/123456789012/*
```

**AWS GovCloud (US)**：以下示例使用 AWS GovCloud (US) Regions的 ARN 语法。

```
arn:aws-us-gov:s3:::amzn-s3-demo-logging-bucket/logging-prefix/AWSLogs/123456789012/*
```

**不带前缀的 S3 存储桶 ARN 示例**  
S3 存储桶名称为 amzn-s3-demo-logging-bucket。S3 存储桶 ARN 中没有前缀部分。

```
arn:aws:s3:::amzn-s3-demo-logging-bucket/AWSLogs/123456789012/*
```

**AWS GovCloud (US)**：以下示例使用 AWS GovCloud (US) Regions的 ARN 语法。

```
arn:aws-us-gov:s3:::amzn-s3-demo-logging-bucket/AWSLogs/123456789012/*
```

### 传统存储桶策略
<a name="legacy-bucket-policy"></a>

在此之前，对于 2022 年 8 月之前可用的区域，我们要求向该区域特定的弹性负载均衡账户授予权限的策略。此旧版策略仍然受到支持，但我们建议您将其替换为上述新版策略。当然如果您愿意，也可以继续使用旧版策略（此处未显示）。

 以下是要在 IDs 旧策略中指定的 Elastic Load Balanc `Principal` ing 账户供参考。请注意，不在此列表中的区域不支持旧版策略。
+ 美国东部（弗吉尼亚州北部）– 127311923021
+ 美国东部（俄亥俄州）– 033677994240
+ 美国西部（北加利福尼亚）– 027434742980
+ 美国西部（俄勒冈州）– 797873946194
+ 非洲（开普敦）– 098369216593
+ 亚太地区（香港）– 754344448648
+ 亚太地区（雅加达）– 589379963580
+ 亚太地区（孟买）– 718504428378
+ 亚太地区（大阪）– 383597477331
+ 亚太地区（首尔）– 600734575887
+ 亚太地区（新加坡）– 114774131450
+ 亚太地区（悉尼）– 783225319266
+ 亚太地区（东京）– 582318560864
+ 加拿大（中部）– 985666609251
+ 欧洲（法兰克福）– 054676820928
+ 欧洲（爱尔兰）– 156460612806
+ 欧洲（伦敦）– 652711504416
+ 欧洲（米兰）– 635631232127
+ 欧洲（巴黎）– 009996457667
+ 欧洲（斯德哥尔摩）– 897822967062
+ 中东（巴林）– 076674570225
+ 南美洲（圣保罗）– 507241528517
+ AWS GovCloud （美国东部）— 190560391635
+ AWS GovCloud （美国西部）— 048591011584

### Outposts 区域
<a name="bucket-policy-outposts"></a>

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

```
{
    "Effect": "Allow",
    "Principal": {
        "Service": "logdelivery.elb.amazonaws.com"
    },
    "Action": "s3:PutObject",
    "Resource": "arn:aws:s3:::amzn-s3-demo-bucket/prefix/AWSLogs/123456789012/*"
    "Condition": {
        "StringEquals": {
            "s3:x-amz-acl": "bucket-owner-full-control"
        }
    }
}
```

对于 `Resource`，请输入访问日志所在位置的 ARN。请务必在 S3 存储桶 ARN 的资源路径中，包含该负载均衡器所在账户的账户 ID。这样可以确保只有来自指定账户的负载均衡器才能将访问日志写入 S3 存储桶。

您指定的 ARN 取决于您是否计划在[步骤 3](enable-access-logging.md#enable-access-logs) 中启用访问日志时包含前缀。

**带前缀的 S3 存储桶 ARN 示例**  
S3 存储桶名称为 amzn-s3-demo-logging-bucket，前缀为 logging-prefix。

```
arn:aws:s3:::amzn-s3-demo-logging-bucket/logging-prefix/AWSLogs/123456789012/*
```

**不带前缀的 S3 存储桶 ARN 示例**  
S3 存储桶名称为 amzn-s3-demo-logging-bucket。S3 存储桶 ARN 中没有前缀部分。

```
arn:aws:s3:::amzn-s3-demo-logging-bucket/AWSLogs/123456789012/*
```

### 安全最佳实践
<a name="bucket-policy-security-best-practices"></a>

为了增强安全性，请使用精确的 S3 存储桶 ARNs。
+ 使用完整的资源路径，而不仅仅是 S3 存储桶 ARN。
+ 包括 S3 存储桶 ARN 的账户 ID 部分。
+ 请勿在 S3 存储桶 ARN 的账户 ID 部分使用通配符（\$1）。

创建存储桶策略后，使用 Amazon S3 接口（例如 Amazon S3 控制台或 AWS CLI 命令）将您的存储桶策略附加到 S3 存储桶。

------
#### [ Console ]

**将您的存储桶策略附加到 S3 存储桶**

1. 打开 Amazon S3 控制台，网址为 [https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)。

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

1. 选择 **Permissions**（权限），然后选择 **Bucket policy**（存储桶策略)、**Edit**（编辑）。

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

1. 选择**保存更改**。

------
#### [ AWS CLI ]

**将您的存储桶策略附加到 S3 存储桶**  
使用 [put-bucket-policy](https://docs.aws.amazon.com/cli/latest/reference/s3api/put-bucket-policy.html) 命令。在此示例中，存储桶策略已保存到指定的 .json 文件中。

```
aws s3api put-bucket-policy \
    --bucket amzn-s3-demo-bucket \
    --policy file://access-log-policy.json
```

------

## 步骤 3：配置连接日志
<a name="enable-connection-logs"></a>

使用以下过程配置连接日志，以捕获日志文件并将其传输到 S3 存储桶。

**要求**  
存储桶必须满足[第 1 步](#connection-log-create-bucket)中所描述的要求，并且必须附加[第 2 步](#attach-bucket-policy-connection)中所描述的存储桶策略。如果指定前缀，则前缀不得包含字符串 “AWSLogs”。

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

------
#### [ Console ]

**启用连接日志**

1. 打开位于 [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/) 的 Amazon EC2 控制台。

1. 在导航窗格中，选择**负载均衡器**。

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

1. 在**属性**选项卡上，选择**编辑**。

1. 对于**监控**，启用**连接日志**。

1. 对于 **S3 URI**，输入日志文件的 S3 URI。您指定的 URI 取决于您是否使用前缀。
   + 带有前缀的 URI：`s3://bucket-name/prefix`
   + 不带前缀的 URI：`s3://bucket-name`

1. 选择**保存更改**。

------
#### [ AWS CLI ]

**启用连接日志**  
使用带有相关属性的[modify-load-balancer-attributes](https://docs.aws.amazon.com/cli/latest/reference/elbv2/modify-load-balancer-attributes.html)命令。

```
aws elbv2 modify-load-balancer-attributes \
    --load-balancer-arn load-balancer-arn \
    --attributes \
        Key=connection_logs.s3.enabled,Value=true \
        Key=connection_logs.s3.bucket,Value=amzn-s3-demo-logging-bucket \
        Key=connection_logs.s3.prefix,Value=logging-prefix
```

------
#### [ CloudFormation ]

**启用连接日志**  
更新[AWS::ElasticLoadBalancingV2::LoadBalancer](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-elasticloadbalancingv2-loadbalancer.html)资源以包含相关属性。

```
Resources:
  myLoadBalancer:
    Type: 'AWS::ElasticLoadBalancingV2::LoadBalancer'
    Properties:
      Name: my-alb
      Type: application
      Scheme: internal
      Subnets: 
        - !Ref subnet-AZ1
        - !Ref subnet-AZ2
      SecurityGroups: 
        - !Ref mySecurityGroup
      LoadBalancerAttributes: 
        - Key: "connection_logs.s3.enabled"
          Value: "true"
        - Key: "connection_logs.s3.bucket"
          Value: "amzn-s3-demo-logging-bucket"
        - Key: "connection_logs.s3.prefix"
          Value: "logging-prefix"
```

------

## 步骤 4：确认存储桶权限
<a name="verify-bucket-permissions-connection"></a>

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

**验证 Elastic Load Balancing 是否在 S3 存储桶中创建了测试文件**

1. 打开 Amazon S3 控制台，网址为 [https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)。

1. 选择您指定用于连接日志的存储桶的名称。

1. 导航到测试文件 `ELBConnectionLogTestFile`。位置取决于您是否使用前缀。
   + 带有前缀的位置：*amzn-s3-demo-logging-bucket**prefix*/AWSLogs/*123456789012*/ELBConnectionLogTestFile
   + 不带前缀的位置：*amzn-s3-demo-logging-bucket*/AWSLogs/*123456789012*/ELBConnectionLogTestFile

## 问题排查
<a name="bucket-permissions-troubleshooting-connection"></a>

如果您遇到访问被拒绝错误，则可能的原因如下：
+ 存储桶策略没有为 Elastic Load Balancing 授予将连接日志写入存储桶的权限。确认您使用的是该区域正确的存储桶策略。确认资源 ARN 使用的存储桶名称与您在启用连接日志时指定的存储桶名称相同。如果您在启用连接日志时未指定前缀，请确认资源 ARN 不包含前缀。
+ 存储桶使用不支持的服务器端加密选项。该存储段必须使用 Amazon S3 托管密钥（SSE-S3）。