window端末でterraformを使用したGCPリソースを作成する

# はじめに
Windows端末へTerraformをインストールし、GCPのリソースを作成する手順をまとめました。

## 1.　Terraformインストール
以下の公式サイトを参考にインストールします。
Install Terraform(https://www.terraform.io/intro/index.html)

### 1-1. バイナリのダウンロード
ダウンロードサイトから「AMD64」をインストールします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636793/e4dff0fc-8517-ad7f-5893-16bea6fc42d5.png)

【ダウンロードサイト】 
https://developer.hashicorp.com/terraform/install(https://developer.hashicorp.com/terraform/install)

### 1-2. zipファイルの解凍
ダウンロードした「terraform_1.6.6_windows_amd64.zip」を任意のフォルダに展開します。
今回はC:\Windows\terraformへ展開しました。
展開後、フォルダ内に「terraform.exe」が展開されていることを確認します。

### 1-3. 環境変数 PATH に Terraformのインストールディレクトリを通す
- スタートメニューを右クリックして、「システム」を選択します。

- 左側の「システムの詳細設定」をクリックします。

- 「詳細設定」ウィンドウが表示されたら、「環境変数」ボタンをクリックします。

<img width="300" alt="スクリーンショット 2023-12-26 225635.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636793/cb5acbd0-47bc-a0e1-e14b-da13ac031dd2.png">

- 下部の「システム変数」からPathを選択し、クリックします。

<img width="300" alt="スクリーンショット 2023-12-26 223213.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636793/164c47d3-26b7-35b8-2cc3-7c988a82c3f9.png">

- 「新規」をクリックし、Terraformのインストールディレクトリのパスを追加し、「OK」をクリックします。

<img width="300" alt="スクリーンショット 2023-12-26 223233.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636793/9e2ec7eb-2547-d848-402b-d60261985cee.png">

- 全てのウィンドウを閉じて設定を保存します。

- PowerShellまたはコマンドプロンプトを再起動します。

- PowerShellまたはコマンドプロンプトを開き、`terraform --version`を実行します。
以下はPowerShellでの実行例です。

```
PS C:\Windows\terraform>terraform --version
Terraform v1.6.6
on windows_amd64
```

## 2.　GCP設定
続いてGCPのコンソールでサービスアカウントを作成し、秘密鍵をWindows端末に保存します。
こうすることで、ローカルからTerraformを実行し、GCPリソースを作成することが可能になります。

### 2-1. プロジェクト作成
GCPのクラウド管理コンソールにログイン後Cloud Shellを開き、`gcloud projects create`コマンドでプロジェクトを作成します。
ここではプロジェクトIDを`Project_ID`、プロジェクトの名前を`"MyProject"`としていますが、適切なプロジェクトIDとプロジェクト名に変更してください。

```
gcloud projects create Project_ID --name="MyProject"
```
既存のプロジェクトを使用する場合は以下コマンドでプロジェクトIDを調べておきます。

```
gcloud config get-value project
```

### 2-2. プロジェクトの切り替え
指定のプロジェクトを使用するように切り替えます。

```
gcloud config set project Project_ID
```
これで、指定したプロジェクトが現在のデフォルトプロジェクトとして設定されます。

### 2-3. サービスアカウント作成
`gcloud iam service-accounts create`コマンドを使用し、Terraform構築用のサービスアカウントを作成します。

```
gcloud iam service-accounts create terraform-account \
  --display-name "Terraform User"
```
### 2-4. サービスアカウントへの権限付与
作成したterraform-accountへ編集者（Editor）ロールを付与します。
`Project_ID`を、先ほど作成したプロジェクトIDへ変更してください。

```
gcloud projects add-iam-policy-binding Project_ID \
  --member serviceAccount:terraform-account@Project_ID.iam.gserviceaccount.com \
  --role roles/editor
```

### 2-5. サービスアカウントの確認
GCPコンソールで「IAMと管理」を開きます。
アカウントが作成されていることを確認します。

<img width="500" alt="スクリーンショット 2023-12-26 235919.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636793/64708adb-7906-b747-a233-ff44916d0ff9.png">

### 2-6. 秘密鍵の作成とダウンロード
GCPコンソールで「APIとサービス」 > 「認証情報」を開きます。
作成したアカウントの「鍵の管理」をクリックします。

<img width="500" alt="スクリーンショット 2023-12-26 150515.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636793/430f566c-454b-c2f1-ab27-e2860723fafd.png">

「新しい鍵を作成」をクリックします。

<img width="500" alt="スクリーンショット 2023-12-26 150533.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636793/4509dce7-3853-2b21-9b57-d3389c736255.png">

「JSON」を選択して「作成」をクリックします。

<img width="500" alt="スクリーンショット 2023-12-26 150544.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636793/83b43d00-a7e2-a0fc-eb33-0f4208d78806.png">

JSONファイルがダウンロードされたら閉じます。
<img width="500" alt="スクリーンショット 2023-12-26 150602.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636793/ae850f2a-0cd2-1b28-92b3-7ef6bf412228.png">


ダウンロードしたファイルをTerraformをインストールしたディレクトリに保存します。

## 3.　tfファイルの作成
tfファイルという、terraformからGCPリソースを構築するための設定ファイルを作成します。

### 3-1. tfファイル作成
PoweShell上で、`New-Item`コマンドを使用してterraformをインストールしたディレクトリに`main.tf`という名前のファイルを作成します。

```
cd C:\Windows\terraform
New-Item -ItemType File -Name main.tf
```

### 3-2. tfファイル編集
メモ帳で`main.tf`ファイルを開き、編集します。
VsCodeで開く場合は`code main.tf`と入力します。

```
notepad main.tf
```

main.tfファイルを編集し、保存します。
今回は`terraform-network`というVPCネットワークを作成するため、`resource "google_compute_network" "vpc_network"`でネットワークを指定します。
また`required_providers`でGoogle CloudのProviderを指定しています。

```main.tf
terraform {
# プロバイダーを指定
  required_providers {
    google = {
     source = "hashicorp/google"
      version = "5.10.0"
    }
  }
 }
provider "google" {
  credentials = file("ダウンロードしたJSONファイルへのフルパス")
  project     = "Project_ID" 
  region      = "asia-northeast1"  # 任意のリージョンを指定
}
resource "google_compute_network" "vpc_network" {
  name = "terraform-network"
}
```
・Providerの最新バージョン情報は以下のサイトで確認することができます。
https://github.com/hashicorp/terraform-provider-google/blob/master/CHANGELOG.md

・`credentials`に記述するパスの`\`はエスケープしてください。
Ex）C:\Windowsの場合：C:\\\Windowsと記述
・`project`はプロジェクトIDを指定します。
・`region`に任意のリージョンを指定します。
・`name`にVPCネットワーク名を指定します。

### 3-3. 作成後の確認
`terraform validate`コマンドを実行し、文法上のエラーがないことを確認します。

```
terraform validate
```
`Success! The configuration is valid.`と表示されればOKです。


## 4.　Terraformの初期化
`main.tf`が保存されているディレクトリに移動します。
`terraform init`コマンドを実行し、プロバイダーとモジュールを初期化します。

```
terraform init
```

出力例
```
Initializing provider plugins...
- Reusing previous version of hashicorp/google from the dependency lock file
- Using previously-installed hashicorp/google v5.10.0

Terraform has been successfully initialized!

You may now begin working with Terraform. Try running "terraform plan" to see
any changes that are required for your infrastructure. All Terraform commands
should now work.

If you ever set or change modules or backend configuration for Terraform,
rerun this command to reinitialize your working directory. If you forget, other
commands will detect it and remind you to do so if necessary.
```

## 5. 実行プランを作成
`terraform plan`コマンドを実行し、実際のリソースや状態に変更を加えずに想定通りの実行ができるか確認します。

```
terraform plan
```

## 6.　Terraformの実行
`terraform apply`コマンドを実行して、定義したリソースを作成します。Terraformが作成するリソースを確認し、yesを入力して実行を許可します。

```
terraform apply
```

## 7.　リソースの確認
GCPのコンソールで「VPCネットワーク」を開き、作成したネットワークが表示されていることを確認します。

<img width="500" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636793/5a1600a5-0539-e496-c35a-3e94ebbfccbc.png">

## 8. 参考
https://developer.hashicorp.com/terraform/tutorials/aws-get-started/install-cli

https://dev.classmethod.jp/articles/accesse-google-cloud-with-terraform/

https://qiita.com/WisteriaWave/items/eeeb39ab1e1349cf0d00

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

https://qiita.com/e-na/items/55e9962ef252e63fc932