03. AWS でチーム開発(Developer Tools)
AWS には独自の CI/CD サービス群「Developer Tools」があります。実務では「GitHub + GitHub Actions + OIDC」がデフォルトですが、AWS 内で完結したい場合は CodePipeline / CodeBuild / CodeDeploy を組み合わせます。本章では両方の構成を整理します。
AWS Developer Tools 全体図
コミット先(GitHub / CodeCommit)
| サービス | 用途 | 状況 |
|---|---|---|
| GitHub | Git ホスティング | 推奨。事実上の標準 |
| CodeCommit | AWS 内 Git ホスティング | 2024 年 7 月以降、新規利用不可。既存のみ継続可 |
新規プロジェクトは GitHub 一択です。AWS の CodeStar Connections で GitHub と接続すれば、CodePipeline からも GitHub リポジトリをトリガにできます。
CodeBuild(ビルド / テスト)
CodeBuild はマネージドなビルドサーバー。buildspec.yml に手順を書き、CodeBuild がコンテナを起動して実行します。
# buildspec.yml
version: 0.2
phases:
install:
runtime-versions:
nodejs: 20
pre_build:
commands:
- npm ci
build:
commands:
- npm test
- npm run build
post_build:
commands:
- aws s3 sync dist/ s3://my-build-artifacts/$CODEBUILD_RESOLVED_SOURCE_VERSION/
artifacts:
files:
- dist/**/*
環境変数、IAM Role、VPC アクセス、Docker レイヤキャッシュなど、エンタープライズ向け設定が一通り揃っています。
CodeArtifact / ECR(成果物保管)
| サービス | 保管対象 |
|---|---|
| CodeArtifact | npm / pip / Maven / NuGet などの依存パッケージ |
| ECR (Elastic Container Registry) | Docker / OCI イメージ |
| S3 | 汎用の成果物(ビルド出力 zip 等) |
CodeDeploy(デプロイ)
CodeDeploy は EC2 / Lambda / ECS への配信を自動化するサービス。ローリング、Blue/Green、Canary などのデプロイ戦略を組み込みでサポートします。
- EC2 / On-prem: 各インスタンスにエージェントを入れて適用
- Lambda: 新バージョンに段階的にトラフィックを移行
- ECS: タスク定義を切り替え、ALB の重み付けを変えて Blue/Green
もっとも、Terraform / CloudFormation で直接 Lambda 関数や ECS サービスを更新するなら、CodeDeploy を挟まないことも多い。
CodePipeline(統合)
CodePipeline は「Source → Build → Deploy」のステージをつなぐマネージドパイプライン。各ステージは別の Code〜 サービスや、外部の GitHub / Jenkins と接続できます。
# Terraform で CodePipeline の最小例
resource "aws_codepipeline" "main" {
name = "myapp"
role_arn = aws_iam_role.pipeline.arn
artifact_store {
location = aws_s3_bucket.artifacts.bucket
type = "S3"
}
stage {
name = "Source"
action {
name = "GitHub"
category = "Source"
owner = "AWS"
provider = "CodeStarSourceConnection"
version = "1"
output_artifacts = ["source"]
configuration = {
ConnectionArn = aws_codestarconnections_connection.github.arn
FullRepositoryId = "myorg/myapp"
BranchName = "main"
}
}
}
stage {
name = "Build"
action {
name = "Build"
category = "Build"
owner = "AWS"
provider = "CodeBuild"
version = "1"
input_artifacts = ["source"]
output_artifacts = ["build"]
configuration = {
ProjectName = aws_codebuild_project.app.name
}
}
}
stage {
name = "Deploy"
action {
name = "Deploy"
category = "Deploy"
owner = "AWS"
provider = "ECS"
version = "1"
input_artifacts = ["build"]
configuration = {
ClusterName = aws_ecs_cluster.main.name
ServiceName = aws_ecs_service.app.name
FileName = "imagedefinitions.json"
}
}
}
}
GitHub Actions → AWS の OIDC 連携
多くのチームはここから「GitHub Actions + OIDC で AWS を操作」する構成に行き着きます。クレデンシャルを 1 つも保管せずに AWS リソースを Terraform 等で更新できます。
# IAM の OIDC プロバイダ
resource "aws_iam_openid_connect_provider" "github" {
url = "https://token.actions.githubusercontent.com"
client_id_list = ["sts.amazonaws.com"]
thumbprint_list = ["6938fd4d98bab03faadb97b34396831e3780aea1"]
}
# Actions から AssumeRole されるロール
resource "aws_iam_role" "github_deploy" {
name = "github-deploy"
assume_role_policy = jsonencode({
Version = "2012-10-17"
Statement = [{
Effect = "Allow"
Principal = {
Federated = aws_iam_openid_connect_provider.github.arn
}
Action = "sts:AssumeRoleWithWebIdentity"
Condition = {
StringEquals = {
"token.actions.githubusercontent.com:aud" = "sts.amazonaws.com"
}
StringLike = {
# myorg/myapp の main ブランチのみ
"token.actions.githubusercontent.com:sub" = "repo:myorg/myapp:ref:refs/heads/main"
}
}
}]
})
}
どっちを使えばいいか
| 状況 | 推奨 |
|---|---|
| 新規プロジェクト | GitHub + Actions + OIDC |
| すでに AWS で固められたエンタープライズ | CodePipeline + CodeBuild + CodeDeploy |
| マルチクラウド / ハイブリッド | GitHub Actions(クラウド非依存) |
| Lambda の段階的トラフィック切替が必要 | CodeDeploy(または Lambda alias を Terraform で直接管理) |