AWS CodeBuildを使って5分以上かかる処理を実行してみる
どうも!西村祐二@大阪です。
以前にAWS Batchを使って下記のようなブログをかきました。
AWS CodeBuildでも同様のことができ、もっとシンプルな構成にできるのではと思い今回試してみました。
AWS CodeBuildとは
CI(継続的インテグレーション)を行うためのサービスです。 アプリケーションのコンパイルやテスト、デプロイなどを自動化することができます。 ソースコードのトップディレクトリにbuildspec.yml を設置しておくことでビルド時に実行してくれます。
5分以上かかる処理
AWS Batchでおこなった処理と同じく「1分毎にS3に空ファイルを作成する処理」を実行してみたいと思います。 今回はAWS CodeCommitではなくGithub上にソースコードを管理して行っていきたいと思います。
今回Github上の下記リポジトリを利用します。 https://github.com/ynishimura0922/CodeBuild-test
主に利用するファイルはtest.py
とbuildspec.yml
になります。
test.py
は前回同様に
sleepを使って60秒毎にS3の「test-bucket-batch」の中に
ファイルを作成する処理を10回繰り返しています。
test.py
の中身が下記になります。
※試す場合はS3のバケット名など変数やパラメータを適宜変更してください。
# -*- coding: utf-8 -*- import boto3 from time import sleep # S3 BUCKET_NAME = "test-bucket-batch" TARGET_DIR = "batch" FILE_CONTENTS = "" # Timer MAX_ITER = 10 SEC = 60 def PutS3(i): s3 = boto3.resource('s3') bucket = s3.Bucket(BUCKET_NAME) filename = str(i+1) obj = bucket.put_object(ACL='private', Body=FILE_CONTENTS, Key=TARGET_DIR + "/" + filename, ContentType='text/plain') return str(obj) def count(i): print("{}秒経過しました。".format((i+1)*SEC)) if __name__ == '__main__': for i in range(MAX_ITER): sleep(SEC) count(i) PutS3(i)
buildspec.yml
はビルド時に実行したい処理を記載しておきます。
今回はAWS CodeBuildで提供されているイメージを利用し、
そこにはpythonやAWS CLIがすでにインストールされているため
最新版にアップデートする処理を記載しています。
次にGithubからソースをcloneし、ソース内にあるスクリプトtest.py
を実行します。
※CodeBuildで指定したリポジトリは自動的にcloneされるため、buildspec.ymlにgithubからcloneする手順は不要でした。
pwdで確認したところ、/codebuild/output/src084820928/src/github.com/ynishimura0922/CodeBuild-test
に、
cloneされていました。
version: 0.2 phases: install: commands: - pip install --upgrade pip - pip install --upgrade awscli - pip install --upgrade boto3 build: commands: - pwd - ls -l - python ./test.py
AWS CodeBuildで使用するビルド環境
今回AWS CodeBuild によって提供されている Dockerイメージを使用します。 このイメージはAWSに最適化されており、事前にAWS CLIなどがインストールされます。
AWS CodeBuild によって提供される Docker イメージ
他には Amazon ECR リポジトリに保存されている Dockerイメージや Docker Hub にて公開されている Dockerイメージ を利用することもできます。
詳細は下記ドキュメンを確認下さい。 AWS CodeBuild のビルド環境リファレンス
作業概要
- AWS CodeBuildのプロジェクト作成
- ビルド実行
事前準備
- ビルド時に実行するソースをリポジトリに管理しておいてください。
今回はGithub上で管理している下記リポジトリを使用します。 https://github.com/ynishimura0922/CodeBuild-test
AWS CodeBuildのプロジェクト作成
マネージメントコンソールからAWS CodeBuildにいき、「プロジェクトの作成」をクリックします。
今回は下記画像のようにプロジェクトを設定しました。
- プロジェクト名:test-batch
- ソースプロバイダ:Github
- リポジトリのURL:https://github.com/ynishimura0922/CodeBuild-test
- 環境イメージ:AWS CodeBuildによって管理されたイメージの使用
- オペレーティングシステム:Ubuntu
- ランタイム:Python
- バージョン:aws/codebuild/python:3.5.2
- ビルド仕様:ソースコードのルートディレクトリのbuildspec.yml
- タイプ:アーティファクトなし
詳細設定はデフォルトのままにして作成しました。 必要に応じで変更してください。 デフォルトだと下記のような設定でプロジェクトが設定されます。
設定が完了したらプロジェクトを保存します。
ロールの設定
他のAWSサービスと連携する場合は権限の付与が必要になります。 今回はS3にオブジェクトを作成するため、AWS CodeBuildのプロジェクト作成時に 作成・指定したロールに権限を付与しておきます。
ビルド実行
▼マネージメントコンソールから作成したプロジェクトをクリックし、「ビルドの開始」をクリックします。
▼下記画面にきたらビルドするソースのバージョンの指定、詳細オプションからビルドタイムアウトの設定、環境変数の設定が行えます。 設定が完了したら「ビルドの開始」をクリックします。
ソースバージョンが空欄ときは最新のソースコードがビルドされます。
▼下記画像のような表示なり、問題なく実行されました。
▼想定どおりS3上に空のオブジェクトが作成されていることがわかります。
AWS CodeBuildの料金
AWS CodeBuildはビルド時間(ビルドを送信してからビルドが終了するまでの時間)で課金されます。
詳細は下記ドキュメントを参照ください。 AWS CodeBuildの料金について
今回の場合(2017/09/27時点)は メモリ(GB):3 vCPU:2 の「build.general1.small」を利用したため、 だいたい 0.005×11分 = 約0.055(USD)
※追加料金について ビルド時にデータを転送する場合、または AWS の他のサービスを使用する場合は、追加料金が発生する可能性がありますのでご注意ください。
さいごに
いかがだったでしょうか。
AWS CodeBuildを使って5分以上かかる処理を実行してみました。 本来の用途とは異なりますが、特に問題なく処理を実行することができました。 コンテナイメージの管理、実行環境についてユーザ側で意識しなくてよいのでとても楽です。 Lambdaからビルド実行するように組み合わせればサーバレスで安価なバッチ実行環境ができるのではと思います。 要件次第では有効に使えるかもしれません。
誰かの参考になれば幸いです。