この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
はじめに
こんにちは、中山です。
現地時間12/1(木)に発表されたフルマネージドのビルドサービスであるCodeBuildですが、早速CloudFormation(以下CFn)でも対応が発表されました。他にもさまざまなリソースタイプが導入されましたが、今回はCodeBuildについて早速使ってみたのでエントリにまとめたいと思います。
導入されたリソースタイプ
今回のCFnアップデートによって導入されたCloudBuild関連のリソースタイプはビルドプロジェクトを作成するためのものです。
指定可能なプロパティは以下の通りです。
プロパティ | 意味 | 指定可能な値 | 必須の有無 |
---|---|---|---|
Artifacts |
ビルドによって生成した成果物(アーティファクト)をどう扱うか。 | 下記参照 | Yes |
Description |
ビルドプロジェクトの説明。 | 文字列 | No |
EncryptionKeys |
アーティファクトを暗号化する際に利用するKMSカスタマーキーのエイリアスまたはARN。指定しない場合はデフォルトのものが利用される。 | 文字列 | No |
Environment |
ビルドで利用するコンテナの指定。 | 下記参照 | Yes |
Name |
ビルドプロジェクトの名前。 | 文字列 | Yes |
ServiceRole |
ビルド時に利用するIAM RoleのARN。 | 文字列 | Yes |
Source |
ビルド対象のソースコードやリポジトリのタイプ。 | 下記参照 | Yes |
Tags |
CodeBuildに設定するタグ。 | Key/Value形式 | No |
TimeoutInMinutes |
ビルドのタイムアウト時間(分)。5分から480分まで指定可能。デフォルトは60分。 | 数値 | No |
- Artifact
項目 | 意味 | 指定可能な値 | 必須の有無 |
---|---|---|---|
Location |
アーティファクトを置くロケーション。 | 文字列 | Type に CODEPIPELINE または NO_ARTIFACT を指定した場合は不要。それ以外は必須。 |
Name |
Location で指定した場所に設置する際のアーティファクト名。注意点として、コンテナ上で生成したアーティファクト名がこの値をキーとして保存される。 |
文字列 | Type に CODEPIPELINE または NO_ARTIFACT を指定した場合は不要。それ以外は必須。 |
NamespaceType |
アーティファクトを設置する際に Name で指定した名前の前かつ Path で指定したパスの後に追加される文字列。 |
BUILD_ID / NONE |
No |
Packaging |
CodeBuildがアーティファクトをパッケージ化(例えばzip)するかどうか。 | ZIP / NONE |
No |
Path |
アーティファクトを設置する際に Name で指定した名前の前に追加するパス名。 |
文字列 | No |
Type |
ビルドで生成したアーティファクトのタイプ。 | CODEPIPELINE / NO_ARTIFACTS S3 |
Yes |
- Environment
項目 | 意味 | 指定可能な値 | 必須の有無 |
---|---|---|---|
ComputeType |
ビルド環境で利用するコンテナのスペック。 | BUILD_GENERAL1_SMALL / BUILD_GENERAL1_MEDIUM BUILD_GENERAL1_LARGE |
Yes |
EnvironmentVariables |
ビルド環境で利用する環境変数。 | Key/Valueで指定 | No |
Image |
ビルド環境で利用するコンテナのイメージ名。 | こちらのドキュメント参照 | Yes |
Type |
ビルド環境で利用するコンテナのタイプ。 | LINUX_CONTAINER |
Yes |
- Source
項目 | 意味 | 指定可能な値 | 必須の有無 |
---|---|---|---|
BuildSpec |
ビルドスペックをここでも指定可能。 | 文字列 | No |
Location |
ソースコードを取得するリポジトリ。 | こちらのドキュメント参照 | Type に CODEPIPELINE を指定していない場合は必須。 |
Type |
ソースコードのリポジトリタイプ。 | CODECOMMIT / CODEPIPELINE / GITHUB / S3 |
Yes |
使ってみる
今回は以前のエントリで作成したサンプルコードを利用します。以下のエントリを参照してS3へのzipファイルのアップロードまで済ませている前提で進めます。
スタックの作製
今回はサンプルを参考にしつつ以下のようなテンプレートにしてみました。
---
AWSTemplateFormatVersion: 2010-09-09
Description: CodeBuild Test Template
Parameters:
ProjectName:
Description: Project Name for CodeBuild
Default: test-prj
Type: String
OutputBucketName:
Description: Output Bucket Name
Default: knakayama-codebuild-output
Type: String
InputBucketName:
Description: Input Bucket Name
Default: knakayama-codebuild-input
Type: String
Resources:
CodeBuildServiceRole:
Type: AWS::IAM::Role
Properties:
Path: /
AssumeRolePolicyDocument:
Statement:
- Effect: Allow
Principal:
Service:
- codebuild.amazonaws.com
Action:
- sts:AssumeRole
Policies:
- PolicyName: !Sub CodeBuildPolicy-${ProjectName}
PolicyDocument:
Version: 2012-10-17
Statement:
- Effect: Allow
Resource:
- !Sub arn:aws:logs:${AWS::Region}:${AWS::AccountId}:log-group:/aws/codebuild/${ProjectName}
- !Sub arn:aws:logs:${AWS::Region}:${AWS::AccountId}:log-group:/aws/codebuild/${ProjectName}:*
Action:
- logs:CreateLogGroup
- logs:CreateLogStream
- logs:PutLogEvents
- Effect: Allow
Resource:
- !Sub arn:aws:s3:::codepipeline-${AWS::Region}-*
Action:
- s3:PutObject
- s3:GetObject
- s3:GetObjectVersion
- Effect: Allow
Resource:
- !Sub arn:aws:s3:::${InputBucketName}/MessageUtil.zip
Action:
- s3:GetObject
- s3:GetObjectVersion
- Effect: Allow
Resource:
- !Sub arn:aws:s3:::${OutputBucketName}/*
Action:
- s3:PutObject
TestProject:
Type: AWS::CodeBuild::Project
Properties:
Name: !Ref ProjectName
Description: this is a test prj
ServiceRole: !Ref CodeBuildServiceRole
Artifacts:
Location: !Ref OutputBucketName
Type: S3
Name: artifacts
Path: !Sub ${ProjectName}
NamespaceType: BUILD_ID
Environment:
Type: LINUX_CONTAINER
ComputeType: BUILD_GENERAL1_SMALL
Image: aws/codebuild/java:openjdk-8
Source:
Location: !Join [ "/", [ !Ref InputBucketName, MessageUtil.zip ] ]
Type: S3
TimeoutInMinutes: 10
Tags:
- Key: Name
Value: !Ref ProjectName
CodeBuildにひも付けるIAM Roleはインラインで指定しています。基本的にはインラインではなくマネージドポリシーを利用した方がポリシーの管理コストが減るのでおすすめです。しかし、現時点(2016/12/2)で用意されているCodeBuildのマネージドポリシーは全てS3読み込みアクセスとなっているので、今回はアーティファクトをS3にPutさせるために、インラインとしました。CodeBuild関連のマネージドポリシーは現時点で以下の3つがあるようです。
- AWSCodeBuildAdminAccess
- AWSCodeBuildDeveloperAccess
- AWSCodeBuildReadOnlyAccess
もちろん、S3書き込み権限のあるマネージドポリシーを同時に付与することもできますが、CodeBuildが必要とする最低限の権限を理解するため今回はインラインにしています。
CodeBuild関連のリソースについても補足します。それぞれの内容は先の表をご覧いただければと思いますが、少しだけ動作を理解しておいた方が良い点がありました。それはアーティファクトがどういった名前で保存されるかという点です。今回 Artifacts
プロパティの名前に関する設定は以下のようになっています。
Name
: artifactsPath
: <ビルドプロジェクト名\>NamespaceType
: ビルドID
この場合、S3にアーティファクトが保存される際には「<ビルドプロジェクト名>/<ビルドID>/artifacts/<アーティファクト名>」となります。ちょっと個人的に分かりにくかったので、もしご利用される際は参考にしていただければと思います。
ビルドしてみる
スタックの作製後ビルドを実行します。今回はAWS CLIを利用してビルドを実行してみます。以下のコマンドを実行してください。注意点としてCodeBuildはまだ発表されたばかりなので、コマンドを実行する前にAWS CLIのバージョンを上げておくことをオススメします。
$ aws codebuild start-build \
--project-name test-prj \
--region us-east-1
{
"build": {
"buildComplete": false,
"initiator": "****************",
"artifacts": {
"location": ""
},
"projectName": "test-prj",
"timeoutInMinutes": 10,
"buildStatus": "IN_PROGRESS",
"environment": {
"computeType": "BUILD_GENERAL1_SMALL",
"image": "aws/codebuild/java:openjdk-8",
"type": "LINUX_CONTAINER",
"environmentVariables": []
},
"source": {
"type": "S3",
"location": "knakayama-codebuild-input/MessageUtil.zip"
},
"currentPhase": "SUBMITTED",
"startTime": 1480710144.886,
"id": "test-prj:87f70831-3ae5-4eb1-b2e0-4133ec9ad73a",
"arn": "arn:aws:codebuild:us-east-1:************:build/test-prj:87f70831-3ae5-4eb1-b2e0-4133ec9ad73a"
}
}
ビルドが開始されました。結果を確認してみましょう。 --ids
オプションで指定するのはビルドのARNになります。先程のコマンドの出力結果から指定してください。
$ aws codebuild batch-get-builds --ids \
arn:aws:codebuild:us-east-1:************:build/test-prj:87f70831-3ae5-4eb1-b2e0-4133ec9ad73a \
--region us-east-1 \
--query 'builds[].buildStatus'
[
"SUCCEEDED"
]
「SUCCEEDED」と表示されたら成功です。
まとめ
いかがだったでしょうか。
CFnのCodeBuild対応についてまとめてみました。このアップデートによりビルドプロジェクトを簡単に生成/複製することができるようになりましたね。引き続きCodeBuildのエントリをまとめていきたいと思います。
本エントリがみなさんの参考になれば幸いです。