【備忘】CLIベースでサクッとROSA with HCPを構築する

# はじめに
検証目的で新しく払い出したAWSアカウントに対して、極力CLIベースでそれなりのROSA with HCPクラスターを構築したい。

# 前提条件
* ROSA with HCP v4.17.20
* Macbook
  * 事前にocコマンド、rosaコマンド、terraformをインストールしておく
    * oc: 4.17.20
    * rosa: 1.2.46
    * terraform: 1.9.8
* AWSアカウント
  * AdministratorAcces権限を持つIAMユーザーのキーとシークレット

# 手順
* ROSAの有効化
  * https://console.aws.amazon.com/rosa から「使用を開始」を選択してROSA with HCPを有効化する
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/419286/f5fccf12-eca1-0868-7025-36e803ccb7c7.png)
  * Red Hatアカウントと自身のAWSアカウントをConnectする
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/419286/815cd2c8-34e5-75c5-7f2b-9c5e60c55360.png)


* AWS CLIの設定
```
aws configure

export AWS_ACCESS_KEY_ID="aws account id"
export AWS_SECRET_ACCESS_KEY="aws secret key"
export AWS_DEFAULT_REGION="ap-northeast-1"
```

* ROSA init
```
rosa init
```

* ocm-roleを作成
  * 今回はOIDCプロバイダーも全部作って欲しいから、`--admin`オプションを追加
```
rosa create ocm-role --admin
```

* user-roleを作成
```
rosa create user-role
```

* account-rolesを作成
```
rosa create account-roles --hosted-cp --mode auto
```

* OIDC Providerを作成
```
rosa create oidc-config
```

* OIDC ProviderのConfig IDを変数に格納
  * 直前のコマンドの実行結果にIDが出力されているため、それを入力
```
export OIDC_CONFIG_ID="OIDCのID"
```

* Operator Rolesを作成
  * Operator RolesのPrefix（任意の文字列）を変数に格納しておく
```
export OPERATOR_ROLE_PREFIX="ほげほげ"

rosa create operator-roles --prefix $OPERATOR_ROLE_PREFIX --oidc-config-id $OIDC_CONFIG_ID
```


* VPCなどを作成
  * main.tfを作成（以下をそのままコピペ）
```main.tf
provider "aws" {
}

variable "cluster_name" {
  type    = string
}

variable "aws_region" {
  type    = string
}

locals {

  vpc = {
    name = "${var.cluster_name}-vpc"
    cidr = "10.0.0.0/16"

    public_subnets = [
      "10.0.0.0/20",
      "10.0.16.0/20",
      "10.0.32.0/20",
    ]

    private_subnets = [
      "10.0.128.0/20",
      "10.0.144.0/20",
      "10.0.160.0/20",
    ]

    tags = {
      Terraform    = "true"
      service      = "ROSA"
      cluster_name = var.cluster_name
    }
  }
}

data "aws_caller_identity" "current" {}

data "aws_availability_zones" "available" {}

module "vpc" {
  source = "terraform-aws-modules/vpc/aws"

  name                 = local.vpc.name
  cidr                 = local.vpc.cidr
  enable_dns_hostnames = true

  azs = [
    data.aws_availability_zones.available.names[0],
    data.aws_availability_zones.available.names[1],
    data.aws_availability_zones.available.names[2],
  ]

  public_subnets  = local.vpc.public_subnets
  private_subnets = local.vpc.private_subnets

  enable_nat_gateway     = true
  single_nat_gateway     = false
  one_nat_gateway_per_az = true

  tags = local.vpc.tags
}

resource "local_file" "subnet_ids" {
  content  = join(",", concat(module.vpc.public_subnets, module.vpc.private_subnets))
  filename = "subnet_ids.txt"
}

output "vpc_cidr_block" {
  value = module.vpc.vpc_cidr_block
}

output "azs" {
  value = module.vpc.azs
}

output "aws_region" {
  value = var.aws_region
}
```
  
  * Terraform実行
    * クラスター名を変数に格納しておく
```
export CLUSTER_NAME="ROSAクラスター名"

terraform init
terraform apply -var "cluster_name=$CLUSTER_NAME" -var "aws_region=$AWS_DEFAULT_REGION"
```

* 作成したSubnet IDを変数に格納
```
export SUBNET_IDS=$(cat subnet_ids.txt)
```

* `cluster-admin`ユーザーのパスワードを設定
```
export CLUSTER_ADMIN_PASSWORD="password"
```

* ROSAクラスター作成
```
export ROSA_VERSION="4.17.20"
rosa create cluster --cluster-name $CLUSTER_NAME --sts \
    --operator-roles-prefix $OPERATOR_ROLE_PREFIX \
    --oidc-config-id $OIDC_CONFIG_ID \
    --region $AWS_DEFAULT_REGION \
    --version $ROSA_VERSION \
    --min-replicas 3 \
    --max-replicas 3 \
    --compute-machine-type m6a.xlarge \
    --machine-cidr 10.0.0.0/16 \
    --service-cidr 172.30.0.0/16 \
    --pod-cidr 10.128.0.0/14 \
    --host-prefix 23 \
    --subnet-ids $SUBNET_IDS \
    --enable-autoscaling \
    --create-admin-user \
    --cluster-admin-password $CLUSTER_ADMIN_PASSWORD \
    --hosted-cp
```