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 アーティファクトを置くロケーション。 文字列 TypeCODEPIPELINE または NO_ARTIFACT を指定した場合は不要。それ以外は必須。
Name Location で指定した場所に設置する際のアーティファクト名。注意点として、コンテナ上で生成したアーティファクト名がこの値をキーとして保存される。 文字列 TypeCODEPIPELINE または 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 ソースコードを取得するリポジトリ。 こちらのドキュメント参照 TypeCODEPIPELINE を指定していない場合は必須。
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 : artifacts
  • Path : <ビルドプロジェクト名>
  • 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のエントリをまとめていきたいと思います。

本エントリがみなさんの参考になれば幸いです。