Infrastructure as Codeのホープ、Pulumiを試す

記事タイトルとURLをコピーする

AWSにおけるInfrastructure as Codeツールと聞いて皆さんは何を思い浮かべるでしょうか?
多くの方はCloudFormationもしくはTerraformあたりを想像するのではないかと思います。

しかし!実は昨年、Pulumiという第三の選択肢がリリースされていました。
このツール、ずっと気になってはいたのですが、GW中にようやく試すことができたのでご紹介します。
何かがきっかけで人気急騰するポテンシャルを秘めたツールだと個人的には思っています。

ツールの概要

Pulumiの特筆すべきところは何と言っても
プログラミング言語で展開リソースの定義を実施できる
ことです。

CloudFormationもTerraformも、実態としてはInfrastructure as Yaml(or JSON)だったわけですが
このツールは正真正銘のInfrastructure as Codeであると言えます。
現在正式に利用ドキュメントが展開されている言語はNode.jsとPythonの2種です。

具体的にどう定義を実施するかというと、展開したい各AWSリソースをインスタンスとしてプログラムファイル内に定義・羅列していくこととなります。
以下はPythonでVPC1つとSubnet1つを定義した例です。このような内容が記されたプログラムファイルをpulumi独自のCLIコマンドで
読み込ませることでリソースを展開することができます。

import pulumi
from pulumi_aws import ec2

vpc = ec2.Vpc('vpc-sample',
    cidr_block='10.0.0.0/16',
    enable_dns_hostnames=True,
    enable_dns_support=True,
    tags={
        'Name': 'vpc-sample',
        'Owner': 'Serverworks'
    }
)

subnet_a = ec2.Subnet('subnet-sample-a',
    availability_zone='ap-northeast-1a',
    cidr_block='10.0.0.0/24',
    vpc_id=vpc.id,
    tags={
        'Name': 'subnet-sample-a',
        'Owner': 'Serverworks'
    }
)
リソースの定義方法についての若干の補足

リソースの定義について上記の例を用いて若干補足しておきましょう。
各インススタンスの第一引数にリソースの固有名称を記した後、
第二引数以降に各AWSリソースに設定するパラメータを記していく形となります。
リソース間の値参照については、Ref・GetAtt関数のような小難しいものを使わずに
上記例の17行目のように{インスタンス}.{属性値}で直感的に参照できるのが地味に嬉しいですね。

Pulumiを用いて生成できるAWSリソース・設定できるパラメータは以下に記述されています。

追々もっと勉強して正確な差異を把握したいと思いますが、数時間触った限りの印象としては
Terraformのカバー範囲はPulumiのカバー範囲に限りなく近しい(ひょっとしたら同じ?)のように見受けられました。

CloudFormationでカバーしていて、Pulumi・Terraformでカバーできていないリソースというのも当然ながら存在するのですが
以下のような書き方(CloudFormationのStackをPulumi内で定義して更にそのStack内で未対応リソースの定義を書く。Terraformでも使える技ですね)で
実質的には対応できることも確認しました。

import pulumi
from pulumi_aws import cloudformation

ws_cfn_stack = cloudformation.Stack('sample-workspaces-stack',
    name='sample-workspaces',
    template_body="""
        Description: Create WorkSpaces for Pulumi Blog
        Resources:
            ServerworksWorkSpaces:
                Type: "AWS::WorkSpaces::Workspace"
                Properties:
                    BundleId: wsb-xxxxxxxxx
                    DirectoryId: d-xxxxxxxxxx
                    RootVolumeEncryptionEnabled: False
                    Tags:
                        - Key: Name
                          Value: serverworks-workspaces
                        - Key: Owner
                          Value: serverworks
                    UserName: tasai
                    WorkspaceProperties:
                        RunningMode: AUTO_STOP
                        RunningModeAutoStopTimeoutInMinutes: 60
"""
)

また、詳細な紹介は他日に譲りますが、依存関係の定義や削除保護・外部ファイルの参照等
今までの既存ツールで提供していた機能の多くはPulumiでも実現することができます。

導入〜リソース作成までの一連の流れ

次に、せっかくですのでPulumiの導入からリソース作成までの具体的な流れを紹介しようと思います。

Pulumiアカウントのサインアップ・セットアップ

Pulumiの公式サイトにアクセスします。

任意のサインアップ手段を選択します。

上記はメールでのサインアップの場合に表示される画面です。

サインアップ・ログインしたのちの画面で表示される[NEW PROJECT]を押下します。

cloudは[AWS]を、laungageについては任意のプログラミング言語(今回はPythonを前提とした手順とします)を選択して、[NEXT]を押下します。

上記の項目をそれぞれ任意で作成して[CREATE PROJECT]を押下します。

Pulumiトークンの発行

セットアップ作業完了後に上記のような画面に遷移するはずですので、ここから赤枠のユーザー名箇所をクリックする等してユーザのホーム画面に移動します
https://app.pulumi.com/{ユーザー名}でホーム画面に移動できます)

ホーム画面の[SETTINGS]を、次いで左メニューの[Access Tokens]を、さらに[NEW ACCESS TOKEN]を押下します。

Tokenの概要・用途として適切な説明書きを入力した後に[CREATE]を押下します。

上記の赤枠の部分にTokenが表示されますのでコピーして控えておきます。

Pulumiミドルウェアのインストール

pulumi用のファイルをダウンロード&展開したのちに、適切なPATHを追加してpulumiコマンドを利用可能な状態とします。
公式の導入案内も併せてご確認ください。
本手順以降の手順はLinux環境(Local PCでAmazon Linux2をDockerで起動させた環境)での手順となります。

実行環境側でのPulumiプロジェクトの設定

export PULUMI_ACCESS_TOKEN={手順「Pulumiトークンの発行」にて発行したトークン}にて環境変数としてトークンを設定しておきます。
その後に上記のようにpulumi newコマンドにて先ほど作成したスタックを指定して指定のディレクトリにpulumiのプロジェクトを展開します。

また、上記で表示されている1~4の手順について、2~3の実施(virtualenvの設定)は任意ですが
4については実施します(python用プロジェクトではpulumi newコマンド実施時にrequirements.txtが生成されますがそこに記載されているミドルウェアをインストールする必要があります)。
なお、PulumiによるAWSリソース作成を実行するにはPython3が必要となることに留意してください。

【参考】事前にTokenを環境変数として設定しなかった場合

Token用環境変数を設定しない状況下で、pulumi newコマンドを入力すると上記のように表示されます。
この状況下でEnterを押すと、Pulumiの実行環境にてブラウザが展開されてPulumiサイトにアクセスしてTokenを自動取得できます。
今回の手順では便宜上ブラウザでの手動Token取得をご案内しましたが、ご自身のPC端末へのPulumi導入に関してはCLIベースで行ってしまった方が楽かもしれません。

Pulumiの実行

pulumiのプロジェクトを展開したディレクトリにて、main.pyというpythonファイルが保存されていますので
そのファイルを編集してAWS上に展開したいリソースを定義します(今回は冒頭でご紹介した1VPC・1サブネットを展開する
ごく簡単な定義内容をそのまま用います)

その後、pulumi upコマンドを実行します。すると、生成されるリソースについて上記のように照会されますので
問題がなければyesにカーソルを合わせてEnterを押下します。

その後、リソース作成が完了すると上記のように表示されます。

無事、リソースが作成されていることがわかります。
リソースを削除したい場合はpulumi destroyコマンドを実行すればOKです。

また、Pulumiの管理コンソールを見てみますと、上記のように実行履歴を確認できる他

現在Pulumiによって展開されているリソースがあれば、その一覧を確認することもできます。
サービスカテゴリごとにソートも行えるようです。今回はごくごく少量のリソース作成ですが、大量のリソース管理時には便利そうです。
このようにPulumi管理コンソールの使い勝手もなかなか悪くなさそうです。

最後に

新たなInfrastructure as Codeツール候補であるPulumiの概要を紹介しました。
いかにも便利で楽しげなツールなので隙をみてゴリゴリ試して続報を書けるといいなと思います。