こんにちは、JX通信社のCTOの小笠原(@yamitzky)です。
この記事では、TerraformとClaude Code GitHub Actionsを活用した、権限管理の効率化の取り組みについてご紹介します。
権限管理の課題と Terraform による IaC 化
JX通信社では、Google CloudやAWS、GitHub、Cloudflareといった複数のクラウドサービスを利用しています。もともとはすべて手作業で権限管理を行っていましたが、以下のような課題がありました。
- 管理の属人化: 特定の管理者にしか設定が分からず、作業が集中してしまう。
- 変更履歴の不透明性: 「いつ」「誰が」「なぜ」権限を変更したのか追跡するのが難しい。
- 複雑な設定の手間: Workload Identity Federationの設定など、複雑な設定が必要な場合がある。
これらの課題を解決するため、権限設定を Terraform を用いてコード化(IaC: Infrastructure as Code)し、GitHub で一元管理できるよう、徐々に移行を進めています。
例えば、以下のようにTerraformのコードを書くだけで、GitHubにメンバーを招待できます。
resource "github_membership" "yamitzky" { username = "yamitzky" role = "member" }
※実際にはmodule化をすることで、より簡単・汎用的にしています。
現在は、下記の設定などをTerraformで管理し、Pull Requestベースで運用しています。
- GitHubのアカウントやリポジトリ
- Google Cloudのプロジェクトやロール
- Cloudflareのアカウントやロール
- Workload Identity設定(GitHub Actionsから各種クラウドに対しての認証)
Terraform による権限管理の問題
Terraformによる権限管理はよく行われていますが、一つ、大きな問題があります。
ずばり、Terraformの構成を書くのが難しくて面倒くさい! ということです。言い換えると「学習コストが高い」ということです。
JX通信社には普段Terraformを書いていないメンバーもいるため、「権限を追加してほしい場合は、Terraformのコードを書いてください」というルールにするのはややハードルが高いです。管理者が代理でTerraformを書く形だと、「管理者への作業集中」という課題は解決できません。
Claude Codeによる自動化で、誰でも権限申請
この「Terraformを書くのが大変」という問題を解決するために、Claude Code GitHub Actionsを導入し、AIによるTerraformコードの自動生成・提案の仕組みを構築しました。
Claude Code GitHub Actions は、Claude CodeによるAIコーディングの仕組みをGitHub Actions上で実行できるものです。
※公式ドキュメントや紹介記事がたくさんあるので説明を省略します。
申請から適用までの流れ
この仕組みの具体的な流れは以下の通りです。
- Issue の作成: 権限を申請したい人は、用途別に用意された Issue テンプレートを使って Issue を作成します。
- AIによるコード生成: Issue が作成されると、GitHub Actionsが実行され、AI(Claude Code)がIssueの内容を解釈し、権限設定用のTerraformコードを自動で生成・修正します。
- Pull Request の作成: Claude Codeが生成したコードを元に、Pull Requestを作成します。
- terraform planの実行: GitHub Action上で、terraform fmt, validate, planを実行し、結果をPull Requestにコメントします。
- レビューとマージ: 申請内容と生成されたコード、terraform planの内容をレビューし、問題がなければ管理者がマージします。マージされると、本番環境に権限設定が適用されます。
この仕組みにより、Terraform の知識がないメンバーでも、Issueを作成するだけで、セルフサービスで権限申請を行えるようになりました。
具体例:GitHubメンバーの招待
例えば、新しいメンバーをGitHubに招待したい場合、申請者は以下のようなIssueを作成します。
--- name: GitHubメンバー招待・管理 about: GitHub組織へのメンバー招待や権限変更の依頼 title: '[GitHub Member] ' labels: ['github', 'member'] assignees: [] --- ## 依頼内容 - [ ] 新しいメンバーの招待 - [ ] 既存メンバーの権限変更 - [ ] メンバーの削除 ## メンバー情報 ### GitHubユーザー名 <!-- 例: example-user --> ### メールアドレス <!-- 例: example@jxpress.net --> ### 権限レベル - [ ] admin (管理者) - [x] member (一般メンバー) ### 所属チーム(分かる場合) --- @claude 上記の内容でGitHubメンバーをお願いします。
ポイントは、最後に @claude とメンションしている点です。claude へのメンションをあらかじめテンプレートに入れておくことで、申請者はユーザー名などを書いて投稿するだけで、権限申請ができるようになります。また、事前設定しておきたい原則ルール(例:adminではなくmember権限を原則とするなど)については予めテンプレートに記入しています。

GitHub Actions の設定
基本的には公式サンプルを踏襲していますが、2点、工夫している箇所があります。
JX通信社では、主にGoogle Cloudを利用しているため、Claude Code GitHub Actions の設定はGoogle CloudのWorkload Identity Federationを利用し、Vertex AI経由で実行しています。Claude CodeはAWSやGoogle Cloudでも使えるため、(SaaSの)Claude自体の利用が始まっていないような会社でも、支払いや許可などの点で利用しやすいのではないかと思います。
また、Claude Codeの実行は数分かかり、GitHub Actionsの費用を浪費してしまいます。そこで、余っているPCで組んだKubernetesクラスター上にActions Runner Controllerを導入し、GitHub Actionsを実行することで、費用を抑えています。
name: Claude Code Action permissions: contents: write pull-requests: write issues: write id-token: write on: issue_comment: types: [created] pull_request_review_comment: types: [created] issues: types: [opened, assigned] pull_request_review: types: [submitted] jobs: claude-code-action: if: | (github.event_name == 'issue_comment' && contains(github.event.comment.body, '@claude')) || (github.event_name == 'pull_request_review_comment' && contains(github.event.comment.body, '@claude')) || (github.event_name == 'pull_request_review' && contains(github.event.review.body, '@claude')) || (github.event_name == 'issues' && contains(github.event.issue.body, '@claude')) runs-on: kubernetes steps: - name: Checkout repository uses: actions/checkout@v4 with: fetch-depth: 1 - name: Generate GitHub App token id: app-token uses: actions/create-github-app-token@v2 with: app-id: ${{ secrets.CLAUDE_CODE_APP_ID }} private-key: ${{ secrets.CLAUDE_CODE_APP_PRIVATE_KEY }} - name: Authenticate to Google Cloud id: auth uses: google-github-actions/auth@v2 with: workload_identity_provider: '(略)' service_account: '(略)' - name: Run Claude PR Action uses: anthropics/claude-code-action@beta with: github_token: ${{ steps.app-token.outputs.token }} use_vertex: "true" model: 'claude-sonnet-4@20250514' env: ANTHROPIC_VERTEX_PROJECT_ID: ${{ steps.auth.outputs.project_id }} CLOUD_ML_REGION: us-east5
今後は、CI失敗時のレビューや、terraform fmtなど自動でのツール実行なども自動化させていきたいです。
CLAUDE.mdの設定
CLAUDE.mdには以下の内容だけを設定しています。*1
このリポジトリは Terraform で作られています。Terraform を使って、Google Cloud や AWS などのリソースを管理することを目的としています。 モジュール定義の書き方は @README.md を参照してください。 OIDC 設定を依頼された際は、サンプルとなる GitHub Actions の設定も教えて下さい。 日本語で書いてください。
その代わりに、READMEには各種権限管理モジュールの説明やサンプルなどを充実させ、人間にもAIにも優しいドキュメントを充実させています。
まとめ
本記事では、TerraformとClaude Code GitHub Actionsを組み合わせ、権限管理を効率化・自動化した取り組みについてご紹介しました。
Terraformでの権限管理自体はやっている会社も多いと思いますが、AIコーディングと組み合わせることで、学習コストの壁を取り払うことができました。ぜひ参考にしてください!
*1:意味のある設定になっているか検証をしていないので、誤り等あればご指摘ください