CloudWatch Events イベントをリッスンするように Amazon ECS を設定する - Amazon Elastic Container Service

CloudWatch Events イベントをリッスンするように Amazon ECS を設定する

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

前提条件: テストクラスターを設定する

イベントをキャプチャする実行中のクラスターがなければ、Fargate 起動タイプ用の Amazon ECS クラスターを作成する のステップに従ってクラスターを作成します。このチュートリアルの最後に、このクラスターでタスクを実行して Lambda 関数が正しく設定されていることをテストします。

ステップ 1: Lambda 関数を作成する

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

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

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

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

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

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

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

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

  5. [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 ログストリームにイベントの詳細が表示されます。

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

ステップ 2: イベントルールを登録する

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

注記

AWS Management Console を使用してイベントルールを作成すると、コンソールが CloudWatch Eventsに Lambda 関数を呼び出す権限を付与するために必要な IAM 権限を自動的に追加します。AWS CLI を使用してイベントルールを作成する場合は、この権限を明示的に付与する必要があります。詳細については、「Amazon EventBridge ユーザーガイド」の「Amazon EventBridge イベント」と「Amazon EventBridge のイベントパターン」を参照してください。

Lambda 関数にイベントをルートするには
  1. CloudWatch コンソールの https://console.aws.amazon.com/cloudwatch/ を開いてください。

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

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

  4. [Targets] (ターゲット) に [Add target] (ターゲットの追加) を選択し、[Target type] (ターゲットの種類) に [Lambda function] (Lambda 関数) を選択したら、Lambda 関数を選択します。

  5. [詳細の設定] を選択します。

  6. [Rule definition] で、ルールの名前と説明を入力し、[Create rule] を選択します。

ステップ 3: タスク定義を作成する

タスク定義を作成します。

  1. コンソール (https://console.aws.amazon.com/ecs/v2) を開きます。

  2. ナビゲーションペインで、[タスク定義] を選択します。

  3. [Create new Task Definition] (新しいタスク定義の作成)、[Create new revision with JSON] (JSON で新しいリビジョンを作成) の順に選択します。

  4. 以下のタスク定義の例をコピーしてボックスに貼り付け、[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" ] }
  5. [作成] を選択します。

ステップ 4: ルールをテストする

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

ルールをテストするには
  1. コンソール (https://console.aws.amazon.com/ecs/v2) を開きます。

  2. [Task definitions] (タスク定義) を選択します。

  3. [console-sample-app-static] を選択し、[Deploy] (デプロイ)、[Run new task] (新しいタスクの実行) の順に選択します。

  4. [Cluster] (クラスター) で [default] (デフォルト) を選択し、[Deploy] (デプロイ) を選択します。

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

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

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