2023/9/9 Terraform google_monitoring_slo がおかしい
#Terraform #OSS
1. Blaming magic-modules/mmv1/products/monitoring/Slo.yaml at main · GoogleCloudPlatform/magic-modules
自動採番される slo_id のパターンが厳しすぎて合わない、A-Z 大文字アルファベットも含まれうる
import したけど適用できない状態に陥る
2. import したら service が null になる
Fix google_monitoring_slo import by nyuta01 · Pull Request 11696 · hashicorp/terraform-provider-google
ここで取り組まれていたけど放置されている
3. rolling_period_days と calendar_period は択一だけど両方 import されて次回バリデーションエラーになる
Overview | Magic Modules
前は asdf で ruby 入れていると進まなかった気がするけど行けたわ
1. SLO 作ってみて自動採番の値を確認する
えー API ドキュメントが [a-z0-9\-]+ じゃん
Method: services.serviceLevelObjectives.create  |  Cloud Monitoring  |  Google Cloud
コンソールから作る & API で作る
自動採番されても入力しても大文字が入る
https://gyazo.com/de29aa168f3cf17a539010d8c8c55370 https://gyazo.com/8446dfa93f39620314c8ce6f8f89428f
実際には : とかも入れられる
日本語送りつけるとエラーメッセージから実際のパターン分かる
^[a-zA-Z0-9-_:.]+$ じゃねーか
code:error.json
{
"error": {
"code": 400,
"message": "Resource names must match pattern ^[a-zA-Z0-9-_:.]+$. Got value \"日本語\"",
"status": "INVALID_ARGUMENT"
}
}
code:feedback
The serviceLevelObjectiveId pattern differs from its actual behavior on services.serviceLevelObjectives.create.
This page says
Must match the pattern a-z0-9\-+
But it's actually
^a-zA-Z0-9-_:.+$`
This can be obtained from the error message when requesting the API with multibyte characters. And when an input is omitted in the console, the auto-generated ID includes uppercase letters.
Contribution process | Magic Modules
product は monitoring
$ make provider VERSION=ga OUTPUT_PATH="$GOPATH/src/github.com/hashicorp/terraform-provider-google" PRODUCT=monitoring
$ make provider VERSION=beta OUTPUT_PATH="$GOPATH/src/github.com/hashicorp/terraform-provider-google-beta" PRODUCT=monitoring
make test 2分ぐらい
これは go 内で完結していそう
受け入れテストは実際に API 叩いていそう!!
$ make testacc TEST=./google/services/monitoring TESTARGS='-run=TestAccMonitoringSlo_'
これも2分ぐらいだけどコンソールで見てるとリソース作られては消えて...となっている
これ service の id もパターンおかしいね
Method: services.create  |  Cloud Monitoring  |  Google Cloud
$ make testacc TEST=./google/services/monitoring TESTARGS='-run=TestAccMonitoringService_'
https://googlecloudplatform.github.io/magic-modules/develop/breaking-changes/
検証をよりゆるくするので breaking changes ではないはず
Create a pull request | Magic Modules
Self-review your PR のリンクミスってる
なんかめっちゃ大変だったな
https://github.com/hashicorp/terraform-provider-google/issues/15825
https://github.com/GoogleCloudPlatform/magic-modules/pull/8939
自前でビルドしたプロバイダを使うには
Provider Requirements - Configuration Language | Terraform | HashiCorp Developer
https://googlecloudplatform.github.io/magic-modules/develop/run-tests/#optional-test-manually
magic-modules でビルドして
terraform-provider-google で make build して
code:tf-dev-override.tfrc
provider_installation {
dev_overrides {
"hashicorp/google" = "/Users/pokutuna/go/bin"
"hashicorp/google-beta" = "/Users/pokutuna/go/bin"
}
direct {}
}
$ TF_CLI_CONFIG_FILE=./tf-dev-override.tfrc terraform plan
custom_import などではおもむろに log.Printf してもいい
2. の service の import も直したい
api_name ない、これ設定したら import 時によしなにしてくれる?
default_from_api も関係ある? import 時に見られる? 生成時の話?
api_name と連携して機能する?
生成される?
カスタムインポート作るしかない?
今 self_link_as_name だけどこれ拡張できる?
別に作りつつ self_link_as_name 相当のものを入れる?
constants と encoder は何?
constants はロジックベースのバリデーション書くところ?
encoder はリクエスト時に加工するやつやな
個々の properties 以下の custom ナントカだと思うなあ
custom_flatten で resource_from_self_link みたいなのでいけないのかな
GetResourceNameFromSelfLink がそれっぽいけど、もう一段値を読まないとダメ?
https://gist.github.com/pokutuna/0f84c03e0eb18ac26a91b031afa1a419
これみると import 時に service_id に束縛はできている、service_id と service の名前の齟齬?
この service_id はどこからきてるんだ?
service に custom_flatten を追加して name 加工する感じかなあ
汎用の custom_flatten/name_from_self_link.erb
tpgresource.NameFromSelfLinkStateFunc(v) 呼ぶ
これはパスの末尾取るだけ
汎用の custom_import/self_link_as_name.erb
これは import id を正規表現で分解するだけ
パターンを複数配列で渡していて project, name を取り出す場合と name だけ取り出すのを順に試す
GoogleCloudPlatform/magic-modules@main - mmv1/templates/terraform/custom_import/vertex_ai_tensorboard_import.go.erb
custom_import やっている例
パラメータ
API 上の name は全体
projects/[PROJECT_ID_OR_NUMBER]/services/[SERVICE_ID]/serviceLevelObjectives/[SLO_NAME]
設定上のパラメータは
service: SERVICE_ID
sloId: SLO_NAME
今は
custom_import
self_link_as_name
(sloId) custom_flatten
name_from_self_link
Add custom resource code | Magic Modules
以下の流れがある
リクエスト時
custom_expand 各パラメータを加工
encoder, update_encoder でリソース全体の値を加工
レスポンス時
decoder でリソース全体の値をバラす
custom_flatten で各パラメータ、プロパティの値を加工
schema.Resource
ここに Create, Read, Update, Delete, Importer 等のリソースがある
Importer はスカスカなので read する前段階なのかな
逆じゃね?
https://gyazo.com/309b2a268317df76901b95d115af4c7d