TerraformでCloud Volumes ONTAP(CVO)デプロイ自動化

# Terraform で Cloud Volumes ONTAP(CVO) デプロイ自動化
Terraformでは多数のProviderが提供されており様々な環境でのプロビジョニングを自動化できます。NetAppでも[複数のProvider](https://registry.terraform.io/namespaces/NetApp)を提供しており、例えば、クラウドサービス用のProviderを利用すればクラウドのメリットをより拡張して利用することができます。

今回は Terraformを利用して、NetApp クラウドストレージサービス **Cloud Volumes ONTAP(CVO)** のデプロイ作業を自動化してみた例を紹介します。 なお、Cloud Volumes ONTAP（CVO)サービスについては[こちら](https://www.netapp.com/ja/cloud-services/cloud-volumes-ontap/)を参照ください。

Cloud Volumes ONTAP(CVO)は、AWS / Azure / GCP のいずれのクラウドでも利用可能で、TerraformのProviderも各クラウド向けのものが提供されていますが、本記事ではGCP環境での利用例を紹介します。

なお、 Cloud Volumes Ontap(CVO)デプロイの事前準備作業を 別記事の [準備編](https://qiita.com/yoihoka/private/9d04ad2fdfc662667873) にて紹介していますのでそちらも参照ください。


## Terraform処理概要
処理の概要は以下の通りです。
作業用Linuxサーバに Terraformを導入して 構成ファイルを準備し、NetApp Cloud Manager向けに Terraformを実行して GCPの環境に Connector / CVO / NFS Volumeを自動的に作成します。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/981926/bdb62ff7-4c4f-3c6b-66da-bba7a8d021b8.png)


##前提
以下の環境で試しています

- Terrafrom 1.0.3
- netapp-cloudmanager 21.5.3
- Cloud Manager 3.9.8
- Cloud Volumes ONTAP 9.9.1
- CentOS7.7

なお、この記事で書かれている 手順やファイルは動作を保証されたものではありません。
各環境に合わせてテスト・確認をしたうえで自己責任にて利用していただければと思います。


##事前準備
以下の事前準備項目が完了している前提となります。

1. NetApp Cloud Centralでの準備事項 : 
 1. アカウント作成 
 2. Token取得
 3. (オプション) Cloud Manager アカウントのID確認
 
2. GCP での 事前準備
 1. gcloudコマンド実行準備
 2. 新規プロジェクト作成
 3. サービスアカウント作成・Private Key(サービスアカウントキー)ファイル取得
 4. API 有効化
 5. VPC / Subnet作成


これら準備事項は、別記事の [準備編](https://qiita.com/yoihoka/private/9d04ad2fdfc662667873) で実施手順を紹介していますので参考にしてください。また、より詳細な内容は[NetAppのドキュメントサイト](https://docs.netapp.com/ja-jp/occm/task_getting_started_gcp.html)を確認してください。


##作業の流れ
1. Terraform初期設定
2. .tfファイル準備
3. terraform 実行（Connector / CVO / NFS Volume 作成）
4. Connector / CVO / NFS Volume 削除


## 1. Terraform初期設定
Terraformコマンドを実行可能にするための初期設定を実施します。

なお、terraformの最新バイナリについては[Terraformのサイト](https://www.terraform.io/downloads.html)で確認してください。

```shell:
$ mkdir ~/terraform
$ cd ~/terraform
$ curl -sL https://releases.hashicorp.com/terraform/1.0.3/terraform_1.0.3_linux_amd64.zip > terraform.zip
$ unzip terraform.zip
$ export PATH=$PATH:~/terraform/
```

上記でterraformコマンドを実行可能となります。
以下のようにバージョンの確認コマンドを実行できることを確認してください。

```shell:
$ terraform --version
Terraform v1.0.3
on linux_amd64
```


## 2. .tfファイル作成

#### 2-1. ディレクトリ・ファイル配置 構成について
terraformの各ディレクトリ・ファイルの構成・配置は以下の前提となります。

```shell:ディレクトリ・ファイル構成
~/terraform
   └─ cloud-manager
      ├─ provider.tf
      ├─ gcp-connector.tf
      ├─ gcp-cvo.tf
      ├─ gcp-cvo-nfsvol.tf  
      └─ gcp_cred
         └─ netapp-teraform-user01.json
  
```
事前準備で用意したサービスアカウントのPrivate Key(サービスアカウントキー)ファイルを、~/terraform/cloud-manager/gcp_credディレクトリ配下に配置します。
別記事の事前準備編を実施している場合は、既に配置済みの状態になっています。

上記構成から 配置ディレクトリ・ファイル名を変更する場合は、".tfファイル"の対応するパラメータを変更して利用してください。


#### 2-2. 主要パラメータについて
GCP/CVO の主要パラメータは以下となります。
パラメータ値についても値を変更する場合は ".tfファイル"の対応する値を変更して利用してください。


**GCP:**

| パラメータ名 | 値 | 
|:---:|---|---|
|Project名| tproject0709 |
|Zone| asia-northeast1-a |
|VPC ID| primary-vpc2 |
|Subnet| subnet11 |
|サービスアカウント名| netapp-teraform-user01 |
|Volume Type| pd-standard |


**CVO:**

| パラメータ名 | 値 | 
|:---:|---|---|
|Connector名| ccon-gcp-from-tera1 |
|CVO名|cvofromtera1 |
|SVM名| svm_cvofromtera1 |
|NFS Volume名| nfsvol01 |
|Licence Type| gcp-cot-standard-paygo |

 

#### 2-3. ".tfファイル"の準備作業
terraform用の構成ファイルを配置するディレクトリを作成し、ファイルを配置します。
今回はterraformのtfファイルはコンパクトにするため、variableの利用などはしていませんのでご注意ください。

最初に、.tfファイル及び サービスアカウントのPrivate Key(サービスアカウントキー)ファイル を 配置するためのディレクトリを作成します。別記事の準備編を実施している場合は、既にディレクトリ作成済みのため、ディレクトリ移動(cd 〜)のみ実施してください。

```shell:
$ mkdir -p ~/terraform/cloud-manager ~/terraform/cloud-manager/gcp_cred
$ cd ~/terraform/cloud-manager

```
~/terraform/cloud-managerディレクトリ配下に、以下４つのtfファイルを作成します。

```plaintext:①provider.tf
terraform {
  required_providers {
    netapp-cloudmanager = {
      source  = "NetApp/netapp-cloudmanager"
    }
  }
}

provider "netapp-cloudmanager" {
  refresh_token = "<< NetApp Cloud Centralで確認した Token >>"
}
```
※ refresh_tokenの値はCloud Centralで確認した値を設定してください。
  (別記事の準備編 "1-2 Token取得" で確認した 値)

```plaintext:②gcp-connector.tf
resource "netapp-cloudmanager_connector_gcp" "cl-occm-gcp" {
  provider              = netapp-cloudmanager
  name                  = "ccon-gcp-from-tera1"
  project_id            = "tproject0709"
  zone                  = "asia-northeast1-a"
  company               = "Company"
  service_account_email = "netapp-teraform-user01@tproject0709.iam.gserviceaccount.com"
  service_account_path  = "./gcp_cred/netapp-teraform-user01.json"
  subnet_id             = "subnet11"
#  account_id            = "account-xxxxxxxx"
}

```
※ 複数のCloud Managerアカウントを使っている環境で、明示的に利用アカウントを指定しないと エラーになったり 意図しないアカウント配下にデプロイされることがあります。 Cloud Manager の Acount IDを指定する場合は、account_id = "acount-xxxxx"行に値を設定してコメントをはずしてください(別記事の準備編 "1-3 Cloud ManagerアカウントのID確認" で確認した 値)
  

```plaintext:③gcp-cvo.tf
resource "netapp-cloudmanager_cvo_gcp" "cl-cvo-gcp-from-tera1" {
  provider             = netapp-cloudmanager
  name                 = "cvofromtera1"
  project_id           = "tproject0709"
  zone                 = "asia-northeast1-a"
  gcp_service_account  = "netapp-teraform-user01@tproject0709.iam.gserviceaccount.com"
  svm_password         = "<< 任意のSVM用パスワード >>"
  client_id            = netapp-cloudmanager_connector_gcp.cl-occm-gcp.client_id
  subnet_id            = "subnet11"
  vpc_id               = "primary-vpc2"
  gcp_volume_size      = "100"
  gcp_volume_size_unit = "GB"
  gcp_volume_type      = "pd-standard"
  instance_type        = "n1-standard-8"
  is_ha                = false
}

```

※ svm_passwordの値は任意のパスワードを指定してください。


```plaintext:④gcp-cvo-nfsvol.tf  
resource "netapp-cloudmanager_volume" "cvo-volume-nfs-from-tera1-1" {
  provider                  = netapp-cloudmanager
  svm_name                  = "svm_cvofromtera1"
  volume_protocol           = "nfs"
  name                      = "nfsvol01"
  size                      = "10"
  unit                      = "GB"
  provider_volume_type      = "pd-standard"
  export_policy_type        = "custom"
  export_policy_ip          = ["0.0.0.0/0"]
  export_policy_nfs_version = ["nfs3"]
  client_id                 = netapp-cloudmanager_connector_gcp.cl-occm-gcp.client_id
  working_environment_id    = netapp-cloudmanager_cvo_gcp.cl-cvo-gcp-from-tera1.id
  capacity_tier             = "none"
}

```


## 3. terraform 実行（Connector / CVO / NFS Volume 作成）
terraformを実行してCVOをデプロイを行います。
最初にiniコマンドでを初期化処理を行い、その後に planコマンドで 実行内容を確認します。
（terraform planでは、CVOデプロイなどの処理は実行されません。）


```shell:実行例
$ cd ~/terraform/cloud-manager
$ terraform init

Initializing the backend...

Initializing provider plugins...
〜〜出力省略〜〜
Terraform has been successfully initialized!
〜〜出力省略〜〜

$ terraform plan

Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the
following symbols:
  + create
〜〜出力省略〜〜
Plan: 3 to add, 0 to change, 0 to destroy.
〜〜出力省略〜〜

```
planでの内容確認後、applyコマンドを実行し、"Enter a value:"でyesを入力してEnterを押下すると、実際に terraformでCVOデプロイ、NFS Volume作成が実行されます。

```shell:実行例
$ terraform apply

Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the
following symbols:
  + create
〜〜出力省略〜〜
Plan: 3 to add, 0 to change, 0 to destroy.

Do you want to perform these actions?
  Terraform will perform the actions described above.
  Only 'yes' will be accepted to approve.

  Enter a value:
  ↑ yesを入力してEnter

〜〜出力省略〜〜
Apply complete! Resources: 3 added, 0 changed, 0 destroyed.
$ terraform state list
netapp-cloudmanager_connector_gcp.cl-occm-gcp
netapp-cloudmanager_cvo_gcp.cl-cvo-gcp-from-tera1
netapp-cloudmanager_volume.cvo-volume-nfs-from-tera1-1
```

terraform state listコマンドで３つのリソースが表示されることを確認します。

[Cloud Manager画面] (https://cloudmanager.netapp.com/)で確認すると、CVOがデプロイされ、NFS Volumeが作成されていることを確認できます。

[GCP Console](https://console.cloud.google.com/?hl=ja)側でも GCEインスタンスが作成されていることを確認できますが、このGCP Console画面からは CVOインスタンスを直接削除しないように注意してください。 CVOインスタンスは 必ず Cloud Managerから削除するか、後述する terraformでの削除を実施するようにしてください。


## 4. Connector / CVO / NFS Volume 削除
terraform destroyコマンドで デプロイした環境の削除を行います。
必ずCVO削除後に、Connectorを削除してください。

NFS Volume → CVO → Connectorの順番に 削除します。


① NFS Volume削除

```shell:実行例
$ terraform destroy -target=netapp-cloudmanager_volume.cvo-volume-nfs-from-tera1-1
〜〜出力省略〜〜
Enter a value:
 ↑ yesを入力してEnter
〜〜出力省略〜〜
Destroy complete! Resources: 1 destroyed.
```

② CVO削除

```shell:実行例
$ terraform destroy -target=netapp-cloudmanager_cvo_gcp.cl-cvo-gcp-from-tera1
〜〜出力省略〜〜
Enter a value:
 ↑ yesを入力してEnter
〜〜出力省略〜〜
Destroy complete! Resources: 1 destroyed.
```

③ Connector削除

```shell:実行例
$ terraform destroy -target=netapp-cloudmanager_connector_gcp.cl-occm-gcp
〜〜出力省略〜〜
Enter a value: 
 ↑ yesを入力してEnter
〜〜出力省略〜〜
Destroy complete! Resources: 1 destroyed.

$ terraform state list
```
terraform state listコマンドで出力がなくなっていることを確認します。
[Cloud Manager画面] (https://cloudmanager.netapp.com/)、[GCP Console](https://console.cloud.google.com/?hl=ja)からも、CVO/Connectorが削除されていることが確認できます。

## まとめ
Terraformを利用した Cloud Volumes Ontap(CVO)デプロイ の 実行例を紹介させていただきました。

terraformでデプロイ・削除を自動化しておくことで、クラウドのオンデマンド性・俊敏性のメリットの効果を高めてより便利に利用可能になってくるかと思います。興味のある方は是非試してみてください。

なお、今回の記事では省略しましたが、Cloud Volumes Ontap(CVO)の紹介や手動でのデプロイ手順等 を[動画](https://www.youtube.com/hashtag/cloudvolumesontap)でも公開しています。ご興味ありましたら是非参考にしてください。