AWS BatchとStep Functionsの10分間チュートリアルをやってみた

10分では終わらなかったので、次に試す人が10分で終わりますようにと願いを込めて
2021.03.01

AWS BatchとStep Functionsの組み合わせを一回触りたいなと思い、10分でできるチュートリアルをやってみました。

やってみた感想

  • AWS Batchは設定を手動で入れるため設定必要な箇所の感覚をつかめる
  • Step Functionsはワークフローコピペなので雰囲気しかつかめない
  • チュートリアル通りだとハマるのでエラー対処方法を紹介します

やってみた

こちらのチュートリアルに沿ってすすめます。実際にビデオのエンコードを行うことはなく、Step Functionsのワークフローの流れで素のAmazon Linux2コンテナが起動して終了するだけの非常にシンプルな内容です。

ステップ 1: セットアップ

AWS Batchのダッシュボードのデザインがアップデートされています。デザイン変更でとくに困るようなことはありませんでした。

ステップ 2: バッチジョブをセットアップする

スポットインスタンスを積極的に活用していきたい派のでFargate Spotを使います!

既存VPCのパブリックサブネットを指定します。プライベートサブネットを指定する場合は、NATゲートウェイまたは、ECR用のVPCエンドポイントが必要になります。

ステップ 3: AWS Batch キューをセットアップする

チュートリアル通りに優先度違いで2つのジョブキューを作成しました。ちなみに優先度の数値の高いジョブキューが優先してコンピューティングリソースを利用します。

ステップ 4: ジョブ定義をセットアップする

今回はパブリックサブネットを指定しているため、パブリックIPを割り当てを有効化しています。

echoコマンドの部分が日本語訳されてしまっているので英語の切り替えて原文を確認して入力しました。デフォルトのecho 'hello world'ままでも本チュートリアルの動作には影響しません。2、3個目のジョブ定義はhello worldのままで作成しました。

echo performing video transcoding job.

つまずき

2vCPUメモリ4GB指定の設定で作成すると下記のエラーが表示されました。

エラー: Error executing request, Exception : Fargate resource requirements (2.00 vCPU, 2048 MiB) not valid., RequestId: f99a2f75-1391-46d0-806b-f400f4d1bd36

指定された CPU またはメモリの値が無効 - Amazon Elastic Container Service

Fargateの仕様でvCPUとメモリサイズの組み合わせが決まっています。2vCPUに対してメモリ4GBがお気に召さなかったようです。ただ、2vCPUのサポート範囲はメモリ4GB-16GBと範囲内です。2vCPUサポート5GB指定だと問題なく作成できました。

最終的に指定の3ジョブ定義を作成しました。

ステップ 5: ステートマシンでワークフローを作成する

IAMロール名は自動的に名前が付与されます。StepsBatchTutorial_Roleを明示的に設定する必要はなくなっていました。

ステートマシンの定義はリージョン名と、アカウント名を置換します。その後、ステートマシンの定義にコピペすれば完成と思いきやハマりました。

ステートマシン定義はコピペすると下記のワークフローが出来上がります。

つまずき

この後ステップ6でワークフローを実行するのですがExtract Featuresでジョブが失敗します。

原因はステートマシン定義内のジョブ定義名に一部誤りがあります。

ステートマシン定義内にjob-definitionStepsBatchTutorial_ExtractFeatures:1とジョブ定義名がExtractFeatures指定されています。ステップ4で作成したジョブ定義名はFindFeaturesです。ワークフローで指定するジョブ定義名をFindFeautersに変更して回避しました。

修正前: arn:aws:batch:REGION:112233445566:job-definitionStepsBatchTutorial_ExtractFeatures:1",

修正後: arn:aws:batch:REGION:112233445566:job-definitionStepsBatchTutorial_FindFeatures:1",

                {
                    "StartAt": "Extract Features",
                    "States": {
                        "Extract Features": {
                            "Type": "Task",
                            "Resource": "arn:aws:states:::batch:submitJob.sync",
                            "Parameters": {
                                "JobDefinition": "arn:aws:batch:REGION:112233445566:job-definitionStepsBatchTutorial_FindFeatures:1",
                                "JobName": "ExtractFeatures",
                                "JobQueue": "arn:aws:batch:REGION:112233445566:job-queue/StepsBatchTutorial_LowPriorityQueue"
                            },
                            "End": true
                        }
                    }
                },

一から始める場合はステップ4のジョブ定義作成時にFindFeauresではなくExtraFeauresの名前で作成するのをオススメします。ステートマシン定義を編集するよりは修正しやすいかと思います。

また、ステートマシン定義で指定しているジョブ定義名の後ろの:1は、AWS Batchのジョブ定義の改定の数値です。 切り分けしてたら5になりました。この場合はステートマシン定義内のジョブ定義は:5と指定してください。

ステップ 6: ワークフローを実行する

ジョブ定義名の誤りを修正していればワークフローは正常に終了します。

なにかすごいことが始まりそうですが、素のAmazon Linux2のコンテナが起動して終了していくだけです。

無事、完了!

おわりに

ジョブ定義名の誤りについては日本語訳の問題ではなく英語でも同様だったためフィードバック済みです。同じところつまづくことがありましたら参考にしていただければ嬉しいです。私はStep Functions初見でした。チュートリアルを終えてワークフローは自作して経験つまないとダメだとわかったのが収穫です。

AWS BatchとStep Functionsの組み合わせは下記の記事も参考にしてください。