LoginSignup
5
3

More than 1 year has passed since last update.

Terraformを使ってROSA(Red Hat OpenShift Service)をデプロイしてみる

Last updated at Posted at 2022-11-21

はじめに

OpenShiftのマネージドサービスであるROSA(Red Hat OpenShift Service on AWS)をデプロイするにあたり、他のAWSリソースと同様にTerraformを使ってIaC化できると嬉しいなーと思い調べたところ、Custom Providerとしてterraform-provider-ocmが公開されていたので、こちらを使ってROSAをデプロイしてみようと思います。

注意

  • リポジトリのREADMEにも記載がありますが、terraform-provider-ocmは現在 0.1 であり、機能は完全ではなく、下位互換性の保証はないことをご理解のうえ利用ください。

前提条件

  • MacOS
  • 各種CLIをインストール済み
    • aws
    • terraform
    • oc
    • rosa
    • go
  • terraform-provider-ocm : Release 0.1.6
  • Administrator Access権限を持つIAMユーザーでaws-cliのconfig設定が完了している

手順

ROSAデプロイに必要なRoleとPolicyを作成

残念ながら、Terraform実行だけではROSAの構築はできません。まずはAWS環境にROSAのデプロイに必要なIAM RoleとIAM Policyを作成します。
今回は公式ドキュメントを参考に、デフォルト設定でRole/Policyを準備します。

以下のコマンドによって必要なリソースを一気に作成します。

rosa create account-roles --prefix ManagedOpenShift --mode auto --yes

Providerの準備

次に対象のProviderを準備します。

git clone https://github.com/openshift-online/terraform-provider-ocm.git
cd terraform-provider-ocm

ProviderをBuildします。

make install

するとディレクトリ配下に.terraform.dが作成されています。中身を見るとProviderが格納されていることがわかります。

tree .terraform.d
.terraform.d
└── plugins
    └── localhost
        └── openshift-online
            └── ocm
                └── 0.1.6
                    └── darwin_arm64
                        └── terraform-provider-ocm

tfファイルの準備

ROSAクラスターを作成するためのtfファイルを準備していきます。

.terraformrc

今回はローカルのProviderを使うため、TerraformのConfigファイルに設定を追加します。
設定ファイルはホームディレクトリ配下に作成します。

vi ~/.terraformrc
.terraformrc
provider_installation {
  fileystem_mirror {
    path    = "<work-directory>/terraform-provider-ocm/.terraform.d/plugins"
    include = ["localhost/*/*"]
  }
  direct {
    exclude = ["localhost/*/*"]
  }
}

少し記載内容を補足します。

  • filesystem_mirror

    • オリジンのレジストリ(defaultではregistry.terraform.io)とは異なる場所からProviderをインストールしたい時に使用します。今回はlocalhostを指定したProviderは<work-directory>/terraform-provider-ocm/.terraform.d/plugins配下のProviderを参照するよう設定します。<work-directory>には今回の作業ディレクトリを設定します。
  • direct

    • directはオリジンのレジストリにアクセスするProviderの条件を指定します。ここではlocalhost/*/*以外を指定したProviderは全てregistry.terraform.ioを参照しにいくように設定します。

provider.tf

次にProviderを指定します。
GitHubのサンプルコードではsourceがopenshift-online/ocmとなっていますが、localhostの指定を追記する必要があります。
OCMのトークンやAWS接続情報はセキュリティの観点から別ファイルに切り出しています。

provider.tf
terraform {
  required_providers {
    ocm = {
      version = ">= 0.1"
      source  = "localhost/openshift-online/ocm"
    }
    aws = {
      source  = "hashicorp/aws"
      version = ">= 4.20.0"
    }
  }
}

provider "ocm" {
  token = local.token
  url   = local.url
}

provider "aws" {
  access_key = local.access_key
  secret_key = local.secret_key
  region     = local.region
}

credentials.tf

シークレット情報をこのファイルで定義します。
ocmのtokenについてはOpenShift Cluster Manager API Tokenにて「Load Token」をクリックすると取得できます。

vi credentials.tf
credentials.tf
locals {
  access_key = "<AWSのアクセスキー>"
  secret_key = "<AWSのシークレットキー>"
  region     = "us-east-1"
  token      = "<OCMのトークン>"

ocm_cluster.tf

あとはサンプルコードを参照に、多少手を加えつつクラスター構築用のファイルを作成します。
今回はus-eas-1に3AZ構成のROSAクラスターを構築します。
まずはocm_cluster.tfです。

ocm_cluster.tf
locals {
  sts_roles = {
    role_arn = "arn:aws:iam::${data.aws_caller_identity.current.account_id}:role/ManagedOpenShift-Installer-Role",
    support_role_arn = "arn:aws:iam::${data.aws_caller_identity.current.account_id}:role/ManagedOpenShift-Support-Role",
    operator_iam_roles = [
      {
        name =  "cloud-credential-operator-iam-ro-creds",
        namespace = "openshift-cloud-credential-operator",
        role_arn = "arn:aws:iam::${data.aws_caller_identity.current.account_id}:role/${local.operator_role_prefix}-openshift-cloud-credential-operator-cloud-c",
      },
      {
        name =  "installer-cloud-credentials",
        namespace = "openshift-image-registry",
        role_arn = "arn:aws:iam::${data.aws_caller_identity.current.account_id}:role/${local.operator_role_prefix}-openshift-image-registry-installer-cloud-cr",
      },
      {
        name =  "cloud-credentials",
        namespace = "openshift-ingress-operator",
        role_arn = "arn:aws:iam::${data.aws_caller_identity.current.account_id}:role/${local.operator_role_prefix}-openshift-ingress-operator-cloud-credential",
      },
      {
        name =  "ebs-cloud-credentials",
        namespace = "openshift-cluster-csi-drivers",
        role_arn = "arn:aws:iam::${data.aws_caller_identity.current.account_id}:role/${local.operator_role_prefix}-openshift-cluster-csi-drivers-ebs-cloud-cre",
      },
      {
        name =  "cloud-credentials",
        namespace = "openshift-cloud-network-config-controller",
        role_arn = "arn:aws:iam::${data.aws_caller_identity.current.account_id}:role/${local.operator_role_prefix}-openshift-cloud-network-config-controller-c",
      },
      {
        name =  "aws-cloud-credentials",
        namespace = "openshift-machine-api",
        role_arn = "arn:aws:iam::${data.aws_caller_identity.current.account_id}:role/${local.operator_role_prefix}-openshift-machine-api-aws-cloud-credentials",
      },
    ]
    instance_iam_roles = {
      master_role_arn = "arn:aws:iam::${data.aws_caller_identity.current.account_id}:role/ManagedOpenShift-ControlPlane-Role",
      worker_role_arn = "arn:aws:iam::${data.aws_caller_identity.current.account_id}:role/ManagedOpenShift-Worker-Role"
    },
  }
}

data "aws_caller_identity" "current" {
}

resource "ocm_cluster_rosa_classic" "rosa_sts_cluster" {
  name                 = local.ocm_cluster.name
  cloud_region         = local.region
  aws_account_id       = data.aws_caller_identity.current.account_id
  multi_az             = local.ocm_cluster.multi_az
  compute_nodes        = local.ocm_cluster.compute_nodes
  compute_machine_type = local.ocm_cluster.compute_machine_type
  availability_zones   = local.ocm_cluster.availability_zones
  properties = {
    rosa_creator_arn = data.aws_caller_identity.current.arn
  }
  sts  = local.sts_roles
}

module operator_roles {
  source  = "./terraform-provider-ocm/modules/operator_roles"

  cluster_id = ocm_cluster_rosa_classic.rosa_sts_cluster.id
  operator_role_prefix = local.operator_role_prefix
  account_role_prefix = local.account_role_prefix
  rh_oidc_provider_thumbprint = ocm_cluster_rosa_classic.rosa_sts_cluster.sts.thumbprint
  rh_oidc_provider_url = ocm_cluster_rosa_classic.rosa_sts_cluster.sts.oidc_endpoint_url
}

いくつか記載内容を補足します。

locals

localsでは、ROSAに必要な operator roleの情報が記載されています。こちらはサンプルコードをベースに、変数情報をvarでなくlocalから取得するように変更しています。ここはユーザー側で変更する箇所ではないので実行用のtfファイルに含めています。

data.aws_caller_identity

現在aws cliでログインしているIAMユーザーの情報を取得しています。ROSAクラスターを構築するocm_cluster_rosa_classicresourceで使います。そのため、terraform applyの前にaws configureでログイン処理を実行しておく必要があります。

ocm_cluster_rosa_classic

ROSAクラスターの構築を実行します。ただ実際に行なっているのは「OpenShift Cluster Manager」に対してROSAの構築をAPI実行しているだけなので、Terraformの実行処理はすぐに終わります。クラスターの構築状況はOpenShift Cluster Manager側で確認する形になります。


local.tf

このファイルではユーザー側で変更する可能性のある値を管理します。

local.tf
locals {
  cluster_name = "rosa-demo-01"

  operator_role_prefix = "ManagedOpenShift"
  account_role_prefix  = "ManagedOpenShift"

  ocm_cluster = {
    name                 = local.cluster_name
    multi_az             = true
    compute_nodes        = 3
    compute_machine_type = "m5.xlarge"
    availability_zones = [
      "us-east-1a",
      "us-east-1b",
      "us-east-1c",
    ]
  }
}

その他にもNW周りで様々な値を設定可能ですが、今回は割愛します。設定可能なパラメータはproviderのソースコードを読み解くと見えてくるかと思います。

operator_role_prefixaccount_role_prefixは手順の最初に実行したrosa create account-rolesでオプション指定した --prefixの値と合わせてください。
また、multi_azをtrueにした場合は、compute_nodesの値を3の倍数で指定する必要がありますのでご注意ください。

実行

これで実行準備が完了しました。ディレクトリ階層は以下のようになっています。

tree -L 1
.
├── credentials.tf
├── local.tf
├── ocm_cluster.tf
├── provider.tf
└── terraform-provider-ocm

terraform applyを実行します。

terraform init
terraform apply

デプロイ確認

OpenShift Cluster Managerでクラスター情報を確認できます。
deploy_rosa.png

おわりに

今回はTerraformを使ったROSAクラスターのデプロイの自動化を試してみました。
rosaは専用のコマンドが用意されているためシェルスクリプトでも自動化は可能ですが、複数のクラスターをパラメータを変更しながら繰り返しデプロイする運用を想定すると、TerraformやAnsibleなど、設定パラメータを切り出して管理できるIaCツールを活用した方が運用面でのメリットは大きいかと思います。
クラスター削除の際もTerraformではterraform destroyをたたくことで実行可能ですので、削除用のスクリプトを作る必要もありません。
What's new in Red Hat OpenShift 4.11を見ると、Mid TermにてROSAのterraform providerがリリースされるとのことなので、まもなくこのProviderが公式に使えるようになるのではと思います。
v1.0が出た際はまた手順を記事にしてみますので乞うご期待ください!

5
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
3