どーも、ogimanです。
本日は、私がEventBrigde、StepFunctionsの検証をしていた際にハマったお話です。
今後、同じことでハマらないためにメモっときます
さきに結論言っておきます!タイムゾーンの見方を間違えていただけ!
目的
- 毎日13時にECSのサービス強制更新をさせたい
- なぜ、更新するのか?
- アプリケーションの一部の仕様上、一部のデータがコンテナのエフェメラルストレージに一時ファイルとして保管される(容量はどんどん積み上がっていく)。普段はデプロイされるたびにコンテナが置き換わるのでエフェメラルストレージはクリアされて問題ないが、年末年始休暇ではデプロイがないため、コンテナが置き換わらない。結果、エフェメラルストレージの容量が不足する。不足した結果、アプリケーションが停止してしまう。なので、暫定処置として長期休日の際は定期的にECSのサービス強制更新を実施することで本問題を解決することになった。
- なぜ、更新するのか?
誰向け
- AWSを使う方
構成はシンプル
EventBrigdeを13時に設定して、StepFunctionsに以下のパラメータを渡す
- cronは
(0 13 ? * * *)
- EventBrigdeのターゲット先として作成したStepFunctionsを指定する
- ターゲットの設定でパラメータを指定できるのでサービス更新を実行したいコンテナ名を指定する
- パラメータを渡す理由として、サービス更新したいECSのコンテナを柔軟に変えたかったため。
{
"container": "ogiman-app"
}
StepFunctionsもシンプル
- ポイントは
"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と権限を与えすぎですね・・・汗
- AmazonECS_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万回も実行させてしまいました。完全にしくじった・・・汗
原因
こいつだ!!そう、タイムゾーンの指定が間違っていた。
EventBrigdeのタイムゾーンはUTCで表示されている。cronで13時と設定していると22時に実行される。
つまり、いくら13時と設定していても動かないですよね・・・・
なぜ、こんなことに気づかなかったのか、情けない。
対処
ということで解決策としてはcronの設定を以下に修正して問題は解消した。
- cronは
(0 4 ? * * *)
最後に
AWSってデフォルトでUTCになっていること多いので注意しましょう。
特にメトリクス周りとか見てるとUTCが多い
AWSって、デフォルトのタイムゾーン変えられるのかしら?
ご存知の方がいらっしゃったら、ご教示くださいませー
この記事が少しでも参考になったら、 お願いします!
励みになります♪
ではでは、良い一日を〜