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 ロールを作成する方法、そしてプロジェクトのパブリックビルドを無効にする方法を説明しました。

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