

# 配置 Amazon ECS 以侦听 CloudWatch Events 事件
<a name="ecs_cwet"></a>

了解如何设置一个简单的 Lambda 函数，用于侦听任务事件并将其写出到 CloudWatch Logs 日志流。

## 先决条件：设置测试集群
<a name="cwet_step_1"></a>

如果您没有要从中捕获事件的正在运行的集群，请执行 [为 Fargate 工作负载创建 Amazon ECS 集群](create-cluster-console-v2.md) 中的步骤来创建一个集群。在本教程结束时，您可在此集群上运行任务来测试您是否已正确配置 Lambda 函数。

## 步骤 1：创建 Lambda 函数
<a name="cwet_step_2"></a>

在此过程中，您将创建一个简单的 Lambda 函数来充当 Amazon ECS 事件流消息的目标。

1. 通过 [https://console.aws.amazon.com/lambda/](https://console.aws.amazon.com/lambda/) 打开 AWS Lambda 控制台。

1. 选择**创建函数**。

1. 在 **Author from scratch** 屏幕上，执行以下操作：

   1. 对于**名称**，输入一个值。

   1. 对于 **Runtime**（运行时），选择 Python 的版本，例如 **Python 3.9**。

   1. 对于**角色**，选择**创建具有基本 Lambda 权限的新角色**。

1. 选择**创建函数**。

1. 在 **Function code** 部分中，编辑示例代码以匹配以下示例：

   ```
   import json
   
   def lambda_handler(event, context):
       if event["source"] != "aws.ecs":
          raise ValueError("Function only supports input from events with a source type of: aws.ecs")
          
       print('Here is the event:')
       print(json.dumps(event))
   ```

   这是一个简单的 Python 3.9 函数，可输出由 Amazon ECS 发送的事件。如果一切配置正确，则在本教程结束时，您将在与此 Lambda 函数关联的 CloudWatch Logs 日志流中看到事件详细信息。

1. 选择**保存**。

## 步骤 2：注册事件规则
<a name="cwet_step_3"></a>

 接下来，您创建一个 CloudWatch Events 事件规则，该规则可捕获来自 Amazon ECS 集群的任务事件。该规则捕获来自定义该规则的账户中的所有集群的所有事件。任务消息本身包含有关事件源的信息（包括事件源所在的集群），可使用这些信息以编程方式对事件进行筛选和排序。

**注意**  
在使用 AWS 管理控制台 创建事件规则时，控制台会自动添加所需的 IAM 权限以便向 CloudWatch Events 授予调用 Lambda 函数所需的权限。如果您使用 AWS CLI 创建事件规则，则需要明确授予此权限。有关更多信息，请参阅《Amazon EventBridge User Guide》**中的 [Events in Amazon EventBridge](https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-events.html) 和 [Amazon EventBridge event patterns](https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-event-patterns.html)。

**将事件路由到 Lambda 函数**

1. 通过 [https://console.aws.amazon.com/cloudwatch/](https://console.aws.amazon.com/cloudwatch/) 打开 CloudWatch 控制台。

1. 在导航窗格上，依次选择**事件**、**规则**、**创建规则**。

1. 对于**事件源**，选择 **ECS** 作为事件源。预设情况下，规则将应用于您的所有 Amazon ECS 组的所有 Amazon ECS 事件。或者，您可以选择特定的事件或特定的 Amazon ECS 组。

1. 对于**目标**，选择**添加目标**，对于**目标类型**，选择 **Lambda 函数**，然后选择您的 Lambda 函数。

1. 选择 **Configure details（配置详细信息）**。

1. 对于 **Rule definition**，键入规则的名称和说明，然后选择 **Create rule**。

## 步骤 3：创建任务定义
<a name="cwet_step_task-def"></a>

创建任务定义。

1. 在 [https://console.aws.amazon.com/ecs/v2](https://console.aws.amazon.com/ecs/v2) 打开控制台。

1. 在导航窗格中，选择 **Task Definitions**。

1. 选择 **Create new Task Definition**（创建新的任务定义）、**Create new revision with JSON**（使用 JSON 创建新的修订）。

1. 将以下示例任务定义复制并粘贴到框中，然后选择**保存**。

   ```
   {
      "containerDefinitions": [ 
         { 
            "command": [
               "/bin/sh -c \"echo '<html> <head> <title>Amazon ECS Sample App</title> <style>body {margin-top: 40px; background-color: #333;} </style> </head><body> <div style=color:white;text-align:center> <h1>Amazon ECS Sample App</h1> <h2>Congratulations!</h2> <p>Your application is now running on a container in Amazon ECS.</p> </div></body></html>' >  /usr/local/apache2/htdocs/index.html && httpd-foreground\""
            ],
            "entryPoint": [
               "sh",
               "-c"
            ],
            "essential": true,
            "image": "public.ecr.aws/docker/library/httpd:2.4",
            "logConfiguration": { 
               "logDriver": "awslogs",
               "options": { 
                  "awslogs-group" : "/ecs/fargate-task-definition",
                  "awslogs-region": "us-east-1",
                  "awslogs-stream-prefix": "ecs"
               }
            },
            "name": "sample-fargate-app",
            "portMappings": [ 
               { 
                  "containerPort": 80,
                  "hostPort": 80,
                  "protocol": "tcp"
               }
            ]
         }
      ],
      "cpu": "256",
      "executionRoleArn": "arn:aws:iam::012345678910:role/ecsTaskExecutionRole",
      "family": "fargate-task-definition",
      "memory": "512",
      "networkMode": "awsvpc",
      "runtimePlatform": {
           "operatingSystemFamily": "LINUX"
       },
      "requiresCompatibilities": [ 
          "FARGATE" 
       ]
   }
   ```

1. 选择**创建**。

## 步骤 4：测试您的规则
<a name="cwet_step_4"></a>

 最后，您创建一个 CloudWatch Events 事件规则，该规则可捕获来自 Amazon ECS 集群的任务事件。该规则捕获来自定义该规则的账户中的所有集群的所有事件。任务消息本身包含有关事件源的信息（包括事件源所在的集群），可使用这些信息以编程方式对事件进行筛选和排序。

**测试您的规则**

1. 在 [https://console.aws.amazon.com/ecs/v2](https://console.aws.amazon.com/ecs/v2) 打开控制台。

1. 选择 **Task definitions**（任务定义）。

1. 选择 **console-sample-app-static**，然后选择 **Deploy**（部署），**Run new task**（运行新任务）。

1. 对于 **Cluster**（集群），选择默认值，然后选择 **Deploy**（部署）。

1. 通过 [https://console.aws.amazon.com/cloudwatch/](https://console.aws.amazon.com/cloudwatch/) 打开 CloudWatch 控制台。

1. 在导航窗格中，选择**日志**，然后选择 Lambda 函数的日志组（例如，**/aws/lambda/***my-function*）。

1. 选择日志流以查看事件数据。