🚀

PulumiでAWS×Goのチュートリアルやった

2022/01/11に公開

Pulumi とは

Terraform などに代表される IaC(Infrastructure as Code)ツールのひとつ。
https://www.pulumi.com/

Pulumi is a modern infrastructure as code platform that allows you to use familiar programming languages and tools to build, deploy, and manage cloud infrastructure.
(訳:Pulumi は、使い慣れたプログラミング言語やツールを使って、クラウド基盤の構築、デプロイ、管理を可能にする、最新の Infrastructure as Code プラットフォームです。)

現在 TypeScript,JavaScript,Python,Go,C#に対応しているようで、例えば Terraform だと HCL(HashiCorp Configuration Language)という独自の言語で記述する必要がありましたが、Pulumi では上記の好きな言語で記述できるそうです。

自分は 1 ヶ月半くらい前にはじめて IaC,Terraform に触り、マネジメントコンソールで作成した中規模くらいの AWS リソースを複製する作業を行いました。正直 HCL の学習コストはそこまで高くなかったんですが、入力補完が少し使いづらかったりしたので、今まで通りの IDE の補完機能使えるなら便利そう!ということで試してみました。Pulumi は Terraform の Provider をラップしており、内部では Terraform が動いている、という情報もちらほら見かけるのですが、ソースが探してない見つけられなかったのでよくわかりません!!!!

準備しておくもの

  • AWS アカウント
  • s3:CreateBucket権限を付与した Pulumi 用 IAM ユーザー(とりあえずざっくり触るだけなら普段使ってる IAM ユーザーを使いまわしちゃっていいと思います)

aws configureコマンドでクレデンシャルを登録しておくか、以下のように環境変数にアクセスキーを登録しておきましょう。

$ export AWS_ACCESS_KEY_ID=<YOUR_ACCESS_KEY_ID>
$ export AWS_SECRET_ACCESS_KEY=<YOUR_SECRET_ACCESS_KEY>

インストール

https://www.pulumi.com/docs/get-started/aws/begin/

asdf にプラグインがあったので、自分は asdf でインストールしました。

  • プラグイン検索
$ asdf plugin list-all | grep pulumi
pulumi                        https://github.com/canha/asdf-pulumi.git
  • プラグインの追加
$ asdf plugin add pulumi
  • 最新版をインストール
$ asdf install pulumi latest
  • global でのバージョン設定
$ asdf global pulumi latest
  • バージョン確認
$ pulumi version
v3.21.1

使用する言語についても、別途インストールしておく必要があります!

プロジェクトの作成

次に、プロジェクトを作成していきます。

ディレクトリ名はお好きなもので、aws-go は使いたい言語によって aws-typescript とかに変更してください。

初回は Pulumi コンソールへのサインアップを求められます。トークンの入力を求められたらそのまま Enter を押すと、ブラウザでサインアップ画面が開くので、お好きな方法でサインアップしましょう。

プロジェクト名と説明文、スタック名は一旦デフォルトで、自分の場合は東京リージョンにリソースを作りたかったのでリージョンのみ ap-northeast-1 に設定しました。

$ mkdir pulumi-tutorial && cd pulumi-tutorial
$ pulumi new aws-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 <ENTER> to log in using your browser                   :
We've launched your web browser to complete the login process.

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 <ENTER>.
Press ^C at any time to quit.

project name: (pulumi-tutorial)
project description: (A minimal AWS Go Pulumi program)
Created project 'pulumi-tutorial'

Please enter your desired stack name.
To create a stack in an organization, use the format <org-name>/<stack-name> (e.g. `acmecorp/dev`).
stack name: (dev)
Created stack 'dev'

aws:region: The AWS region to deploy into: (us-east-1) ap-northeast-1
Saved config

Installing dependencies...
--- 省略 ---
Finished installing dependencies

Your new project is ready to go! ✨

To perform an initial deployment, run 'pulumi up'

すると、go.mod,go.sum,main.go の他に、Pulumi.dev.yaml,Pulumi.yaml が生成されています。

Pulumi のプロジェクトは 1 つ以上のスタックから形成されており、例えばプロジェクトが todo-app でスタックが dev,staging,production といった感じのようですね。Pulumi.yaml がプロジェクトの設定ファイル、Pulumi.dev.yaml が dev スタックの設定ファイル、といった感じです。

https://www.pulumi.com/docs/intro/concepts/

リソースの作成

そして main.go には既に S3 バケットの定義らしきものが記述されています!

main.go
package main

import (
	"github.com/pulumi/pulumi-aws/sdk/v4/go/aws/s3"
	"github.com/pulumi/pulumi/sdk/v3/go/pulumi"
)

func main() {
	pulumi.Run(func(ctx *pulumi.Context) error {
		// Create an AWS resource (S3 Bucket)
		bucket, err := s3.NewBucket(ctx, "my-bucket", nil)
		if err != nil {
			return err
		}

		// Export the name of the bucket
		ctx.Export("bucketName", bucket.ID())
		return nil
	})
}

言われるがまま pulumi up すると...

$ pulumi up
Previewing update (dev)

View Live: https://app.pulumi.com/keyamin/pulumi-tutorial/dev/previews/78f18ce4-47a2-4114-8b19-824b53a1b9a9

[resource plugin aws-4.30.0] installing
Downloading plugin: 96.35 MiB / 96.35 MiB [========================] 100.00% 13s
     Type                 Name                 Plan
 +   pulumi:pulumi:Stack  pulumi-tutorial-dev  create
 +   └─ aws:s3:Bucket     my-bucket            create

Resources:
    + 2 to create

Do you want to perform this update?  [Use arrows to move, enter to select, type to fi
Do you want to perform this update? yes
Updating (dev)

View Live: https://app.pulumi.com/keyamin/pulumi-tutorial/dev/updates/1

     Type                 Name                 Status
 +   pulumi:pulumi:Stack  pulumi-tutorial-dev  created
 +   └─ aws:s3:Bucket     my-bucket            created

Outputs:
    bucketName: "my-bucket-81deda3"

Resources:
    + 2 created

Duration: 7s

これだけで S3 バケットが作成されました!

リソースの削除

チュートリアルではここに html ファイルを配置し、同じく pulumi up で変更を反映していますが、一旦 destroy も試してみましょう。

$ pulumi destroy
Previewing destroy (dev)

View Live: https://app.pulumi.com/keyamin/pulumi-tutorial/dev/previews/fb08aabe-03f7-4ebc-b29d-f3561ed115a7

     Type                 Name                 Plan
 -   pulumi:pulumi:Stack  pulumi-tutorial-dev  delete
 -   └─ aws:s3:Bucket     my-bucket            delete

Outputs:
  - bucketName: "my-bucket-81deda3"

Resources:
    - 2 to delete

Do you want to perform this destroy?  [Use arrows to move, enter to select, t
Do you want to perform this destroy?  [Use arrows to move, enter to select, t
Do you want to perform this destroy? yes
Destroying (dev)

View Live: https://app.pulumi.com/keyamin/pulumi-tutorial/dev/updates/2

     Type                 Name                 Status
 -   pulumi:pulumi:Stack  pulumi-tutorial-dev  deleted
 -   └─ aws:s3:Bucket     my-bucket            deleted

Outputs:
  - bucketName: "my-bucket-81deda3"

Resources:
    - 2 deleted

Duration: 3s

The resources in the stack have been deleted, but the history and configuration associated with the stack are still maintained.
If you want to remove the stack completely, run 'pulumi stack rm dev'.

S3 バケットが削除されました!

この辺の使い勝手は Terraform と一緒ですね。

実行計画の確認

pulumi preview で terraform plan 相当の Dry Run ができます。

$ pulumi preview
Previewing update (dev)

View Live: https://app.pulumi.com/keyamin/pulumi-tutorial/dev/previews/53971b46-1fef-431d-850e-265a3fb91087

     Type                 Name                 Plan
 +   pulumi:pulumi:Stack  pulumi-tutorial-dev  create
 +   └─ aws:s3:Bucket     my-bucket            create

Resources:
    + 2 to create

まとめ

今回は簡単に S3 バケットの作成のみやってみましたが、VSCode 上で普段のコーディングと同じように型定義にジャンプしたりできて感動しました...

最初にアカウント登録した Pulumi コンソールもかなり見やすく、全体を通して使いたくなります!

今回は自動生成されたものをそのまま up しただけで、pulumi コマンドも今回使ったもの以外にも結構種類がありそうなので、実践しながらいろいろ覚えていければと思います。

ではーーー

GitHubで編集を提案

Discussion