「簡単なジョブ実行でサーバーを使うのはもうやめよう」ということでStep Functionsとコンテナで簡単にジョブ実行させる方法のご紹介です。
はじめに
こんにちは。サーバーワークスの松井です。 今回はAWS StepFunctionsとコンテナで簡単にジョブ実行をする方法についてご紹介します。
前提条件
以下のリソースは事前に作成済みであることを前提とします。
- ECS タスク定義
- ECS タスク実行用IAMロール
- ECS タスク用IAMロール
- ECS クラスター
- ECR レポジトリ
- Docker イメージ
- VPC サブネット(ECS タスク実行用)
- ECS用セキュリティグループ
AWS Step Functionsの準備
AWSのマネージメントコンソールログイン後にAWS Step Functionsのコンソール画面へ移動し、ステートマシンを作成します
- 「ステートマシンの作成」を押下します
- Blankのまま「選択」を押下します
- Workflow Studioからデフォルトの「デザイン」から「コード」に変更します
- 以下のJSON文を貼り付けてステートマシーンを定義し、「作成」を押下します(「$.commands」部分は、AWS Step Functionsの入力値に置き換えられます)
{ "Comment": "execute an ECS task", "StartAt": "Run an ECS Task", "States": { "Run an ECS Task": { "Type": "Task", "Resource": "arn:aws:states:::ecs:runTask.sync", "Parameters": { "LaunchType": "FARGATE", "Cluster": "arn:aws:ecs:ap-northeast-1:<AWSアカウントID>:cluster/<ECSクラスター名>", "TaskDefinition": "arn:aws:ecs:ap-northeast-1:<AWSアカウントID>:task-definition/<タスク定義名>:<リビジョン番号>", "NetworkConfiguration": { "AwsvpcConfiguration": { "Subnets": [ "<サブネットID_1>", "<サブネットID_2>" ], "SecurityGroups": [ "<セキュリティグループID>" ], "AssignPublicIp": "ENABLED" } } }, "Overrides": { "ContainerOverrides": [ { "Name": "<コンテナ名>", "Command.$": "$.commands" } ] } }, "Retry": [ { "ErrorEquals": [ "States.ALL" ], "IntervalSeconds": 1, "MaxAttempts": 2, "BackoffRate": 3 } ], "End": true } } }
- ロールの作成を確認の画面で、「確認」を押下します
※ このままですと実行時にIAM Passロールがないとエラーが出ますので、IAMポリシーを新しく作成して、作成されたIAMロールにアタッチします
{ "Version": "2012-10-17", "Statement": [ { "Sid": "EcsIamPass", "Effect": "Allow", "Action": "iam:PassRole", "Resource": [ "arn:aws:iam::<AWSアカウントID>:role/<タスク実行ロールのID>", "arn:aws:iam::<AWSアカウントID>:role/<タスクロールのID>" ] } ] }
AWS Step Functionsの実行
AWS Step Functionsの実行方法には、EventBridgeからスケジュールジョブとして実行する方法と手動実行の2パターンがあります。
今回は、手動実行を利用しますが、EventBridgeでスケジュールジョブとして実行する場合は、以下の「EventBridge ルールを作成」を押下して以降は任意のスケジュールジョブを作成してください
- 「実行を開始」から手動実行をします
- 以下のJSONを貼り付けて「実行を開始」を押下します(今回はUbuntuイメージ上でlsコマンドを実行させます)
{ "commands": [ "ls" ] }
- 実行が成功することを確認します
- ECSのコンソールに移動して、ECS タスクの状態を確認します。実行後は、プロビジョニングの状態になります
- しばらくするとECS タスクは実行中になります
- そしてECS タスクは実行完了と共に削除されます
- CloudWatch Logsにもlsコマンド実行ログが出力されます
まとめ
ご紹介はここまでになります。 サーバー上でcronジョブを組んで実行している簡単なジョブがある場合は、オーバースペックの可能性があるので、是非今回のようなAWSのコンポーネントを組み合わせたコンテナの仕組みを使ってコストカットと運用効率化を検討してみてはいかがでしょうか。
松井 宏司
エンタープライズクラウド部
2022 2023 2024Japan AWS All Certifications Engineer
プロレス観戦が趣味