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のバケット名など変数やパラメータを適宜変更してください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | # -*- 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
を実行します。
1 2 3 4 5 6 7 8 9 10 11 12 13 | version: 0.2 phases: install: commands: - pip install --upgrade pip - pip install --upgrade awscli - pip install --upgrade boto3 build: commands: - git clone https : //github.com/ynishimura0922/CodeBuild-test.git /usr/local/test-build - cd /usr/local/test-build - python /usr/local/test-build/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からビルド実行するように組み合わせればサーバレスで安価なバッチ実行環境ができるのではと思います。
要件次第では有効に使えるかもしれません。
誰かの参考になれば幸いです。