はじめに
前回は、Pulumi CrossGuardを利用したポリシーの自動適用について解説しました。今回は、今まで利用していたPulumi CLIの機能をプログラマティックに利用可能な「Pulumi Automation API」について解説します。後半のハンズオンでは、実際に「Pulumi Automation API」を利用して、Pulumi CLIを利用せずにStackをデプロイする様子を確認していきます。
「Pulumi Automation API」について
Pulumi Automation APIとは?
前回までの記事では、Stackの作成(pulumi stack init)やProgramのデプロイ(pulumi up)などの実行はPulumi CLIを利用していましたが、これらのPulumi CLIの機能をカプセル化して、APIとしてプログラムで利用できるようにしたのが「Pulumi Automation API」です。Automation APIは複数の開発言語を用いた実装が可能で、2023年7月現在では、TypeScript/JavaScript/Python/.NET/GOがStableとして利用できます。
【Pulumi CLI】
01 | stack = auto.create_stack( |
02 | stack_name=stack_name, |
03 | project_name=project_name, |
04 | program=pulumi_program |
08 | stack.up(on_output=print) |
11 | stack.destroy(on_output=print) |
【Automation API (Python)】
一般的にPulumiやTerraformを代表とするInfrastructure as Codeでは、インフラストラクチャのコード化により、インフラのデプロイ迅速化や再現性の確保、DevOpsツールとのコラボレーションが容易となり、数多くのメリットをもたらしてきました。しかし、IaCが進んでもなお、インフラデプロイ時のIaCツールの手動CLI実行(pulumi upなど)や、事前にCI/CDシステムにCLIのコマンドを埋め込むなど、一度人の手を介する必要があるため、インフラストラクチャのスケールがしづらい背景がありました。
Automation APIを利用すると人の手を介したCLI実行の部分をコード化でき、スケールも容易になるため、「エンドユーザー独自のインフラ環境を整備させる」ような Software-as-a-Service のクラス作成(インフラの抽象化)も可能となります。
公式より引用:従来のインフラデプロイとAutomation APIによるデプロイ
Software-as-a-Serviceクラス作成の他にも、Database移行やBlue/Greenデプロイなどの複雑なワークフローの制御、「5日以上使用されていないPulumi Stackの自動削除ツール」のようなOpsツールの作成など、複数のAutomation APIの利用シナリオが挙げられます。公式Blogでもその具体的なシナリオについて解説していますので、ぜひ参考にしてください。
Automation APIはgRPCインターフェースを利用してPulumiエンジンと通信し、Programを実行しています。最終的にPulumiエンジンで自動的にPulumi CLIを実行するため、Automation APIを利用する場合でも、一度、Programを実行する環境にPulumi CLIをインストールする必要があるので、その点ご注意ください。
Pulumi Automation APIのユースケース
「主にPulumi Stackの作成/更新/削除をコード化する」のがAutomation APIですが、その利用について、以下のようなユースケースが挙げられます。
●Inline Program
Pulumi Programの中にAutomation APIのコードを埋め込む方法です。具体的には、ProgramをPythonで作成する場合、1つの「__main__.py」(Programファイル)に、インフラリソースの定義とStackの作成や更新などのAutomation APIのコードを記述するイメージとなります。テストなど、ひとまずAutomation APIを利用してProgramをデプロイしたい場合に使われます。
04 | from pulumi import automation as auto |
05 | from pulumi_aws import s3 |
09 | site_bucket = s3.Bucket("my-bucket", website=s3.BucketWebsiteArgs(index_document="index.html")) |
12 | <head><title>Hello S3</title><meta charset="UTF-8"></head> |
21 | stack = auto.create_or_select_stack(stack_name=stack_name, |
22 | project_name=project_name, |
23 | program=pulumi_program) |
【Inline Program (Python)】
●Local Program
Pulumi Programのリソースの定義とAutomation APIのコードの記述で、それぞれファイル/ディレクトリを分ける方法です。ある程度Programの規模が大きくなった場合などにLocal Programの構成を考慮します。
03 | ├── automation ← Automation API コード |
06 | └── program ← インフラリソースの定義 |
【Local Program ディレクトリ構成】
●Cross-Language Program (within Local Program)
Local Programの構成ですが、ProgramのコードとAutomation APIのコードをそれぞれ別の開発言語で記述することもできます。シナリオとしては「Pythonで作成されたProgramが既にいくつか存在するが、新たにAutomation APIのコードをGoで記述したい」場合などが挙げられます。
03 | ├── automation ← Automation API コード(python) |
06 | └── program ← インフラリソースの定義(Go) |
【Cross-Language Program (Program:Go, AutomationAPI:Python)】
他にも、公式HPでは様々なユースケースが紹介されていますので、ぜひ参考にしてください。
【ハンズオン】Pulumi Automation API を利用した
Programのデプロイ(Pulumi Over HTTP)
ハンズオンの流れ
今回のハンズオンの流れと関連するサービス/リソースの全体像は以下のとおりです。今回のハンズオンでは、PythonのWebアプリケーションフレームワークであるFlaskを利用して、簡易的なWebサーバーを作成します。Webサーバーでは、ユーザーからのHTTPリクエストに対応して、PulumiのAutomation APIでS3 Bucket/Bucket Object/Bucket Policyなどを自動作成できるようにします。
ハンズオン実施前には「事前準備」を行います(後述)。基本的にはPulumi公式HP記載の手順に沿う形ですが、コードは少し修正しています。Pulumi ProgramおよびAutomation APIのコードはPythonで作成して、AWSリソースをデプロイしていきます。作業は主にMacOSのターミナルを利用します。
- Pulumi ProgramとAutomation APIコードを編集する
- Pythonの仮想環境をセットアップする
- 動作確認する
また、ハンズオン実施時の最終的なディレクトリ構成は以下のようになります。
前提
- ハンズオンを実施する上で必要なAWSのアクセス権限を有する
- PCにPythonを導入済み(version 3.7以上)
事前準備
Pulumiを利用したAWSリソースデプロイのハンズオンを実施するには、事前に以下の作業が実施済みである必要があります。第2回で事前準備の手順を紹介していますので、まだ実施されていない方はそちらをご確認ください。
- Pulumi CLIのインストール
- Pulumiアカウント新規作成
- AWSアカウントへのPulumiアクセス設定