Open sakamomo554101 opened 2 years ago
https://runebook.dev/ja/docs/terraform/configuration/interpolation#path-information
path.module周りについて。 moduleが記載されたファイルパスのことっぽいな(path.module)
他には、cwdやrootなどがあるが、path.moduleがシンプルそう。
うーむ、、terraformで指定するcredentialファイルのパスや、プロジェクト情報、GCPのロケーション情報はenvから取りたいな・・。 どうにか出来んだろうか。
terraform initって、何やってるんだ?
あと、terraform validateも気になる。
試しに下記をterraform applyしてみたら、permission errorとなった。
terraform {
required_providers {
google = {
source = "hashicorp/google"
version = "3.5.0"
}
}
}
provider "google" {
credentials = file("${path.module}/../credentials/youyaku-ai-service-account.json")
project = "youyaku-ai"
region = "us-central1"
zone = "us-central1-c"
}
resource "google_cloud_run_service" "default" {
name = "cloudrun-srv"
location = "us-central1"
template {
spec {
containers {
image = "us-docker.pkg.dev/cloudrun/container/hello"
}
}
}
traffic {
percent = 100
latest_revision = true
}
}
★エラー内容
│ Error: Error creating Service: googleapi: Error 403: Permission 'run.services.create' denied on resource 'namespaces/youyaku-ai/services/cloudrun-srv' (or resource may not exist).
│
│ with google_cloud_run_service.default,
│ on main.tf line 17, in resource "google_cloud_run_service" "default":
│ 17: resource "google_cloud_run_service" "default" {
サービスアカウントの権限問題な気がする。
権限問題でした。 Cloud Run Developerを入れればOK。
CloudRunの課金形態を見てみる。
terraform destroyをすると、直近作ったやつが消えるのかな。 試してみるか。
CloudRunを直接公開するより、間にLoadBalancer入れて、アクセス可能にするか。
GCPだと、完全マネージドな証明書がありそう。 DNS、DomainもGCPに頼ってしまえば、GCPで全部完結できるかな。
https://jprs.jp/pubcert/about/wildcard/
ワイルドカード証明書ってなんぞ?って思ったが、複数のサーバーに対して、別サブドメインを割り振ってHTTPS通信をしたい場合に使えそう。
Google マネージド証明書だと、このワイルドカード証明書に対応してないらしい(最新はどうか知らんが)
とりあえず、CloudRunベースで作って、ダッシュボードのコンテナだけ外部公開(IP固定)して、アクセス出来るようにするか。
ロードバランサーやドメイン、証明書周りについては、別issueで検討しよ。
https://www.topgate.co.jp/cloud-run-2021#i-7
トラフィック周りで参考になりそう。
https://zenn.dev/mseto/articles/cloud-run-domain
あれ、CloudRunに直接ドメインをマッピング出来る?
https://cloud.google.com/run/docs/configuring/static-outbound-ip
CloudRunだと、外むきのiP(グローバル)は固定出来るっぽい。 たぶん、inboundは固定出来なさそう。
これ、単純にterraform化だけでは動かんだろうなぁ。 構成次第だが、
envに書いてあるHOST名については、terraformで構築したhost名を入れるような対応が必要(つまり、順番が逆になる)
上記は、terraformでのインフラ構築時に、host名などを環境変数として与え直して、オーバーライドするのが良さそう。 上記ができるかを調査する。
https://registry.terraform.io/providers/kreuzwerker/docker/latest/docs/resources/container
上記みると、設定できそうだが、Cloud Runのcontainersで同様にENVが設定できるかどうか。
あとは、コンポーネントごとに順番通りに作っていけるかどうか。 順序も決める必要がある。
あれ、ダッシュボードって、直接DB見てないんだよな・・。 DBの情報いらん気がする。
あと、BQのDB使う際に、gcp_project_idを設定する必要があるが、api_gatewayでちゃんと設定してるのか?
ダッシュボードからDBの接続しようとしている処理(使ってない)を削除するようにしよう
タスクをざっと整理。
terraformで、リソース作成の依存関係が作れるかを調査 envファイルを読み込んで、環境変数をリソースに与えられるかを調査
上記をまずは調査する。
https://y-ohgi.com/introduction-terraform/handson/syntax/ 勉強になる。
depends_onを使えばよさそう。(依存関係で順番制御)
envファイルの読み込みだが、いくつか方法がありそう。
参考 https://qiita.com/ringo/items/3af1735cd833fb80da75 https://stackoverflow.com/questions/59789730/how-can-i-read-environment-variables-from-a-env-file-into-a-terraform-script
terraform実行時にコマンド引数として、環境変数を渡す(スクリプトを作ってしまうとよさそう)
上記でいくか。 ビルド用のコンテナ作る手もあるけど、面倒なので、requirements.txtだけ置いておく。
https://www.terraform.io/language/values/variables#variables-on-the-command-line 上記のような感じで、コマンドライン引数として、パラメーターが渡せる。
map型に環境変数を入れておいて、参照する形にするか。 https://qiita.com/VTRyo/items/a633eaa3d9049cad0ed5
https://dev.classmethod.jp/articles/terraform_module_coordination/ ふむ、outputから取れそう。 コンポーネントごとにちゃんと定義されてそうなので、CloudRunのケースを探してみる。
https://registry.terraform.io/modules/GoogleCloudPlatform/cloud-run/google/latest?tab=outputs
これっぽいんだが、、module, resourceって、何が違うんだっけ?
https://qiita.com/shikazuki/items/1aca321651949e9ac725
ふーむ、moduleはリソースに対してパラメーターを制限したり、outputを定義し直したりして、使い回しをしやすくしてる感じかな
https://www.terraform.io/language/values/outputs terraform公式のoutputについて。
CLIの実行結果として出す場合じゃなければ、下記のようにプロパティみたいな感じでアクセス出来そう。 https://www.terraform.io/language#example
あとは、CloudRunが何をプロパティとして持っているか、だな。
https://www.terraform.io/language/files/override
For these rare situations, Terraform has special handling of any configuration file whose name ends in _override.tf or _override.tf.json. This special handling also applies to a file named literally override.tf or override.tf.json.
へぇ、オーバーライドの命名規則でファイル作れば、各プロパティのオーバーライドが出来そう。
resourceはproviderごとにドキュメントが整理されている。 GCPの場合は下記を見れば良い。(Terraform Registryを見れば良い) https://registry.terraform.io/providers/hashicorp/google/latest/docs
https://www.terraform.io/language/resources/behavior#accessing-resource-attributes リソースのプロパティへのアクセスの仕方。
<RESOURCE TYPE>.<NAME>.<ATTRIBUTE>
https://www.terraform.io/language/data-sources
データソースって、variableのテンプレートに近いイメージなのだろうか。
https://www.terraform.io/language/data-sources#description なるほどなー、上記のようなフィルター処理をする際にも使えるのか。
https://www.terraform.io/language/values/variables#type-constraints input valueで受け付けている型
https://www.terraform.io/language/values/variables#custom-validation-rules へぇ、validationとか入れられるのか。
https://www.terraform.io/language/values/outputs#output-values
同一モジュール内では、前述したプロパティのアクセスでいけるが、ひょっとすると異なるモジュール間(リソース含め?)だと、outputの定義が必要なのかもしれない。 ここらへんは試してみればいいかな。
https://www.terraform.io/cli/commands/console#examples おぉ、terraform consoleで、tfファイルを読み込んで、色々と実験できそう(プロパティが読めるとか)
概要
試しにGCP上で、CloudRunを使って、インフラを構成してみる。
terraformを使って、構成を自動で構築できるようにすること。
タスク