Pulumi × GitHub Actionsで極限まで加速するIaCパイプライン:実戦的CI/CD構築の全作法
こんにちは。テックリードの私だ。
日々のインフラ運用で、こんな絶望を味わっていないだろうか?
「TerraformのPlan結果が長すぎて誰もレビューしない」
「PRが出されるたびにローカルで`pulumi up`を叩く亡霊がいる」
「ステートのロック競合でCIが落ち、Slackが荒れる」
これらは、IaCを「ただ導入しただけ」のチームが陥る典型的なアンチパターンだ。
今回は、PulumiとGitHub Actionsを完全に調停させ、開発スピードを劇的に高めつつ、要塞のような堅牢性を誇るCI/CDパイプラインの構築手法を、実戦コードとともに魂を込めて伝授する。
—
1. 思想の共有:なぜ「Pulumi Cloud + GitHub Actions」なのか
Terraform(HCL)の静的な記述力にフラストレーションを感じたことはないか? Pulumiは、TypeScript、Python、Goといった汎用プログラミング言語を用いてインフラを定義できる。これにより、テスト駆動インフラ(TDI)や、DRY原則を極めたコンポーネント設計が現実のものとなる。
しかし、真価を発揮するのはその「自動化レイヤー」だ。
今回は、ステート管理の煩わしさをゼロにする Pulumi Cloud をバックエンドに据え、GitHub ActionsとのOIDC(OpenID Connect)連携による鍵の完全廃止(Secretless)を前提としたパイプラインを構築する。
—
2. セキュリティとシークレット管理のベストプラクティス(OIDC連携)
AWSの長期クレデンシャル(`AWS_ACCESS_KEY_ID` など)をGitHubのSecretsに保存しているチームは、今すぐその設定を削除してほしい。漏洩リスクの温床でしかない。
GitHub ActionsとAWS/Pulumi Cloudをセキュアに結ぶため、AWS側でOIDCプロバイダを設定し、GitHubからのJWTを信頼するアーキテクチャを採用する。
GitHub Actionsワークフローの設定例
以下のワークフローは、PR時にプレビュー(`pulumi preview`)、mainマージ時にデプロイ(`pulumi up`)を完全に自動化するプロダクションレディな設定だ。
name: “Infrastructure CI/CD”
on:
pull_request:
branches:
- main
paths:
- ‘infra/’ # インフラコードの変更のみ反応させる
push:
branches:
- main
paths:
- ‘infra/’
同時実行制御:同一ブランチでのデプロイメント競合を確実に防ぐ
concurrency:
group: pulumi-${{ github.ref }}
cancel-in-progress: false
jobs:
pulumi:
name: “Pulumi Preview & Deploy”
runs-on: ubuntu-latest
# 権限の最小化:IDトークンの取得を許可
permissions:
id-token: write
contents: read
pull-requests: write # PRへのコメント自動投稿に必須
defaults:
run:
working-directory: ./infra
steps:
- name: Checkout Repository
uses: actions/checkout@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: ’20’
cache: ‘npm’
cache-dependency-path: ./infra/package-lock.json
- name: Install Dependencies
run: npm ci
# AWS OIDC 認証(長期クレデンシャルを一切使わない)
- name: Configure AWS Credentials
uses: aws-actions/configure-aws-credentials@v4
with:
role-to-assume: arn:aws:iam::123456789012:role/GitHubActionsPulumiDeployRole
aws-region: ap-northeast-1
- name: Login to Pulumi Cloud
uses: pulumi/actions@v5
with:
command: login
env:
PULUMI_ACCESS_TOKEN: ${{ secrets.PULUMI_ACCESS_TOKEN }}
# プレビュー実行(PR時)
- name: Pulumi Preview
if: github.event_name == ‘pull_request’
uses: pulumi/actions@v5
with:
command: preview
stack: production
comment-on-pr: true # PRにリッチな差分を自動コメント
env:
PULUMI_ACCESS_TOKEN: ${{ secrets.PULUMI_ACCESS_TOKEN }}
AWS_REGION: ap-northeast-1
# 本番デプロイ実行(mainマージ時)
- name: Pulumi Up
if: github.event_name == ‘push’ && github.ref == ‘refs/heads/main’
uses: pulumi/actions@v5
with:
command: up
stack: production
options: –refresh # ステートと実際のインフラストラクチャのドリフトを強制検知
env:
PULUMI_ACCESS_TOKEN: ${{ secrets.PULUMI_ACCESS_TOKEN }}
AWS_REGION: ap-northeast-1
—
3. チーム開発の生産性を爆上げする設定と極意
ここからは、日々の開発スピードを一段階引き上げるための「プロの隠し味」を共有する。
A. `pulumi/actions` の `comment-on-pr: true` を使い倒せ
先ほどのワークフローで設定した `comment-on-pr: true` は、Terraformで言う `tfaction` や `atlantis` のような体験をGitHub Actions単体で実現する。
PRにPulumiのプレビュー結果(追加・更新・削除されるリソースのツリー)が自動でコメントされるため、レビュアーはコードだけでなく「インフラストラクチャへの影響範囲」を視覚的に一瞬で把握できる。
B. 設定ファイルのベストプラクティス(`Pulumi..yaml`)
環境ごとの設定値は、コード内にハードコーディングせず、スタック設定ファイルに厳格に分離する。さらに、機密情報(DBのパスワードなど)はプレーンテキストで置かず、必ずPulumiの暗号化機能を通すこと。
Pulumi.production.yaml
config:
aws:region: ap-northeast-1
my-app:instanceType: t3.medium
# 機密情報は `pulumi config secret` で暗号化して保存する
my-app:dbPassword:
secure: AAABAHvK9…[暗号化されたシークレット]
C. チーム開発のための共有化ルール(ESLint & Prettier & Policy as Code)
言語にTypeScriptを採用している場合、インフラコードの品質担保はアプリケーションコードと同等に行うべきだ。
- Pulumi Policy (CrossGuard): 「すべてのS3バケットはパブリックアクセスをブロックしなければならない」といった組織のガバルンスルールをコードとして定義し、`pulumi preview` 時に自動バリデーションする。
- strictなTypeScript設定: `tsconfig.json` では `noImplicitAny: true` や `strictNullChecks: true` を有効化し、型の不整合によるデプロイ失敗をコンパイル段階で完全に排除する。
—
4. テックリードからのエピローグ
IaCのCI/CD構築は、単に「コマンドをGitHub Actionsに移植する作業」ではない。
「開発者がインフラ変更の恐怖から解放され、ビジネス価値の創出に集中できる環境をつくること」こそが本質だ。
今回紹介したOIDC認証によるセキュアなパイプラインと、Pulumi Cloudによる精緻なプレビューの自動化を導入すれば、チームのデプロイ頻度は劇的に向上し、インフラ起因の障害は過去のものとなるだろう。
さあ、今すぐYAMLを書き換え、Pull Requestを投げてみよう。快適なインフラ自動化の世界へようこそ。