IAMユーザー・アクセスキーを作成せずにRed Hat OpenShift Service on AWS(ROSA)クラスターを作成してみた

2021.11.20

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

Red Hat OpenShift Service on AWS(ROSA;ロサ)はAWSで提供されるフルマネージドなOpenShiftサービスです。

ROSAでは

  • ユーザー
  • Red Hat

それぞれが、AWSリソースを操作し、そのための認証情報を払い出す必要があります。

今回はIAMユーザーの作成や永続的なアクセスキーの管理が厳格な環境でもスムーズにROSAを導入できるよう、 IAMユーザー・アクセスキーを作成せずに、ROSAクラスターを作成する方法を紹介します。

1. ユーザーによるAWS操作

1つ目は自明です。

ROSAのCLIツールで ROSA クラスターを構築します。 裏では、AWS CLIが呼び出され、クラスターに必要な各種AWSリソースを作成します。

その代表格の一つは、Red Hat が ROSA クラスターを操作できるようにするための IAM リソースです。

EC2にインスタンスプロファイルをアタッチし、アクセスキー無しに AWS CLIを実行できるようにします。

2. Red Hat によるROSAクラスターへのアクセス

ROSA の大きな特徴の一つは、Red HatがAWS環境にアクセスし、クラスターの作成や運用業務を行うことです。

Red Hat OpenShift Service on AWS (ROSA) provides a model that allows Red Hat to deploy clusters into a customer’s existing Amazon Web Service (AWS) account. https://docs.openshift.com/rosa/rosa_getting_started/rosa-aws-prereqs.html

以前はIAMユーザ(osdManagedAdminなど)・アクセスキーを発行して、クラスターへアクセスさせていましたが、現在はIAMロール・STSを使った一時トークンにも対応しています。

後者でクラスターを作成します。

IAMユーザー方式とIAMロール方式はクラスター作成時にオプションで指定します。

IAMロール・STS方式の場合、--sts オプションを渡すだけです。

$ rosa create cluster \
  --cluster-name YOUR-CLUSTER-NAME \
  --sts \
  --mode auto --yes

IAMユーザーを作成せずにROSAクラスターを作ってみる

以上を踏まえ、IAMユーザー・アクセスキーを作成せずに、ROSAクラスターを作成します。

全体図

1. EC2用IAMロールの作成

ROSA/AWS CLIなどのコマンドライン操作は EC2 内で行います。

アクセスキー無しにAWSのAPIを実行できるよう、EC2にインスタンスプロファイルをアタッチします。

そのIAMロールを作成します。

ドキュメントによると AdministratorAccess ポリシーが必要です。

This user has Programmatic access enabled and the AdministratorAccess policy attached to it. https://docs.openshift.com/rosa/rosa_getting_started/rosa-config-aws-account.html

  • パーミッション : AdministratorAccess ポリシー
  • Trusted relationships : エンティティ ec2.amazonaws.com を信頼

のIAMロールを作成します。

2. CLI実行用EC2の作成

VPC内にEC2インスタンスを起動します。

AMIにはAWS CLIとSSMエージェントがデフォルトでインストールされている Amazon Linux 2を利用します。

パブリック・プライベートサブネットがあり、NAT経由でインターネットに出られるネットワーク構成の場合、プライベートサブネットに配置します。

EC2起動ウィザードの「Step 3: Configure Instance Details」において IAM role に手順1で作成したIAMロールを指定します。

EC2 には SSM セッションマネージャーでアクセスし、SSH アクセスなどは発生しないため、セキュリティグループのインバウンドルールは不要です。

3. EC2 内にSSMセッションマネージャーでアクセス

EC2インスタンス起動後、SSM セッションマネージャーでシェルアクセスします。

インスタンスを選択し、「Connect」→「Session Manager」からシェル画面に移動します。

EC2デフォルトの ec2-user に変わります。

sh-4.2$ sudo su - ec2-user
Last login: Thu Nov 18 12:23:39 UTC 2021 on pts/0
$

セッションマネージャーの利用者には、少なくとも以下のアクションを許可してください。

  • ssm:StartSession
  • ssm:TerminateSession
  • ssm:ResumeSession

4. ROSA を有効化

AWSコンソールにアクセスし、ROSA サービスページに移動し、「Enable Openshift」ボタンをクリックして ROSA を有効にします。

5. 各種 CLI ツールのインストール

ROSA CLI の設定

ROSA が有効化されると、ROSA CLI のダウンロードリンクが表示されます。

ダウンロード用URLをコピーし、EC2 内にダウンロードします。

$ wget https://mirror.openshift.com/pub/openshift-v4/clients/rosa/latest/rosa-linux.tar.gz

展開すると、 rosa コマンドがあるため、PATH の通っているディレクトリに移動します。

$ tar zxfv rosa-linux.tar.gz
rosa
$ sudo cp rosa /usr/local/bin/
$ rosa version
1.1.5

ROSA との疎通

$ rosa login コマンドを叩き、Red Hat のポータルサイトにアクセスし、トークンを取得し、認証します。

$ rosa login
To login to your Red Hat account, get an offline access token at https://console.redhat.com/openshift/token/rosa
? Copy the token and paste it here:  ***

: Logged in as 'foo@example.jp' on 'https://api.openshift.com'

AWS CLI の設定

ROSA CLI は内部的に AWS CLI を呼び出しています。

$ rosa whoami
E: failed to create AWS client: Region is not set. Use --region to set the region

パット見ではわかりにくいですが、このエラーは AWS CLI のリージョン設定不足に起因します。

$ aws ec2 describe-instances
You must specify a region. You can also configure your region by running "aws configure".

AWS CLI のリージョン設定をします。

$ aws configure set default.region ap-northeast-1

デプロイ先リージョンに合わせて ap-northeast-1(東京) の部分を変更して下さい。

この状態でもう一度 $ rosa whoami すると、成功します。

$ rosa whoami
AWS Account ID:               123
AWS Default Region:           eu-west-1
AWS ARN:                      arn:aws:iam::123:role/EC2Rosa
OCM API:                      https://api.openshift.com
OCM Account ID:               xxx
OCM Account Name:             John Smith
OCM Account Username:         foo@example.jp
OCM Account Email:            foo@example.jp
OCM Organization ID:          XXX
OCM Organization Name:        CLASSMETHOD,INC.
OCM Organization External ID: XXX

AWSのクオータに引っかかっていないことを確認します。

$ rosa verify quota
I: Validating AWS quota...
I: AWS quota ok. If cluster installation fails, validate actual AWS resource usage against https://docs.openshift.com/rosa/rosa_getting_started/rosa-required
-aws-service-quotas.html

OpenShift CLI の設定

最後に OpenShiftのCLIツール oc/kubectl をインストールします。

rosa コマンド経由でダウンロードし、展開します。

$ rosa download oc
I: Verifying whether OpenShift command-line tool is available...
W: OpenShift command-line tool is not installed.
Run 'rosa download oc' to download the latest version, then add it to your PATH.
...
I: Successfully downloaded openshift-client-linux.tar.gz

$ tar zxfv openshift-client-linux.tar.gz
README.md
oc
kubectl

$ sudo cp kubectl oc /usr/local/bin/

$ oc version
Client Version: 4.9.7

正しくインストールされていることを確認します。

$ rosa verify openshift-client
I: Verifying whether OpenShift command-line tool is available...
I: Current OpenShift Client Version: 4.9.7

6. Red Hat向けIAMロールを作成

本アカウントでSTS ベースのROSAを初めて作成する場合、次のコマンドを実行し、IAMロールを作成します。

$ rosa create account-roles --mode auto --yes
I: Logged in as 'foo@example.jp' on 'https://api.openshift.com'
I: Validating AWS credentials...
I: AWS credentials are valid!
...
I: Creating account roles
I: Creating roles using 'arn:aws:iam::123:role/EC2Rosa'
I: Created role 'ManagedOpenShift-Installer-Role' with ARN 'arn:aws:iam::123:role/ManagedOpenShift-Installer-Role'
I: Created role 'ManagedOpenShift-ControlPlane-Role' with ARN 'arn:aws:iam::123:role/ManagedOpenShift-ControlPlane-Role'
I: Created role 'ManagedOpenShift-Worker-Role' with ARN 'arn:aws:iam::123:role/ManagedOpenShift-Worker-Role'
I: Created role 'ManagedOpenShift-Support-Role' with ARN 'arn:aws:iam::123:role/ManagedOpenShift-Support-Role'
I: Created policy with ARN 'arn:aws:iam::123:policy/ManagedOpenShift-openshift-machine-api-aws-cloud-credentials'
I: Created policy with ARN 'arn:aws:iam::123:policy/ManagedOpenShift-openshift-cloud-credential-operator-cloud-crede'
I: Created policy with ARN 'arn:aws:iam::123:policy/ManagedOpenShift-openshift-image-registry-installer-cloud-creden'
I: Created policy with ARN 'arn:aws:iam::123:policy/ManagedOpenShift-openshift-ingress-operator-cloud-credentials'
I: Created policy with ARN 'arn:aws:iam::123:policy/ManagedOpenShift-openshift-cluster-csi-drivers-ebs-cloud-credent'
I: To create a cluster with these roles, run the following command:
rosa create cluster --sts

6行目から、EC2にアタッチしたIAMロールでリソース作成していることがわかります。

また、7行目以降から、ROSAクラスター向けのIAMロール・ポリシーを作成しているのがわかります。

次のRed Hat のブログから、各ロールの用途を抜粋します。

Creating a ROSA Cluster Using STS

ロール名 信頼されたエンティティ 用途
ManagedOpenShift-ControlPlane-Role AWS Service: ec2 コントロールプレーンEC2用
ManagedOpenShift-Worker-Role AWS Service: ec2 ワーカーノードEC2用
ManagedOpenShift-Installer-Role Red HatのAWSアカウントID クラスターのインストール・削除用
ManagedOpenShift-Support-Role Red HatのAWSアカウントID Red Hat SREチーム用

※ブログ内の「ManagedOpenShift-IAM-Role」を「ManagedOpenShift-Installer-Role」に読み替えています。

気になるのは、SRE チームが利用する ManagedOpenShift-Support-Role ロールに許可されたアクションです。

ポリシー ManagedOpenShift-Support-Role-Policy を確認すると、

  • CloudTrail
  • CloudWatch
  • EC2
  • elasticloadbalancing
  • Route53
  • S3

に対する操作が許可されていました。

そのほとんどは参照系アクションですが、EC2 だけは以下の更新系アクションが許可されていました。

  • スナップショット
  • インスタンスの起動・再起動・ターミネート

IAMポリシーのリソースの記述は "Resource": "*" とあるため、理論的には非ROSAクラスターのEC2も操作可能です。

7. STS ベースのROSAクラスターを作成

ようやく本題です。

STS ベースのROSAクラスターを作成するには $ rosa create cluster コマンドに --sts オプションを渡します。

$ rosa create cluster \
  --cluster-name my-rosa-cluster \
  --sts \
  --mode auto --yes
I: Using arn:aws:iam::123:role/ManagedOpenShift-Installer-Role for the Installer role
I: Using arn:aws:iam::123:role/ManagedOpenShift-ControlPlane-Role for the ControlPlane role
I: Using arn:aws:iam::123:role/ManagedOpenShift-Worker-Role for the Worker role
I: Using arn:aws:iam::123:role/ManagedOpenShift-Support-Role for the Support role
I: Creating cluster 'my-rosa-cluster'
...

40分程度待ち、クラスターのステートが installing から ready になれば、インストールの完了です。

$ rosa list clusters
ID                      NAME             STATE
xxx                     my-rosa-cluster  ready

STS 方式でクラスター作成した場合、クラスター固有の運用ロールも同時に作成されます。

$ rosa describe cluster -c my-rosa-cluster
...
Operator IAM Roles:
 - arn:aws:iam::123:role/my-rosa-cluster-aaaa-openshift-ingress-operator-cloud-credential
 - arn:aws:iam::123:role/my-rosa-cluster-aaaa-openshift-cluster-csi-drivers-ebs-cloud-cre
 - arn:aws:iam::123:role/my-rosa-cluster-aaaa-openshift-machine-api-aws-cloud-credentials
 - arn:aws:iam::123:role/my-rosa-cluster-aaaa-openshift-cloud-credential-operator-cloud-c
 - arn:aws:iam::123:role/my-rosa-cluster-aaaa-openshift-image-registry-installer-cloud-cr
...

詳細は次のドキュメントを参照ください。

Cluster-specific Operator IAM role reference

8. 管理ユーザーの作成

クラスターの管理者を作成します。

$ rosa create admin --cluster=my-rosa-cluster
W: It is recommended to add an identity provider to login to this cluster. See 'rosa create idp --help' for more information.
I: Admin account has been added to cluster 'my-rosa-cluster'.
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.my-rosa-cluster.xxx.p1.openshiftapps.com:6443 --username cluster-admin --password zzz

I: It may take up to a minute for the account to become active.

oc コマンドでクラスターにログインします。

rosa create のコマンド結果には I: It may take up to a minute for the account to become active. とありますが、 私の場合、ログインが成功するまで、5分程度かかりました。

ログインが成功するまで、気長に待ちましょう。

$ oc login https://api.my-rosa-cluster.xxx.p1.openshiftapps.com:6443 --username cluster-admin --password zzz
The server uses a certificate signed by an unknown authority.
You can bypass the certificate check, but any data you send to the server could be intercepted by others.
Use insecure connections? (y/n): yes

Login successful.

You have access to 88 projects, the list has been suppressed. You can list all projects with 'oc projects'

Using project "default".
Welcome! See 'oc help' to get started.

9. クラスターを削除

ROSAの検証が完了したら、クラスターを削除します。

まずは、クラスターを削除します。

$ rosa delete cluster --cluster <cluster-name>
? Are you sure you want to delete cluster my-rosa-cluster? Yes
I: Cluster 'my-rosa-cluster' will start uninstalling now
I: Your cluster 'my-rosa-cluster' will be deleted but the following object may remain
I: Operator IAM Roles: - arn:aws:iam::123:role/my-rosa-cluster-t5w0-openshift-ingress-operator-cloud-credential
 - arn:aws:iam::123:role/my-rosa-cluster-t5w0-openshift-cluster-csi-drivers-ebs-cloud-cre
 - arn:aws:iam::123:role/my-rosa-cluster-t5w0-openshift-machine-api-aws-cloud-credentials
 - arn:aws:iam::123:role/my-rosa-cluster-t5w0-openshift-cloud-credential-operator-cloud-c
 - arn:aws:iam::123:role/my-rosa-cluster-t5w0-openshift-image-registry-installer-cloud-cr

I: OIDC Provider : https://rh-oidc.s3.us-east-1.amazonaws.com/zzz

I: Once the cluster is uninstalled use the following commands to remove the above aws resource.

        rosa delete operator-roles -c AAA
        rosa delete oidc-provider -c AAA
I: To watch your cluster uninstallation logs, run 'rosa logs uninstall -c my-rosa-cluster --watch'

コマンドの実行結果にあるように、この削除操作では EC2 や ELB などは削除されますが、

  • OIDC プロバイダー
  • STS用IAMロール・ポリシー

は削除されません。

クラスターID(クラスター名ではないことに注意)を指定し、手動で削除します。

OIDC プロバイダーは、次のコマンドで削除します。

$ rosa delete oidc-provider -c <clusterID> --mode auto --yes
? OIDC provider deletion mode: auto
? Delete the OIDC provider 'arn:aws:iam::123:oidc-provider/rh-oidc.s3.us-east-1.amazonaws.com/xxx'? Yes

次に、クラスター固有の運用ロールを削除します。

$ rosa delete operator-roles -c <clusterID> --mode auto --yes
? Operator roles deletion mode: auto
I: Fetching operator roles for the cluster: 1ohvnhp7e3pr9103klecb9eebtclalmo
? Delete the operator roles  'my-rosa-cluster-X-openshift-cloud-credential-operator-cloud-c'? Yes
? Delete the operator roles  'my-rosa-cluster-X-openshift-cluster-csi-drivers-ebs-cloud-cre'? Yes
? Delete the operator roles  'my-rosa-cluster-X-openshift-image-registry-installer-cloud-cr'? Yes
? Delete the operator roles  'my-rosa-cluster-X-openshift-ingress-operator-cloud-credential'? Yes
? Delete the operator roles  'my-rosa-cluster-X-openshift-machine-api-aws-cloud-credentials'? Yes

アカウント固有のROSAロールを削除

STSベースのROSAクラスター作成の準備として、 コマンド $ rosa create account-roles --mode auto --yes を実行し、ManagedOpenShift-Support-Role など4つのIAMロールを作成しました。

本アカウントにおいて、ROSA クラスターと永遠のお別れをする場合、次のコマンドを実行して、これらロールも削除してください。

$ rosa delete account-roles --prefix ManagedOpenShift --mode auto --yes
$

他の rosa delete 系コマンドと異なり、Y/n の確認を挟まずにいきなり削除されます。 ご注意ください。

最後に

ROSA の運用では

  • ユーザー
  • Red Hat

それぞれが AWSリソースを操作します。

前者は インスタンスプロファイルをアタッチしたEC2から操作、後者は STSモードのRosaクラスターを作成することで、 IAMユーザー・アクセスキーを作成せずに、ROSA クラスターを構築できます。

IAMユーザーのアクセスキーは永続的な上、アクセスキーの配置も必要です。 IAMロール/STSの一時トークンを利用することで、よりセキュアに認証情報を管理・運用できます。

ぜひ、ご検討ください。

参考