fbpx

インフラ構成ツール Pulumi を試してみた #Pulumi #GCP #Go

この記事は1年以上前に投稿されました。情報が古い可能性がありますので、ご注意ください。

terraformやAnsible、AWS CloudFormationなど、クラウドリソースオーケストレーションツール(または構成管理ツール)の類似ツールとなる Pulumi について、公式ドキュメントのチュートリアルを実施してみましたので、こちらにまとめます。Pulumiのざっくりとしたarchitectureや既存クラウドリソースのPulumi管理方法については、こちらのblogでまとめていますので、よろしければご参考ください。

目次

Pulumiとは

Pulumiの概要 (参考)

Build, deploy, and manage modern cloud applications and infrastructure using familiar languages, tools, and engineering practices.
引用:Pulumi公式HPより

infrastructure as code プラットフォームのPulumiは普段開発エンジニアやインフラエンジニアが慣れ親しんでいる開発言語(Go/C#/Python/TypeScriptなど)やマークアップ言語(YAMLなど)で数多くのクラウドインフラリソースやクラウドアプリケーションをビルド/デプロイすることが可能となり、リソースの最終的なあるべき姿(冪等性)を好きな言語で表現することができます。仮にインフラリソースの管理でTerraformを利用するとなった場合はHCL(HashiCorp Configuration Language)について1から学習したり、Ansibleの場合はPlaybookなどの仕組みを理解したりと、それぞれのツールである程度の学習コストがかかるところを、Pulumiの場合は各々の開発言語が普段パッケージを扱うようにPulumiを利用できるため、学習コストが少なくて済み、かつプログラマブルな処理(ループの記載/特定インフラの関数化 etc…)が組みやすくなっています。またPulumiはGCP/AWS/Microsoft Azureなどのマルチクラウド管理や、kubernetesのdeployも対応しています。その他PulumiのGUIコンソール画面からソースコードのビルド、テスト、デプロイまでの一通りのパイプライン制御や、auditログの確認、RBAC制御やサポート(有償)などのサービスも利用可能です。 Pulumiを導入した企業の一部として、Atlassian、SANS、Skai、Mercedes-Benzなどが紹介されていて、GartnerよりPulumiが「Cool Vendor in the May 2020 Gartner Cool Vendors in Agile and DevOps」として認識されるなど、ここ数年で海外での注目度も上がっています。

Pulumiの主な構成 (参考)

Pulumiの主な構成は以下になります(公式HPより引用)

1_pulumi-concept

簡単にまとめると以下になります。

  • Program → インフラストラクチャのあるべき姿を定義したもの
  • Resource → インフラストラクチャを構成するオブジェクト(実際のインフラリソース)。オブジェクトのプロパティ(設定値)は他のオブジェクトに共有することが可能(図のInputs/Outputsの部分)
  • Project → Programのソースコードとメタデータ(どのようにProgramを動かすかの情報)を格納するディレクトリ
  • Stack → Projectディレクトリ内でProgramを「pulumi up」(Pulumi CLI) した後のインスタンス。同一のProgramから本番環境/ステージング環境など、用途に応じて複数の環境用にインスタンスを作成が可能

また、公式HPの図には記載されていませんが、Projectの上位の構成としてOrganizationを作成することもできます。Organizationは複数のProjectを1つにまとめ、Organizationに紐づいているメンバーにProjectへのアクセス権限を与えたり、Organization単位でのポリシー設定や料金管理をすることが可能です。

Pulumiの料金 (参考)

2023年1月17日現在

Pulumiはオープンソースとなり個人利用する分には料金は掛かりません。また15人までの複数人利用プラン(Teamプラン)では150kクレジットまで毎月無料で利用できます。15人を超える複数人利用や、企業単位で利用する場合には以下の有償プランが用意されています。料金やプラン内容について今後変動する可能性もあるので、実際に利用される際は公式HPをご確認ください。

Individual Team Enterprise BusinessCritical
無料 $1/2000クレジット
150Kクレジット/月まで無料
(毎月200リソース程度)
要問い合わせ 要問い合わせ
  • 全ての言語/全てのクラウドで利用可能
  • 1メンバーまで(個人利用)
  • state/secret管理
  • 無制限のデプロイ
  • Hosted deployments(プレビュー)
Individualプランに以下追加

  • 10メンバーまで
  • 無制限stack
  • 同時アップデート(5アップデート)
  • CI/CDアシスタント
  • webhooks
Teamプランに以下追加

  • 無制限メンバー/チーム
  • RBAC(Role-based access control)利用
  • SAML/SSO
  • コミット割引
  • 既存のIaC->Pulumi変換が含まれる
  • サポートサービス (12 x 5)
    Enterpriseに以下追加

  • 組織ポリシー機能
  • セルフホスティング利用
  • 自動グループおよびユーザー同期(SCIM)
  • エクスポート可能な監査ログ
  • プライベートSlackチャンネル
  • トレーニング、オンボーディング、ワークショップ
  • プロフェッショナルサービス
  • サポートサービス (24 x 7)

※ 1 クレジット → Pulumi Programに定義された 1 つのリソースを 1 時間利用した時の 1 単位

実際に触ってみた

前提

今回はローカル開発環境(macOS)を利用してGoでGCPリソース(CloudStorageBucket)のデプロイを実施したいと思います。デプロイ後はhtmlファイルのbucketへの配置もPulumiで実施して、簡易な静的Webサーバーの動作確認を行います。基本的にデプロイ手順は公式HPに記載の手順に沿って実施します。

  • macOS v11.6.4
  • go1.18.3 darwin/amd64
  • Pulumi v3.35.3

前準備 (参考)

  • PulumiをmacOSにインストール
  • brew install pulumi/tap/pulumi
    
  • GoをmacOSにインストール (参考: Go公式HP)
    • Go公式HPに記載の手順に従ってインストール実施しました
  • GCP projectの新規作成
    • GCPコンソールにログイン後、今回は新しく「pulumi-test」projectを作成しました
  • PulumiのGoogleCloudAccountアクセス設定
    • ローカル環境での開発となるのでGoogleCloudSDKをmacOSのターミナルにをあらかじめインストールしておきます
    • GCPリソースの作成はPulumiが利用するGCPのServiceAccountと、適切なIAM設定が必要になります。今回はServiceAccount(pulumi-test-sa)に、GCS Bucket作成で必要なrole(roles/storage.admin)を付与しました。
      $ gcloud iam service-accounts create pulumi-test-sa
      Created service account [pulumi-test-sa].
      $ gcloud projects add-iam-policy-binding pulumi-test --member='pulumi-test-sa@pulumi-test-364012.iam.gserviceaccount.com' --role='roles/storage.admin'
      Updated IAM policy for project [pulumi-test].
      bindings:
      〜
      - members:
      - serviceAccount:pulumi-test-sa@pulumi-test-364012.iam.gserviceaccount.com
      role: roles/storage.admin
      〜
      
    • gcloudのdefault application credentialsを設定します
      $ gcloud auth application-default login
      ---
      -> CLIに表示されたリンクをクリックしてログイン
      

手順 (参考)

Pulumi Project 新規作成

  • pulumiプロジェクト用のディレクトリを作成します。
  • $ mkdir quickstart && cd quickstart
    
  • まずはpulumiアカウント新規作成のため、「pulumi new <テンプレート名>」コマンドを実行します。「log in using your browser」で「Enter」を叩くと、Pulumiのログイン画面がブラウザで表示されます。
  • $ pulumi new gcp-go
    Manage your Pulumi stacks by logging in.
    Run `pulumi login --help` for alternative login options.
    Enter your access token from https://app.pulumi.com/account/tokens
        or hit to log in using your browser :
    

    3_pulumi-login

  • Pulumiのアカウントは今回新規に作成します。 ログイン画面下部の「Create an account」をクリックします。
  • 4_pulumi-createanaccount

  • 「Create an Account」の箇所でアカウント作成に用いるサービスを選択します。今回は「Email」を選択しました。
  • 5_pulumi-choseemail

  • アカウントの情報(Full Name/Username/Email/Password)を入力して、「Sign up」をクリックします。
  • 6_pulumi-filedinfo

  • アカウント登録が完了するとPulumiのダッシュボード画面に遷移します
  • 7_pulumi-dashboard

  • アカウント登録したメールアドレス宛にPulumiのメールアドレス承認メールが送信されます。「Verify Email」をクリックしてメールアドレスを承認します。「Verify Email」をクリックした際も同じく、Pulumiのダッシュボードに遷移されます。
  • 8_pulumi-verifyemail

  • Pulumiアカウント登録は済んだので、ここで再度「pulumi new <テンプレート名>」を実行します。先ほど実行した際のプロセスは「kill (Ctrl+C)」などで一度抜けてもらい、再度「pulumi new <テンプレート名>」実行後、「Enter」をクリックします。
  • $ pulumi new gcp-go
    
    Manage your Pulumi stacks by logging in.
    Run `pulumi login --help` for alternative login options.
    Enter your access token from https://app.pulumi.com/account/tokens
     or hit to log in using your browser
    

    ※ちなみに、pulumi newコマンドはProjectとStackをあらかじめ用意されたテンプレートから作成するコマンドになりますが、テンプレート名が分からない場合は引数を指定せず「pulumi new」コマンドを実行すると、以下のようにテンプレート一覧が表示されるので、この中から目的のテンプレートを選択することが可能です。

    $ pulumi new
    [Use arrows to move, enter to select, type to filter]
    〜〜(略)〜〜
    gcp-csharp                         A minimal Google Cloud C# Pulumi program
    gcp-fsharp                         A minimal GCP F# Pulumi program
    > gcp-go                             A minimal Google Cloud Go Pulumi program
    gcp-java                           A minimal Google Cloud Java Pulumi program
    gcp-javascript                     A minimal Google Cloud JavaScript Pulumi program
    gcp-python                         A minimal Google Cloud Python Pulumi program
    gcp-typescript                     A minimal Google Cloud TypeScript Pulumi program
    gcp-visualbasic                    A minimal GCP VB.NET Pulumi program
    gcp-yaml                           A minimal Google Cloud Pulumi YAML program
    〜〜(略)〜〜
    
  • 「Enter」をクリックすると「Welcome to Pulumi!」のメッセージがCLIに表示され、同時にブラウザでPulumiの以下「You're logged in!」が表示されます。
  • 9_pulumi-youreloggedin

  • CLI側でproject name/project説明文/stack nameの入力を促されますので、新しく設定値を入力するか、空欄のまま「Enter」をクリックしてdefault値(プロンプトかっこの箇所)を設定します。今回は全てdefault値にしました。
  • Waiting for login to complete...
    
    
    Welcome to Pulumi!
    
    Pulumi helps you create, deploy, and manage infrastructure on any cloud using
    your favorite language. You can get started today with Pulumi at:
    
    https://www.pulumi.com/docs/get-started/
    
    Tip of the day: Resources you create with Pulumi are given unique names (a randomly
    generated suffix) by default. To learn more about auto-naming or customizing resource
    names see https://www.pulumi.com/docs/intro/concepts/resources/#autonaming.
    
    
    This command will walk you through creating a new Pulumi project.
    
    Enter a value or leave blank to accept the (default), and press .
    Press ^C at any time to quit.
    
    project name: (quickstart)
    project description: (A minimal Google Cloud Go Pulumi program)
    Created project 'quickstart'
    
    Please enter your desired stack name.
    To create a stack in an organization, use the format / (e.g. `acmecorp/dev`).
    stack name: (dev)
    Created stack 'dev'
    
  • 次にインフラリソースデプロイ先のGCPのProject名を入力します。入力完了して「Enter」をクリックすると、Goのdependenciesが自動インストールされて、PulumiのProject作成が完了します。
  • gcp:project: The Google Cloud project to deploy into: pulumi-test
    Saved config
    
    Installing dependencies...
    
    go: downloading github.com/pulumi/pulumi-gcp/sdk/v6 v6.26.0
    go: downloading github.com/pulumi/pulumi/sdk/v3 v3.34.1
    go: downloading github.com/blang/semver v3.5.1+incompatible
    go: downloading golang.org/x/net v0.0.0-20201021035429-f5854403a974
    〜〜(略)〜〜
    go: downloading github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239
    go: downloading github.com/kr/text v0.2.0
    go: downloading github.com/alcortesm/tgz v0.0.0-20161220082320-9c5fe88206d7
    Finished installing dependencies
    
    Your new project is ready to go! ✨
    
    To perform an initial deployment, run 'pulumi up'
    
  • ちなみに、Pulumi Project作成が完了するとPulumiのGUI画面の「Projects」タブから、今回作成されたProjectが確認できます。今回CLIで実施したPulumi Projectsの作成や、その他Organizationの作成、Pulumiの諸々の設定などはGUI画面からも実施することが可能です。
  • 10_pulumi-createprojectwithconsole

Program 新規作成

  • 先ほど新しくPulumi Projectを作成した際に生成されたファイルは以下の通りとなります
    • Pulumi.yaml → Pulumi Projectの定義ファイル
    • Pulumi.dev.yaml → stackの設定ファイル
    • main.go → stack resourceを定義するPulumi Program
  • 「main.go」に以下コードを記載して、実際のstack resource (storage bucket)を定義します。作成したstorage bucketのbucket nameを出力させます。
  • package main
    
    import (
        "github.com/pulumi/pulumi-gcp/sdk/v6/go/gcp/storage"
        "github.com/pulumi/pulumi/sdk/v3/go/pulumi"
    )
    
    func main() {
        pulumi.Run(func(ctx *pulumi.Context) error {
            // Create a GCP resource (Storage Bucket)
        bucket, err := storage.NewBucket(ctx, "my-bucket", &storage.BucketArgs{
            Location: pulumi.String("US"),
        })
        if err != nil {
            return err
        }
    
            // Export the DNS name of the bucket
        ctx.Export("bucketName", bucket.Url)
            return nil
        })
    }
    

Stack デプロイ

  • Programの準備が整ったらStack(dev)を実際にデプロイします。
  • $ pulumi up
    
  • アップデート(Stackデプロイ)を実行するか確認のプロンプトが表示されるので、矢印を「yes」に合わせて「Enter」をクリックします。ちなみにここで「details」を選択すると、アップデート前後のdiffを確認できます。
  • Previewing update (dev)
    
    View Live: https://app.pulumi.com/CL_Kenneth/quickstart/dev/previews/bdc6be2e-****-****-****-******
    
    [resource plugin gcp-6.26.0] installing
    Downloading plugin: 40.40 MiB / 40.40 MiB [=========================] 100.00% 4s
        Type                  Name           Plan
    +   pulumi:pulumi:Stack   quickstart-dev create
    +   └─ gcp:storage:Bucket my-bucket      create
    
    Resources:
        + 2 to create
    
    Do you want to perform this update? [Use arrows to move, enter to select, type to filter]
    > yes
      no
      details
    
  • デプロイが完了すると以下のように作成されたリソースの数(Stack,Bucketの2つ)やデプロイ時間、Stackのアウトプット(今回はbucketName)が表示されます。
  • Do you want to perform this update? yes
    Updating (dev)
    
    View Live: https://app.pulumi.com/CL_Kenneth/quickstart/dev/updates/1
    
        Type                  Name           Status
    +   pulumi:pulumi:Stack   quickstart-dev created
    +   └─ gcp:storage:Bucket my-bucket      created
    
    Outputs:
    bucketName: "gs://my-bucket-198eadd"
    
    Resources:
        + 2 created
    
    Duration: 6s
    
  • 実際にGCPコンソールからもStorageBucketが作成されていることが確認できます。
  • StackアウトプットではProgramで他のStackに共有したいvalueをアウトプットとして出力できます。以下のコマンドでStackアウトプットを確認できます。
  • $ pulumi stack output bucketName
    gs://(bucket dns name)
    

    またはPulumi GUIからも確認できます。
    12_pulumi-checkedstack

Program 編集

  • Storage BucketがPulumiを用いてデプロイ出来たので、今度はhtmlファイルをPulumiでBucketに格納します。
  • Pulumi Project directory(quickstart)内で簡単なhtmlファイルを作成します。
  • cat <<EOT > index.html
    <html>
        <body>
            <h2>Hello, Pulumi!</h2>
        </body>
    </html>
    EOT
    
  • 「main.go」Programを編集して、以下 bucketObjectとbucketEndpoint resourceを追記します。BucketObjectArgsのBucket名指定では、前回に作成したbucket.Name変数を指定しています。
  • bucketObject, err := storage.NewBucketObject(ctx, "index.html", &storage.BucketObjectArgs{
        Bucket: bucket.Name,
        Source: pulumi.NewFileAsset("index.html"),
    })
    bucketEndpoint := pulumi.Sprintf("http://storage.googleapis.com/%s/%s", bucket.Name, bucketObject.Name)
    if err != nil {
        return err
    }
    

Program 変更 デプロイ

  • 「main.go」Programを編集後は、StorageBucket新規作成時と同様に「pulumi up」を実施後、「yes」を選択します。
    $ pulumi up
    ---
    Previewing update (dev)
    
    View Live: https://app.pulumi.com/CL_Kenneth/quickstart/dev/previews/a16a6685-****-****-****-******
    
        Type Name Plan
        pulumi:pulumi:Stack quickstart-dev
    +   └─ gcp:storage:BucketObject index.html create
    
    Resources:
      + 1 to create
        2 unchanged
    
    Do you want to perform this update? [Use arrows to move, enter to select, type to filter]
    > yes
      no
      details
    
    • 「pulumi up」時に「bucketEndpoint declared but not used」errorが出た場合は、一旦以下 bucketEndpoint変数をアンダースコア変数に格納します。
    • _ = bucketEndpoint
      
  • Programの変更分がデプロイ完了した際は以下のように、今回作成したobject(index.html)と 「1 created」が確認できます。
  • Do you want to perform this update? yes
    Updating (dev)
    
    View Live: https://app.pulumi.com/CL_Kenneth/quickstart/dev/updates/2
    
        Type Name Status
        pulumi:pulumi:Stack quickstart-dev
      + └─ gcp:storage:BucketObject index.html created
    
    Outputs:
        bucketName: "gs://my-bucket-198eadd"
    
    Resources:
      + 1 created
        2 unchanged
    
    Duration: 3s
    
  • object作成後はPulumiのstack output出力コマンドを用いて、以下「gsutil ls」コマンドで作成されたobjectを確認します。
  • $ gsutil ls $(pulumi stack output bucketName)
    ---
    gs://my-bucket-****/index.html-****
    
  • object作成後は、Storage bucketが静的webサーバーとして機能するようにProgramを編集します。「main.go」のbucketに「Website」propertyと、Google Cloud Storage利用時の推奨に基づき「uniform bucket-level acces: ture」をセットします。
  • bucket, err := storage.NewBucket(ctx, "my-bucket", &storage.BucketArgs{
        Location: pulumi.String("US"),
        Website: storage.BucketWebsiteArgs{
            MainPageSuffix: pulumi.String("index.html"),
        },
        UniformBucketLevelAccess: pulumi.Bool(true),
    })
    
  • 次にインターネット経由で匿名のユーザーが該当htmlファイルを閲覧できるように権限設定をProgramに追記します。
  • _, err = storage.NewBucketIAMBinding(ctx, "my-bucket-IAMBinding", &storage.BucketIAMBindingArgs{
        Bucket: bucket.Name,
        Role: pulumi.String("roles/storage.objectViewer"),
        Members: pulumi.StringArray{
            pulumi.String("allUsers"),
        },
    })
    if err != nil {
        return err
    }
    
  • またBucketObjectにHTMLとしてサーブできるようにContentType propertyを追記します。
  • bucketObject, err := storage.NewBucketObject(ctx, "index.html", &storage.BucketObjectArgs{
        Bucket: bucket.Name,
        ContentType: pulumi.String("text/html"),
        Source: pulumi.NewFileAsset("index.html"),
    })
    
  • 最後にアクセス先のエンドポイントURLをStackアウトプット設定をProgramに追記します。
  • ※一時的に「bucketEndpoint」変数にアンダースコア変数を用いている場合はこのタイミングで削除します

    ctx.Export("bucketEndpoint", bucketEndpoint)
    
  • Programの準備が整ったので、ここで「pulumi up」を実行します。「pulumi up」時のdetailは以下のようなdiffが確認できました。
  • $ pulumi up
    Previewing update (dev)
    
    View Live: https://app.pulumi.com/CL_Kenneth/quickstart/dev/previews/1bc49657-****-****-****-******
    
        Type                             Name                 Plan      Info
        pulumi:pulumi:Stack              quickstart-dev
      ~ ├─ gcp:storage:Bucket            my-bucket            update    [diff: +website~uniformBucket
      + ├─ gcp:storage:BucketIAMBinding  my-bucket-IAMBinding create
     +- └─ gcp:storage:BucketObject      index.html           replace   [diff: ~contentType]
    
    Outputs:
    + bucketEndpoint: "http://storage.googleapis.com/my-bucket-****/index.html-****"
    
    Resources:
        + 1 to create
        ~ 1 to update
        +-1 to replace
        3 changes. 1 unchanged
    

    detail (diff)

    Do you want to perform this update? details
        pulumi:pulumi:Stack: (same)
            [urn=urn:pulumi:dev::quickstart::pulumi:pulumi:Stack::quickstart-dev]
            ~ gcp:storage/bucket:Bucket: (update)
                [id=my-bucket-*****]
                [urn=urn:pulumi:dev::quickstart::gcp:storage/bucket:Bucket::my-bucket]
                ~ uniformBucketLevelAccess: false => true
                + website : {
                    + mainPageSuffix: "index.html"
                }
            + gcp:storage/bucketIAMBinding:BucketIAMBinding: (create)
                [urn=urn:pulumi:dev::quickstart::gcp:storage/bucketIAMBinding:BucketIAMBinding::my-bucket-IAMBinding]
                bucket : "my-bucket-*****"
                members : [
                    [0]: "allUsers"
                ]
                role : "roles/storage.objectViewer"
            ++gcp:storage/bucketObject:BucketObject: (create-replacement)
                [id=my-bucket-****-index.html-****]
                [urn=urn:pulumi:dev::quickstart::gcp:storage/bucketObject:BucketObject::index.html]
              ~ contentType: "text/html; charset=utf-8" => "text/html"
            +-gcp:storage/bucketObject:BucketObject: (replace)
                [id=my-bucket-****-index.html-****]
                [urn=urn:pulumi:dev::quickstart::gcp:storage/bucketObject:BucketObject::index.html]
              ~ contentType: "text/html; charset=utf-8" => "text/html"
            --outputs:--
            + bucketEndpoint: "http://storage.googleapis.com/my-bucket-*****/index.html-*****"
            --gcp:storage/bucketObject:BucketObject: (delete-replaced)
                [id=my-bucket-****-index.html-****]
                [urn=urn:pulumi:dev::quickstart::gcp:storage/bucketObject:BucketObject::index.html]
    
  • デプロイ後は、Pulumi stack outputコマンドを用いてhtmlファイルが取得できるか確認します。Pulumi動作検証はこれにて完了です。
  • $ curl $(pulumi stack output bucketEndpoint)
    ---
    cat <<EOT > index.html
    <html>
        <body>
            <h2>Hello, Pulumi!</h2>
        </body>
    </html>
    EOT
    

Stack resource 削除

  • 今回の検証で作成したStackのresourceを削除します。削除前に、bucketObjectを含んだままのbucketをそのまま削除出来るように、事前に「ForceDestroy: pulumi.Bool(true)」をProgramに追記して、「pulumi up」で一度更新します。
  • bucket, err := storage.NewBucket(ctx, "my-bucket", &storage.BucketArgs{
        Location: pulumi.String("US"),
        Website: storage.BucketWebsiteArgs{
            MainPageSuffix: pulumi.String("index.html"),
        },
        UniformBucketLevelAccess: pulumi.Bool(true),
        ForceDestroy:             pulumi.Bool(true),
    })
    
    $ pulumi up
    Previewing update (dev)
    
    View Live: https://app.pulumi.com/CL_Kenneth/quickstart2/dev/previews/********-****-****-****-***********
    
         Type                   Name             Plan       Info
         pulumi:pulumi:Stack    quickstart2-dev             
     ~   └─ gcp:storage:Bucket  my-bucket        update     [diff: ~forceDestroy]
     
    Resources:
        ~ 1 to update
        3 unchanged
    
    Do you want to perform this update?  [Use arrows to move, enter to select, type to filter]
    > yes
      no
      details
    
  • Stack resource 削除時は以下コマンドを実行します。
  • $ pulumi destroy
    ---
    Previewing destroy (dev)
    
    View Live: https://app.pulumi.com/CL_Kenneth/quickstart/dev/previews/********-****-****-****-***********
    
        Type                            Name                 Plan
    -   pulumi:pulumi:Stack             quickstart-dev       delete
    -   ├─ gcp:storage:BucketIAMBinding my-bucket-IAMBinding delete
    -   ├─ gcp:storage:BucketObject     index.html           delete
    -   └─ gcp:storage:Bucket           my-bucket            delete
    
    Outputs:
    - bucketEndpoint: "http://storage.googleapis.com/my-bucket-198eadd/index.html-******"
    - bucketName : "gs://my-bucket-198eadd"
    
    Resources:
        - 4 to delete
    

Stack 削除

  • Stack自体に今までのstate情報(現在のresourceの状態や、どのresourceがどの時点で作成/削除されたかなどの履歴)が含まれているので、Stack自体を削除するとそれらのstate情報も削除されます。
  • 削除前に現在のStackリストを表示。
  • $ pulumi stack ls
    NAME    LAST UPDATE   RESOURCE  COUNT  URL
    dev*    21 hours ago  3                https://app.pulumi.com/CL_Kenneth/quickstart/dev
    
  • stack自体を削除するコマンド実行。確認のため、削除するstack名をタイピングする必要あります。
  • $ pulumi stack rm dev
    This will permanently remove the 'dev' stack!
    Please confirm that this is what you'd like to do by typing ("dev"): dev
    Stack 'dev' has been removed!
    
  • 再度Stackリストを表示して、Stackが削除されていることを確認。
  • $ pulumi stack ls
    NAME    LAST UPDATE   RESOURCE  COUNT  URL
    

まとめ

普段慣れ親しんだ言語でインフラリソースを管理できるのはとても便利だと思いました。本blogでは触れていないPulumiのその他の機能で、CI/CDのインテグレーション監査ログ機能などの便利な機能や、PulumiのGUIについて今後も深掘りしてみたいと思います。

新規CTA