AWS Batchを使うまでのまとめ


はじめに

AWS Batchを使って、S3に静的コンテンツをアップロードして配信してみたかったのですが、初歩的な所で引っかかる部分がいくつかあったので、備忘録的にまとめておきます。
作りたい構成はざっくり以下のようなものです。

IAMロールを用いたAWS CLIの認証

公式の説明はこちら
ですが、これを行う前にIAMへアクセスし、アクセスキーを生成するようにしてください。

AWS CLIを使ってECRへログイン

公式の説明はこちらにあるのですが、まずログイン部分のここ

aws ecr get-login-password --region region | docker login --username AWS --password-stdin aws_account_id.dkr.ecr.region.amazonaws.com

--username AWS はそのままでいいです。赤字の部分だけ置き換えればいいのですが、ちょっと悩みました。

Batch実行

公式の説明はこちら
ECRへのPUSHが成功したら、Batchの作成時にECR上のイメージのフルパスをコピペするだけ。
実行からログが出るまでしばらく時間かかるので焦らず待ちましょう。
なお、ログはCloud Watchに出力されるようです。

スポットインスタンスでの実行

スポットフリートロールが必要なようです。公式の説明はこちら
以下の2コマンドをポチポチ実行すると、スポットインスタンスを実行するためのロールができるようです。
後はコンピューティング環境を設定する際にスポットを選択すれば、スポットインスタンスで実行できます。

$ aws iam create-role --role-name AmazonEC2SpotFleetRole \
    --assume-role-policy-document '{"Version":"2012-10-17","Statement":[{"Sid":"","Effect":"Allow","Principal":{"Service":"spotfleet.amazonaws.com"},"Action":"sts:AssumeRole"}]}'
$ aws iam attach-role-policy \
    --policy-arn arn:aws:iam::aws:policy/service-role/AmazonEC2SpotFleetTaggingRole \
    --role-name AmazonEC2SpotFleetRole

S3へのファイル送信

以下のようにDockerFileを作成し、hello-worldイメージを更新します。

FROM ubuntu:18.04

# Install dependencies
RUN apt-get update && \
 apt-get -y install curl unzip && \
 curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip" && \
 unzip awscliv2.zip && \
 ./aws/install

# Create Index File & POST To S3
RUN echo 'echo "Hello World From ECR!" `date` > /root/index.html' > /root/run_awscli.sh && \
 echo 'aws s3 cp --acl public-read /root/index.html $AWS_BUCKET_URI' >> /root/run_awscli.sh && \
 chmod 755 /root/run_awscli.sh

CMD /root/run_awscli.sh

環境変数を与えて起動すれば、S3にファイルが配置され、ブラウザからファイルを参照できます(実行時の環境変数についてはこちらを参照。AWS_BUCKET_URIは自前です)。

$ docker run -e AWS_ACCESS_KEY_ID=xxxx -e AWS_SECRET_ACCESS_KEY=xxxx -e AWS_BUCKET_URI=xxxx hello-world

後は、このイメージをECRにPUSHして、AWSBatchのジョブ定義を再作成すればS3にファイルがPUT出来ます。

定期実行

公式の説明はこちら
CloudWatchのイベント-ルールから書いてある通り設定するだけ。
とても簡単でした。

おわりに

Dockerさえ使い慣れていれば、かなり簡単にバッチ実行をすることができました。
もっとやりやすい方法などあれば教えてくださいmm