LoginSignup
12

EventBridge SchedulerでECSタスクの定期実行(まず動かしたい人向け

Last updated at Posted at 2023-06-01

Event Bridge Schedulerを使ってECRからpullしたイメージをECSで定期実行する設定方法をご紹介します
ECS周りの設定は既に済んでるものと仮定しての説明となります点ご了承ください

ECSで実行するアプリケーションはSpring BatchでApplicationRunnerを起動するものとなっております(後述しますが、実行するバッチ種類を指定するためにコンテナに対してパラメータを付与します)
eventbridge.drawio.png

早速設定してみる

スケジュール名と説明

このあたりは機能に直接影響があるものではないので、わかりやすい識別子を設定して次へ行きます
スクリーンショット 2023-04-04 9.20.33.png

スケジュールのパターン

毎日0時に起動するよう設定していきたいと思います
cron式はUNIX系OSお馴染みのものです!
具体的に設定できる値についてはawsの方でもわかりやすくドキュメント化してくださってるのでこちらを参照
https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/events/ScheduledEvents.html
スクリーンショット 2023-04-06 9.50.33.png

時間枠

タイムゾーンを設定(デフォルトのまま)して次画面へいきます
スクリーンショット 2023-04-04 9.21.51.png

ターゲットの詳細

次画面に遷移すると色々なAWSサービスの色々な操作を選択できる画面が表示されます
今回は既に存在するECSクラスタ、タスク定義を使ってECSタスクを実行する目的なので「RunTask」を選択します
スクリーンショット 2023-04-04 9.32.40.png

RunTask

RunTaskに必要なさまざまな設定をしていきます

ECSクラスターとECSタスク定義をここで選択します
プルダウン展開で選択候補値をだしてくれます
スクリーンショット 2023-04-04 9.37.52.png
コンピューティングオプション選択は注意が必要です

  • プラットフォームのバージョン
  • サブネット
  • セキュリティグループ
    はそれぞれ手入力が必要です(*2023/04/04現在)
    プラットフォームのバージョンは「LATEST」で良いと思います
    他は各サービスメニューからサブネットID、セキュリティグループIDをコピーして貼り付けましょう(他のサービスはこの辺の選択がプルダウンになっているのでそのうち対応されると筆者は思ってます)

また、自動割り当てパブリックIPは「有効」にしてください
しないとこちらのエラーが発生します・・! ECRからpullできない?
スクリーンショット 2023-04-04 9.38.15.png

デフォルトからの変更点は「実行コマンドを有効化」している点です
スクリーンショット 2023-04-04 9.38.35.png

今回は起動するバッチの種類をアプリケーションに対して引数で渡したいため、コマンドの上書きを行います
はまったポイント

{
	"containerOverrides": [
		{
			"name": "batch",
			"command": [
				"--batch.execute=sample"
			]
		}
	]
}

スクリーンショット 2023-04-04 9.38.58.png

スケジュールの状態 / 再試行ポリシーとデッドレターキュー

本タスクは24時間に1度起動なので、イベント最大経過時間はデフォルトのままにしました
再試行回数はデフォルト185回ですが、失敗するパターンとすればプログラムやデータに何らかの考慮不足があるときなので3回程度としました(もちろん機能が違えば失敗するパターンも違ってくるので応じて判断していただければと思います)
スクリーンショット 2023-04-05 9.39.31.png

暗号化 / アクセス許可

これらはデフォルトのままとしました
実行ロールについては TODO
スクリーンショット 2023-04-05 9.40.19.png

設定完了

あとは画面に従って操作を進めれば設定完了です
スクリーンショット 2023-04-06 9.38.43.png

まず、起動成功した or エラーってどう見るの

起動できているかどうかの確認は、CloudTailから確認できそうです
イベント時刻をみると15分おきにRunTaskが実行されているのが確認できます

スクリーンショット 2023-04-06 9.46.43.png

エラーの場合

エラーコードの箇所にエラーの種類が表示されます(今回サンプルで示しているケースだと「InvalidParameterException)
スクリーンショット 2023-04-06 9.53.39.png

詳細を確認するには、画面下部のイベントレコードを確認します
InvalidParameterExceptionで検索してみてください
エラーを発生させるために、RunTask > コンピューティングオプション > 起動タイプ を未指定にしてみました
スクリーンショット 2023-04-06 9.59.11.png

成功の場合

スクリーンショット 2023-04-07 9.59.39.png

設定中はまったこと

コマンドの上書き指示でエラー

{
	"containerOverrides": [
		{
			"command": [
				"--batch.execute=sample"
			]
		}
	]
}

構築初期、調べに調べて捻り出したコマンド上書きの設定値がこちらで、正しいものと比べるとnameが欠落してました
コマンドの上書き指示になにを渡したら良いかが当時参考文献少なく、結構ハマりました
こちらのドキュメントを参照することで何を設定したら良いか、なにが必須なのかがわかりました!
https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/APIReference/API_ContainerOverride.html

実際のエラー情報
スクリーンショット 2023-04-11 10.37.34.png

~~ 略 ~~
    "errorCode": "InvalidParameterException",
    "errorMessage": "name cannot be blank.",
    "requestParameters": {
        "platformVersion": "LATEST",
        "overrides": {
            "containerOverrides": [
                {
                    "command": [
                        "--batch.execute=sample"
                    ]
                }
            ]
        },
~~ 略 ~~

because no identity-based policy allows the ecs:RunTask action

"errorMessage": "User: arn:aws:sts::xxx:assumed-role/Amazon_EventBridge_Scheduler_ECS_yyy/zzz is not authorized to perform: ecs:RunTask on resource: arn:aws:ecs:ap-northeast-1:xxx:task-definition/sample-def because no identity-based policy allows the ecs:RunTask action"

※ 2023/04/04現在 自動生成の実行ロールを指定している場合はこのエラーは発生しません
本記事では触れてませんが、実運用ではアクセス許可に設定する実行ロールを「既存のロールを使用」して独自で定義したポリシーをアタッチしてました。
また、その実行ロールを複数のスケジュールで共有しておりました。
上記の条件で以下のようなポリシーを定義している場合はエラーが発生しますので注意です

悪い例

Resourceに指定するECSタスク定義に「:*」の指定がある

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ecs:RunTask"
            ],
            "Resource": [
                "arn:aws:ecs:ap-northeast-1:xxxx:task-definition/development-batch-def:*"
            ],
            "Condition": {
                "ArnLike": {
                    "ecs:cluster": "arn:aws:ecs:ap-northeast-1:xxxx:cluster/development"
                }
            }
        },
        {
            "Effect": "Allow",
            "Action": "iam:PassRole",
            "Resource": [
                "*"
            ],
            "Condition": {
                "StringLike": {
                    "iam:PassedToService": "ecs-tasks.amazonaws.com"
                }
            }
        }
    ]
}

良い例

Resourceに指定するECSタスク定義ARNに「:*」の指定がない

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ecs:RunTask"
            ],
            "Resource": [
                "arn:aws:ecs:ap-northeast-1:xxxx:task-definition/development-batch-def"
            ],
            "Condition": {
                "ArnLike": {
                    "ecs:cluster": "arn:aws:ecs:ap-northeast-1:xxxx:cluster/development"
                }
            }
        },
        {
            "Effect": "Allow",
            "Action": "iam:PassRole",
            "Resource": [
                "*"
            ],
            "Condition": {
                "StringLike": {
                    "iam:PassedToService": "ecs-tasks.amazonaws.com"
                }
            }
        }
    ]
}

実際のエラー情報
スクリーンショット 2023-04-13 10.01.41.png

~~ 略 ~~
    "errorCode": "AccessDenied",
    "errorMessage": "User: arn:aws:sts::894229353696:assumed-role/Amazon_EventBridge_Scheduler_ECS_8840c322a4/xxxx is not authorized to perform: ecs:RunTask on resource: arn:aws:ecs:ap-northeast-1:894229353696:task-definition/development-batch-def because no identity-based policy allows the ecs:RunTask action",
    "requestParameters": null,
    "responseElements": null,
~~ 略 ~~

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12