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)ロール(プロジェクトメンテナが定義したもの)を使用して、ビルドログや利用可能なアーティファクトを取得して表示します。
プロジェクトのパブリックビルドを有効にするには、以下の手順を行います:
- CodeBuild コンソールで、パブリックビルドを有効にするプロジェクトのリソースページに移動します。
- Edit の Project configuration を選択します。
- Enable public build access を選択します。
- New service role を選択します。
- Service role には、この新しいロールに付けたいロール名を入力します。この記事では、
example-public-builds-role
というロール名を使用します。これにより、このブログ記事の次のセクションで定義されたパーミッションを持つ新しい IAM ロールが作成されます。 - 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 定義でVisibility
をPRIVATE
に設定します。 AWS アカウントの任意のプロジェクトがパブリックビルドを使用しないようにするには、 AWS Organizations のサービスコントロールポリシー(SCP)で IAM Action CodeBuild:UpdateProjectVisibility を拒否するように設定します。
まとめ
CodeBuild のパブリックビルドでは、 AWS アカウントへの直接アクセスを許可することなく、オープンソースプロジェクトのビルド情報をすべてのコントリビューターと共有できるようになりました。この記事では、コンソールと CloudFormation の両方を使って AWS CodeBuild でパブリックビルドを有効にする方法、パブリックビルドの結果を共有するための最小特権の IAM ロールを作成する方法、そしてプロジェクトのパブリックビルドを無効にする方法を説明しました。
翻訳はソリューションアーキテクト堀(ほり) が担当しました。