AWS CodeBuildを使って5分以上かかる処理を実行してみる

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

どうも!西村祐二@大阪です。

以前にAWS Batchを使って下記のようなブログをかきました。

AWS Batchを使って5分以上かかる処理を実行してみる

AWS CodeBuildでも同様のことができ、もっとシンプルな構成にできるのではと思い今回試してみました。

AWS CodeBuildとは

CI(継続的インテグレーション)を行うためのサービスです。
アプリケーションのコンパイルやテスト、デプロイなどを自動化することができます。
ソースコードのトップディレクトリにbuildspec.yml を設置しておくことでビルド時に実行してくれます。

5分以上かかる処理

AWS Batchでおこなった処理と同じく「1分毎にS3に空ファイルを作成する処理」を実行してみたいと思います。
今回はAWS CodeCommitではなくGithub上にソースコードを管理して行っていきたいと思います。

今回Github上の下記リポジトリを利用します。
https://github.com/ynishimura0922/CodeBuild-test

主に利用するファイルはtest.pybuildspec.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にいき、「プロジェクトの作成」をクリックします。

2017-09-27_12_27_06

今回は下記画像のようにプロジェクトを設定しました。

  • プロジェクト名:test-batch
  • ソースプロバイダ:Github
  • リポジトリのURL:https://github.com/ynishimura0922/CodeBuild-test
  • 環境イメージ:AWS CodeBuildによって管理されたイメージの使用
  • オペレーティングシステム:Ubuntu
  • ランタイム:Python
  • バージョン:aws/codebuild/python:3.5.2
  • ビルド仕様:ソースコードのルートディレクトリのbuildspec.yml
  • タイプ:アーティファクトなし

AWS CodeBuild_batch

詳細設定はデフォルトのままにして作成しました。
必要に応じで変更してください。
デフォルトだと下記のような設定でプロジェクトが設定されます。

2017-09-27 14.49.25

設定が完了したらプロジェクトを保存します。

ロールの設定

他のAWSサービスと連携する場合は権限の付与が必要になります。
今回はS3にオブジェクトを作成するため、AWS CodeBuildのプロジェクト作成時に
作成・指定したロールに権限を付与しておきます。

ビルド実行

▼マネージメントコンソールから作成したプロジェクトをクリックし、「ビルドの開始」をクリックします。

2017-09-27_15_14_43

▼下記画面にきたらビルドするソースのバージョンの指定、詳細オプションからビルドタイムアウトの設定、環境変数の設定が行えます。
設定が完了したら「ビルドの開始」をクリックします。

ソースバージョンが空欄ときは最新のソースコードがビルドされます。

2017-09-27 15.23.57

▼下記画像のような表示なり、問題なく実行されました。

2017-09-27_15_42_04

▼想定どおりS3上に空のオブジェクトが作成されていることがわかります。

2017-09-27 15.42.41

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からビルド実行するように組み合わせればサーバレスで安価なバッチ実行環境ができるのではと思います。
要件次第では有効に使えるかもしれません。

誰かの参考になれば幸いです。