AWS Elastic Beanstalk 環境のワーカー層に定期的なタスクを追加したいと考えています。
解決方法
注: Elastic Beanstalk は aws-elasticbeanstalk-ec2-role インスタンスプロファイルロールを使用します。これには、AWSElasticBeanstalkWebTier、AWSElasticBeanstalkWorkerTier、AWSElasticBeanstalkMulticontainerDocker という管理権限が含まれています。定期的なタスクを機能させるには、AWSElasticBeanstalkWorkerTier が必要です。詳細については、「Elastic Beanstalk インスタンスプロファイルの管理」を参照してください。
定期的なタスクをワーカー層に追加する
Elastic Beanstalk 環境のワーカー層に定期的なタスクを追加するには、ソースコードのルートに cron.yaml ファイルを配置します。例:
version: 1
cron:
- name: "schedule"
url: "/schedule"
schedule: "0 */12 * * *"
注: 前述の例では、スケジュールタスクはタスクを説明する Amazon Simple Queue Service (Amazon SQS) メッセージを定期的に送信します。スケジュールタスクは、12 時間ごとにキューの先頭にメッセージを送信します。メッセージがキューを通過した後、インスタンスはタスクを取得し、「/schedule」エンドポイントを HTTP POST します。
定期的なタスクがワーカー層に表示されない場合は、次の「定期的なタスクの問題をトラブルシューティングする」セクションの手順を実行します。
定期的なタスクに関する問題をトラブルシューティングする
1. /var/log/aws-sqsd/default.log プラットフォームファイルで、次のようなログを確認します。
schedule-parser: Successfully loaded 1 scheduled tasks from file /var/app/current/cron.yaml .
2. /var/log/aws-sqsd/default.log ファイルで、Amazon SQS デーモンが実行中で、正しいキューをポーリングしていることを確認します。
Amazon SQS デーモンが正しく起動すると、次のようなログが表示されます。
2023-01-17T03:28:31Z init: initializing aws-sqsd 3.0.4 (2022-03-18)
2023-01-17T03:28:31Z schedule-parser: Successfully loaded 1 scheduled tasks from file /var/app/current/cron.yaml .
2023-01-17T03:28:31Z leader-election: initialized leader election
2023-01-17T03:28:31Z scheduler: initialized 1 job's pending time
2023-01-17T03:28:31Z pollers: start initializting poller timer...
2023-01-17T03:28:31Z pollers: start auto running poller...
2023-01-17T03:28:31Z leader-election: Starting leader election
2023-01-17T03:28:31Z leader-election: current role: worker
2023-01-17T03:28:31Z scheduler: Starting scheduler
2023-01-17T03:28:31Z start: polling https://sqs.us-east-1.amazonaws.com/111122223333/yourWorkerQueue
3. /var/log/aws-sqsd/default.log ファイルで、Amazon SQS デーモンがポート 80 で http://localhost/ に対して送信する HTTP POST リクエストを確認します。デーモンがキューアイテムをポーリングすると、リクエストを送信します。
その際、次のような出力が表示されます。
2019-07-05T13:54:52Z message: sent to http://localhost:80/
4. Amazon SQS キューがメッセージを受信していることを確認するには、ワーカー環境に関連付けられたキューのメトリクス NumberOfMessagesReceived を確認します。
5. スケジュールされたタスクを手動で呼び出すには、次のコマンドを実行します。
curl -d param1=value1 -d param2=value2 -H "Content-Type: application/json" -X POST http://localhost/scheduled-task-path
-d (--data) フラグにより、定期的なタスクに渡そうとしているデータを保持することができます。
注: 定期的なタスクは、Amazon SQS FIFO (First-In-First-Out) キューを設定したワーカー環境では機能しません。
関連情報
Elastic Beanstalk 環境にある Amazon EC2 インスタンスに cron ジョブを作成する方法を教えてください
Periodic Tasks (定期的なタスク)