こんにちは!インフラエンジニアの先輩です。
日々のインフラ管理、お疲れ様です。「手動で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ライフを!