はじめに
前々回の記事ではROSA HCPの概要やメリットを紹介し、前回の記事ではROSA HCPクラスターを実際に構築してきました。
今回は、本番運用を見据えた、ROSA HCPクラスターにおける「ログ保管の自動化」 についてご紹介します。
KubernetesやOpenShift環境では、Podが再起動したり削除されたりすると、コンテナ内に出力されていたログは消えてしまいます。そのため、システムの安定運用やトラブルシューティングを行うためには、コンテナログを保管する仕組みが必須となります。
そこで、AWSの運用に慣れたエンジニアにとって、最も親和性が高く手軽なログ保管先となるのが「Amazon CloudWatch Logs」です。
本記事では、具体的な設定手順に進む前の前提知識として、まずはROSA環境におけるログ保管の全体像を整理し、その後CloudWatch Logsへ転送する具体的な設定方法を解説していきます。
ROSAで出力されるログの種類
CloudWatch Logsへの転送設定を始める前に、まずはROSAが出力するログの種類についてご紹介します。
ROSAを構成するコンポーネントから出力されるログは以下の3種類に大別されます。
ROSA with HCPでは、ログ種別によってログの転送方法が異なるため注意が必要です。
| ログ種別 | 概要 | 転送方法 |
|
アプリケーションログ |
ユーザーがデプロイしたPod(コンテナ)から出力されるログ |
OpenShift Logging |
|
インフラストラクチャログ |
ワーカーノードやOpenShiftのシステムコンポーネント(※)から出力されるログ |
OpenShift Logging |
|
監査ログ |
クラスター内での操作履歴のログ |
ROSA with HCPの標準機能 |
※インフラストラクチャログにおけるシステムコンポーネントの定義
OpenShfitの仕様上、以下のnamespaceで実行されているPodはすべて「OpenShiftのシステムコンポーネント」とみなされ、それらが出力するログはインフラストラクチャログとして分類されます。
- default
- kube–xxx
- openshift-xxx
OpenShift Loggingとは
ROSA with HCPにおいて、アプリケーションログ・インフラストラクチャログを収集し、外部へ転送するための機能が「OpenShift Logging」です。
Kubernetes標準の機能だけでは、Podが再起動したり削除されたりするとコンテナ内のログも一緒に消えてしまいます。OpenShift Loggingは、クラスター内の各コンテナが出力するログをリアルタイムに収集し、外部(今回はCloudWatch Logs)へと転送するパイプラインを自動管理してくれます。
OpenShift Loggingを構成する主要コンポーネント
現在のOpenShift Loggingは以下のコンポーネントで構成されます。
- Cluster Logging Operator
- ログ収集エンジンや転送設定全体のライフサイクルを管理するコンポーネントです。
- ログ収集エンジン
- 各ワーカーノードにDaemonSetとして配置され、ノード上で動くコンテナのログを収集するコンポーネントです。以前のOpenShiftではFluentdがログ収集エンジンとして使用されていましたが、現在の最新バージョンではパフォーマンスとリソース効率に優れたVectorがデフォルトのエンジンとして採用されています。
ログ転送パイプラインを定義する「ClusterLogForwarder」
OpenShift Loggingは、ログの転送パイプラインの定義を「ClusterLogForwarder」というカスタムリソースで定義します。
これにより、YAMLファイルを1つ定義するだけで、「どのログを」「どこへ転送するか」を自由に設定することができるようになっています。
ClusterLogForwarderに定義する転送パイプラインは、主に以下の3つの要素を組み合わせて設定します。
- Inputs(入力元): どのログを対象にするか
- Outputs(出力先): どこに送るか
- Pipelines(経路の結合): どのInputsを、どのOutputsへ紐付けるか
ログ転送のデータフロー
OpenShift Loggingを利用したログ転送のデータフローを図に示すと以下のようになります。

ログ収集エンジンであるVectorはClusterLogForwarderの定義に従い、Inputsに設定したアプリケーションログやインフラストラクチャログを収集し、Outputsに設定したCloudWatch Logsにログを転送します。
OpenShift Loggingを利用したCloudWatch Logsへのログ転送設定
ここからは実際にOpenShift Loggingを利用したCloudWatch Logsへのログ転送設定をご紹介します。
前提条件
- ROSAクラスターが構築済みであること(前回の記事を参照)
- ROSAクラスターにCLIでログインできていること
- ROSAクラスターの管理コンソールにWebブラウザからログインできていること
事前準備(ロググループとIAMロール・ポリシーの作成)
ロググループの作成
まずは転送先ロググループを作成します。
以下はCloudFormationでロググループを作成する際のサンプルになります
AWSTemplateFormatVersion: '2010-09-09'
Description: 'Log Group for OpenShift Logging'
Resources:
# アプリケーションログ用のロググループ
LogGroupApp:
Type: AWS::Logs::LogGroup
DeletionPolicy: "Delete"
Properties:
LogGroupName: /rosa/hcp-cluster/application
# インフラストラクチャログ用のロググループ
LogGroupInfra:
Type: AWS::Logs::LogGroup
DeletionPolicy: "Delete"
Properties:
LogGroupName: /rosa/hcp-cluster/infrastructure
上記CloudFormationを適用すると以下のロググループが作成されます。
※OpenShift Loggingはアプリケーションログを「<任意の値>/application」、インフラストラクチャログを「<任意の値>/infrastructure」の名称のロググループにログを転送します。

IAMロール・IAMポリシーの作成
OpenShift Loggingに割り当てるIAMロール・IAMポリシーを作成します。
以下はCloudFormationでIAMロールを作成する際のサンプルになります
AWSTemplateFormatVersion: '2010-09-09'
Description: 'IAM Role and Policy for OpenShift Logging'
Parameters:
# ROSA構築時に作成したOIDCエンドポイント
OidcEndpoint:
Type: String
Description: 'The OIDC Endpoint'
Resources:
# CloudWatch Logs へのアクセス許可ポリシー
OpenShiftLoggingPolicy:
Type: 'AWS::IAM::ManagedPolicy'
Properties:
ManagedPolicyName: 'rosa-openshift-logging-policy'
PolicyDocument:
Version: '2012-10-17'
Statement:
- Effect: Allow
Action:
- 'logs:PutLogEvents'
- 'logs:PutRetentionPolicy'
- 'logs:CreateLogStream'
- 'logs:DescribeLogGroups'
- 'logs:DescribeLogStreams'
Resource: 'arn:aws:logs:*:*:*'
# ログ転送用 IAM ロール
OpenShiftLoggingRole:
Type: 'AWS::IAM::Role'
Properties:
RoleName: 'rosa-openshift-logging-role'
AssumeRolePolicyDocument: !Sub |
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Federated": "arn:aws:iam::${AWS::AccountId}:oidc-provider/${OidcEndpoint}"
},
"Action": "sts:AssumeRoleWithWebIdentity",
"Condition": {
"StringEquals": {
"${OidcEndpoint}:sub": "system:serviceaccount:openshift-logging:cloudwatch-log-forwarder-sa"
}
}
}
]
}
ManagedPolicyArns:
- !Ref OpenShiftLoggingPolicy
上記CloudFormationの「OidcEndpoint」というパラメーターには、前回の記事で作成したoidc-configの情報を以下のrosaコマンドで確認し、「ISSUER URL」の値の「https://」を除いた値を設定してください。
$ rosa list oidc-config
# 出力例
ID MANAGED ISSUER URL SECRET ARN
XXXXXXXXX true https://xxxx/xxxxx
CloudFormationを適用すると以下のIAMロールが作成されます。

OpenShift Loggingのインストール
Cluster Logging Operatorのデプロイ
まず、OpenShift Loggingのコンポーネントの1つである「Cluster Logging Operator」をデプロイします。
以下はCluster Logging Operatorをyamlファイルでデプロイする際のサンプルになります。
opensfhit-logging-operator.yaml
apiVersion: operators.coreos.com/v1
kind: OperatorGroup
metadata:
name: openshift-logging-operaror-group
namespace: openshift-logging
spec:
upgradeStrategy: Default
---
apiVersion: operators.coreos.com/v1alpha1
kind: Subscription
metadata:
name: openshift-logging-operaror-subscription
namespace: openshift-logging
spec:
# インストールするOpenShift Loggingのチャンネルを指定
channel: stable-6.4
# インストールするOpenShift Loggingのバージョンを指定
startingCSV: cluster-logging.v6.4.1
installPlanApproval: Manual
name: cluster-logging
source: redhat-operators
sourceNamespace: openshift-marketplace
作成したopensfhit-logging-operator.yamlをROSAクラスターにログインし、適用します。
$ oc login https://api.your-cluster-name.xxxx.p1.openshiftapps.com:443 --username cluster-admin --password XXXXX-XXXXX-XXXXX-XXXXX
$ oc apply -f opensfhit-logging-operator.yaml
OpenShiftの管理コンソール上の「エコシステム」→「インストール済みのOperator」のページで「cluster-logging」が選択できるようになります。

「cluster-logging」を選択し、「installPlan」のページに遷移すると、OpenShift Logging Operatorのインストールの承認確認画面が表示されるため、「承認」を選択します。



インストールを承認すると、ROSAクラスター上にCluster Logging Operatorが起動します。
$ oc get pod -n openshift-logging
NAME READY STATUS RESTARTS AGE
cluster-logging-operator-dd4646d96-zcw6g 1/1 Running 0 45s
Secretリソースのデプロイ
次に、ログ収集エンジンにIAMロールを割り当てるためのSecretリソースをデプロイします。
以下はSecretのサンプルになります。
secret.yaml
apiVersion: v1
kind: Secret
metadata:
name: cloudwatch-credentials
namespace: openshift-logging
stringData:
# 作成したIAMロールのARNを指定
role_arn: arn:aws:iam::xxx:role/rosa-openshift-logging-role
作成したsecret.yamlをROSAクラスターに適用します。
$ oc apply -f secret.yaml
ServiceAccountのデプロイ
ログ収集エンジンに割り当てるServiceAccoutをデプロイします。
以下はServiceAccountのサンプルになります。
serviceaccount.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
name: cloudwatch-log-forwarder-sa
namespace: openshift-logging
作成したserviceaccount.yamlをROSAクラスターに適用します。
$ oc apply -f secret.yaml
ClusterRoleBindingのデプロイ
ログ収集エンジンにログ収集権限を付与するため、ClusterRoleBindingリソースでServiceAccoutに権限の割り当てを行います。
割り当てるClusterRoleはCluster Logging Operatorのデプロイ時に自動で作成されるClusterRoleを割り当てます。
以下はClusterRoleBindingのサンプルになります。
cluster-role-binding.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: logging-collector-logs-writer-crb
subjects:
- kind: ServiceAccount
name: cloudwatch-log-forwarder-sa
namespace: openshift-logging
roleRef:
kind: ClusterRole
name: logging-collector-logs-writer
apiGroup: rbac.authorization.k8s.io
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: collect-application-logs-crb
subjects:
- kind: ServiceAccount
name: cloudwatch-log-forwarder-sa
namespace: openshift-logging
roleRef:
kind: ClusterRole
name: collect-application-logs
apiGroup: rbac.authorization.k8s.io
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: collect-infrastructure-logs-crb
subjects:
- kind: ServiceAccount
name: cloudwatch-log-forwarder-sa
namespace: openshift-logging
roleRef:
kind: ClusterRole
name: collect-infrastructure-logs
apiGroup: rbac.authorization.k8s.io
作成したcluster-role-binding.yamlをROSAクラスターに適用します。
$ oc apply -f cluster-role-binding.yaml
ClusterLogForwarderのデプロイ
ログ収集エンジンをデプロイするためのカスタムリソース(CR)であるClusterLogForwarderをデプロイします。
OpenShift Logging OperatorはClusterLogForwarderに定義した設定内容に基づいてログ収集エンジンをデプロイします。
以下はClusterLogForwarderのサンプルになります。
cluster-log-forwarder.yaml
apiVersion: observability.openshift.io/v1
kind: ClusterLogForwarder
metadata:
name: cloudwatch-cluster-log-forwarder
namespace: openshift-logging
spec:
collector:
tolerations:
- operator: "Exists"
serviceAccount:
# 3.ServiceAccoutのデプロイで作成したServiceAccout名を指定
name: cloudwatch-log-forwarder-sa
outputs:
- name: cloudwatch-output
type: cloudwatch
cloudwatch:
# 作成したロググループ名を指定
# {.log_type||"unknown"}の部分はinputRefsで指定している「application」・「infrastructure」の文字列が埋め込まれる
groupName: '/rosa/hcp-cluster/{.log_type||"unknown"}'
# ロググループを作成したリージョンを指定
region: us-east-1
authentication:
type: iamRole
iamRole:
roleARN:
key: role_arn
# 2.Secretリソースのデプロイで作成したSecret名を指定
secretName: cloudwatch-credentials
token:
from: serviceAccount
pipelines:
- name: to-cloudwatch
# アプリケーションログとインフラストラクチャログを収集するように指定
inputRefs:
- application
- infrastructure
outputRefs:
- cloudwatch-output
作成したcluster-log-forwarder.yamlをROSAクラスターに適用します。
$ oc apply -f cluster-log-forcluster-log-forwarder.yaml
動作確認
OpenShift Loggingのインストール後、Podが正常に起動しているか確認してください。
$ oc get pod -n openshift-logging
NAME READY STATUS RESTARTS AGE
cloudwatch-cluster-log-forwarder-fngmj 1/1 Running 0 61s
cloudwatch-cluster-log-forwarder-pgx5h 1/1 Running 0 62s
cluster-logging-operator-8646fc6b78-5hh5v 1/1 Running 0 12m
次に、作成したロググループにインフラストラクチャログ・アプリケーションログが転送されていることを確認してください。
※今回はアプリケーションログを出力させるために「test」というnamespace配下にテスト用の「app-log-test」という名前のPodを起動させ、ログ出力させています。


作成したロググループにアプリケーションログ・インフラストラクチャログのログストリームが作成されていることがわかります。以上で、アプリケーションログ・インフラストラクチャログをCloudWatch Logsに転送する設定は完了になります。
【補足】監査ログ(Audit Logs)の転送設定について
ROSA with HCPにおける監査ログはRedHatが管理するコントロールプレーン側で出力されるため、ワーカーノード上に存在するOpenShift Loggingではログの収集が行えません。
そのため、ROSA with HCPでは、監査ログをCloudWatch Logsへ転送する標準機能が用意されています。
監査ログのCloudWatch Logsへの転送を有効化したい場合は、ROSAがCloudWatchにログを書き込むための専用IAMロールを作成し、そのIAMロールのARNを rosa コマンドのオプションに設定します。
以下はCloudFormationでIAMロールを作成する際のサンプルになります。
AWSTemplateFormatVersion: '2010-09-09'
Description: 'IAM Role and Policy for ROSA HCP Audit Log'
Parameters:
# ROSA構築時に作成したOIDCエンドポイント
OidcEndpoint:
Type: String
Description: 'The OIDC Endpoint'
Resources:
# 1. CloudWatch Logs へのアクセス許可ポリシー
RosaAuditLogPolicy:
Type: 'AWS::IAM::ManagedPolicy'
Properties:
ManagedPolicyName: 'rosa-audit-log-policy'
PolicyDocument:
Version: '2012-10-17'
Statement:
- Effect: Allow
Action:
- 'logs:CreateLogGroup'
- 'logs:CreateLogStream'
- 'logs:DescribeLogGroups'
- 'logs:DescribeLogStreams'
- 'logs:PutLogEvents'
- 'logs:PutRetentionPolicy'
Resource: 'arn:aws:logs:*:*:*'
# 2. Auditログ転送用 IAM ロール
RosaAuditLogRole:
Type: 'AWS::IAM::Role'
Properties:
RoleName: 'rosa-audit-log-role'
AssumeRolePolicyDocument: !Sub |
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Federated": "arn:aws:iam::${AWS::AccountId}:oidc-provider/${OidcEndpoint}"
},
"Action": "sts:AssumeRoleWithWebIdentity",
"Condition": {
"StringEquals": {
"${OidcEndpoint}:sub": "system:serviceaccount:openshift-config-managed:cloudwatch-audit-exporter"
}
}
}
]
}
ManagedPolicyArns:
- !Ref RosaAuditLogPolicy
上記CloudFormationの「OidcEndpoint」というパラメーターには、OpenShift Logging用のIAMロールを作成した時と同様に、oidc-configの「ISSUER URL」の「https://」を除いた値を設定してください。
CloudFormationを適用すると以下のIAMロールが作成されます。

以下のrosaコマンドで監査ログの転送を有効化します。
$ rosa edit cluster --cluster=<クラスター名> \
--audit-log-arn="arn:aws:iam::xxxxxxx:role/rosa-audit-log-role"
CloudWatch Logsに以下のようなロググループが作成されていれば、監査ログの転送設定は完了です。


※ロググループ名は「ocm-production-<クラスターのID>-<クラスター名>」の形式で自動作成されます。
また、クラスター構築時に–domain-prefixを設定していた場合は、「ocm-production-<クラスターのID>-<domain-prefixの値>」の形式となります。
おわりに
ROSAクラスターにおけるCloudWatch Logsへのログ転送方法について解説しました。
実際にROSAクラスターを運用する際の参考になれば幸いです。
次回はROSAクラスター上のメトリクスをCloudWatchに転送する方法についてご紹介します。
参考文献
https://docs.redhat.com/en/documentation/red_hat_openshift_service_on_aws/4
https://docs.aws.amazon.com/ja_jp/rosa/latest/userguide/what-is-rosa.html
https://docs.redhat.com/en/documentation/red_hat_openshift_logging/6.6/html/install/installing-the-red-hat-openshift-logging-operator


