PulumiでAWS×Goのチュートリアルやった
Pulumi とは
Terraform などに代表される IaC(Infrastructure as Code)ツールのひとつ。
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>
インストール
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 スタックの設定ファイル、といった感じです。
リソースの作成
そして main.go には既に S3 バケットの定義らしきものが記述されています!
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 コマンドも今回使ったもの以外にも結構種類がありそうなので、実践しながらいろいろ覚えていければと思います。
ではーーー
Discussion