今回やりたかったこと

  • 社内で適用しているセキュリティのSaaSサービスのアップデートの自動化をしたい
  • 処理内容は、基本的にapiをコールしてこねこねしていくだけ

Lambdaでいいのでは?

  • SaaSが提供しているapiサーバーが、アクセス集中時だと5分経ってもレスポンスを返してくれない

そこでAWS BATCH

AWS BATCHとは

  • Job queueを受けた段階で、予め指定しておいたスペック(スペックが足りなかったら自動で最適なものを立ててくれるらしい?)のEC2を立ち上げてECRからコンテナイメージを持ってきてタスク実行してくれる
  • スケジュールを設定して実行してくれる!とかは無さそう。

アーキテクチャ

Dockerfileはこんな感じ

FROM centos:latest
RUN curl -kl https://bootstrap.pypa.io/get-pip.py | python
RUN pip install awscli
RUN yum install -y git
ADD init.sh /opt/
CMD ["sh","/opt/init.sh","test"]

事前に処理実行に必要なコードだったりシェルスクリプトなんかは、ECRに含めておく。
シェルには、コードコミットから実行ソースをcloneするのに必要なssh key(事前にKMSとかで暗号化しておいたもの)、復号化処理、処理実行とかを書いておく。

あとは、Job queueを送ってあげれば、自動でEC2を立ち上げ、コンテナをマウントして最新のソースコードをcloneしてきて、処理を実行してくれます。
自動で立ち上がったEC2はタスク処理終了後(CMDのとこのやつ)、1時間単位の課金が切れるタイミング?で自動で削除されます。(立ち上がりっぱなしとかの心配なし!)

job queueに送信
aws --profile  --region  batch submit-job --job-name <好きな名前> --job-queue  --job-definition <定義したjob>

結果については、 Jobsの画面で確認することができます。

まとめ

先日参加した「JAWS-UG KOBE」のコンテナまつりでHiganWorks sawanobolyさんがElasticDockerRunって呼んでるって言ってました。
DockerImageを基にいい感じに実行してくれるが、逆にBatch?なのかって印象でした。
もし、スケジュール実行で定期的にbatch処理をしたい!とかでれば、lambdaなんかを使ってqueueに送信してやるといいかなぁと思いました。

追記

シェル内にkmsで暗号化したssh keyを含めているのですが、出来れば外出ししたい。。
パラメーターストアとかに出せるかと思ったのですが、文字数制限の関係で無理でした。

元記事はこちら

AWS Batchを使ってバッチ処理を実装してみた。