TerraformでGCPのCloud Runを作成

## Terraformを使うメリット
基本的にGCPのコンソールでインフラの作成を行っていたが、Terraformを使うことでも作成できるようになる。
コードでインフラを作成できるので、管理がしやすい！

## やること
`未認証を許可`した`Cloud Run`を作成する

## Homebrewでtfenvをインストール
`brew install tfenv`

tfenvのコマンドが使えるようになったので、バージョンを指定してインストール
`tfenv install X.X.X`

最新をインストール
`tfenv install latest`

リスト
`tfenv list`
実行後、下記のようなリストが出てくる

    1.1.6
    1.1.0
    1.0.11
    0.14.4

terraformで使いたいバージョン
例：`echo 1.0.11 > .terraform-version`

これでterraformコマンドが使える！
`terraform --version`を実行して確認

バージョンの切り替えの時
`tfenv use X.X.X`

※vscodeのプラグインは下記を入れました。
`HashiCorp Terraform`

## サービスアカウントの作成
どうしてもGCPのコンソールで作成しないといけないもの = [サービスアカウント](https://cloud.google.com/docs/authentication/getting-started)

1. サービスアカウント名を入力
1. 作成して続行をクリック
1. ロールを選択(今回はRunを使うので、`編集者`と`Cloud Run管理者`を選択)
1. 続行をクリック
完了

#### keyの作成
上記手順で作成したアカウントがあることを確認
1. そのアカウントのリンクをクリック
1. 「キー」を選択
1. 鍵を追加、「新しい鍵を作成」をクリック
1. 「JSON」 で作成

#### JSON
`credential`というフォルダを作成し、上記でダウンロードした「JSON」を`credentials.json`として保存

## 一番最初に必要なもの

- `terraform.tfvars`
- `variables.tf`
- `provider.tf`


terraform.tfvars

    credential = "./credential/credentials.json"
    default_location = "asia-northeast1"
    project_id = "クレデンシャルで作成したproject_id"

variables.tf

    variable "credential" {
    type = string
    }
    variable "default_location" {
    type = string
    }
    variable "project_id" {
    type = string
    }

provider.tf

    provider "google" {
    credentials = var.credential
    region      = var.default_location
    project     = var.project_id
    }

※Cloud Run以外を動かす際にも上記の3つは必要

## Cloud Runの作成

cloud_run.tf

    resource "google_cloud_run_service" "test" {
    name     = "test"
    location = "asia-northeast1"

    template {
        spec {
        containers {
            image = "us-docker.pkg.dev/cloudrun/container/hello"
        }
        }
    }

    traffic {
        percent         = 100
        latest_revision = true
    }
    }

※今回は必要最低限のコード(細かい設定もできるので公式等を見て記載していく必要あり)

## 未認証許可

iam.tf

    //cloud run未認証許可
    resource "google_cloud_run_service_iam_member" "member" {
    location = google_cloud_run_service.test.location
    project  = google_cloud_run_service.test.project
    service  = google_cloud_run_service.test.name
    role     = "roles/run.invoker"
    member   = "allUsers"
    }

## Makefileの作成
Makefile

	# プロジェクトをセット
	project-set:
		gcloud config set project プロジェクト名
	# プロジェクトなどの一覧
	project-show:
		gcloud config list
	# 作成した差分
	plan:
		@make project-set
		terraform plan -var-file ./env/terraform.tfvars
	# デプロイ
	apply:
		@make project-set
		terraform apply -var-file ./env/terraform.tfvars
	# 履歴などの削除
	destroy:
		@make project-set
		terraform destroy -var-file ./env/terraform.tfvars

Makefile：`make〇〇`で実行できるようにする(`JS`では`package.json`の`script`!)

## Cloud Runにあげる

1. `terraform init`：初期化
1. `make apply`を実行
1. `Enter a value:`に`yes`と入れる

GCPのCloud Runを開いて、名前：`test`、認証：`未認証許可`、最終デプロイ日：`数秒前`になっていればOK！
## エラーから解決策

    Error: Error applying IAM policy for cloudrun service

私は、最初に作成するサービスアカウントでロールを`編集者`だけで行なってました。
そしてターミナルで`make apply`を実行後に上記のエラーが...

#### 解決策
たどり着いた解決策が`Cloud Run 管理者`を追加！

## 最後に
Cloud Runにあげることはできましたが、ほぼデフォルトです...
また、知識のアップデートがあれば、更新します。

## 参考文献

https://registry.terraform.io/providers/hashicorp/google/latest/docs/resources/cloud_run_service

https://registry.terraform.io/providers/hashicorp/google/latest/docs/resources/cloud_run_service_iam


https://qiita.com/donko_/items/6289bb31fecfce2cda79

https://learn.hashicorp.com/tutorials/terraform/install-cli