【入門編】Pulumiで実現するCI/CDパイプライン構築:GitHub Actions連携の実装手順 – インフラ構成管理(IaC)活用バイブル

こんにちは!インフラエンジニアの先輩です。

日々のインフラ管理、お疲れ様です。「手動でAWSやGCPのコンソールをポチポチするのはもうやめたい」「Terraformもいいけど、もっと慣れ親しんだプログラミング言語でインフラを書きたい」――そんな風に思ったことはありませんか?

今回は、次世代のインフラ構成管理(IaC)ツールとして世界中のエンジニアを夢中にさせている「Pulumi(プルミ)」と、「GitHub Actions」を組み合わせて、インフラの変更を完全に自動化するCI/CDパイプラインの構築方法を解説します。

これをマスターすれば、プルリクエストを送るだけで自動でインフラの変更予定(プレビュー)がコメントされ、mainブランチにマージするだけで安全にデプロイが完了する、夢のような開発体験が手に入りますよ。毎日の作業が劇的に楽になりますので、一緒に一歩ずつ進めていきましょう!

—

1. PulumiとGitHub Actions連携の全体像

まずは、「なぜこの組み合わせが最強なのか」をサクッと理解しておきましょう。

  • Pulumiとは?

TypeScript、Python、Go、C#といった使い慣れたプログラミング言語でインフラを定義できるIaCツールです。JSONや独自DSL(HCLなど)と違って、ループや条件分岐、関数を自然に書けるため、複雑なインフラ構成も美しく保てます。

  • GitHub Actionsとは?

GitHubのコードリポジトリと密に連携するCI/CDプラットフォームです。「PRが作られたら」「マージされたら」といったイベントをトリガーに、自動でスクリプトを実行できます。

この2つを組み合わせると、以下のような「完全自動化された安全地帯」が完成します。

1. 開発者がインフラコードを書いてGitHubにPush
2. GitHub Actionsが自動で立ち上がり、Pulumiで「変更プレビュー(pulumi preview)」を実行
3. 結果をPRに自動コメント(チームメンバーがレビューしやすい!)
4. mainブランチにマージされると、自動で本番環境に適用(`pulumi up`)

—

2. 基礎セットアップ:Pulumi Cloudの準備

今回は、インフラの状態(ステート)を安全かつ簡単に管理するために、無料から使えるPulumi Cloudをバックエンドとして使用します。

ステップ1: Pulumiアカウントの作成とアクセストークンの取得

1. [Pulumi公式サイト](https://www.pulumi.com/)にアクセスし、GitHubアカウントなどでサインアップします。
2. ダッシュボード右上のアイコンから “Settings” > “Access Tokens” に移動します。
3. “Create token” を押し、適当な名前(例: `github-actions`)をつけてトークンを生成します。
4. 生成されたトークン(`pul-…`で始まる文字列)をコピーし、絶対に他人に見られないよう安全に保管してください。

ステップ2: GitHubリポジトリへのシークレット登録

GitHub ActionsからPulumi Cloudやクラウド(例:AWS)にアクセスするため、GitHubの「Secrets」に認証情報を登録します。

あなたのGitHubリポジトリの Settings > Secrets and variables > Actions から、以下のシークレットを追加してください。

  • `PULUMI_ACCESS_TOKEN`: 先ほど生成したPulumiのアクセストークン
  • (AWSを使う場合)`AWS_ACCESS_KEY_ID`: AWSのアクセスキー
  • (AWSを使う場合)`AWS_SECRET_ACCESS_KEY`: AWSのシークレットキー

—

3. プルリクエスト時のプレビュー自動化(CI)

それでは、ここからが本番です。GitHub Actionsのワークフローファイルを記述していきましょう。

まずは、「プルリクエストが作成・更新されたときに、インフラの変更内容をプレビューしてPRにコメントする」ワークフローを作ります。

プロジェクトのルートに `.github/workflows/pulumi.yml` というファイルを作成し、以下のコードを記述してください。

name: “Pulumi CI/CD”

1. ワークフローを走らせるトリガーの設定
on:
push:
branches:

  • main

pull_request:
branches:

  • main

2. 実行環境(ランナー)の指定
jobs:
pulumi:
name: Pulumi Preview & Deploy
runs-on: ubuntu-latest

# 3. Pulumi Cloudとクラウド(AWS)への権限付与
steps:

  • name: Checkout Repository

uses: actions/checkout@v4

  • name: Setup Node.js (TypeScriptを使用する場合)

uses: actions/setup-node@v4
with:
node-version: ’20’
cache: ‘npm’

# 4. 依存関係のインストール(例: TypeScriptプロジェクトの場合)

  • name: Install dependencies

run: npm ci

  • name: Login to AWS (AWSリソースを操作する場合)

uses: aws-actions/configure-aws-credentials@v4
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: ap-northeast-1

# 5. Pulumi CLIのセットアップとプレビュー実行

  • name: Run Pulumi Preview

uses: pulumi/action-pulumi-secret-pusher@v3 # 必要に応じて
# 公式のPulumiアクションを使用します
uses: pulumi/actions@v5
with:
command: preview
stack-name: dev # Pulumiのスタック名(環境名)
cloud-url: ${{ secrets.PULUMI_ACCESS_TOKEN }} # 省略しても環境変数から拾われます
env:
PULUMI_ACCESS_TOKEN: ${{ secrets.PULUMI_ACCESS_TOKEN }}
# クラウドの認証情報も環境変数として渡す
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}

> 💡 先輩からのワンポイントアドバイス
> 公式の `pulumi/actions@v5` を使うと、なんとPRに対して自動的に「何が追加され、何が変更されるか」の差分(Diff)をコメントしてくれます!これによって、「意図しないリソースが削除される変更になっていないか」をチームメンバー全員で簡単にレビューできるようになります。

—

4. マージ時の本番デプロイ自動化(CD)

先ほどのワークフローファイルは、実は工夫次第で「PRのときは `preview`、`main` ブランチへのマージのときは `up`(本番適用)」を1つのファイルでスマートに切り替えられます。

先ほどの `.github/workflows/pulumi.yml` を、以下のように少しだけブラッシュアップしましょう。

name: “Pulumi CI/CD”

on:
push:
branches:

  • main

pull_request:
branches:

  • main

jobs:
pulumi:
name: Pulumi Preview & Deploy
runs-on: ubuntu-latest

permissions:
contents: read
pull-requests: write # PRにコメントを書く権限に必要です

steps:

  • name: Checkout Repository

uses: actions/checkout@v4

  • name: Setup Node.js

uses: actions/setup-node@v4
with:
node-version: ’20’
cache: ‘npm’

  • name: Install dependencies

run: npm ci

  • name: Configure AWS Credentials

uses: aws-actions/configure-aws-credentials@v4
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: ap-northeast-1

# 3. ブランチ条件分岐:mainへのマージなら ‘up’、PRなら ‘preview’ を実行

  • name: Run Pulumi Up / Preview

uses: pulumi/actions@v5
with:
command: ${{ github.event_name == ‘push’ && ‘up’ || ‘preview’ }}
stack-name: production # 本番用スタック、または環境変数で動的に切り替え
comment-on-pr: true # PRに結果をコメントする
env:
PULUMI_ACCESS_TOKEN: ${{ secrets.PULUMI_ACCESS_TOKEN }}
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}

たったこれだけの記述で、

  • PR作成時 = 安全な `pulumi preview` が走り、結果がコメントされる
  • mainマージ時 = 自動で `pulumi up` が走り、インフラが最新の状態にアップデートされる

という、モダンで堅牢なCI/CDパイプラインが完成します!

—

5. セキュリティとシークレット管理のベストプラクティス

インフラ自動化において、セキュリティの担保はエンジニアの生命線です。最後に、絶対に守るべきベストプラクティスを3つお伝えします。

1. データベースのパスワードやAPIキーはコードに直書きしない
Pulumiには強力な機密情報管理機能(`pulumi.secret`)が備わっています。コード内で機密情報を扱う場合は、必ずPulumiの暗号化機能を通しましょう。
2. GitHub Secretsの権限を最小限にする
GitHub Actionsに渡すAWSのクレデンシャル(アクセスキー)は、必要最低限の権限(Least Privilegeの原則)を持つIAMユーザー/ロールのものを使用してください。何でもできる `AdministratorAccess` を渡すのは絶対にNGです。
3. ステートファイルの管理に悩まない
今回使用した「Pulumi Cloud」を利用すれば、面倒なS3やDynamoDBのステートロック設定を自分でメンテする必要がありません。暗号化もデフォルトで有効なため、セキュリティ面でも非常に安心です。

—

まとめ

今回は、PulumiとGitHub Actionsを連携させた、モダンでストレスフリーなCI/CDパイプラインの構築方法を解説しました。

  • プログラミング言語でインフラを優しく記述できる Pulumi
  • PR時の自動プレビューと、マージ時の自動デプロイを担う GitHub Actions

この2つを組み合わせることで、「インフラ変更の恐怖」から解放され、コードレビューを中心とした健全なインフラ開発チームを作ることができます。

これをマスターすれば、毎日の作業が劇的に楽になりますよ。ぜひあなたのプロジェクトでも試してみてくださいね!それでは、良きIaCライフを!

タイトルとURLをコピーしました