CodeBuild

【VPC外リージョンサービス / ENIでVPC接続】

CodeBuild は、フルマネージドのビルドサービスです。

コンテナ上の Build Environment(ビルド環境) で、Buildspec(ビルド仕様書)(buildspec.yml) に基づいて依存関係の取得、ビルド、テスト、成果物の生成を実行します。この設定は Build Project(ビルドプロジェクト) として定義され、ソースコードは Source Provider(ソースプロバイダ)(CodeCommit/GitHub/S3など)から取得します。

ビルド結果は Artifacts(アーティファクト) として S3(Simple Storage Service)や ECR(Elastic Container Registry) に保存でき、ビルド中の 環境変数、Compute types(コンピュートタイプ) の選択、Privileged Mode(特権モード) によるDockerビルド、VPC Configuration(VPC接続設定) によるプライベートリソースアクセスにも対応しています。また、IAM Role(サービスロール) を使用して、S3・ECR・Secrets ManagerなどのAWSサービスへ安全にアクセスできます。

さらに、CodePipeline と統合して自動ビルドをパイプライン化したり、CodeCommit でのコミットをトリガーに起動したり、CodeDeploy、ECS(Elastic Container Service)、EKS(Elastic Kubernetes Service)、Lambda などのデプロイ先サービスと連携させることで、再現性の高い CI/CD(継続的インテグレーション/継続的デリバリー) 環境を簡単に構築することができます。

ビルドログやメトリクスは CloudWatch で確認でき、成果物は S3/ECR に出力されます。

重要用語

ユースケース

アプリケーションのビルド・テスト自動化ソースコードからコンパイル・ユニットテスト・パッケージングまでをビルドプロジェクトとして定義し、コミットごとに自動実行する。
コンテナイメージの自動ビルドDockerfileを元にコンテナイメージをビルドし、ECRなどのコンテナレジストリへ自動的にpushする処理を行う。
静的解析やセキュリティスキャンの実行ビルドプロセスの中でコードの静的解析ツールや脆弱性スキャナを実行し、品質とセキュリティチェックを自動化する。

ベストプラクティス

最小権限のサービスロールビルドに必要なリソースだけにアクセス可能なIAMロールを利用する。
buildspec.ymlの標準化共通のビルド手順をbuildspecで管理し、再利用性を高める。
キャッシュとアーティファクト管理依存パッケージや成果物をキャッシュ/S3に保存し、ビルド時間を短縮する。

セキュリティ

関連サービス設定内容
KMS(データの暗号化と鍵の安全管理)-
Secrets Manager(機密情報の安全管理)シークレット(秘密情報)の作成が推奨
 Git認証情報・APIキー・環境設定パスワード
SSM Parameter Store(設定情報の一元管理)パラメータ(Parameter)の作成が推奨
 環境依存変数・リポジトリURL・APIキー
CloudTrail(操作履歴の記録・監査・追跡)【自動記録】
作成・更新・削除・設定変更は自動記録される。(コントロールプレーンAPI)
データ操作は追跡できない(データプレーンAPI)
Config(リソースの構成状態・設定変更を記録)【Configが有効な場合】
プロジェクト設定変更履歴・環境変数に認証情報直書き検知等の準拠評価
GuardDuty(脅威を自動検出)【GuardDutyが有効な場合】
プロジェクト変更のAPI異常検知
CodeBuildが実行ロールを引き受ける典型的な連携パターン
実行ロールを介して連携するサービス実行ロールにアタッチするポリシー
CloudWatch Logslogs:CreateLogGroup
logs:CreateLogStream
logs:PutLogEvents
VPCec2:CreateNetworkInterface
ec2:DescribeNetworkInterfaces
ec2:DeleteNetworkInterface
ec2:DescribeSubnets
ec2:DescribeSecurityGroups
ec2:DescribeDhcpOptions
ec2:DescribeVpcs
S3s3:ListBucket
s3:GetObject
s3:PutObject
s3:GetBucketLocation
s3:GetBucketVersioning
ECR(Push)ecr:GetAuthorizationToken
ecr:BatchGetImage
ecr:GetDownloadUrlForLayer
ecr:BatchCheckLayerAvailability
ecr:InitiateLayerUpload
ecr:UploadLayerPart
ecr:CompleteLayerUpload
ecr:PutImage
ECR(Pull)ecr:GetAuthorizationToken
ecr:BatchGetImage
ecr:GetDownloadUrlForLayer
CodeCommitcodecommit:GitPull
CodeArtifactcodeartifact:GetAuthorizationToken
codeartifact:ReadFromRepository
sts:GetServiceBearerToken
SSM Parameter Storessm:GetParameter
kms:Decrypt
Secrets Managersecretsmanager:GetSecretValue
kms:Decrypt
KMSkms:Encrypt
kms:Decrypt
※)権限設計の原則

信頼ポリシー: CodeBuild

   {
     "Version": "2012-10-17",
     "Statement": [{
       "Effect": "Allow",
       "Principal": {"Service": "codebuild.amazonaws.com"},
       "Action": "sts:AssumeRole"
     }]
   }

ログ・監視

ログ出力先ログの種類
CloudWatch Logsビルドログ
CloudWatch Logs優先の原則
標準メトリクス
メトリクス名説明
Durationビルド時間
Buildsビルド数
FailedBuilds失敗ビルド数
SucceededBuilds成功ビルド数

制限値(固定値/ハードリミット/ソフトリミット)

ハードリミット制限値
ビルドの最大実行時間8時間
ビルドキュー時間8時間
環境変数数/ビルド100

ソフトリミット制限値
プロジェクト数/リージョン5,000
同時ビルド数60

AWS CLIのサンプルコード

サービスロールを作成する(信頼ポリシーのファイル名 指定)
codebuild-trust-policy.json
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "codebuild.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}
aws iam create-role \
  --role-name CodeBuildServiceRole \
  --assume-role-policy-document file://codebuild-trust-policy.json
サービスロールを表示する
aws iam list-roles
サービスロールを削除する(実行ロール名 指定)
aws iam list-attached-role-policies \
  --role-name CodeBuildServiceRole

サービスロールにAWS管理ポリシーをアタッチする(ロール名 指定)
aws iam attach-role-policy \
  --role-name CodeBuildServiceRole \
  --policy-arn arn:aws:iam::aws:policy/service-role/AmazonECSTaskExecutionRolePolicy
サービスロールからAWS管理ポリシーをデタッチする(ロール名 指定)
aws iam detach-role-policy \
  --CodeBuildServiceRole \
  --policy-arn arn:aws:iam::aws:policy/service-role/AmazonECSTaskExecutionRolePolicy

プロジェクトを作成する(ロール名 指定)
aws codebuild create-project \
  --name MyProject \
  --source type=GITHUB,location=https://github.com/user/repo.git \
  --artifacts type=S3,location=my-build-bucket \
  --environment type=LINUX_CONTAINER,image=aws/codebuild/standard:7.0,computeType=BUILD_GENERAL1_SMALL \
  --service-role arn:aws:iam::123456789012:role/CodeBuildServiceRole
プロジェクトの一覧を表示する
aws codebuild list-projects
プロジェクトの詳細を表示する(プロジェクト名 指定)
aws codebuild batch-get-projects \
  --names MyProject
プロジェクトを削除する(プロジェクト名 指定)
aws codebuild delete-project \
  --name MyProject

ビルドを開始する(プロジェクト名 指定)
aws codebuild start-build \
  --project-name MyProject
ビルド履歴を表示する
aws codebuild list-builds
プロジェクトのビルド履歴を表示する(プロジェクト名 指定)
aws codebuild list-builds-for-project \
  --project-name MyProject
ビルドの詳細を表示する(ビルド ID 指定)
aws codebuild batch-get-builds \
  --ids MyProject:build-id-12345
ビルドを停止する(ビルド ID 指定)
aws codebuild stop-build \
  --id MyProject:build-id-12345

CloudFormationのサンプルコード

Terraformのサンプルコード

料金計算

課金項目説明
ビルド時間コンピューティングタイプ別のビルド分数
料金計算ツール

公式ページ

AWSドキュメント CodeBuild