EventBridgeからStepFunctionsを呼びたいのに動かない・・・（泣）

どーも、ogimanです。

本日は、私がEventBrigde、StepFunctionsの検証をしていた際にハマったお話です。
今後、同じことでハマらないためにメモっときます

さきに結論言っておきます！タイムゾーンの見方を間違えていただけ！:scream:

# 目的
- 毎日13時にECSのサービス強制更新をさせたい
  - なぜ、更新するのか？
    - アプリケーションの一部の仕様上、一部のデータがコンテナのエフェメラルストレージに一時ファイルとして保管される（容量はどんどん積み上がっていく）。普段はデプロイされるたびにコンテナが置き換わるのでエフェメラルストレージはクリアされて問題ないが、年末年始休暇ではデプロイがないため、コンテナが置き換わらない。結果、エフェメラルストレージの容量が不足する。不足した結果、アプリケーションが停止してしまう。なので、暫定処置として長期休日の際は定期的にECSのサービス強制更新を実施することで本問題を解決することになった。



# 誰向け
- AWSを使う方

# 構成はシンプル

![スクリーンショット 2024-02-03 11.09.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144316/00fc42c2-01b5-0280-0da9-168d20c07ae3.png)
※ECSの実行環境はFargeteです。

**EventBrigdeを13時に設定して、StepFunctionsに以下のパラメータを渡す**
  - cronは `（0 13 ? * * *）`
  - EventBrigdeのターゲット先として作成したStepFunctionsを指定する
  - ターゲットの設定でパラメータを指定できるのでサービス更新を実行したいコンテナ名を指定する
    - パラメータを渡す理由として、サービス更新したいECSのコンテナを柔軟に変えたかったため。
  

```
{
  "container": "ogiman-app"
}
```

**StepFunctionsもシンプル**


![スクリーンショット 2024-02-03 10.42.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144316/de7ed2a7-0ea8-6f7b-6213-9b753506cd17.png)

- ポイントは `"Service.$": "$.container"` のところで前述したEventBrigdeのパラメータを渡している

```
{
  "Comment": "Update ECS Service",
  "StartAt": "UpdateService",
  "States": {
    "UpdateService": {
      "Type": "Task",
      "End": true,
      "Parameters": {
        "Cluster": "ogiman-cluster",
        "Service.$": "$.container",
        "ForceNewDeployment": true
      },
      "Resource": "arn:aws:states:::aws-sdk:ecs:updateService"
    }
  }
}
```

**IAMの設定**
権限が緩くてすんません
本当はリソースの指定とかしっかりしたほうが良いので引用される方はご注意を！

- Eventbrigde(ポリシー)

```
{
    "Statement": [
        {
            "Action": "states:StartExecution",
            "Effect": "Allow",
            "Resource": "*"
        }
    ],
    "Version": "2012-10-17"
}
```
- Eventbrigde(信頼されたエンティティ)

```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Service": "events.amazonaws.com"
            },
            "Action": "sts:AssumeRole"
        }
    ]
}
```

- StepFunctions(ポリシー)
  - AmazonECS_FullAccessと以下のポリシーを追加
    - ここもFullAccessと権限を与えすぎですね・・・汗

```
{
    "Statement": [
        {
            "Action": [
                "xray:PutTraceSegments",
                "xray:PutTelemetryRecords",
                "xray:GetSamplingRules",
                "xray:GetSamplingTargets"
            ],
            "Effect": "Allow",
            "Resource": [
                "*"
            ]
        }
    ],
    "Version": "2012-10-17"
}
```

- StepFunctions(信頼されたエンティティ)

```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Service": "states.amazonaws.com"
            },
            "Action": "sts:AssumeRole"
        }
    ]
}
```

# 問題
- どんだけ何をいじってもEventBrigdeのイベントが発動しない
  - また別の機会に記載しますが、色々と検証を試した結果、誤ってStepFunctionsのジョブを30万回も実行させてしまいました。完全にしくじった・・・汗


# 原因
![スクリーンショット 2024-02-03 10.34.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144316/92456ce8-a0f9-76ed-f3e9-45d43eacfc02.png)

こいつだ！！そう、タイムゾーンの指定が間違っていた。
EventBrigdeのタイムゾーンはUTCで表示されている。cronで13時と設定していると22時に実行される。
つまり、いくら13時と設定していても動かないですよね・・・・
なぜ、こんなことに気づかなかったのか、情けない。



# 対処
ということで解決策としてはcronの設定を以下に修正して問題は解消した。

- cronは `（0 4 ? * * *）` 


# 最後に
AWSってデフォルトでUTCになっていること多いので注意しましょう。
特にメトリクス周りとか見てるとUTCが多い

AWSって、デフォルトのタイムゾーン変えられるのかしら？
ご存知の方がいらっしゃったら、ご教示くださいませー:bow_tone1:

この記事が少しでも参考になったら、 :heart: お願いします！
励みになります♪

ではでは、良い一日を〜