1. aosho235

    No comment

    aosho235
Changes in body
Source | HTML | Preview
@@ -1,25 +1,27 @@
-ECSでCloudWatch Eventスケジュール式(cron式)をトリガーにタスクを起動するよう設定していたのだが、なぜかまれにタスクが同時に2個起動することがある。エラーが起きたからリトライされたというわけではなく、タスクは2個とも正常終了した。
+CloudWatch Eventスケジュール式(cron式)をトリガーにECSでタスクを起動するよう設定していたのだが、なぜかまれにタスクが同時に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に設定しておけばよいのかもしれない。
+Lambdaでも同様にCloudWatch Eventスケジュール式をトリガーにしていると多重起動することがあるらしい。Lambdaの場合は同期実行数を1に設定しておけばよいと思いきや、それでもダメ。1つの Lambda 関数が起動して終了した後に、もう1つの Lambda 関数が起動してくる可能性があるため。
+[Lambda 関数の同時実行数を1にしても冪等性の担保から逃れることは出来ない | by noid11 | Medium](https://medium.com/@noid11/lambda-%E9%96%A2%E6%95%B0%E3%81%AE%E5%90%8C%E6%99%82%E5%AE%9F%E8%A1%8C%E6%95%B0%E3%82%921%E3%81%AB%E3%81%97%E3%81%A6%E3%82%82%E5%86%AA%E7%AD%89%E6%80%A7%E3%81%AE%E6%8B%85%E4%BF%9D%E3%81%8B%E3%82%89%E9%80%83%E3%82%8C%E3%82%8B%E3%81%93%E3%81%A8%E3%81%AF%E5%87%BA%E6%9D%A5%E3%81%AA%E3%81%84-24a7e414933d)
-多重起動を防ぎたければ、DynamoDBを使ってロックを実装するのが良いらしい。ロックを解除しないままエラー終了してしまうと、ロックが残ったままになるので、DynamoDBテーブルにTTLを設定して、一定時間後に自動的に削除される(=ロック解除される)ようにしておくと良いかもしれない。
+多重起動を防ぎたければ、DynamoDBを使ってロックを実装するのが良いらしい。ロックを解除しないままエラー終了してしまうと、ロックが残ったままになるので、DynamoDBテーブルにTTLを設定して、一定時間後に自動的に削除される(=ロック解除される)ようにしておくと良いかもしれない。TTLは指定時刻ピッタリでなく、最大48時間以内に削除されるという仕様だが…
+[【小ネタ】 DynamoDBのTTLで一部だけ無期限にしたい時は0でOK - Qiita](https://qiita.com/kimama-cloud/items/4e9fa4d19f798ad9d032)
酷い話だ。
追記:
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/)