IaC (Infrastructure as Code)とは、ネットワーク、サーバ、データベースなどのインフラリソースをコードによって管理しプロビジョニングできることを言います。 クラウドを利用している場合、マネジメントコンソールからボタンポチポチでリソースを作成・更新・削除できます。手動で操作する場合、手順書を用意し手順書に沿ってマネジメントコンソールを操作すると思いますが、手順書を確認していてもオペミスによって意図せずリソースを更新・削除してしまう可能性やマネジメントコンソールは定期的にアップデートされるため、手順書が古くなってしまい意味を成さなくなってくる時もあると思います。
Credentials saved to file: [/home/xxxxxxxxx/.config/gcloud/application_default_credentials.json]
These credentials will be used by any library that requests Application Default Credentials (ADC).
環境変数を介して GCPのデフォルトプロジェクトを設定します。
export GOOGLE_PROJECT=xxxxxxxx
Pulumiプロジェクトの作成
Pulumiを利用するためPulumiプロジェクトを作成します。
$ mkdir pulumi && cd 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 <ENTER> to login using your browser :
上記のURLへアクセスするとPulumiのSign In画面へ遷移します。 まだ、アカウントを作成していないのでCreate an accoutをクリックします。
アカウントを作成するため、今回はE-Mailを利用してアカウントを作成しようと思います。
Username
Email
Password
を入力しCreate Accountをクリックします。
Personal access tokensの作成を求められるので、Create Tokenをクリックします。
descriptionに任意の値を入力します。
アクセストークンが生成されるので、メモしておきます。
先ほどのCLI画面に戻り、生成したアクセストークンを入力します。 するとWelcome to 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 <ENTER> to login using your browser : xxxxxxxxxx
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: 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.
Pulumiのプロジェクト名とプロジェクトの説明を求められるので、任意の値を入力していきます。
project name: (pulum) gcp-test project description: (A minimal Google Cloud Go Pulumi program) gcp-test Created project 'gcp-test'
次に、スタック名を尋ねられます。devと入力します。
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) dev Created stack 'dev'
最後に、Google Cloud プロジェクトの場合、Google Cloud プロジェクトを選択するよう求められます。Google Cloud プロジェクト ID を入力します。
gcp:project: The Google Cloud project to deploy into: xxxxxxxx Saved config
funcmain() { 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"), // Settings for publishing content to the Internet Website: storage.BucketWebsiteArgs{ MainPageSuffix: pulumi.String("index.html"), }, UniformBucketLevelAccess: pulumi.Bool(true), }) if err != nil { return err }
// Add index.html Object bucketObject, err := storage.NewBucketObject(ctx, "index.html", &storage.BucketObjectArgs{ Bucket: bucket.Name, ContentType: pulumi.String("text/html"), // Settings for publishing content to the Internet Source: pulumi.NewFileAsset("index.html"), }) if err != nil { return err }
// Settings for publishing content to the Internet _, 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 }
// Export the DNS name of the bucket ctx.Export("bucketName", bucket.Url) ctx.Export("ObjectName", bucketObject.Name)
// Settings for publishing content to the Internet bucketEndpoint := pulumi.Sprintf("http://storage.googleapis.com/%s/%s", bucket.Name, bucketObject.Name) ctx.Export("bucketEndpoint", bucketEndpoint)
returnnil }) }
main.goの設定が完了しましたので、pulumi upを実行しyesを選択しデプロイします。
$ pulumi up Previewing update (dev)
View in Browser (Ctrl+O): https://app.pulumi.com/xxxxxxx/gcp-test/dev/previews/xxxxxxxxxxxxxx
Type Name Plan Info pulumi:pulumi:Stack gcp-test-dev ~ ├─ gcp:storage:Bucket my-bucket update [diff: +website~uniformBucketLevelAccess] + ├─ gcp:storage:BucketIAMBinding my-bucket-IAMBinding create +- └─ gcp:storage:BucketObject index.html replace [diff: ~contentType]
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`.
$ pulumi stack rm 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!
Create GCP Resource. ・VPC and The CIDR of the subnet is 192.168.0.0/24 and the region uses us-central1. ・Create a firewall that allows ssh with iap using the iap-ssh tag. ・Build a GCE using ubuntu 20.04 using the FIrewall you just created. ・Export of InstanceName
View in Browser (Ctrl+O): https://app.pulumi.com/xxxxxxxxxx/gcp-test/dev/previews/xxxxxxxxxx
Type Name Plan Info pulumi:pulumi:Stack gcp-test-dev 1 error; 5 messages
Diagnostics: pulumi:pulumi:Stack (gcp-test-dev): # gcp-test ./main.go:27:9: firewall declared and not used ./main.go:29:21: cannot use pulumi.StringArray{…} (value of type pulumi.StringArray) as compute.FirewallAllowArrayInput value in struct literal: pulumi.StringArray does not implement compute.FirewallAllowArrayInput (missing method ToFirewallAllowArrayOutput) ./main.go:48:21: unknown field ImageFamily in struct literal of type compute.InstanceBootDiskInitializeParamsArgs ./main.go:49:21: unknown field ImageProject in struct literal of type compute.InstanceBootDiskInitializeParamsArgs
error: error in compiling Go: unable to run `go build`: exit status 1
View in Browser (Ctrl+O): https://app.pulumi.com/xxxxxxxxxxxxx/gcp-test/dev/previews/xxxxxxxxxxxxx
Type Name Plan + pulumi:pulumi:Stack gcp-test-dev create + ├─ gcp:compute:Network my-vpc create + ├─ gcp:compute:Subnetwork my-subnet create + ├─ gcp:compute:Firewall allow-ssh-with-iap create + └─ gcp:compute:Instance my-instance create
Outputs: InstanceName: "my-instance-1e6164c"
Resources: + 5 to create
Do you want to perform this update? [Use arrows to move, type to filter] > yes no details
下記のように、成功しました。
Do you want to perform this update? yes Updating (dev)
View in Browser (Ctrl+O): https://app.pulumi.com/xxxxxxxxxxxxx/gcp-test/dev/updates/12
Type Name Status + pulumi:pulumi:Stack gcp-test-dev created (76s) + ├─ gcp:compute:Network my-vpc created (43s) + ├─ gcp:compute:Subnetwork my-subnet created (14s) + ├─ gcp:compute:Firewall allow-ssh-with-iap created (12s) + └─ gcp:compute:Instance my-instance created (17s)
Outputs: InstanceName: "my-instance-a5cb493"
Resources: + 5 created
Duration: 1m19s
Google Cloudのマネジメントコンソールから「VMインスタンス」に作成されたVMインスタンスの「SSHボタン」をクリックします。