「Pulumi Stack」とは ー Pulumiによるマルチステージ環境の構築方法

2023年4月20日(木)
大関 研丞 (Kenneth Ozeki)
第3回となる今回は、Pulumi Stackの概要について解説し、複数Stackのデプロイについてハンズオンを実施していきます。

はじめに

前回は、Pulumiのチュートリアルを通して実際にAWSリソースを作成し、Pulumiの基本的な使い方について解説しました。今回は、前回でも少し触れたPulumiのStackについて、もう少し深掘りして概要/メリットや活用方法を解説していきます。

なお、後半のハンズオンではdev環境や本番環境など、リリース段階に応じた複数の環境をPulumi Stackで実際に構築し、Stackの理解を深めていきます。

Pulumi Stackについて

Stackの概要

Stackとは、異なる環境やアプリケーションごとにインフラストラクチャをデプロイするための機能であり、Pulumi Programから生成されるインスタンスです。例えば、1つのPulumi Programから開発、ステージング、本番環境といった複数の環境ごとにStackをデプロイすることで、各環境に応じたインフラストラクチャを実際に構築できます。

1つのProgramから複数のStackをデプロイ

または、開発、ステージングなど、Pulumi Project内で用途ごとにディレクトリを分けて、それぞれのPulumi ProgramからStackをデプロイすることも可能です。

用途ごとにディレクトリ/Pulumi Programを分けてStackをデプロイ

Pulumi Programからインスタンス化された各Stackには独自の状態が存在しており、それぞれの環境に合わせてインフラストラクチャの構成を変更させることもできます。

Stackごとの設定ファイルを読み込んで1つのProgramから複数のStackデプロイ

また、Stackでは今までのインフラストラクチャの状態(State)もデフォルトで保持されます。各StackのStateはPulumi Serviceのコンソール画面やPulumi CLIのコマンドから確認できます。

$ pulumi stack export

{
    "version": 3,
    "deployment": {
        "manifest": {
            "time": "2023-02-09T17:45:14.947799+09:00",
            "magic": "375b9a4575c488972efc376a5a54ab60c43297fcce335704037cb8c668a4c864",
            "version": "v3.53.1"
        },
        "secrets_providers": {
〜〜(略)〜〜
       "resources": [
            {
                "urn": "urn:pulumi:dev::pulumi-test::pulumi:pulumi:Stack::pulumi-test-dev",
                "custom": false,
                "type": "pulumi:pulumi:Stack",
                "outputs": {
                    "bucket_name": "my-bucket-c4e1d9c"
                }
            },
〜〜(略)〜〜
【Pulumi CLI Stackのインフラストラクチャの状態(State)確認】

Pulumi Service Stack Activity(リソース作成履歴)画面

Stackのメリット

Pulumiで複数のStackをうまく活用することで、例えば以下のようなメリットがもたらされます。

■Stack単位でインフラストラクチャを管理できる

Stackを単位として、インフラストラクチャをグループ分けできます。プロジェクトにより適切なグループの分け方は異なりますが、例えば以下のようなグループ分けが可能です。

●リリース段階別
開発環境(dev)/ステージング環境(stg)/本番環境(prod)など、リリース段階別にStackを分けることで、例えば開発環境への変更が本番環境に影響しないようにできます。

├── dev
│   ├── __main__.py
│   ├── Pulumi.yaml
│   └── Pulumi.dev.yaml
├── stg
│   ├── __main__.py
│   ├── Pulumi.yaml
│   └── Pulumi.stg.yaml
└── ...

●アプリケーション別
Stackにより異なるアプリケーション間でリソースを分離することで、アプリケーションへの変更が他のアプリケーションに影響が出ないように管理できます。

├── webApp
│   ├── __main__.py
│   ├── Pulumi.yaml
│   └── Pulumi.web.yaml
├── snsApp
│   ├── __main__.py
│   ├── Pulumi.yaml
│   └── Pulumi.sns.yaml
└── ...

●チーム別
チームごとにStackを分けることで、各チームで管理しているリソースを分離できます。チームごとに異なる権限を付与すれば、他チームのリソースに対する想定外のオペレーションを防ぐことができます。

├── infraTeam
│   ├── __main__.py
│   ├── Pulumi.yaml
│   └── Pulumi.infra.yaml
├── appTeam
│   ├── __main__.py
│   ├── Pulumi.yaml
│   └── Pulumi.app.yaml
└── ...

上記以外にも、ゾーン別やリソース別など、様々な観点でStackによるグループ分けを行ってインフラストラクチャを管理できます。

■インフラストラクチャコードを容易に再利用できる

インフラストラクチャをコード(Program)として定義し、実際のデプロイはコードを元にStackが作成(更新)され、リソースが作成されます。そのため、例えばコードを再利用して異なるStackとして再度同様の構成でリソースを作成することも可能です。逆にStack間で異なるコードを使用できるため(Programの分離)、プロジェクトによってどのようなコードの構成をとるか、自由に計画できます。

■Stackごとのアクセス権限(RBAC)が設定可能

「Stack単位でインフラストラクチャを管理できる」の項でも少し触れていますが、Stackごとにアクセス権限を付与できます。例えば、チームごとにStackを振り分けて権限を付与できるため、大型プロジェクトのような複数チームが存在するプロジェクトでPulumiを用いたインフラ/アプリケーション開発(クロスチームコラボレーション)も容易になります。Stack権限に関する詳細はこちらを参考にしてください。

前回のようにPulumiを使い始めた段階では、1つのPulumi ProjectとStackでインフラストラクチャを管理しますが、ある程度チーム規模やコードの総量が増えてくると1つのStackを分割したり、そもそもPulumi Project自体を分割するといった方法を検討するかと思います。

公式HPでは、上記のようなメリットの他にPulumi ProjectやStackをどのように構成するか、Monolithic(1つのPulumi Project/Stackによる運用)とMicro-Stacks(複数のPulumi Project/Stackによる運用)それぞれのメリットや、MonolithicからMicro-Stacksへの移行について紹介されているので、ぜひ参考にしてください。

Stack関連の操作

ハンズオンに入る前に、Pulumi Stackに関連するPulumi CLI操作コマンドやProgramによる操作について、ひと通り解説します。

■Pulumi CLIコマンドによる操作

●Pulumi Project/Stack新規作成コマンド
$ pulumi new <template名>

Pulumi Projectが存在しない場合は、Stackを作成する前にProjectを作成する必要があります。上記コマンドではPulumi ProjectとStackが同時に新規作成されます。Project名やStack名はコマンド実行後のプロンプトで指定できます。

template名はPulumiで利用する言語(Go/Pythonなど)とPulumiで管理するクラウドサービス(AWS/GCPなど)の組み合わせとなり、あらかじめ決められたtemplate名を指定する必要があります。template名が分からない場合は「pulumi new」コマンドだけ実行すると、以下のようにtemplateを選択できます。

$ pulumi new

Please choose a template (38/206 shown):
  [Use arrows to move, type to filter]
  aiven-go                           A minimal Aiven Go Pulumi program
  aiven-python                       A minimal Aiven Python Pulumi program
〜〜(略)〜〜
  aws-fsharp                         A minimal AWS F# Pulumi program
> aws-go                             A minimal AWS Go Pulumi program
〜〜(略)〜〜
●Stack新規作成コマンド
$ pulumi stack init <stack名>

Pulumi Projectがすでに作成されている場合は、上記コマンドで新たにStackを作成できます。上記コマンド実行時点ではPulumi Stackのkey-value形式の設定ファイル「Pulumi.<stack名>.yaml」は作成されず、後述の「Stackの設定」を実行した時点で設定ファイルが作成されます。

●Stack一覧コマンド
$ pulumi stack ls
●Stack選択コマンド
$ pulumi stack select <stack名>
●Stackデプロイコマンド
$ pulumi up

すでに複数のStackが存在する場合は、デプロイ対象のStackへ事前に切り替えてから「pulumi up」コマンドを実行します。

$ pulumi stack ls
NAME  LAST UPDATE  RESOURCE COUNT  URL
dev   1 week ago   0               https://app.pulumi.com/*/dev
stg*  n/a          n/a             https://app.pulumi.com/*/stg

$ pulumi stack select dev

$ pulumi up
Previewing update (dev)
〜〜(略)〜〜
●Stack outputの確認
$ pulumi stack output

現在Stackに設定されているoutputの一覧を確認できます。key-value形式となるため、特定のOUTPUT名(key)を指定して、VALUEを出力することもできます。

$ pulumi stack output
Current stack outputs (2):
    OUTPUT        VALUE
    project_name  test1
    stack_name    dev

$ pulumi stack output stack_name
dev
著者
大関 研丞 (Kenneth Ozeki)
クリエーションライン株式会社 Data Platform Team
前職では保険や金融エンタープライズのミッションクリティカルシステム(オンプレミス、仮想サーバー、CDN等のインフラ系業務)の設計/構築を経験。クリエーションラインに転職後はクラウドエンジニアとしてGCP関連の案件でインフラの設計/構築、IaCやCI/CDを用いたDevOpsの導入、コンテナ(Kubernetes)基盤の構築、運用自動化ツールの作成などを担当。
クリエーションラインの技術ブログをチェック

連載バックナンバー

システム運用技術解説
第10回

Pulumiの最新機能「Pulumi ESC」を使ってみよう

2023/12/26
最終回となる今回は、2023年12月時点でリリースされている新機能の紹介と、その新機能の中から「Pulumi ESC」を用いたハンズオンを実践していきます。
システム運用技術解説
第9回

TerraformからPulumiへの移行

2023/11/28
第9回となる今回は、既にTerraformでAWS環境に作成されているリソースをPulumiへ移行するケースを想定して、CoexistenceとConversionのハンズオンを実践していきます
システム運用技術解説
第8回

既に存在するリソースをPulumiで管理してみよう

2023/10/19
第8回となる今回は、既にクラウド環境にデプロイされているリソースをPulumiで管理(import)する方法について、ハンズオンで実践していきます。

Think ITメルマガ会員登録受付中

Think ITでは、技術情報が詰まったメールマガジン「Think IT Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。

Think ITメルマガ会員のサービス内容を見る

他にもこの記事が読まれています