イベント駆動型にAmazon ECS Taskを動かす

# はじめに
AWS ECSのタスクをイベント駆動型に動かしてみます。今回は「特定のS3バケットにオブジェクトがアップロードされた場合」に起動するように設定します。
![image_09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675893/00d014bc-2d3e-00f8-1356-24f03e115eee.png)


参考：

https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-ecs-tutorial.html

ちなみに、イベント駆動型以外にもスケジュール型が存在しており、バッチのようにタスクを動かすことも可能です。

https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/scheduling_tasks.html

# 設定方法
## 前提条件
ECSの設定(Cluster,Task定義..etc)とS3バケットの作成が完了していること。
CloudTrailが有効化されていること。

## EventBridgeの設定

- コンソールにアクセスし、ルールを作成する。


 - 「Amazon EventBridge - ルールを作成」からルールを作成する。
![image_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675893/9509c619-461a-40a3-1682-5f1079888fe5.png)


- 「パターンを定義」では以下の通りに設定する。
    - 特定のバケットではアップロードを検知したいバケット名を入力する。
![image_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675893/39f5f7d9-b095-55df-6ff0-3e9b9349d507.png)

```json:EventPattern.json
{
  "source": ["aws.s3"],
  "detail-type": ["AWS API Call via CloudTrail"],
  "detail": {
    "eventSource": ["s3.amazonaws.com"],
    "eventName": ["PutObject"],
    "requestParameters": {
      "bucketName": ["<Your S3 Bucket>"]
    }
  }
}
```

detail-typeから察するに、トリガーはCloudTrailのイベントのよう。

- 「ターゲットを選択」では以下のように設定する
    - ターゲット：ECSタスク
    - クラスター：タスクをデプロイしたいクラスター
    - タスク定義：デプロイしたいタスクのタスク定義
    - タスク定義リビジョン：デプロイしたいタスクのリビジョン
    - カウント：デプロイしたいタスク数

![image_03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675893/fb758854-e648-8c8e-4abe-0c3be047a3ca.png)

- 「コンピューティングオプション」/「ネットワーク設定を構成する」では自環境にあったものを設定する

![image_04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675893/7e89548a-3287-c1b3-2b73-38aab26fd9d4.png)

![image_05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675893/dff4a970-d6b8-8e9d-0c53-c99d5f2b461b.png)

- 「追加プロパティを設定」は最近追加されたようです


https://aws.amazon.com/jp/about-aws/whats-new/2021/07/amazon-ecs-supports-additional-configurations-for-scheduled-and-event-driven-tasks/

- 自環境に合うように設定する
※Fargate起動タイプを使用する場合はタスク配置戦略/配置拘束はサポートされません。
    - タスクグループ：複数のタスクをひとまとまりとする。配置戦略などでセットとしてみなされる。
    - 配置拘束：タスク配置時に考慮されるルール。
        - distinctInstance：タスクグループ内の各タスクを別のインスタンスに配置する。
        - memberOf：式を満たすコンテナインスタンスにタスクを配置する。
    - 配置戦略：コンテナインスタンスにタスクを配置する方法。
        - binpack：インスタンス数を最小限に抑える。
        - random：ランダムに配置する。
        - spread：指定された値に基づいて均等に配置する。
    - 管理タグを設定：マネージドタグを自動的にタグ付けするかどうか。
    - 実行コマンドを設定：[Amazon ECS Exec][link-1]を使用するかどうか。
    - 伝搬タグを設定：タスク定義からタグを伝搬するかどうか。

参考：
https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/task-placement.html

[link-1]:https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/userguide/ecs-exec.html


- ロールの作成・リトライの設定をしたのち、作成する

## 試す
- 対象のS3バケットに適当なファイルを配置する

- ECSのコンソールから確認する
    - タスクが立ち上がっている
    - 開始元がEventBridgeで作成したルールとなっている

![image_07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675893/51ee1ce4-ac1d-d9f6-9fb2-7d63e372552e.png)
 
## イベントがトリガーされない場合
「CloudTrail - 証跡」から、データイベントが有効化されていることを確認してください。

![image_08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675893/11fb4f8f-a2cb-b179-bd4e-1e764d30bece.png)

# まとめ
特定のS3バケットにオブジェクトが配置されたらタスクを実行するという設定を行いました。「S3に何か行われた際に何かする」というユースケースの場合、Lambdaを使う場合が多いかなという気もしますが、ECSを使うこともできるということも頭の片隅に入れておきたいですね。