ROSAでKafkaアプリケーション構築


お疲れさまです。
今日はROSAでKafkaアプリケーション構築してみます。
ただ、チュートリアルをそのままというよりは、自身がやりたい構成でやっていったので、ほかの人の参考になれば幸いです。

# 前提

正直やってみたものの、いろいろな方の記事を参考にして切り貼りした感が否めないので、
素晴らしい参考元は是非アクセスしてください。というわけで、ここではやったコマンドのログを残す程度にします。
（ここでは、やりたいことをピンポイントで実行できるようにフォーカスを絞るのと、それぞれの記事の整合性を保つことを目的として備忘録とします）

## やりたかったこと

 - ROSA使いたかった
 - PythonでKafkaアプリケーション
 - コードは内緒なので、Git等に挙げるのではなく、Dockerイメージを利用。ただし、ローカルにDockerBuildの用意はない。（Openshiftでやってくれや、の精神）

## 参考元
 - ROSA構築
    - https://rheb.hatenablog.com/entry/2021/06/07/AWS上でのマネージド_OpenShift_サービス_ROSA_(ろさ)_の提供開始
 - Kafka構築(AMQ)
    - https://kenta-kosugi.medium.com/openshift-amq-streams-apache-kafka-quarkus-で実現するアプリケーション-17481f0dd63d
 - Kafkaアプリケーション
    - https://github.com/dpkp/kafka-python
 - ビルド
    - https://thinkit.co.jp/article/15696

## クライアント

Windows10
※コマンドは同じなので、別にMacでもできます。

# 事前準備

基本的には前述の通り参考元サイトに従って実行していけばできます。
rosaコマンドとocコマンドはダウンロードしますが、面倒なのでパスは通しません。
どのコマンドも相対パスを指定して実行してますので、必要に応じて読み替えてください。

## AWS側の準備

 - AWSコンソールからROSAを開いて、Openshiftの有効化を実行
 - CLIをダウンロード（上記の通りパスは通さず解凍するのみです。）

## Redhat側の準備

 - OpenshiftはRedhat製品ですので、Redhat側にアカウント作成が必要です。アカウントは作っておきましょう。
    - 私はRHELをDeveloperで使いたかったので登録済でした。

## CLIの準備

CLIの準備としては以下です。（一気にコマンド打っていきます。）

 - rosa確認
 - rosaログイン
 - ocダウンロード・解凍
 - quota確認

```Powershell:CLISetup

# 確認
> .\rosa.exe version
1.0.9

# ログイン
> .\rosa.exe init
### RedhatのページからAPIToken取得 ###

# OCダウンロード
> .\rosa download oc
### ファイルをダウンロードしたら解凍 ###

# quota確認
> .\rosa verify quota --region=ap-northeast-1
### クオータを確認 ###
```


# ROSA構築

さて、実行の事前準備が完了したので、実際にROSAクラスターを作っていきます。（驚くほど簡単です。）

 - ROSA構築
 - 管理ユーザ作成
 - ログイン

ただし、ROSA構築は1時間ぐらい待ちますので、気長に待ってください。

``` Powershell:ROSA
# ROSA構築
> .\rosa create cluster --cluster-name rosa-cluster --watch

# 管理ユーザ作成
> .\rosa create admin --cluster=rosa-cluster

# ログイン
### 上記管理ユーザ作成時に" oc login https://----"といった出力が出てくるので、それを実行
### ただし、ここでも絶対パスなので、注意。以下実行例
> .\ oc login https://api.rosa-cluster-----
### また、上記管理ユーザ作成から5～10分ぐらい待つ必要あり。

```

ここまで来たらクラスターの作成及び運用準備が完了しているので、続いて（後続Kafka構築のためにも）ウェブコンソールにログインしてみましょう。

 - 以下にアクセスし、左バーからClustersを選択し、作成したクラスターを選択。

https://console.redhat.com/openshift

 - 右上に記載のある、OpenConsoleをクリック
 - ログイン画面で、上記管理ユーザ作成した時のID/Passwordを入力してログイン

コンソールにログインしたら、左上のバーから管理者とDeveloperを切り替えられることを確認しておいてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/216765/f0a832dc-263d-0f72-530c-d2de735d8b24.png)

上記で構築完了です。あまりに簡単すぎて驚いたと思います。
数コマンドで実行完了できるのは感動ものですね。

# Kafka構築(AMQ)

続いて、Openshift上で動作するKafkaを構築します。
今回は、Openshiftから、AMQStreams(Apache Kafka)を構築します。
ほぼ以下通りで大丈夫ですが、何点か注意点を記載しておきます。

https://kenta-kosugi.medium.com/openshift-amq-streams-apache-kafka-quarkus-%E3%81%A7%E5%AE%9F%E7%8F%BE%E3%81%99%E3%82%8B%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3-17481f0dd63d


 - 事前にプロジェクトを作成しておきます。
    - 左バーのホーム -> プロジェクト　右上のプロジェクトの作成
 - OperatorHubはOpenshiftのクラスターのコンソールにて、管理者モードで開くことができます。 
 - OperatorHubでいくつか出てきますが、"Red Hat Integration - AMQ Streams"を選択します。
 - Kafkaを作成するときの名前はこの後使いますので、意識して決めましょう。
    - よくわからなかったので私は"kafka-service"としてしまいました。今回はこれで進めます。
 - 実施するのは、"AMQ Streams on OpenShift"の項目だけで大丈夫です。"QUARKUS kafka-quickstart のビルドと Docker イメージ化"以降の項目はいったん実施不要です。（今回はPythonを利用するので）

正直、上記サイトのQuarkusもめちゃくちゃ参考になるので、是非やってみてください。

# Kafkaアプリケーション

続いて、Kafkaのアプリケーションです。Openshiftはコンテナが前提なので、アプリケーションは普通に書きますが、最終的にはコンテナ化されます。
もう一つわがままを言うと、Dockerはインストールしたくない（）ので、Openshift上でビルドしてもらいましょう。

とりあえず、以下みたいなKafkaへの接続コードを書きました。
（諸事情で全文乗っけられなくてすみません。要望があれば公開する準備します。）

```Python:app.py(抜粋)
from kafka import KafkaProducer
    broker_host = "kafka-service-kafka-bootstrap:9092"
    producer = KafkaProducer(bootstrap_servers=broker_host)
    consumer = KafkaConsumer(
            "counter", 
            bootstrap_servers=[broker_host])
```

ポイントは、broker_hostの部分ですが、先ほど、Kafkaはkafka-serviceとして作成したので、末尾に"-kafka-bootstrap"を足したものを設定します。
上記のAMQ構築が終わっていれば、本名前で解決できます。Openshiftとして、Service名で名前解決できるようになっているからです。

ではさっそくビルドをしていきましょう。
といっても、ローカルでは実行せず、あくまでOpenshiftにビルドを登録し、実行してもらいます。

```Powershell:DockerBuild
> .\oc.exe new-build --name=<AppName> --strategy=docker --binary --namespace=<ProjectName>
> .\oc.exe start-build <AppName> --from-dir=. --follow --namespace=<ProjectName>
```

続いて、ウェブコンソールからアプリケーションを登録します。

 - Openshiftウェブコンソールを開く
 - 左上のロールにて、Developerを選択する。
 - 左バーの追加 -> コンテナーイメージを選択
 - イメージのデプロイで、「内部レジストリーからのイメージストリームタグ」を選択し、先ほどビルドしたイメージを選択

そうすると、トポロジーが開き、アプリケーションが実行されていることがわかると思います。
コマンドでもできるんですが、コンソール使ってみました。

ウェブアプリケーションをデプロイした場合は、トポロジーのところからURLを開くこともできます。

# 終了時のお掃除

一通り検証終わったら忘れずに以下を実行してリソースを削除しておきましょう。

```Powershell:DeleteResource

# 作成リソースの削除
> .\rosa delete cluster --cluster=rosa-cluster --watch

# ROSAの残骸すべて削除
> .\rosa init --delete-stack

```

# おわり

いかがでしたでしょうか。
エンタープライズ利用ということもあって文献も少なめかなと思いました。。。
とはいえ、実行基盤として人権のありやなしやもあると思うので、
誰かの参考になれば幸いです。