Skip to content

infra(ci-cd): Phase 1 Sprint 0 — (platform/tasks) OIDC + plan/apply×platform/tasks = 4 IAM Role(Environment 分離)(S0Infra-3) #246

Description

@win2cot

Phase 1 Sprint 0 Infra-3: (platform/tasks) GitHub Actions OIDC + plan/apply×platform/tasks = 4 IAM Role(Environment 分離)

概要

GitHub Actions の workflow から AWS へ OIDC trust relationship で IAM Role を assume(長寿命 access key を Secrets に置かない)。ADR-0004 の platform/tasks 2 stack 分離に合わせ、plan(read-only)/ apply(write)× platform / tasks = 4 role に分け、GitHub Environment で割り当てを分離する。

詳細仕様: infra/docs/adr/0004-platform-project-infra-separation.md §3.F / docs/architecture/infrastructure-plan.md §6.1。

stack / 配置(ADR-0004)

  • OIDC Provider + 4 role はアカウント単位の共有資産。platform stack(infra/shared/environments/dev/、key platform/dev/...)の iam_oidc module に置く(tasks 非依存)。
  • state backend は key prefix で分離: platform-* role → platform/*、tasks-* role → tasks/*

実装内容

A. AWS 側(OIDC Provider + 4 IAM Role)

  • IAM OIDC Provider: https://token.actions.githubusercontent.com(アカウントに 1 つ)
  • 4 role(trust policy で repo:win2cot/tasks-webapi + GitHub Environment 条件に限定):
role 用途 state backend resource 権限 SSM
platform-dev-plan PR plan(read-only) platform/* 読取 network/alb/ses 読取 /platform/dev/* 読取
platform-dev-apply apply(write) platform/* 読書 network/alb/ses CRUD /platform/dev/* 読書(publish)
tasks-dev-plan PR plan(read-only) tasks/* 読取 tasks resource 読取 /platform/dev/* + /tasks/dev/* 読取
tasks-dev-apply apply(write) tasks/* 読書 tasks resource(SG/RDS/ECS/Route53/PS 等)CRUD /platform/dev/* 読取 + /tasks/dev/* 読書
  • use_lockfile のため state lock は s3:PutObject / GetObject / DeleteObject で完結(DynamoDB 権限不要)。

B. Terraform

  • infra/shared/modules/iam_oidc/ モジュール化(OIDC Provider + 4 role + policy)
  • infra/shared/environments/dev/main.tf から呼び出し
  • 命名 platform-dev-* / tasks-dev-*

C. GH Actions workflow 雛形 + Environment

  • GitHub Environment: platform-dev / tasks-dev(apply role の assume を Environment 保護で限定)
  • .github/workflows/terraform-apply.yml(Sprint 0 ではコメント out 可、apply role 使用)
  • permissions: id-token: write / aws-actions/configure-aws-credentials@v4

受入条件

  • IAM OIDC Provider 存在
  • 4 role(platform/tasks × plan/apply)存在、trust policy で repo + Environment に限定
  • state backend 権限が key prefix(platform/*tasks/*)で分離
  • terraform で OIDC Provider + 4 role + policy 記述、terraform plan(platform)差分なし
  • 各 role で GH Actions から aws sts get-caller-identity 成功

関連

備考

  • task-type: task-type:impl / 優先度: priority/p0 / area: area/infra + area/ci
  • claude-automation: 適用(IAM 標準パターン)。ただし plan-in-CI の workflow(terraform-plan.yml)は case B 人手 PR

スコープ追加(2026-06-04): plan-in-CI を内包(旧 Tier B)

plan role を作ったその場で terraform plan を通し OIDC 疎通まで動作確認するため、Terraform plan の PR CI を本 issue に統合。

追加実装

  • .github/workflows/terraform-plan.yml: PR 時に platform-plan / tasks-plan role を OIDC assume → 各 root で terraform init(remote backend)→ terraform plan -no-color -lock=false(read-only)
  • plan 出力を sticky comment(platform / tasks 別 header)へ
  • paths-filter は terraform ファイル限定(infra/**/*.tf / infra/**/*.hcl / infra/**/*.tfvars / 当ワークフロー)(dorny/paths-filter)+ concurrency。infra/** 全体は doc-only(.md)で誤発火するため不可
  • リソース投入(S0Infra-4 以降)前は空 plan("no changes")になるが、雛形と OIDC 疎通はここで確認

追加受入条件

  • PR で platform / tasks の plan が OIDC role assume で実行され、差分(初期は "no changes")が comment 表示
  • plan は read-only(apply は terraform-apply.yml 側)

関連: Terraform CI tracker #382(Tier A fmt/validate・IaC スキャンと同パイプライン)

Metadata

Metadata

Assignees

No one assigned

    Labels

    area/ci.github/workflows / CI/CD パイプライン変更area/infraAWS インフラ(ECS Fargate / RDS / Keycloak / IAM)変更priority/p0Critical / Blocker。本番影響あり、または他作業がブロックされるtask-type:implコード実装が主体のタスク

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions