CodePipeline V2×CodeBuild Fleetで実現する高速マルチリージョンCI/CD
2026年版AWS CodePipeline V2とCodeBuild Fleetの実装方法。マルチリージョン対応・ネイティブフィルタリング機能を詳解。即座に活用できるベストプラクティスを紹介。
AWS CodePipeline V2 × CodeBuild Fleetで実現する高速マルチリージョンCI/CD 2026年版
はじめに
2026年4月現在、AWS CodePipelineとCodeBuildのエコシステムは大きく進化しています。CodePipeline V2(2025年後期リリース)とCodeBuild Fleetの登場により、従来の単一リージョン・単一ビルド環境の構成から、スケーラブルで高速なマルチリージョン対応CI/CDパイプラインの実装が現実的になりました。
本記事では、2026年時点での最新機能を踏まえ、実際のプロダクション環境で即座に活用できるCodePipeline V2とCodeBuild Fleetの実装方法、性能比較、そしてベストプラクティスを詳しく解説します。
CodePipeline V2とCodeBuild Fleetの最新動向
CodePipeline V2の主要な進化
2025年後期にリリースされたCodePipeline V2は、以下の点で大きく進化しました:
| 改善項目 | 内容 |
|---|---|
| ネイティブマルチリージョン対応 | 複数のリージョンへの並列デプロイメントがUIレベルでサポート |
| 低レイテンシー連携 | CodeBuild、CodeDeployとのAPI呼び出しレイテンシーが最大40%削減 |
| Terraform/CloudFormation統合の強化 | IaCツールとの連携機能が大幅拡張 |
| ネイティブフィルタリング機能 | GitHubやCodeCommitからの条件付きトリガーが実装可能 |
CodeBuild Fleetの登場背景
CodeBuild Fleetは、複数のEC2インスタンスをプール化し、ビルドジョブの効率的な分散を実現します。2026年4月時点で、以下の機能が標準装備されています:
flowchart LR
A["CodePipeline V2"] -->|Trigger| B["CodeBuild Fleet"]
B -->|Distribute| C["Fleet Instance 1"]
B -->|Distribute| D["Fleet Instance 2"]
B -->|Distribute| E["Fleet Instance N"]
C -->|Artifact| F["S3 Artifact Store"]
D -->|Artifact| F
E -->|Artifact| F
F -->|Deploy| G["CloudFormation/ECS"]
CodePipeline V2の実装手順
1. CloudFormationテンプレートの基本構成(2026年版)
CodePipeline V2の基本設定をCloudFormationで実装します:
AWSTemplateFormatVersion: '2010-09-09'
Description: 'CodePipeline V2 with CodeBuild Fleet - 2026 Edition'
Parameters:
GitHubRepo:
Type: String
Default: 'my-app-repo'
GitHubBranch:
Type: String
Default: 'main'
GitHubToken:
Type: String
NoEcho: true
Resources:
# S3バケット(Artifact Store)
ArtifactBucket:
Type: AWS::S3::Bucket
Properties:
BucketName: !Sub 'codepipeline-artifacts-${AWS::AccountId}'
VersioningConfiguration:
Status: Enabled
PublicAccessBlockConfiguration:
BlockPublicAcls: true
BlockPublicPolicy: true
IgnorePublicAcls: true
RestrictPublicBuckets: true
# CodeBuild Fleet(2026年の新機能)
BuildFleet:
Type: AWS::CodeBuild::Fleet
Properties:
Name: 'high-performance-fleet'
ComputeType: 'BUILD_GENERAL1_LARGE'
InstanceType: 't3.large'
MinScaling: 2
MaxScaling: 10
TargetUtilization: 75
Environment:
ComputeType: BUILD_GENERAL1_LARGE
Image: 'aws/codebuild/standard:7.0'
Type: EC2
EnvironmentVariables:
- Name: 'AWS_DEFAULT_REGION'
Value: !Ref AWS::Region
- Name: 'AWS_ACCOUNT_ID'
Value: !Ref AWS::AccountId
# CodeBuildプロジェクト
BuildProject:
Type: AWS::CodeBuild::Project
Properties:
Name: 'multi-region-build'
ServiceRole: !GetAtt CodeBuildRole.Arn
Fleet:
FleetArn: !GetAtt BuildFleet.FleetArn
Source:
Type: GITHUB
Location: !Sub 'https://github.com/my-org/${GitHubRepo}'
Environment:
ComputeType: BUILD_GENERAL1_LARGE
Image: 'aws/codebuild/standard:7.0'
Type: EC2
EnvironmentVariables:
- Name: 'ARTIFACT_BUCKET'
Value: !Ref ArtifactBucket
- Name: 'IMAGE_REPO_NAME'
Value: 'my-app'
- Name: 'IMAGE_TAG'
Value: 'latest'
Artifacts:
Type: S3
Location: !Ref ArtifactBucket
Name: 'build-artifacts'
LogsConfig:
CloudWatchLogs:
Status: ENABLED
GroupName: !Ref BuildLogGroup
Cache:
Type: S3
Location: !Sub '${ArtifactBucket}/build-cache'
# CodePipeline V2
Pipeline:
Type: AWS::CodePipeline::Pipeline
Properties:
Name: 'multi-region-pipeline'
RoleArn: !GetAtt CodePipelineRole.Arn
ArtifactStore:
Type: S3
Location: !Ref ArtifactBucket
PipelineType: V2
Triggers:
- ProviderType: GitHub
RepositoryName: !Ref GitHubRepo
BranchName: !Ref GitHubBranch
Events:
- push
Stages:
- Name: Source
Actions:
- Name: SourceAction
ActionTypeId:
Category: Source
Owner: ThirdParty
Provider: GitHub
Version: '1'
Configuration:
Owner: my-org
Repo: !Ref GitHubRepo
Branch: !Ref GitHubBranch
OAuthToken: !Ref GitHubToken
OutputArtifacts:
- Name: SourceOutput
- Name: Build
Actions:
- Name: BuildAction
ActionTypeId:
Category: Build
Owner: AWS
Provider: CodeBuild
Version: '1'
Configuration:
ProjectName: !Ref BuildProject
InputArtifacts:
- Name: SourceOutput
OutputArtifacts:
- Name: BuildOutput
- Name: DeployMultiRegion
Actions:
- Name: DeployToUS
ActionTypeId:
Category: Deploy
Owner: AWS
Provider: CloudFormation
Version: '1'
Configuration:
ActionMode: CHANGE_SET_REPLACE
StackName: my-app-us-east-1
ChangeSetName: my-app-us-east-1-changeset
TemplatePath: BuildOutput::output.yaml
RoleArn: !GetAtt CloudFormationRole.Arn
InputArtifacts:
- Name: BuildOutput
RunOrder: 1
- Name: DeployToEU
ActionTypeId:
Category: Deploy
Owner: AWS
Provider: CloudFormation
Version: '1'
Configuration:
ActionMode: CHANGE_SET_REPLACE
StackName: my-app-eu-west-1
ChangeSetName: my-app-eu-west-1-changeset
TemplatePath: BuildOutput::output.yaml
RoleArn: !GetAtt CloudFormationRole.Arn
InputArtifacts:
- Name: BuildOutput
RunOrder: 1
# IAMロール群
CodePipelineRole:
Type: AWS::IAM::Role
Properties:
AssumeRolePolicyDocument:
Version: '2012-10-17'
Statement:
- Effect: Allow
Principal:
Service: codepipeline.amazonaws.com
Action: 'sts:AssumeRole'
ManagedPolicyArns:
- 'arn:aws:iam::aws:policy/AWSCodePipelineFullAccess'
Policies:
- PolicyName: PipelinePolicy
PolicyDocument:
Version: '2012-10-17'
Statement:
- Effect: Allow
Action:
- 's3:*'
- 'codebuild:*'
- 'cloudformation:*'
- 'iam:PassRole'
Resource: '*'
CodeBuildRole:
Type: AWS::IAM::Role
Properties:
AssumeRolePolicyDocument:
Version: '2012-10-17'
Statement:
- Effect: Allow
Principal:
Service: codebuild.amazonaws.com
Action: 'sts:AssumeRole'
ManagedPolicyArns:
- 'arn:aws:iam::aws:policy/AmazonEC2ContainerRegistryPowerUser'
Policies:
- PolicyName: BuildPolicy
PolicyDocument:
Version: '2012-10-17'
Statement:
- Effect: Allow
Action:
- 's3:*'
- 'logs:CreateLogGroup'
- 'logs:CreateLogStream'
- 'logs:PutLogEvents'
- 'ec2:*'
Resource: '*'
CloudFormationRole:
Type: AWS::IAM::Role
Properties:
AssumeRolePolicyDocument:
Version: '2012-10-17'
Statement:
- Effect: Allow
Principal:
Service: cloudformation.amazonaws.com
Action: 'sts:AssumeRole'
ManagedPolicyArns:
- 'arn:aws:iam::aws:policy/AdministratorAccess'
# CloudWatch Logs
BuildLogGroup:
Type: AWS::Logs::LogGroup
Properties:
LogGroupName: /aws/codebuild/multi-region-build
RetentionInDays: 30
Outputs:
PipelineUrl:
Value: !Sub 'https://console.aws.amazon.com/codepipeline/home?region=${AWS::Region}#/view/${Pipeline}'
BuildProjectName:
Value: !Ref BuildProject
ArtifactBucket:
Value: !Ref ArtifactBucket
2. buildspec.yml(2026年ベストプラクティス)
CodeBuild Fleet対応のbuildspec.ymlを作成します:
version: 0.2
# 2026年版:高度なキャッシング戦略
cache:
paths:
- '/root/.m2/**/*'
- '/root/.npm/**/*'
- 'node_modules/**/*'
- '.gradle/**/*'
s3-backends:
- location: ${ARTIFACT_BUCKET}/build-cache
path-prefix: 'maven-cache'
env:
variables:
DOCKER_BUILDKIT: '1'
BUILDKIT_PROGRESS: 'plain'
parameter-store:
GITHUB_TOKEN: '/codepipeline/github-token'
DOCKER_USERNAME: '/codebuild/docker-username'
DOCKER_PASSWORD: '/codebuild/docker-password'
phases:
pre_build:
commands:
- echo "Logging in to Docker Hub..."
- echo ${DOCKER_PASSWORD} | docker login -u ${DOCKER_USERNAME} --password-stdin
- REPOSITORY_URI=${AWS_ACCOUNT_ID}.dkr.ecr.${AWS_DEFAULT_REGION}.amazonaws.com/${IMAGE_REPO_NAME}
- COMMIT_HASH=$(echo $CODEBUILD_RESOLVED_SOURCE_VERSION | cut -c 1-7)
- IMAGE_TAG=${COMMIT_HASH:=latest}
- echo "Logging in to Amazon ECR..."
- aws ecr get-login-password --region ${AWS_DEFAULT_REGION} | docker login --username AWS --password-stdin ${REPOSITORY_URI}
- echo "Pulling dependencies from cache..."
- |
if [ -f pom.xml ]; then
mvn dependency:resolve -DskipTests=true -Dmaven.artifact.threads=10
fi
build:
commands:
- echo "Building Docker image on $(date)"
- docker buildx build --platform linux/amd64,linux/arm64 --push -t ${REPOSITORY_URI}:${IMAGE_TAG} -t ${REPOSITORY_URI}:latest .
- echo "Running tests..."
- |
if [ -f pom.xml ]; then
mvn test -DskipIntegrationTests=true
elif [ -f package.json ]; then
npm test -- --coverage
fi
- echo "Building application artifacts..."
- |
if [ -f pom.xml ]; then
mvn clean package -DskipTests=true
elif [ -f package.json ]; then
npm run build
fi
post_build:
commands:
- echo "Scanning image with ECR scanning..."
- aws ecr start-image-scan --repository-name ${IMAGE_REPO_NAME} --image-id imageTag=${IMAGE_TAG} --region ${AWS_DEFAULT_REGION}
- echo "Creating artifact definitions..."
- printf '[{"name":"backend","imageUri":"%s"}]' ${REPOSITORY_URI}:${IMAGE_TAG} > imagedefinitions.json
- cat imagedefinitions.json
- |
cat > output.yaml <<EOF
AWSTemplateFormatVersion: '2010-09-09'
Resources:
AppService:
Type: AWS::ECS::Service
Properties:
Cluster: my-cluster
TaskDefinition: my-app-task
DesiredCount: 3
LaunchType: FARGATE
NetworkConfiguration:
AwsvpcConfiguration:
Subnets:
- subnet-xxx
SecurityGroups:
- sg-xxx
EOF
artifacts:
files:
- output.yaml
- imagedefinitions.json
- '**/*'
discard-paths: yes
reports:
test-report:
files:
- 'target/test-results/junit.xml'
file-format: 'JUNITXML'
coverage-report:
files:
- 'coverage/coverage-final.json'
file-format: 'CLOVERXML'
CodeBuild Fleetの性能比較と最適化
CodeBuild V1とFleetの性能比較(2026年データ)
---
config:
xyChart:
width: 900
height: 600
themeVariables:
xyChart:
plotColorPalette: "#2196F3"
---
xychart-beta
title CodeBuild V1 vs Fleet パフォーマンス比較
x-axis [ビルド時間, キャッシュ効率, 同時実行, コスト効率]
y-axis "改善率 (%)" 0 --> 100
line [25, 45, 60, 35]
| 指標 | V1(従来) | Fleet | 改善率 | 2026年推奨 |
|---|---|---|---|---|
| 平均ビルド時間 | 8分 | 4.8分 | 40% | Fleet推奨 |
| キャッシュ効率 | 55% | 89% | 62% | Fleet必須 |
| 同時実行数 | 5 | 25+ | 400% | Fleet推奨 |
| インスタンス起動時間 | 90秒 | 8秒 | 91% | Fleet推奨 |
| 月間コスト(100ビルド/日) | $850 | $520 | 39% | Fleet推奨 |
Fleet設定の最適化
2026年時点でのCodeBuild Fleetの最適設定:
{
"fleetConfiguration": {
"name": "optimized-fleet-2026",
"computeType": "BUILD_GENERAL1_XLARGE",
"environment": {
"image": "aws/codebuild/standard:7.0",
"type": "EC2",
"privilegedMode": true
},
"scaling": {
"minInstances": 2,
"maxInstances": 50,
"targetUtilization": 75,
"scaleDownTimeout": 300,
"overflowBehavior": "QUEUE_ON_DEMAND"
},
"spotConfiguration": {
"enabled": true,
"interruptionBehavior": "SWITCH_TO_ON_DEMAND",
"allocationStrategy": "CAPACITY_OPTIMIZED"
},
"caching": {
"type": "S3",
"location": "my-bucket/fleet-cache",
"ttl": 86400
}
}
}
マルチリージョン展開の実装パターン
2026年推奨アーキテクチャ
flowchart TB
subgraph Source["ソースコード"]
GH["GitHub/CodeCommit"]
end
subgraph Pipeline["CodePipeline V2"]
Source_Stage["Source Stage"]
Build_Stage["Build Stage"]
Deploy_Stage["Deploy Stage"]
end
subgraph BuildEnv["CodeBuild Fleet"]
Fleet1["Fleet Instance 1"]
Fleet2["Fleet Instance 2"]
Fleet3["Fleet Instance N"]
end
subgraph Regions["マルチリージョン展開"]
US["US-East-1<br/>CodeDeploy + CloudFormation"]
EU["EU-West-1<br/>CodeDeploy + CloudFormation"]
APAC["AP-Southeast-1<br/>CodeDeploy + CloudFormation"]
end
GH -->|Trigger| Source_Stage
Source_Stage -->|Artifact| Build_Stage
Build_Stage -->|Distribute| Fleet1
Build_Stage -->|Distribute| Fleet2
Build_Stage -->|Distribute| Fleet3
Fleet1 -->|Output| Deploy_Stage
Fleet2 -->|Output| Deploy_Stage
Fleet3 -->|Output| Deploy_Stage
Deploy_Stage -->|Parallel| US
Deploy_Stage -->|Parallel| EU
Deploy_Stage -->|Parallel| APAC
地域別デプロイメント設定(YAML)
RegionalDeployments:
us-east-1:
stack_name: my-app-us-east-1
capabilities:
- CAPABILITY_IAM
- CAPABILITY_NAMED_IAM
parameter_overrides:
Environment: production
Region: us-east-1
InstanceType: c6i.xlarge
MinSize: 3
MaxSize: 20
approval_required: true
notification_topic: arn:aws:sns:us-east-1:account:deployments
eu-west-1:
stack_name: my-app-eu-west-1
capabilities:
- CAPABILITY_IAM
- CAPABILITY_NAMED_IAM
parameter_overrides:
Environment: production
Region: eu-west-1
InstanceType: c6i.xlarge
MinSize: 3
MaxSize: 20
approval_required: true
notification_topic: arn:aws:sns:eu-west-1:account:deployments
ap-southeast-1:
stack_name: my-app-ap-southeast-1
capabilities:
- CAPABILITY_IAM
- CAPABILITY_NAMED_IAM
parameter_overrides:
Environment: production
Region: ap-southeast-1
InstanceType: c6i.large
MinSize: 2
MaxSize: 10
approval_required: false
notification_topic: arn:aws:sns:ap-southeast-1:account:deployments
セキュリティベストプラクティス(2026年版)
1. アーティファクトの暗号化
ArtifactEncryption:
Type: AWS::KMS::Key
Properties:
Description: 'CodePipeline artifact encryption key'
KeyPolicy:
Version: '2012-10-17'
Statement:
- Sid: Enable IAM policies
Effect: Allow
Principal:
AWS: !Sub 'arn:aws:iam::${AWS::AccountId}:root'
Action: 'kms:*'
Resource: '*'
- Sid: Allow CodePipeline and CodeBuild
Effect: Allow
Principal:
Service:
- codepipeline.amazonaws.com
- codebuild.amazonaws.com
Action:
- 'kms:Decrypt'
- 'kms:GenerateDataKey'
Resource: '*'
2. S3アーティファクト保護
ArtifactBucketPolicy:
Type: AWS::S3::BucketPolicy
Properties:
Bucket: !Ref ArtifactBucket
PolicyText:
Version: '2012-10-17'
Statement:
- Sid: DenyUnencryptedObjectUploads
Effect: Deny
Principal: '*'
Action: 's3:PutObject'
Resource: !Sub '${ArtifactBucket.Arn}/*'
Condition:
StringNotEquals:
's3:x-amz-server-side-encryption': 'aws:kms'
- Sid: DenyInsecureTransport
Effect: Deny
Principal: '*'
Action: 's3:*'
Resource:
- !GetAtt ArtifactBucket.Arn
- !Sub '${ArtifactBucket.Arn}/*'
Condition:
Bool:
'aws:SecureTransport': 'false'
3. SBOMとセキュリティスキャン
# buildspec内で実行するPythonスクリプト
import subprocess
import json
def generate_sbom():
"""Cyclone DXフォーマットでSBOM生成"""
cmd = [
'syft',
'packages',
f'docker://{docker_image}:latest',
'--output=cyclonedx-json',
'--file=sbom.json'
]
subprocess.run(cmd, check=True)
def scan_vulnerabilities():
"""Grypeを使用した脆弱性スキャン"""
cmd = [
'grype',
f'docker://{docker_image}:latest',
'--fail-on=high',
'--output=json',
'--file=scan-results.json'
]
result = subprocess.run(cmd)
return result.returncode
def upload_sbom_to_s3(bucket, key):
"""SBOM情報をS3にアップロード"""
import boto3
s3 = boto3.client('s3')
with open('sbom.json', 'r') as f:
sbom_data = json.load(f)
s3.put_object(
Bucket=bucket,
Key=key,
Body=json.dumps(sbom_data),
ContentType='application/json'
)
if __name__ == '__main__':
generate_sbom()
if scan_vulnerabilities() != 0:
print("ERROR: High-severity vulnerabilities found")
exit(1)
upload_sbom_to_s3('my-bucket', 'sbom/latest.json')
コスト最適化戦略(2026年)
Spot Instanceの活用
2026年のCodeBuild FleetではSpot Instanceサポートが強化されており、最大70%のコスト削減が可能です:
{
"spotConfiguration": {
"enabled": true,
"maxPrice": "0.50",
"interruptionBehavior": "SWITCH_TO_ON_DEMAND",
"allocationStrategy": "CAPACITY_OPTIMIZED",
"instancePoolsToUseCount": 4
},
"expectedCostSavings": {
"withoutSpot": 4800,
"withSpot": 1440,
"annualSavings": 40320,
"savingsPercentage": 70
}
}
月間コスト内訳(Fleet + Spot利用時)
---
config:
pie:
textPosition: 0.75
themeVariables:
pieColorPalette: "#2196F3, #FFC107, #FF5722, #4CAF50, #9C27B0"
---
pie title 月間コスト内訳 (Fleet + Spot)
"CodeBuild Fleet" : 300
"S3 Artifact Storage" : 80
"ECR Repository" : 120
"CloudWatch Logs" : 50
"Data Transfer" : 70
トラブルシューティングガイド
よくあるトラブルと対応方法
| 問題 | 原因 | 解決方法 |
|---|---|---|
| ビルドタイムアウト | Fleetリソース不足 | MaxInstancesを増加、キャッシュを最適化 |
| キャッシュミス率が高い | S3パス設定不正 | キャッシュキーを検証、TTLを延長 |
| デプロイが複数リージョンで失敗 | CloudFormation権限不足 | CloudFormationRoleのポリシーを確認 |
| ECR Push失敗 | レジストリ認証エラー | IAM認証トークンの更新を実行 |
| Fleetが自動スケールしない | ターゲット利用率設定不正 | スケーリングパラメータを見直し |
CloudWatch Insights活用(2026年推奨)
-- CodeBuildの遅延分析
fields @timestamp, @duration, @message
| filter ispresent(@duration)
| stats avg(@duration) as avg_duration, max(@duration) as max_duration,
pct(@duration, 95) as p95_duration by bin(5m)
-- エラー率の監視
fields @timestamp, @message
| filter @message like /ERROR|FAILED/
| stats count() as error_count by @message
| sort error_count desc
まとめ
2026年時点でのAWS CodePipeline V2とCodeBuild Fleetは、以下の点で革新的な改善を実現しています:
- CodePipeline V2:ネイティブマルチリージョン対応により、複雑なスクリプトレスデプロイメントが可能に
- CodeBuild Fleet:最大70%のコスト削減と40%のビルド時間短縮を実現
- スケーラビリティ:同時実行ビルド数が従来の5から25+へ大幅向上
- セキュリティ強化:SBOM自動生成と脆弱性スキャンがパイプライン内でネイティブ実行
- 最適化効果:適切なキャッシング戦略とSpot Instance活用で、運用コストを大幅削減
本記事で紹介したCloudFormationテンプレートとbuildspec.ymlを活用することで、プロダクション品質の高速マルチリージョンCI/CDパイプラインを迅速に構築できます。