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ロールを作成する方法、そしてプロジェクトのパブリックビルドを無効にする方法を説明しました。
翻訳はソリューションアーキテクト堀(ほり) が担当しました。