Slide 1

Slide 1 text

Terraformerͷ͓͸ͳ͠ Terraform meetup tokyo#2 LT @int_tt

Slide 2

Slide 2 text

໨࣍ ! Terraformerʹ͍ͭͯ ! ΞʔΩςΫνϟ঺հ ! ػೳ௥Ճͷ࢓ํ ! ௐ΂ͯΈͯ ! ࢀߟࢿྉ

Slide 3

Slide 3 text

terraformer ࢖ͬͨ͜ͱ͋Δਓʙ

Slide 4

Slide 4 text

Terraformerͱ͸ ! https://github.com/GoogleCloudPlatform/terraformer ! WazeࣾͷSREνʔϜʹΑͬͯ࡞੒ ! ରԠ͍ͯ͠ΔSaaS,IaaSͷطଘ৘ใΛݩʹtfstateͱtfϑΝΠϧΛ࡞੒ ! ϦιʔεΛࢦఆ͢ΔͱҰׅͰશ෦(!) ɹɹɹɹɹɹɹɹɹ ͖࣋ͬͯͯ͘ΕΔ ! aws,gcp,datadog౳ͨ͘͞Μͷproviderɹɹɹɹɹɹɹɹɹɹɹɹɹɹɹɹɹɹɹɹ ʹରԠ

Slide 5

Slide 5 text

͍ܰ࢖͍ํ terraformer import google --resources=logging --projects=playground 2019/10/02 17:41:09 google importing project playground-226302 region global 2019/10/02 17:41:10 google importing... logging 2019/10/02 17:41:10 [TRACE] GRPCProvider: GetSchema 2019/10/02 17:41:10 [TRACE] GRPCProvider: Configure 2019/10/02 17:41:10 [TRACE] GRPCProvider: GetSchema 2019/10/02 17:41:11 [TRACE] GRPCProvider: GetSchema 2019/10/02 17:41:11 [TRACE] GRPCProvider: Configure 2019/10/02 17:41:11 Refreshing state... google_logging_metric.hog 2019/10/02 17:41:11 [TRACE] GRPCProvider: GetSchema 2019/10/02 17:41:11 Refreshing state... google_logging_metric.fuga 2019/10/02 17:41:11 [TRACE] GRPCProvider: GetSchema 2019/10/02 17:41:11 [TRACE] GRPCProvider: ReadResource 2019/10/02 17:41:11 [TRACE] GRPCProvider: ReadResource 2019/10/02 17:41:12 google Connecting.... 2019/10/02 17:41:12 google save logging 2019/10/02 17:41:12 [DEBUG] New state was assigned lineage "7bfb14fa-5e9e-4fb8-456d-1feab006acdd" 2019/10/02 17:41:12 google save tfstate for logging . ├── generated │ └── google │ └── playground-226302 │ └── logging │ └── global │ ├── logging_metric.tf │ ├── outputs.tf │ ├── provider.tf │ └── terraform.tfstate └── provider.tf

Slide 6

Slide 6 text

resource "google_logging_metric" "fuga" { bucket_options { exponential_buckets { growth_factor = "2" num_finite_buckets = "64" scale = "0.01" } } description = "fuga" filter = "resource.type=\"k8s_cluster\"\nresource.labels.location=\"us-central1-a\"\nresource.labels.cluster_name=\"standard-cluster-1\"\n" label_extractors = {} metric_descriptor { metric_kind = "DELTA" value_type = "DISTRIBUTION" } name = "fuga" project = "playground-226302" value_extractor = "EXTRACT(protoPayload.@type)" } resource "google_logging_metric" "hoge" { description = "hoge" filter = "resource.type=\"k8s_cluster\"\nresource.labels.location=\"us-central1-a\"\nresource.labels.cluster_name=\"standard-cluster-1\"\n" label_extractors = {} metric_descriptor { metric_kind = "DELTA" unit = "1" value_type = "INT64" } name = "hog" project = "playground-226302" }

Slide 7

Slide 7 text

ΞʔΩςΫνϟ঺հ terraformer import google --resources=logging --projects=playground Terraformer લॲཧ providerͱͷ௨৴ औಘ݁Ռͷparse

Slide 8

Slide 8 text

ΞʔΩςΫνϟ঺հ terraformer import google --resources=logging --projects=playground Terraformer લॲཧ providerͱͷ௨৴ औಘ݁Ռͷparse •ίϚϯυͷparse • provider͝ͱͷॳظઃఆ • ରԠͯ͠ΔϦιʔε͔ʙ • ରԠ͍ͯ͠Ε͹ͦͷϦιʔεͷҰཡΛऔಘ͠ɺIDͱϦιʔ ε໊Ληοτ͢Δ • providerͱͷ௨৴४උ ىಈ͔Β
 https://github.com/GoogleCloudPlatform/terraformer/blob/0.8.1/cmd/import.go ͷfunc Importͷલ൒ลΓ

Slide 9

Slide 9 text

ΞʔΩςΫνϟ঺հ terraformer import google --resources=logging --projects=playground Terraformer લॲཧ providerͱͷ௨৴ औಘ݁Ռͷparse provider-google •ࢦఆͨ͠ϦιʔεͷRefresh(Read) Λୟ͍ͯ݁ՌΛड͚औΔ • rpc͔grpcͰ௨৴ https://github.com/GoogleCloudPlatform/terraformer/blob/0.8.1/cmd/import.go ͷfunc Importͷޙ൒ ֤छproviderͷresourcesลΓ

Slide 10

Slide 10 text

ΞʔΩςΫνϟ঺հ terraformer import google --resources=logging --projects=playground Terraformer લॲཧ providerͱͷ௨৴ औಘ݁Ռͷparse •↑Ͱಘͨ݁ՌΛࣗྗͰparseͯ͠ tf,tfstateϑΝΠϧΛग़ྗ͢Δ https://github.com/GoogleCloudPlatform/terraformer/blob/0.8.1/cmd/import.go ͷfunc ImportFromPlanลΓ

Slide 11

Slide 11 text

ػೳ௥Ճͷ࢓ํ ! ಺༰͸GCPͷlogging_metrics resouce΁ͷରԠ ! PR(https://github.com/GoogleCloudPlatform/terraformer/pull/173)Λૹͬͨͱ ͖ʹ΍ͬͨ͜ͱ ! ଞαϯϓϧΛݩʹϦιʔεҰཡͷऔಘΛͯ͠໰͍߹Θͤ෦෼Λ૊Έཱͯ Δ(providers/gcp/logging.go) ! ࣮ߦ࣌Ҿ਺ͱϝιουͷରԠ෇͚(providers/gcp/gcp_provider.go) ! READMEΛॻ͘(README.md) ! ΞʔΩςΫνϟͰݴ͏લॲཧͷ෦෼͚ͩʂʂʂ

Slide 12

Slide 12 text

func (g *LoggingGenerator) loadLoggingMetrics(ctx context.Context, client *logadmin.Client) error { metricIterator:= client.Metrics(ctx) for{ metric, err := metricIterator.Next() if err == iterator.Done { break } if err != nil { return err } g.Resources = append(g.Resources, terraform_utils.NewResource( metric.ID, metric.ID, "google_logging_metric", "google", map[string]string{ "name": metric.ID, "project": g.GetArgs()["project"].(string), }, loggingAllowEmptyValues, loggingAdditionalFields, )) } return nil } ͜Εͱ

Slide 13

Slide 13 text

͜Εͱ͜Ε͚ͩ

Slide 14

Slide 14 text

ௐ΂ͯΈͯ ! providerΛ͏·͘࢖͏͜ͱͰॲཧΛ࠷খݶʹ཈͑ͭͭɺࠓޙͷରԠ΋؆୯ʹ ߦ͑ΔΑ͏ʹͳ͍ͬͯΔ ! terraformer΋ੌ͍͚Ͳterraformͷpluginػߏ΋ੌ͍ ! ֤छplugin͸SaasͷresourcesͷCRUD෦෼Λந৅Խͯ͘͠Ε͍ͯΔๅ ശ ! terraformຊମʹґଘͤͣΤίγεςϜΛ૿΍͍ͯ͘͜͠ͱ΋Ͱ͖ͦ͏

Slide 15

Slide 15 text

ࢀߟࢿྉ ! ιʔείʔυ:https://github.com/GoogleCloudPlatform/terraformer ! 3rd Party tool Λ͖͔͚ͬʹ Terraform ͷιʔείʔυΛগ͠ᅂΜͩ࿩ https://chroju.github.io/blog/2019/05/14/read_terraform_source_code/ ! Terraform Provider࣮૷ ೖ໳(1): Custom Providerͷجૅ ! http://febc-yamamoto.hatenablog.jp/entry/terraform-custom-provider-01