「Pulumi Stack」とは ー Pulumiによるマルチステージ環境の構築方法
はじめに
前回は、Pulumiのチュートリアルを通して実際にAWSリソースを作成し、Pulumiの基本的な使い方について解説しました。今回は、前回でも少し触れたPulumiのStackについて、もう少し深掘りして概要/メリットや活用方法を解説していきます。
なお、後半のハンズオンではdev環境や本番環境など、リリース段階に応じた複数の環境をPulumi Stackで実際に構築し、Stackの理解を深めていきます。
Pulumi Stackについて
Stackの概要
Stackとは、異なる環境やアプリケーションごとにインフラストラクチャをデプロイするための機能であり、Pulumi Programから生成されるインスタンスです。例えば、1つのPulumi Programから開発、ステージング、本番環境といった複数の環境ごとにStackをデプロイすることで、各環境に応じたインフラストラクチャを実際に構築できます。
または、開発、ステージングなど、Pulumi Project内で用途ごとにディレクトリを分けて、それぞれのPulumi ProgramからStackをデプロイすることも可能です。
Pulumi 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)確認】
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
連載バックナンバー
Think ITメルマガ会員登録受付中
全文検索エンジンによるおすすめ記事
- SecretもPulumiで使いこなしたい! PulumiのSecurityを試してみよう
- Policy as Codeでインフラのコンプライアンスを自動実現! 「Pulumi CrossGuard」を活用してみよう
- PulumiでAWSリソースをデプロイしよう
- 既に存在するリソースをPulumiで管理してみよう
- Pulumi Kubernetes Operatorを活用してPulumiのCI/CDを実現しよう
- TerraformからPulumiへの移行
- 「Pulumi Automation API」でPulumi CLIの機能をコード化しよう
- 「Terraform」のコードを自分で書けるようになろう
- kustomizeで復数環境のマニフェストファイルを簡単整理
- マシン・イメージを自動構築し、作業効率を高めるPacker入門