ヤマムギ

growing hard days.

*

AWS BatchでPandocコンテナイメージを実行する

   

「ECR(Amazon Elastic Container Registry)にコンテナイメージをアップロードする」でアップロードしたPandocのコンテナイメージを使用してAWS Batchで実行したいと思います。


最終的にはS3にアップロードされたマークダウンからEPUB3への変換を自動化したいと思います。
とりあえず今日はBatchを使って実行できることやコマンドの構成をどのようにしないといけないかを確認します。

AWS Batchユーザーガイドを確認しながら進めます。

AWS Batchで実行するにあたって

まずはこちらの「AWS Batchを使って5分以上かかる処理を実行してみる」が一番うやりたいこに近かったので読みました。

コンテナの中にはgit cloneしてダウンロードしたシェルを実行するシェルを用意しておけば、コードは外部でメンテナンスできます。
ブートストラップのような構成ができそうです。

「Pandocサーバーのコンテナイメージを作成する」で作ったコンテナにシェルを仕込みます。
そのためのAWS CodeCommitの環境も作らないとです。

AWS CodeCommitの設定

[リポジトリの作成]からリポジトリを作成しました。

接続方法は以前と変わってなさそうですので、「AWS Code Commitをプライベートリポジトリとして使う」をご参照いただければ幸いです。

run.shというファイルを作成してコミットしてプッシュしておきました。

S3バケットからinput.mdをダウンロードして、pandocでEPUBに変換してS3バケットにアップロードするだけのテストスクリプトです。

コンテナイメージへの追加設定

MacのDockerで作業してます。

コンテナを起動してターミナルに入ります。
今回のテストでは、AWS CLIとシェルスクリプトのみを使いますが、最終的にはPythonを使うことになりそうなので環境を作っておきます。
イメージのOSがAmazon Linux2だったのですが、すでにPython2.7は入っていました。

/usr/local/init.sh

このシェルスクリプトも「AWS Batchを使って5分以上かかる処理を実行してみる」を参考に、というかほぼそのままです。
IAMロールでAWS CodeCommitにgitコマンド実行できるのって、セキュアですっごくいいですね。

コンテナを抜けてローカルへ戻りました。

docker ps コマンドで設定したコンテナのIDを確認して、docker commitコマンドでイメージのアップデートをしました。

そして、「ECR(Amazon Elastic Container Registry)にコンテナイメージをアップロードする」の手順でECRのイメージを上書きしました。

AWS Batchの設定

[今すぐ始める]ボタンから初回実行ウィザードを起動しました。

すべてをデフォルトでとりあえず設定しました。
作成するとジョブが送信されてEC2インスタンスが起動していたので終了しました。

AWS Batchで作成されたジョブ定義、ジョブキュー、コンピューティング環境は削除しました。

IAMの設定

2つのIAMロールが出来ているのでこちらを使います。
* AWSBatchServiceRole
* ecsInstanceRole

AWSBatchServiceRoleはそのまま使いました。
ecsInstanceRoleには、CodeCommitの該当のリポジトリと、対象のS3バケットへの権限を追加しました。

あとスポットインスタンスを使いたいので、Amazon EC2 スポットフリートロールの手順で、AmazonEC2SpotFleetRoleを作成しました。

VPC

今回の環境用にVPCを作成しました。
S3にアクセスするのでインターネットゲートウェイをアタッチして、全AZにパブリックサブネットを作成しました。
セキュリティグループは1つ作成し、インバウンドは拒否、アウトバウンドは許可、のデフォルトのままにしました。
サブネットは作成後に[アクション]-[自動割り当てIP設定の変更]をONにしておきました。
そうしないと、今回の構成ではVPC内で起動してきたコンテナがS3やCloudWatch、CodeCommitにアクセスできないです。

ジョブ定義

設定したのはジョブ名、コンテナイメージ、コマンド、vCPUs、メモリです。
コンテナイメージはECRのURIを設定しました。
コマンドはコンテナで実行するコマンドです。

コンピューティング環境

サービスロール、インスタンスロールはウィザードで作成された、以下のロールを指定しました。
* AWSBatchServiceRole
* ecsInstanceRole

一応キーペアも選択しておきました。

コンピューティングリソースでは、スポットインスタンスを使用したいので、スポットフリートロールはあらかじめ作成していたAmazonEC2SpotFleetRoleを指定しました。

上限入札価格はオンデマンドインスタンスの100%にしました。

ネットワーキングではあらかじめ作成しておいたVPC、サブネット、セキュリティグループを指定しました。

ジョブキュー

コンピューティング環境に紐付けてジョブキューを作成しました。

成功しました!!

S3バケットに変換されたEPUBファイルができました。

CloudWatchにも実行ログが出力されていました。

最初はVPCのサブネットでパブリックIPアドレスの自動割り当てをしてなかったので、CloudWatchにログが書き出されなくて何がいけなのかわからずに少し悩みました。

これでマークダウンからEPUBへ変換する環境ができました。
実行後少しすると、コンテナを動かしていたEC2インスタンスも終了されました。


最後までお読みいただきましてありがとうございました!

「AWS認定資格試験テキスト&問題集 AWS認定ソリューションアーキテクト - プロフェッショナル 改訂第2版」という本を書きました。

「AWS認定資格試験テキスト AWS認定クラウドプラクティショナー 改訂第2版」という本を書きました。

「ポケットスタディ AWS認定 デベロッパーアソシエイト [DVA-C02対応] 」という本を書きました。

「要点整理から攻略するAWS認定ソリューションアーキテクト-アソシエイト」という本を書きました。

「AWSではじめるLinux入門ガイド」という本を書きました。

 - AWS, MarkDown , ,

ad

ad

  関連記事

リザーブドインスタンスはじめました

このブログも2014年9月にはじめたので、もうすぐ3年。 1件~17件とばらつき …

AWS CloudShellでboto3(SDK for Python)使うならpython3

本の執筆をしていて、ちょっとAWS CLIやSDKのふるまいを確認したいことがあ …

AWS Systems Manager Session Managerでログを有効にする

AWS Systems Manager Session Managerでのコマン …

AWS Client VPNの接続ログを確認しました

AWS Client VPNを設定しましたで証明書とかせっかく作ったので、いろい …

AWS Cost Anomaly Detectionでコストモニターを作成しました

[ご利用開始にあたって]を押下しました。 このあと画面を説明してくれるツアーがあ …

AWS Organizationsで組織全体のAWS CloudTrailを有効にしました

Organizationsのサービスメニューから、CloudTrailを選択して …

EC2インスタンスWindowsでセッションマネージャーを使う

WindowsのEC2インスタンスでセッションマネージャーを使ってみたことがない …

JAWS-UG 大阪 関西女子合同 Amazon Personalizeハンズオンやってみました

久しぶりに大阪でJAWS-UGに参加です。 Amazon Personalize …

WordPressで画像アップロードができなくなった(AWS WAFでブロックしていた)

WordPressで画像がアップロードできなくなりました。 こんなメッセージです …

AWS CodeDeployからEC2 Auto Scalingにデプロイするチュートリアル

公式チュートリアルチュートリアル: アプリケーションを CodeDeployグル …