1. aosho235

    No comment

    aosho235
Changes in body
Source | HTML | Preview
@@ -1,22 +1,25 @@
ECSでCloudWatch Eventスケジュール式(cron式)をトリガーにタスクを起動するよう設定していたのだが、なぜかまれにタスクが同時に2個起動することがある。エラーが起きたからリトライされたというわけではなく、タスクは2個とも正常終了した。
CloudWatch Eventはそういうもので、ちょうど1回だけ起動することを保証していないとAWSドキュメントに書いてある。
>1 つのイベントに応じてルールが複数回トリガーされました。CloudWatch イベント で、ルールのトリガーまたはターゲットへのイベントの提供で何が保証されますか。
まれに、単一のイベントまたはスケジュールされた期間に対して同じルールを複数回トリガーしたり、特定のトリガーされたルールに対して同じターゲットを複数回起動したりする場合があります。
>[CloudWatch イベント のトラブルシューティング](https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/events/CWE_Troubleshooting.html#RuleTriggeredMoreThanOnce)
Lambdaでも同様にCloudWatch Eventスケジュール式をトリガーにしていると多重起動することがあるらしい。Lambdaの場合は同期実行数を1に設定しておけばよいのかもしれない。
多重起動を防ぎたければ、DynamoDBを使ってロックを実装するのが良いらしい。ロックを解除しないままエラー終了してしまうと、ロックが残ったままになるので、DynamoDBテーブルにTTLを設定して、一定時間後に自動的に削除される(=ロック解除される)ようにしておくと良いかもしれない。
酷い話だ。
+追記:
+DynamoDBを使ってロックを実装しても、1個目のタスクが1分で終了してから2個目のタスクが起動されたことがあった。これはロックでは防げない…
+
## 参考
- [Scheduled Task Running Twice](https://forums.aws.amazon.com/thread.jspa?messageID=873044)
- [Lambda でアトミックなロック処理を実装する](https://blog.manabusakai.com/2016/07/lambda-atomic-lock/)
- [Lambda is been executed several times by scheduled event](https://forums.aws.amazon.com/message.jspa?messageID=750312)
- [DynamoDBの各データを自動で削除する機能(TTL:Time to Live)を試してみた | DevelopersIO](https://dev.classmethod.jp/cloud/aws/try-dynamodb-ttl/)