「Pulumi Automation API」でPulumi CLIの機能をコード化しよう

2023年8月8日(火)
大関 研丞 (Kenneth Ozeki)
第6回となる今回は、Automation APIの概要を解説し、実際にAutomation APIを使ったRESTful APIの静的Webサーバーを構築するハンズオンを実践していきます。

はじめに

前回は、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 stack init
→Stack新規作成

$ pulumi up
→Stackデプロイ

$ pulumi destroy
→Stackリソース削除
【Pulumi CLI】
stack = auto.create_stack(
  stack_name=stack_name,
  project_name=project_name,
  program=pulumi_program
)
→Stack新規作成

stack.up(on_output=print)
→Stackデプロイ

stack.destroy(on_output=print)
→Stackリソース削除
【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をデプロイしたい場合に使われます。

import sys
import json
import pulumi
from pulumi import automation as auto
from pulumi_aws import s3

# インフラリソースの定義
def pulumi_program():
    site_bucket = s3.Bucket("my-bucket", website=s3.BucketWebsiteArgs(index_document="index.html"))
    index_content = """
  <html>
        <head><title>Hello S3</title><meta charset="UTF-8"></head>
        <body>
            <p>Hello, world!</p>
        </body>
    </html>
    """
~~(略)~~

# Automation APIコード
stack = auto.create_or_select_stack(stack_name=stack_name,
                                    project_name=project_name,
                                    program=pulumi_program)
【Inline Program (Python)】

●Local Program
Pulumi Programのリソースの定義とAutomation APIのコードの記述で、それぞれファイル/ディレクトリを分ける方法です。ある程度Programの規模が大きくなった場合などにLocal Programの構成を考慮します。

local_program
├── README.md
├── automation ← Automation API コード
│   ├── main.py
│   └── requirements.txt
└── program ← インフラリソースの定義
    ├── Pulumi.yaml
    ├── README.md
    ├── __main__.py
    └── requirements.txt
【Local Program ディレクトリ構成】

●Cross-Language Program (within Local Program)
Local Programの構成ですが、ProgramのコードとAutomation APIのコードをそれぞれ別の開発言語で記述することもできます。シナリオとしては「Pythonで作成されたProgramが既にいくつか存在するが、新たにAutomation APIのコードをGoで記述したい」場合などが挙げられます。

cross_language
├── README.md
├── automation ← Automation API コード(python)
│   ├── main.py
│   └── requirements.txt
└── program ← インフラリソースの定義(Go)
     ├── Dockerfile
     ├── go.mod
     ├── go.sum
     └── main.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のターミナルを利用します。

  1. Pulumi ProgramとAutomation APIコードを編集する
  2. Pythonの仮想環境をセットアップする
  3. 動作確認する

また、ハンズオン実施時の最終的なディレクトリ構成は以下のようになります。

pulumi_over_http
├── app.py
├── requirements.txt
└── venv

前提

  • ハンズオンを実施する上で必要なAWSのアクセス権限を有する
  • PCにPythonを導入済み(version 3.7以上)

事前準備

Pulumiを利用したAWSリソースデプロイのハンズオンを実施するには、事前に以下の作業が実施済みである必要があります。第2回で事前準備の手順を紹介していますので、まだ実施されていない方はそちらをご確認ください。

  • Pulumi CLIのインストール
  • Pulumiアカウント新規作成
  • AWSアカウントへのPulumiアクセス設定
著者
大関 研丞 (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メルマガ会員のサービス内容を見る

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