★★ 中級

03. AWS でチーム開発(Developer Tools)

AWS には独自の CI/CD サービス群「Developer Tools」があります。実務では「GitHub + GitHub Actions + OIDC」がデフォルトですが、AWS 内で完結したい場合は CodePipeline / CodeBuild / CodeDeploy を組み合わせます。本章では両方の構成を整理します。

AWS Developer Tools 全体図

AWS Developer Tools:CodeCommit / CodeBuild / CodeDeploy / CodePipeline / CodeArtifact
「Code〜」シリーズが各フェーズを担当し、CodePipeline がそれらをつなぐ。新規利用は GitHub + Actions + OIDC が主流。

コミット先(GitHub / CodeCommit)

サービス用途状況
GitHubGit ホスティング推奨。事実上の標準
CodeCommitAWS 内 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(成果物保管)

サービス保管対象
CodeArtifactnpm / pip / Maven / NuGet などの依存パッケージ
ECR (Elastic Container Registry)Docker / OCI イメージ
S3汎用の成果物(ビルド出力 zip 等)

CodeDeploy(デプロイ)

CodeDeploy は EC2 / Lambda / ECS への配信を自動化するサービス。ローリング、Blue/Green、Canary などのデプロイ戦略を組み込みでサポートします。

もっとも、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 で直接管理)