sakamomo554101 / YouyakuAI

日本語用の要約を行うデモサービス
0 stars 0 forks source link

terraformを使って、試しにCloudRunベースでGCP上で稼働するように構成を組んでみる #55

Open sakamomo554101 opened 2 years ago

sakamomo554101 commented 2 years ago

概要

試しにGCP上で、CloudRunを使って、インフラを構成してみる。

terraformを使って、構成を自動で構築できるようにすること。

タスク

sakamomo554101 commented 2 years ago

参考になりそうな記事

https://learn.hashicorp.com/tutorials/terraform/google-cloud-platform-build https://qiita.com/donko_/items/6289bb31fecfce2cda79 https://cloud.google.com/community/tutorials/getting-started-on-gcp-with-terraform

sakamomo554101 commented 2 years ago

https://runebook.dev/ja/docs/terraform/configuration/interpolation#path-information

path.module周りについて。 moduleが記載されたファイルパスのことっぽいな(path.module)

他には、cwdやrootなどがあるが、path.moduleがシンプルそう。

sakamomo554101 commented 2 years ago

うーむ、、terraformで指定するcredentialファイルのパスや、プロジェクト情報、GCPのロケーション情報はenvから取りたいな・・。 どうにか出来んだろうか。

sakamomo554101 commented 2 years ago

terraform initって、何やってるんだ?

sakamomo554101 commented 2 years ago

あと、terraform validateも気になる。

sakamomo554101 commented 2 years ago

試しに下記を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" {
sakamomo554101 commented 2 years ago

サービスアカウントの権限問題な気がする。

sakamomo554101 commented 2 years ago

https://stackoverflow.com/questions/70912039/terraform-cloud-run-error-creating-service-googleapi-error-403-permission

権限問題でした。 Cloud Run Developerを入れればOK。

sakamomo554101 commented 2 years ago

CloudRunの課金形態を見てみる。

sakamomo554101 commented 2 years ago

https://cloud.google.com/run/pricing

かなり安いな

sakamomo554101 commented 2 years ago

terraform destroyをすると、直近作ったやつが消えるのかな。 試してみるか。

sakamomo554101 commented 2 years ago

CloudRunを直接公開するより、間にLoadBalancer入れて、アクセス可能にするか。

sakamomo554101 commented 2 years ago

https://zenn.dev/koz/scraps/3dfccfc92a7a0b

sakamomo554101 commented 2 years ago

https://qiita.com/riku-shiru/items/d3f7dda5a5e87c4b26e9

sakamomo554101 commented 2 years ago

GCPだと、完全マネージドな証明書がありそう。 DNS、DomainもGCPに頼ってしまえば、GCPで全部完結できるかな。

https://qiita.com/Nishi53454367/items/ba8b58e3517bba3af8d6

sakamomo554101 commented 2 years ago

https://jprs.jp/pubcert/about/wildcard/

ワイルドカード証明書ってなんぞ?って思ったが、複数のサーバーに対して、別サブドメインを割り振ってHTTPS通信をしたい場合に使えそう。

Google マネージド証明書だと、このワイルドカード証明書に対応してないらしい(最新はどうか知らんが)

sakamomo554101 commented 2 years ago

とりあえず、CloudRunベースで作って、ダッシュボードのコンテナだけ外部公開(IP固定)して、アクセス出来るようにするか。

ロードバランサーやドメイン、証明書周りについては、別issueで検討しよ。

sakamomo554101 commented 2 years ago

https://www.topgate.co.jp/cloud-run-2021#i-7

トラフィック周りで参考になりそう。

sakamomo554101 commented 2 years ago

https://zenn.dev/mseto/articles/cloud-run-domain

あれ、CloudRunに直接ドメインをマッピング出来る?

sakamomo554101 commented 2 years ago

https://cloud.google.com/run/docs/configuring/static-outbound-ip

CloudRunだと、外むきのiP(グローバル)は固定出来るっぽい。 たぶん、inboundは固定出来なさそう。

sakamomo554101 commented 2 years ago

これ、単純にterraform化だけでは動かんだろうなぁ。 構成次第だが、

sakamomo554101 commented 2 years ago

envに書いてあるHOST名については、terraformで構築したhost名を入れるような対応が必要(つまり、順番が逆になる)

上記は、terraformでのインフラ構築時に、host名などを環境変数として与え直して、オーバーライドするのが良さそう。 上記ができるかを調査する。

sakamomo554101 commented 2 years ago

https://registry.terraform.io/providers/kreuzwerker/docker/latest/docs/resources/container

上記みると、設定できそうだが、Cloud Runのcontainersで同様にENVが設定できるかどうか。

sakamomo554101 commented 2 years ago

https://registry.terraform.io/providers/hashicorp/google/latest/docs/resources/cloud_run_service#example-usage---cloud-run-service-multiple-environment-variables

おぉ、上記いける!ENV設定できますね〜

sakamomo554101 commented 2 years ago

あとは、コンポーネントごとに順番通りに作っていけるかどうか。 順序も決める必要がある。

sakamomo554101 commented 2 years ago

あれ、ダッシュボードって、直接DB見てないんだよな・・。 DBの情報いらん気がする。

sakamomo554101 commented 2 years ago

あと、BQのDB使う際に、gcp_project_idを設定する必要があるが、api_gatewayでちゃんと設定してるのか?

sakamomo554101 commented 2 years ago

ダッシュボードからDBの接続しようとしている処理(使ってない)を削除するようにしよう

sakamomo554101 commented 2 years ago

タスクをざっと整理。

sakamomo554101 commented 2 years ago

terraformで、リソース作成の依存関係が作れるかを調査 envファイルを読み込んで、環境変数をリソースに与えられるかを調査

上記をまずは調査する。

sakamomo554101 commented 2 years ago

https://y-ohgi.com/introduction-terraform/handson/syntax/ 勉強になる。

depends_onを使えばよさそう。(依存関係で順番制御)

sakamomo554101 commented 2 years ago

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

sakamomo554101 commented 2 years ago

terraform実行時にコマンド引数として、環境変数を渡す(スクリプトを作ってしまうとよさそう)

上記でいくか。 ビルド用のコンテナ作る手もあるけど、面倒なので、requirements.txtだけ置いておく。

sakamomo554101 commented 2 years ago

https://www.terraform.io/language/values/variables#variables-on-the-command-line 上記のような感じで、コマンドライン引数として、パラメーターが渡せる。

sakamomo554101 commented 2 years ago

map型に環境変数を入れておいて、参照する形にするか。 https://qiita.com/VTRyo/items/a633eaa3d9049cad0ed5

sakamomo554101 commented 2 years ago

https://dev.classmethod.jp/articles/terraform_module_coordination/ ふむ、outputから取れそう。 コンポーネントごとにちゃんと定義されてそうなので、CloudRunのケースを探してみる。

sakamomo554101 commented 2 years ago

https://registry.terraform.io/modules/GoogleCloudPlatform/cloud-run/google/latest?tab=outputs

これっぽいんだが、、module, resourceって、何が違うんだっけ?

sakamomo554101 commented 2 years ago

https://qiita.com/shikazuki/items/1aca321651949e9ac725

ふーむ、moduleはリソースに対してパラメーターを制限したり、outputを定義し直したりして、使い回しをしやすくしてる感じかな

sakamomo554101 commented 2 years ago

https://www.terraform.io/language/values/outputs terraform公式のoutputについて。

sakamomo554101 commented 2 years ago

CLIの実行結果として出す場合じゃなければ、下記のようにプロパティみたいな感じでアクセス出来そう。 https://www.terraform.io/language#example

あとは、CloudRunが何をプロパティとして持っているか、だな。

sakamomo554101 commented 2 years ago

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.

へぇ、オーバーライドの命名規則でファイル作れば、各プロパティのオーバーライドが出来そう。

sakamomo554101 commented 2 years ago

resourceはproviderごとにドキュメントが整理されている。 GCPの場合は下記を見れば良い。(Terraform Registryを見れば良い) https://registry.terraform.io/providers/hashicorp/google/latest/docs

sakamomo554101 commented 2 years ago

https://www.terraform.io/language/resources/behavior#accessing-resource-attributes リソースのプロパティへのアクセスの仕方。

<RESOURCE TYPE>.<NAME>.<ATTRIBUTE>
sakamomo554101 commented 2 years ago

https://www.terraform.io/language/data-sources

データソースって、variableのテンプレートに近いイメージなのだろうか。

sakamomo554101 commented 2 years ago

https://www.terraform.io/language/data-sources#description なるほどなー、上記のようなフィルター処理をする際にも使えるのか。

sakamomo554101 commented 2 years ago

https://www.terraform.io/language/values/variables#type-constraints input valueで受け付けている型

sakamomo554101 commented 2 years ago

https://www.terraform.io/language/values/variables#custom-validation-rules へぇ、validationとか入れられるのか。

sakamomo554101 commented 2 years ago

https://www.terraform.io/language/values/outputs#output-values

同一モジュール内では、前述したプロパティのアクセスでいけるが、ひょっとすると異なるモジュール間(リソース含め?)だと、outputの定義が必要なのかもしれない。 ここらへんは試してみればいいかな。

sakamomo554101 commented 2 years ago

https://www.terraform.io/cli/commands/console#examples おぉ、terraform consoleで、tfファイルを読み込んで、色々と実験できそう(プロパティが読めるとか)

sakamomo554101 commented 2 years ago

https://registry.terraform.io/providers/hashicorp/google/latest/docs/resources/cloud_run_service#attributes-reference CloudRunでアクセスできるプロパティ一覧