Amazon Web Services ブログ

AWS CodeBuildのパブリックビルドの導入

この記事は Introducing public builds for AWS CodeBuild を翻訳したものです。

AWS CodeBuildを使用することで、CodeBuildプロジェクトで作成されたログとアーティファクトの両方を共有できるようになりました。このブログ記事では、パブリックビルドを有効にするために既存のCodeBuildプロジェクトを設定する方法を説明します。

AWS CodeBuildは、ソースコードをコンパイルし、テストを実行し、デプロイ可能なソフトウェアパッケージを作成する、フルマネージドな継続的インテグレーションサービスです。CodeBuildを使えば、独自のビルドサーバをプロビジョニング、管理、スケーリングする必要はありません。今回の新機能では、CodeBuildプロジェクトのビルドの結果を公開することができます。パブリックビルドは、継続的インテグレーション(CI)タスクの結果をコントリビューターが確認できるため、オープンソースプロジェクトのコラボレーションワークフローを簡素化します。

パブリックビルドの仕組み

プロジェクトのビルド中、お客様がプロジェクトのLogsConfigプロパティをどのように設定したかに応じて、CodeBuildはAmazon Simple Storage Service (Amazon S3)またはAmazon CloudWatchのいずれかにビルドログを配置します。オプションとして、プロジェクトのビルドではビルドが完了した後も持続する成果物を作成することができます。パブリックビルドを有効にしたプロジェクトのビルドでは、CodeBuildはCODEBUILD_PUBLIC_BUILD_URLという環境変数を設定し、そのビルドのログやアーティファクトを一般に公開するためのURLを提供します。ユーザーがこのURLにアクセスすると、CodeBuildはAWS Identity and Access Management(AWS IAM)ロール(プロジェクトメンテナが定義したもの)を使用して、ビルドログや利用可能なアーティファクトを取得して表示します。

プロジェクトのパブリックビルドを有効にするには、以下の手順を行います:

  1. CodeBuild コンソールで、パブリックビルドを有効にするプロジェクトのリソースページに移動します。
  2. EditProject configurationを選択します。
  3. Enable public build accessを選択します。
  4. New service roleを選択します。
  5. Service roleには、この新しいロールに付けたいロール名を入力します。この記事では、example-public-builds-roleというロール名を使用します。これにより、このブログ記事の次のセクションで定義されたパーミッションを持つ新しいIAMロールが作成されます。
  6. Update configurationを選択して変更を保存し、CodeBuildコンソール内のプロジェクトのリソースページに戻ります。

ビルドログとアーティファクトが、プロジェクトのリソースページ内のConfigurationパネルのPublic project URLセクションに記載されたURLで公開されるようになりました。

GitHub リポジトリのプルリクエスト内の CI ビルドステータスに、ビルド結果へのパブリックリンクが含まれるようになりました。リポジトリにプルリクエストが作成されると、CodeBuildはプロジェクトのビルドを開始し、ビルド中にコミットステータスの更新を行い、公開ビルド情報へのリンクを提供します。このリンクは、コミットステータスメッセージのDetailsセクションからハイパーリンクとして利用できます。

IAMロールの権限

この新機能では、CodeBuild用の新しいIAMロールが導入されています。この新しいロールはCodeBuildサービスに引き継がれ、ビルドログや公開したい潜在的なアーティファクトへの読み取りアクセスが必要になります。前述の例では、ログをAmazon CloudWatchに保存するようにCodeBuildプロジェクトを構成し、ビルド成果物(ビルドIDに名前を付けたもの)をAmazon S3に配置していました。以下のAWS CloudFormationテンプレートでは、公開されたビルド結果にアクセスするための適切な最小特権ポリシーを持つIAM Roleを作成します。

ロールテンプレート

Parameters:
  LogGroupName:
    Type: String
    Description: prefix for the CloudWatch log group name
  ArtifactBucketArn:
    Type: String
    Description: Arn for the Amazon S3 bucket used to store build artifacts.

Resources:
  PublicReadRole:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument:
        Statement:
        - Action: ['sts:AssumeRole']
          Effect: Allow
          Principal:
            Service: [codebuild.amazonaws.com]
        Version: '2012-10-17'
      Path: /

  PublicReadPolicy:
    Type: 'AWS::IAM::Policy'
    Properties:
      PolicyName: PublicBuildPolicy
      PolicyDocument:
        Version: "2012-10-17"
        Statement:
          - Effect: Allow
            Action:
              - "logs:GetLogEvents"
            Resource:
              - !Sub "arn:aws:logs:${AWS::Region}:${AWS::AccountId}:log-group:${LogGroupName}:*"
          - Effect: Allow
            Action:
              - "s3:GetObject"
              - "s3:GetObjectVersion"
            Resource:
              - !Sub "${ArtifactBucketArn}/*"
      Roles:
        - !Ref PublicReadRole

AWS CloudFormationでのパブリックビルドの作成

AWS CloudFormationを使用すると、Infrastructure as Code(IaC)を使用してCodeBuildプロジェクトをプロビジョニングすることができます。既存のCodeBuildプロジェクトを更新してパブリックビルドを有効にするには、プロジェクト定義に以下の2つのフィールドを追加します。

# (テンプレートの一部を抜粋)  
CodeBuildProject:
    Type: AWS::CodeBuild::Project
    Properties:
      ServiceRole: !GetAtt CodeBuildRole.Arn
      LogsConfig: 
        CloudWatchLogs:
          GroupName: !Ref LogGroupName
          Status: ENABLED
          StreamName: ServerlessRust
      Artifacts:
        Type: S3
        Location: !Ref ArtifactBucket
        Name: ServerlessRust
        NamespaceType: BUILD_ID
        Packaging: ZIP
      Environment:
        Type: LINUX_CONTAINER
        ComputeType: BUILD_GENERAL1_LARGE
        Image: aws/codebuild/standard:4.0
        PrivilegedMode: true
      Triggers:
        BuildType: BUILD
        Webhook: true
        FilterGroups:
          - - Type: EVENT
              Pattern: PULL_REQUEST_CREATED,PULL_REQUEST_UPDATED
      Source:
        Type: GITHUB
        Location: "https://github.com/richardhboyd/ServerlessRust.git"
        BuildSpec: |
          version: 0.2
          phases:
            build:
              commands:
                - sam build
          artifacts:
            files:
              - .aws-sam/build/**/*
            discard-paths: no
      Visibility: PUBLIC_READ
      ResourceAccessRole: !Ref PublicReadRole # Note that this references the role defined in the previous section.

パブリックビルドの無効化

プロジェクトでパブリックビルドが有効になっていて、それを無効にしたい場合は、プロジェクトの構成でEnable public build accessというチェックボックスをクリアするか、プロジェクトのCloudFormation定義でVisibilityPRIVATEに設定します。AWSアカウントの任意のプロジェクトがパブリックビルドを使用しないようにするには、AWS Organizationsのサービスコントロールポリシー(SCP)でIAM Action CodeBuild:UpdateProjectVisibilityを拒否するように設定します。

まとめ

CodeBuildのパブリックビルドでは、AWSアカウントへの直接アクセスを許可することなく、オープンソースプロジェクトのビルド情報をすべてのコントリビューターと共有できるようになりました。この記事では、コンソールとCloudFormationの両方を使ってAWS CodeBuildでパブリックビルドを有効にする方法、パブリックビルドの結果を共有するための最小特権のIAMロールを作成する方法、そしてプロジェクトのパブリックビルドを無効にする方法を説明しました。

翻訳はソリューションアーキテクト堀(ほり) が担当しました。