

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

# 设置系统日志提取
<a name="CWL_Syslog_Setup"></a>

本节将引导您完成在日志中设置 syslog 提取的步骤。 CloudWatch 您将为 syslog 服务创建 VPC 终端节点、用于接收消息的日志组、用于授权 syslog 服务的资源策略以及用于将流量从 VPC 终端节点路由到日志组的 syslog 配置。

您可以使用 Amazon 管理控制台 Amazon CLI、或 Amazon 软件开发工具包执行所有这些步骤。以下说明提供了控制台和 Amazon CLI 示例。

## 先决条件
<a name="CWL_Syslog_Setup_Prerequisites"></a>

用于设置 syslog 提取的 IAM 身份（用户或角色）必须具有创建 VPC 终端节点、日志组、资源策略和 syslog 配置的权限。以下示例策略显示了所需的最低权限：

```
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "logs:CreateLogGroup",
        "logs:PutResourcePolicy",
        "logs:DeleteResourcePolicy",
        "logs:PutSyslogConfiguration",
        "logs:ListSyslogConfigurations",
        "logs:DeleteSyslogConfiguration"
      ],
      "Resource": "*"
    },
    {
      "Effect": "Allow",
      "Action": [
        "ec2:CreateVpc",
        "ec2:ModifyVpcAttribute",
        "ec2:CreateSubnet",
        "ec2:CreateSecurityGroup",
        "ec2:AuthorizeSecurityGroupIngress",
        "ec2:CreateVpcEndpoint",
        "ec2:ModifyVpcEndpoint",
        "ec2:DescribeVpcEndpoints"
      ],
      "Resource": "*"
    }
  ]
}
```

**注意**  
如果您已经拥有 VPC、子网和安全组，则只需要执行 EC2 操作的`ec2:CreateVpcEndpoint``ec2:ModifyVpcEndpoint`、和`ec2:DescribeVpcEndpoints`权限。

## 步骤 1：创建或标识 VPC
<a name="CWL_Syslog_Setup_VPC"></a>

您需要一个可以从生成系统日志的设备所在的本地网络（通过 VPN 或 Direct Connect）访问的 VPC。如果您已经有一个 VPC 连接到您的数据中心，请跳过此步骤并使用现有的 VPC 和子网 ID。

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

**创建 VPC (控制台)**

1. 打开位于 [https://console.aws.amazon.com/vpc/](https://console.amazonaws.cn/vpc/) 的 Amazon VPC 控制台。

1. 在导航窗格中，选择**您的 VPC**，然后选择**创建 VPC**。

1. 对于**要创建的资源**，选择 **仅 VPC**。

1. 对**于 IPv4 CIDR 块**，请输入`10.0.0.0/16`（或与您的本地网络不冲突的 CIDR）。

1. 选择**创建 VPC**。

1. 选择新创建的 VPC，选择**操作**，**编辑 VPC 设置**。同时启用 **DNS 解析**和 **DNS 主机名**，然后选择**保存**。

1. 为 VPC 终端节点创建子网：

   1. 在导航窗格中，选择**子网**，然后选择**创建子网**。

   1. 对于 **VPC ID**，请选择您创建的 VPC。

   1. 对于**可用区**，请选择一个可用区。

   1. 对于 **IPv4 子网 CIDR 块**，请输入。`10.0.1.0/24`

   1. 选择**创建子网**。

------
#### [ Amazon CLI ]

```
REGION=us-east-1

# Create VPC
VPC_ID=$(aws ec2 create-vpc \
  --cidr-block 10.0.0.0/16 \
  --region $REGION \
  --query 'Vpc.VpcId' --output text)

aws ec2 modify-vpc-attribute --vpc-id $VPC_ID --enable-dns-support --region $REGION
aws ec2 modify-vpc-attribute --vpc-id $VPC_ID --enable-dns-hostnames --region $REGION

# Create a subnet for the VPC endpoint
SUBNET_ID=$(aws ec2 create-subnet \
  --vpc-id $VPC_ID \
  --cidr-block 10.0.1.0/24 \
  --availability-zone ${REGION}a \
  --region $REGION \
  --query 'Subnet.SubnetId' --output text)

echo "VPC: $VPC_ID, Subnet: $SUBNET_ID"
```

------

**注意**  
VPC 终端节点在您的子网中创建带有私有 IP 的弹性网络接口 (ENI)。您的本地设备通过您的 VPN 或 Direct Connect 连接访问此 IP。确保您的网络路由允许从您的设备流向子网 CIDR 的流量。

## 步骤 2：创建安全组
<a name="CWL_Syslog_Setup_SG"></a>

为 VPC 终端节点创建安全组，允许来自您的 VPC 的入站系统日志流量。这控制了哪些资源可以向端点发送 syslog。

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

**创建安全组（控制台）**

1. 打开位于 [https://console.aws.amazon.com/vpc/](https://console.amazonaws.cn/vpc/) 的 Amazon VPC 控制台。

1. 在导航窗格中，选择**安全组**，然后选择**创建安全组**。

1. 对于**安全组名称**，输入 `syslog-vpce-sg`。

1. 对于**描述**，输入 `Allow syslog traffic to VPC endpoint`。

1. 对于 **VPC**，请选择您在步骤 1 中创建或标识的 VPC。

1. 在**入站规则**部分，选择**添加规则**并添加以下规则：
   + **规则 1：**类型 = **自定义 TCP**，端口范围 =`6514`，来源 =`10.0.0.0/16`（您的 VPC CIDR）
   + **规则 2：**类型 = **自定义 TCP**，端口范围 =`1514`，来源 = `10.0.0.0/16`
   + **规则 3：**类型 = **自定义 UDP**，端口范围 =`514`，来源 = `10.0.0.0/16`

1. 选择**创建安全组**。

------
#### [ Amazon CLI ]

```
VPCE_SG_ID=$(aws ec2 create-security-group \
  --group-name syslog-vpce-sg \
  --description "Allow syslog traffic to VPC endpoint" \
  --vpc-id $VPC_ID \
  --region $REGION \
  --query 'GroupId' --output text)

# Allow TCP+TLS (port 6514), TCP plaintext (port 1514), and UDP (port 514)
aws ec2 authorize-security-group-ingress --group-id $VPCE_SG_ID \
  --protocol tcp --port 6514 --cidr 10.0.0.0/16 --region $REGION
aws ec2 authorize-security-group-ingress --group-id $VPCE_SG_ID \
  --protocol tcp --port 1514 --cidr 10.0.0.0/16 --region $REGION
aws ec2 authorize-security-group-ingress --group-id $VPCE_SG_ID \
  --protocol udp --port 514 --cidr 10.0.0.0/16 --region $REGION
```

------

**提示**  
如果您只打算使用一种协议（例如，端口 6514 上的 TCP\+TLS），则只需在安全组中打开该端口即可。

## 步骤 3：创建 VPC 端点
<a name="CWL_Syslog_Setup_VPCE"></a>

创建指向 syslog Amazon PrivateLink 服务的接口 VPC 终端节点。这为您的 VPC 提供了一个进入 CloudWatch 日志 syslog 服务的私有入口点。

**注意**  
在创建终端节点时，您可以跨不同的可用区指定多个子网 ID。终端节点在每个子网中创建一个 ENI，从而提供更高的可用性，而无需为每个可用区单独的 VPC 终端节点。子网位于多个可用区的单个 VPC 终端节点就足够了。

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

**创建 VPC 终端节点（控制台）**

1. 打开位于 [https://console.aws.amazon.com/vpc/](https://console.amazonaws.cn/vpc/) 的 Amazon VPC 控制台。

1. 在导航窗格中，选择**终端节点**，然后选择**创建终端节点**。

1. 在**名称标签**中，输入终端节点的名称（例如`syslog-vpce`）。

1. 对于**服务类别**，选择 **Amazon 服务**。

1. 在 “**服务**” 搜索字段中，输入`syslog-logs`并选择服务`com.amazonaws.{{Region}}.syslog-logs`。

1. 对于 **VPC**，请选择您在步骤 1 中创建或标识的 VPC。

1. 在**子网**部分，选择一个或多个可用区，然后选择要在其中创建终端节点网络接口的子网。

1. 对于**安全组**，请选择您在步骤 2 (`syslog-vpce-sg`) 中创建的安全组。

1. （可选）如果您想限制允许通过终端节点的流量，请配置 VPC 终端节点策略。有关更多信息，请参阅 [系统日志的 VPC 终端节点策略](CWL_Syslog_VPCEndpointPolicies.md)。

1. 选择**创建端点**。

1. 在终端节点状态更改为 “可**用**” 后，选择终端节点并记下 **DNS 名称**值。这是您的系统日志设备将发送到的地址。

------
#### [ Amazon CLI ]

```
VPCE_ID=$(aws ec2 create-vpc-endpoint \
  --vpc-id $VPC_ID \
  --service-name com.amazonaws.${REGION}.syslog-logs \
  --vpc-endpoint-type Interface \
  --subnet-ids $SUBNET_ID \
  --security-group-ids $VPCE_SG_ID \
  --region $REGION \
  --query 'VpcEndpoint.VpcEndpointId' --output text)

echo "VPC Endpoint: $VPCE_ID"
```

等待终端节点变为可用（大约 60 秒），然后检索 DNS 名称：

```
VPCE_DNS=$(aws ec2 describe-vpc-endpoints --vpc-endpoint-ids $VPCE_ID \
  --region $REGION --query 'VpcEndpoints[0].DnsEntries[0].DnsName' --output text)

echo "Endpoint DNS: $VPCE_DNS"
```

保存`VPCE_DNS`值 — 您将配置您的 syslog 设备以发送到此地址。

------

## 步骤 4：创建日志组
<a name="CWL_Syslog_Setup_LogGroup"></a>

创建用于传送 syslog 消息的 Log CloudWatch s 日志组。您可以使用任何日志组名称。为了便于组织清晰起见，我们建议使用`/syslog/`前缀。

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

**创建日志组（控制台）**

1. 打开 CloudWatch 日志控制台，网址为[https://console.aws.amazon.com/cloudwatch/](https://console.amazonaws.cn/cloudwatch/)。

1. 在导航窗格的 “**日志管理**” 下，选择 “**日志组**”。

1. 选择**创建日志组**。

1. 在**日志组名称**中，输入`/syslog/my-devices`。

1. （可选）根据需要配置保留设置和加密。

1. 选择**创建**。

------
#### [ Amazon CLI ]

```
aws logs create-log-group \
  --log-group-name /syslog/my-devices \
  --region $REGION
```

------

您无需创建日志流。当传送第一条消息时，syslog 服务会自动创建一个名为`{{VPCE_ID}}_Syslog_{{Region}}`（例如`vpce-0abc123def456_Syslog_us-east-1`）的日志流。

## 步骤 5：添加资源策略
<a name="CWL_Syslog_Setup_ResourcePolicy"></a>

Log CloudWatch s syslog 服务使用`syslog.logs.amazonaws.com`服务主体写入您的日志组。您必须通过日志组的资源策略向其授予权限。该`aws:SourceArn`条件可确保只有来自您的特定 VPC 终端节点的流量才能写入此日志组。

```
ACCOUNT_ID=$(aws sts get-caller-identity --query 'Account' --output text)

aws logs put-resource-policy \
  --policy-name syslog-ingestion \
  --policy-document '{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "syslog.logs.amazonaws.com"
      },
      "Action": [
        "logs:PutLogEvents",
        "logs:CreateLogStream"
      ],
      "Resource": "arn:aws:logs:'$REGION':'$ACCOUNT_ID':log-group:/syslog/my-devices:*",
      "Condition": {
        "StringEquals": {
          "aws:SourceAccount": "'$ACCOUNT_ID'"
        },
        "ArnEquals": {
          "aws:SourceArn": "arn:aws:ec2:'$REGION':'$ACCOUNT_ID':vpc-endpoint/'$VPCE_ID'"
        }
      }
    }
  ]
}' \
  --region $REGION
```

资源策略中的条件提供了以下保护：
+ `aws:SourceAccount`— 防止混乱的副手攻击。仅接受您账户的流量。
+ `aws:SourceArn`— 限定对特定 VPC 终端节点的访问权限。如果您有多个 VPC 终端节点，请在条件中将每个终端节点添加为单独的 ARN。

要允许多个 VPC 终端节点写入同一个日志组，请使用带通配符的`ArnLike`条件运算符：

```
"ArnLike": {
    "aws:SourceArn": "arn:aws:ec2:us-east-1:123456789012:vpc-endpoint/*"
}
```

## 步骤 6：创建系统日志配置
<a name="CWL_Syslog_Setup_Config"></a>

此步骤告知 Log CloudWatch s syslog 服务，来自您的 VPC 终端节点的流量应路由到您的日志组。如果没有此配置，来自您的终端节点的流量将被拒绝。

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

**创建 syslog 配置（控制台）**

1. 打开 CloudWatch 日志控制台，网址为[https://console.aws.amazon.com/cloudwatch/](https://console.amazonaws.cn/cloudwatch/)。

1. 在导航窗格的 “**日志管理**” 下，选择 “**日志组**”。

1. 选择您在步骤 4 中创建的日志组（例如`/syslog/my-devices`）。

1. 在日志组详细信息中，找到 **Syslog Ing** estion 部分。

1. 选择**配置**。

1. 从 VPC 终端节点下拉列表中，选择您在步骤 3 中创建的 VPC 终端节点。

1. 选择**创建**。

------
#### [ Amazon CLI ]

```
aws logs put-syslog-configuration \
  --log-group-identifier /syslog/my-devices \
  --vpc-endpoint-id $VPCE_ID \
  --region $REGION
```

验证配置：

```
aws logs list-syslog-configurations \
  --log-group-identifier /syslog/my-devices \
  --region $REGION
```

------

您的 syslog 摄取管道现已激活。发送到 VPC 终端节点的任何 syslog 消息都将传送到`/syslog/my-devices`日志组。

## 第 7 步：验证交付和字段提取
<a name="CWL_Syslog_Setup_Verify"></a>

从任何可以到达 VPC 终端节点的 EC2 主机或设备发送测试消息，然后使用 CloudWatch Log Analytics 验证消息是否已发送以及结构化字段是否正确提取。消息通常会在 10-20 秒内出现。

**发送测试消息（TCP 纯文本）：**

```
echo "<134>1 $(date -u +%Y-%m-%dT%H:%M:%SZ) myhost myapp 1234 - - Hello from syslog" | \
  nc $VPCE_DNS 1514
```

**验证交付和提取的字段：**

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

**使用日志分析（控制台）验证传送**

1. 打开 CloudWatch 日志控制台，网址为[https://console.aws.amazon.com/cloudwatch/](https://console.amazonaws.cn/cloudwatch/)。

1. 在导航窗格的 “**日志**” 下，选择 “**日志分析**”。

1. 在日志组选择器中，选择您的日志组（例如`/syslog/my-devices`）。

1. 输入以下查询并选择**运行查询**：

   ```
   fields @timestamp, facility, severity, hostname, appName, procId, message
   | sort @timestamp desc
   | limit 10
   ```

1. 确认您的测试消息已显示，提取的字段是否填充正确。对于上面的测试消息，您应该看到 `facility` `severity` = `local0`、`hostname` = `info` `myhost`、= `myapp`、`appName` = 和 `procId` = `1234`。

------
#### [ Amazon CLI ]

启动日志分析查询以验证交付和字段提取：

```
QUERY_ID=$(aws logs start-query \
  --log-group-name /syslog/my-devices \
  --start-time $(date -d '5 minutes ago' +%s 2>/dev/null || echo $(date -v-5M +%s)) \
  --end-time $(date +%s) \
  --query-string 'fields @timestamp, facility, severity, hostname, appName, procId, message | sort @timestamp desc | limit 10' \
  --region $REGION \
  --query 'queryId' --output text)

# Wait a few seconds for the query to complete, then retrieve results
aws logs get-query-results \
  --query-id $QUERY_ID \
  --region $REGION
```

确认您的测试消息已显示，提取的字段是否填充正确。对于上面的测试消息，您应该看到 `facility` `severity` = `local0`、`hostname` = `info` `myhost`、= `myapp`、`appName` = 和 `procId` = `1234`。

------