

# CloudWatch Events イベントをリッスンするように Amazon ECS を設定する
<a name="ecs_cwet"></a>

タスクイベントをリッスンし、それを CloudWatch Logs ログストリームに書き込むシンプルな Lambda 関数を設定する方法について説明します。

## 前提条件: テストクラスターを設定する
<a name="cwet_step_1"></a>

イベントをキャプチャする実行中のクラスターがなければ、[Fargate ワークロード用の Amazon ECS クラスターを作成する](create-cluster-console-v2.md) のステップに従ってクラスターを作成します。このチュートリアルの最後に、このクラスターでタスクを実行して Lambda 関数が正しく設定されていることをテストします。

## ステップ 1: Lambda 関数を作成する
<a name="cwet_step_2"></a>

この手順では、Amazon ECS イベントストリームメッセージのターゲットとなるシンプルな Lambda 関数を作成します。

1. AWS Lambda コンソールの [https://console.aws.amazon.com/lambda/](https://console.aws.amazon.com/lambda/) を開いてください。

1. [**関数の作成**] を選択してください。

1. [**Author from scratch**] 画面で、次の操作を行います。

   1. [**名前**] に値を入力します。

   1. **[Runtime]** (ランタイム) で、Python のバージョン (**Python 3.9** など) を選択します。

   1. [**Role**] で、[**Create a new role with basic Lambda permissions**] を選択します。

1. **[Create function]** を選択します。

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))
   ```

   これは、Amazon ECS から送信されたイベントを出力するシンプルな Python 3.9 関数です。すべてが正しく設定されると、このチュートリアルの最後に、この Lambda 関数に関連付けられている CloudWatch Logs ログストリームにイベントの詳細が表示されます。

1. **[保存]** を選択します。

## ステップ 2: イベントルールを登録する
<a name="cwet_step_3"></a>

 次に、Amazon ECS クラスターから送信されるタスクイベントをキャプチャする CloudWatch Events イベントルールを作成します。このルールでは、それが定義されているアカウント内のすべてのクラスターから送信されるすべてのイベントがキャプチャされます。タスクメッセージ自体内に、イベントソースに関する情報 (イベントソースがあるクラスターの情報など) が含まれており、この情報を使用してプログラムでイベントをフィルタしてソートできます。

**注記**  
AWS マネジメントコンソール を使用してイベントルールを作成すると、コンソールが CloudWatch Eventsに Lambda 関数を呼び出す権限を付与するために必要な IAM 権限を自動的に追加します。AWS CLI を使用してイベントルールを作成する場合は、この権限を明示的に付与する必要があります。詳細については、「*Amazon EventBridge ユーザーガイド*」の「[Amazon EventBridge イベント](https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-events.html)」と「[Amazon EventBridge のイベントパターン](https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-event-patterns.html)」を参照してください。

**Lambda 関数にイベントをルートするには**

1. CloudWatch コンソールの [https://console.aws.amazon.com/cloudwatch/](https://console.aws.amazon.com/cloudwatch/) を開いてください。

1. ナビゲーションペインで、[**Events**]、[**Rules**]、[**Create rule**] の順に選択します。

1. [**Event Source**] で、イベントソースとして [**ECS**] を選択します。デフォルトでは、ルールはすべての Amazon ECS グループのすべての Amazon ECS イベントに適用されます。または、特定のイベントや特定の Amazon ECS グループを選択することもできます。

1. **[ターゲット]** に **[ターゲットの追加]** を選択し、**[ターゲットの種類]** に **[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. ナビゲーションペインで、**[タスク定義]** を選択します。

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>

 最後に、Amazon ECS クラスターから送信されるタスクイベントをキャプチャする CloudWatch Events イベントルールを作成します。このルールでは、それが定義されているアカウント内のすべてのクラスターから送信されるすべてのイベントがキャプチャされます。タスクメッセージ自体内に、イベントソースに関する情報 (イベントソースがあるクラスターの情報など) が含まれており、この情報を使用してプログラムでイベントをフィルタしてソートできます。

**ルールをテストするには**

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]** (クラスター) で [default] (デフォルト) を選択し、**[Deploy]** (デプロイ) を選択します。

1. CloudWatch コンソールの [https://console.aws.amazon.com/cloudwatch/](https://console.aws.amazon.com/cloudwatch/) を開いてください。

1. ナビゲーションペインで、**ログ** を選択して Lambda 関数 (例えば、**/aws/lambda/***my-function など*)] のロググループを選択します。

1. イベントデータを表示するログストリームを選択します。