AWS BatchでPandocコンテナイメージを実行する
「ECR(Amazon Elastic Container Registry)にコンテナイメージをアップロードする」でアップロードしたPandocのコンテナイメージを使用してAWS Batchで実行したいと思います。
最終的にはS3にアップロードされたマークダウンからEPUB3への変換を自動化したいと思います。
とりあえず今日はBatchを使って実行できることやコマンドの構成をどのようにしないといけないかを確認します。
目次
AWS Batchで実行するにあたって
まずはこちらの「AWS Batchを使って5分以上かかる処理を実行してみる」が一番うやりたいこに近かったので読みました。
コンテナの中にはgit cloneしてダウンロードしたシェルを実行するシェルを用意しておけば、コードは外部でメンテナンスできます。
ブートストラップのような構成ができそうです。
「Pandocサーバーのコンテナイメージを作成する」で作ったコンテナにシェルを仕込みます。
そのためのAWS CodeCommitの環境も作らないとです。
AWS CodeCommitの設定
[リポジトリの作成]からリポジトリを作成しました。
接続方法は以前と変わってなさそうですので、「AWS Code Commitをプライベートリポジトリとして使う」をご参照いただければ幸いです。
run.shというファイルを作成してコミットしてプッシュしておきました。
S3バケットからinput.mdをダウンロードして、pandocでEPUBに変換してS3バケットにアップロードするだけのテストスクリプトです。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
#!/bin/bash echo 'download start' aws s3 cp s3://bucket_name/input/input.md /tmp/input.md echo 'pandoc start' pandoc -f markdown /tmp/input.md -o /tmp/output.epub echo 'upload start' aws s3 cp /tmp/output.epub s3://bucket_name/output/output.epub echo 'finish!!' |
コンテナイメージへの追加設定
MacのDockerで作業してます。
1 2 |
$ docker run -v /Users/xxx/Documents/docker/pandoc:/tmp -it pandoc /bin/bash |
コンテナを起動してターミナルに入ります。
今回のテストでは、AWS CLIとシェルスクリプトのみを使いますが、最終的にはPythonを使うことになりそうなので環境を作っておきます。
イメージのOSがAmazon Linux2だったのですが、すでにPython2.7は入っていました。
1 2 3 4 5 6 7 8 |
# yum install -y python3 # pip3 install awscli # pip3 install boto3 # yum install -y git # yum install -y vim # mkdir /usr/local/pandoc # vim /usr/local/init.sh |
/usr/local/init.sh
1 2 3 4 5 6 7 8 9 10 11 |
#!/bin/bash echo 'init start' CODE_REPO=https://git-codecommit.us-east-1.amazonaws.com/v1/repos/repos_name echo 'clone start' git clone --config credential.helper='!aws --region us-east-1 codecommit credential-helper $@' --config credential.UseHttpPath=true $CODE_REPO /usr/local/pandoc echo 'run exe' sh /usr/local/pandoc/run.sh |
このシェルスクリプトも「AWS Batchを使って5分以上かかる処理を実行してみる」を参考に、というかほぼそのままです。
IAMロールでAWS CodeCommitにgitコマンド実行できるのって、セキュアですっごくいいですね。
1 2 |
# exit |
コンテナを抜けてローカルへ戻りました。
1 2 3 4 |
$ docker ps -a 38e10a07f143 pandoc "/bin/bash" 19 seconds ago Exited (0) 4 seconds ago compassionate_wilson $ docker commit 38e10a07f143 pandoc |
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版」という本を書きました。
![](https://www.sbcr.jp/wp-content/uploads/2023/01/9784815617929-1-407x596.jpg)
「AWS認定資格試験テキスト AWS認定クラウドプラクティショナー 改訂第3版」という本を書きました。
![](https://www.sbcr.jp/wp-content/uploads/2024/01/9784815625382-3-420x596.jpg)
「ポケットスタディ AWS認定 デベロッパーアソシエイト [DVA-C02対応] 」という本を書きました。
![](https://www.shuwasystem.co.jp//images/book/637791.jpg)
「要点整理から攻略するAWS認定ソリューションアーキテクト-アソシエイト」という本を書きました。
![](https://book.mynavi.jp/files/topics/135344_ext_06_0.jpg?v=1673514682)
「AWSではじめるLinux入門ガイド」という本を書きました。
![](https://www.yamamanx.com/wp-content/uploads/2023/12/81Rp5O9We6L._SY522_.jpg)
![@yamamanx](https://www.yamamanx.com/wp-content/plugins/lazy-load/images/1x1.trans.gif)
開発ベンダー5年、ユーザ企業システム部門通算9年、ITインストラクター5年目でプロトタイプビルダーもやりだしたSoftware Engineerです。
質問はコメントかSNSなどからお気軽にどうぞ。
出来る限りなるべく答えます。
このブログの内容/発言の一切は個人の見解であり、所属する組織とは関係ありません。
このブログは経験したことなどの共有を目的としており、手順や結果などを保証するものではありません。
ご参考にされる際は、読者様自身のご判断にてご対応をお願いいたします。
また、勉強会やイベントのレポートは自分が気になったことをメモしたり、聞いて思ったことを書いていますので、登壇者の意見や発表内容ではありません。
ad
ad
関連記事
-
-
CloudWatch Logs機密データ保護を設定しました
Amazon CloudWatch Logs を使用して機密データを保護するがリ …
-
-
AWS CodeStarのプロジェクトテンプレートLambda+Pythonによって生成されるもの
勉強会のデモで、AWS CodeStarのプロジェクトテンプレートLambda+ …
-
-
CloudFormation Lambda-backedカスタムリソースチュートリアルをやりました
チュートリアル: Amazon マシンイメージ ID を参照するの手順に従ってや …
-
-
Transit GatewayポリシーテーブルでCloud WANのコアネットワークに接続しました
「ポリシーテーブルってなんですか?」のご質問をいただいたので設定してみました。 …
-
-
AWS Well-Architected フレームワークによるクラウド ベスト プラクティスのセッションを聞いたので自アカウントの環境を確認してみる
AWS Summit Tokyo 2017で「AWS Well-Architec …
-
-
AWS Control TowerにOUを追加する
AWS Control TowerにOUを追加する 管理アカウントでAWS Co …
-
-
Amazon CloudWatch クロスリージョンクロスアカウントダッシュボードを作成
本ブログのCloudFrontとWAFのアカウントと、EC2、RDS、S3などオ …
-
-
「JAWS-UG 名古屋 2022年 “re:Invent”の復習~忘年会~」に参加しました
re:Inventのおみやげも飲み物、ピザ、お寿司もたくさん。 コラボベースさん …
-
-
AWS X-Ray SDK for PythonをOrganizations組織内にLambda Layersで共有しました
ローカルでパッケージ作成 インストールコマンドはこちらAWS X-Ray SDK …
-
-
特定AWSアカウント特定リージョンのCloud9環境を削除するLambda(Python)
やりたいこと 特定アカウント内特定リージョン内のCloud9環境を全部削除したい …