CloudFromationのアップデートでCodeBuildに対応しました #reinvent
はじめに
こんにちは、中山です。
現地時間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のエントリをまとめていきたいと思います。
本エントリがみなさんの参考になれば幸いです。