Terraform を使って ROSA HCP をデプロイする (Official Sample 版)

# 0.はじめに

`ROSA` には `Classic` ( Control Plane node がユーザーの AWS アカウント内に作られるもの) と、`HCP` (Hosted Control Plane: Compute Node だけがユーザーのAWSアカウントに作られるもの）の2種類のタイプがあります。

この記事は、`ROSA HCP` に関する記事です。
過去に ROSA クラスターを作成していない綺麗な環境での実行を想定しています。

ROSA は CLIでも作成できるのですが、Enterprise 向けの製品だけあって、オプションが山のようにあります。
Terraform を使う事で、いつも使うオプション構成で気軽にクラスターをデプロイしたり、削除する事が可能です。


この記事の Official ドキュメントのサンプルは、`ROSA HCP`環境の作成のみ特化しており、シンプルで見やすいので、独自の`terraform` スクリプトを作成する場合は、こちらをベースとする事をおすすめします。


# 1. 各種 CLI を準備する

・AWS CLI コマンド
・git コマンド
・terraform コマンド
・rosa / oc コマンド
・jq コマンド

が構成されている事が前提です。[こちらの](https://yuhkih.github.io/mcs-docs/docs/rosa-hcp/create-delete/rosa-hcp-prepare/) ガイドを参考にしてください。

また、クラスターを作成するために、トークンを `Red Hat` のサイトから取得する必要があります。アカウントの作成は無料になっているので、アカウントを持ってない場合は、[こちら](https://access.redhat.com/)から作成します。

# 2. サンプルの設定ファイルをダウンロードする

いろいろ設定ファイル(.tf)を幾つか手書きする必要があるのですが、面倒な人向けに[公式ドキュメント](https://docs.openshift.com/rosa/rosa_hcp/terraform/rosa-hcp-creating-a-cluster-quickly-terraform.html)に載っているサンプルファイルを、**ほぼ**そのまま書き起こしたものを用意しました。

サンプルは、以下のコマンドでダウンロードできます。

```
git clone https://github.com/yuhkih/rosa-hcp-terraform
```

ダウンロードしたディレクトリに移動します。

```
cd rosa-hcp-terraform
```

このサンプルは、公式ドキュメント版を以下の点で変更しています。

・クラスターが作成されるデフォルト・リージョンを `us-east-2` から  `ap-northeast-1` に
・デフォルトのクラスター構成を`Multi AZ` から `Single AZ` に。Compute Node 数は`2`に。
・デフォルトで、クラスター用の `VPC` を作成するように。
・デフォルトで、`Public` クラスターが作成されるように。
・インストールバージョンを、`4.16.3` に。

これらのカスタマイズは、1) 日本向け、2) テスト用にクラスターが最小に、3) 作成時にできるだけ入力を求められないように、4) すぐに触れるように。という観点での、デフォルト設定の変更になります。

:::note warn
ROSA のインストールバージョンは、時間が経つとサポートされないバージョンになる可能性があります。その際は `terraform` の実行が失敗するので、適宜アップデートする必要があります。`rosa` の install 可能なバージョンは、`rosa list version` で確認できます。
インストールするバージョンは、`variables.tf`内で指定しています。
:::

rosa の最新 Version は、`rosa list version` で確認できます。

```
$ rosa list version
VERSION    DEFAULT    AVAILABLE UPGRADES
4.17.3     no
4.17.2     no         4.17.3
4.17.1     no         4.17.2, 4.17.3
4.17.0     no         4.17.1, 4.17.2, 4.17.3
...
```

`variables.tf` の中を検索し、バージョンを探して、現在､使用可能なバージョンに修正してください。

# 3. [Option] 作成される Compute Node の数を変更する。

この手順はオプションです。慣れて来たら試して見てください。

この terraform スクリプトはデフォルトでは、以下のような Single AZ の Public に公開された ROSA (HCP)クラスターを作成します。ROSA (HCP) の 最小構成は、Compute Node は2本になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99425/84d98bff-6959-c013-a30f-6659a30369bc.png)

terraform の `variables.tf` を編集する事でインストール内容をカスタマイズできます。

`variables.tf` の以下の部分で、インストールする OpenShift のバージョンを変更できます。

```
variable "openshift_version" {
  type        = string
  default     = "4.16.3"
  description = "Desired version of OpenShift for the cluster, for example '4.14.20'. If version is greater than the currently running version, an upgrade will be scheduled."
}
```


作成するCluster の`Multi AZ`か`Single AZ` の選択や、`Compute Node` の本数を指定できます。

```
variable "multi_az" {
  type        = bool
  description = "Multi AZ Cluster for High Availability"
  default     = false
}

variable "worker_node_replicas" {
  default     = 2
  description = "Number of worker nodes to provision. Single zone clusters need at least 2 nodes, multizone clusters need at least 3 nodes"
  type        = number
}
```

## 4. ROSA の token を取得する



ROSA クラスターを作成するために [https://console.redhat.com/openshift/token](https://console.redhat.com/openshift/token) から Token を取得します。以下の部分をコピーします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99425/77da49db-aced-e380-76f3-c9ebfc1cf740.png)

取得した Token を変数にセットします。

```
export RHCS_TOKEN=<上記のページからコピーした Token>
```

:::note information
既に `rosa login` でログイン済みの場合は、以下の方法で、ローカルに保存されている Token を使って環境変数をセットできます。

**Mac**
```
export RHCS_TOKEN="$(jq -r .refresh_token ~/Library/Application\ Support/ocm/ocm.json)"
```
**Linux**
```
export RHCS_TOKEN="$(jq -r .refresh_token ~/.config/ocm/ocm.json)"
```
:::

## 5. ROSA Cluster の作成

terraform を初期化します。
```
terraform init
```

もしファイルを編集した場合は、`validate`で編集ミスが無いか確認します。

```
terraform validate
```

以下のコマンドでプランを生成します。

```
terraform plan -out hcp.plan
```

以下でクラスターが作成が開始されます。(途中で確認を求められるので `yes`と入力します)

```
terraform apply hcp.plan
```

途中経過のログが流れはじめ、20-30分ほど待つと完了するはずです。


正常に完了したら、以下のコマンドでクラスター名を取得して変数にセットします。
`jq` コマンドが無い場合は、普通に `rosa list clusters` でクラスター名を表示させてからコピーしてセットします。

```
CLUSTER_NAME=$(rosa list clusters -o json | jq '.[0].name' | sed 's/"//g') 
```

変数がセットされてるか確認します。

```
echo $CLUSTER_NAME
```

以下のコマンドでクラスター用の管理者ユーザー (`cluster-admin` という名前になります）を作成します。
```
rosa create admin -c $CLUSTER_NAME
```

上記のコマンドを実行すると標準出力にログイン用のコマンドストリングが表示されるので、それを使ってログイン可能です。(ログインできるようになるまで数分かかります `401`が出る場合は暫く待ちます）

<details><summary>出力例</summary>

```
$ rosa create admin -c $CLUSTER_NAME
I: Admin account has been added to cluster 'rosa-a42u7q'.
I: Please securely store this generated password. If you lose this password you can delete and recreate the cluster admin user.
I: To login, run the following command:

   oc login https://api.rosa-a42u7q.cmq3.p3.openshiftapps.com:443 --username cluster-admin --password L99jG-VZZKy-NNiCv-YmWnn

I: It may take several minutes for this access to become active.
$
```
</details>

## 5. ROSA の基本コマンド

ログイン ( 前段で実行した `rosa create admin -c $CLUSTER_NAME` の出力に初期 `userid` / `password` が出ています）

```
oc login https://api.rosa-22aoom.6qk7.p1.openshiftapps.com:6443 --username cluster-admin --password abcdef-1234556-pFV3Y-g45BV
```

コンソールの URL の表示 (CLIと同じ UserID/パスワードでログインできます）

```
oc whoami --show-console
```



## 6. ROSA クラスターの削除

以下で ROSA クラスターを削除できます。

```
terraform destroy
```

削除するリソースをリストした後、確認を求められるので `yes` と入力します。

```
...
...
Do you really want to destroy all resources?
  Terraform will destroy all your managed infrastructure, as shown above.
  There is no undo. Only 'yes' will be accepted to confirm.

  Enter a value: yes
```