

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 設定 Amazon ECS 監聽 CloudWatch Events 事件
<a name="ecs_cwet"></a>

了解如何設定一個簡單的 Lambda 函式，用於監聽 Amazon ECS 任務事件並將之寫入 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：//[https://console.aws.amazon.com/lambda/](https://console.aws.amazon.com/lambda/) 開啟 AWS Lambda 主控台。

1. 選擇 **Create function** (建立函數)。

1. 在 **Author from scratch** (從頭開始撰寫) 畫面上，執行下列操作：

   1. 對於 **Name (名稱)**，輸入值。

   1. 針對 **Runtime** (執行時間)，選擇您的 Python 版本，例如：**Python 3.9**。

   1. 針對 **Role (角色)**，選擇 **Create a new role with basic Lambda permissions (建立具備基本 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. 在導覽窗格上，選擇 **Events (事件)**、**Rules (規則)**、**Create rule (建立規則)**。

1. 針對 **Event Source** (事件來源)，選擇 **ECS** 做為事件來源。根據預設，此規則套用至所有 Amazon ECS 群組的 Amazon ECS 事件。或者，您可以選取特定事件或特定 Amazon ECS 群組。

1. 對於 **Targets** (目標)，選擇 **Add target** (新增目標)，並對於 **Target type** (目標類型)，選擇 **Lambda function** (Lambda 函數)，然後選取您的 Lambda 函數。

1. 選擇**設定詳細資訊**。

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. 複製下列任務定義範例並貼到方塊中，然後選擇 **Save (儲存)**。

   ```
   {
      "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. 在導覽窗格上，選擇 **Logs** (日誌)，然後選取 Lambda 函數的日誌群組 (例如，**/aws/lambda/***my-function*)。

1. 選取日誌串流，以檢視事件資料。