Kafka Connector の各種モジュールを組み込んだDockerイメージを作成してみました

# Kafka Connector の各種モジュールを組み込んだDockerイメージを作成してみました

## 概要

Kafka/Confluent の利用において、各種データリソースと接続するために、Kafka Connect に必要なモジュール（プラグイン）を組み込む方法の手順となります。組み込む方法はいくつかあると思いますが、今回はDockerイメージを作成する方法となります。作成したDockerイメージを Azure Container Registry (ACR) にプッシュします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544022/9f2cb843-bdc2-5a04-6395-17bba1aaefad.png)

そのDockerイメージを利用して、Azure Kubernetes Service(AKS)上で Confluent Platform を実行したときの Connector 画面イメージは以下となります
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544022/a4ce58a1-8536-9b1a-997c-a83ca08cac8c.png)

### ローカル環境

- macOS Monterey 12.3
- Azure CLI 2.34.1

### 前提条件

1. Azure環境がすでに用意されていること（テナント/サブスクリプション）
2. ローカル環境に「azure cli」がインストールされていること

### 事前準備

- Azure VMの作成（Ubuntu）
  - [この記事](https://qiita.com/turupon/items/c249680acea136aff42b) を実行し、Dockerイメージ作成のためのUbuntu仮想マシンを起動していること
- ACR の作成
  - [この記事](https://qiita.com/turupon/items/96c5ce8c7c1d39373eac) を参考にして、Dockerイメージのプッシュ先としてのACR環境を準備していること

## Ubuntu 環境設定

| 項目 | 値 |
| :--- | :--- |
| リソースグループ | rg_ituru_vm02 |
| 仮想マシン名 | vm-ituru-ubuntu |

### 仮想マシン（Ubuntu）へのログイン

```
## 仮想マシンの確認
$ az vm list -g rg_ituru_vm02 -d --output table
Name             ResourceGroup    PowerState    PublicIps      Fqdns    Location    Zones
---------------  ---------------  ------------  -------------  -------  ----------  -------
vm-ituru-ubuntu  rg_ituru_vm02    VM running    20.222.161.31           japaneast

## 秘密鍵の取得とパーミッションの変更
$ terraform output -raw tls_private_key > vm_ubuntu.pem
$ chmod 600 vm_ubuntu.pem

## SSH接続
$ ssh -i vm_ubuntu.pem nmcadmin@20.222.161.31
nmcadmin@ubuntu1804:~$
```

### Azure CLI 　のインストール

```
## Azure CLI のインストール
nmcadmin@ubuntu1804:~$ curl -sL https://aka.ms/InstallAzureCLIDeb | sudo bash
Hit:1 http://azure.archive.ubuntu.com/ubuntu bionic InRelease
Get:2 http://azure.archive.ubuntu.com/ubuntu bionic-updates InRelease [88.7 kB]
Get:3 http://azure.archive.ubuntu.com/ubuntu bionic-backports InRelease [74.6 kB]
Get:4 http://azure.archive.ubuntu.com/ubuntu bionic-security InRelease [88.7 kB]
Hit:5 https://download.docker.com/linux/ubuntu bionic InRelease          
Fetched 252 kB in 0s (737 kB/s)                                 
Reading package lists... Done
Reading package lists... Done
Building dependency tree       
Reading state information... Done
     :
    省略
     :
Get:1 https://packages.microsoft.com/repos/azure-cli bionic/main amd64 azure-cli all 2.35.0-1~bionic [73.9 MB]
Fetched 73.9 MB in 2s (29.8 MB/s)     
Selecting previously unselected package azure-cli.
(Reading database ... 77314 files and directories currently installed.)
Preparing to unpack .../azure-cli_2.35.0-1~bionic_all.deb ...
Unpacking azure-cli (2.35.0-1~bionic) ...
Setting up azure-cli (2.35.0-1~bionic) ...

## Azure CLI 確認
nmcadmin@ubuntu1804:~$ az version
{
  "azure-cli": "2.35.0",
  "azure-cli-core": "2.35.0",
  "azure-cli-telemetry": "1.0.6",
  "extensions": {}
}
```

### 仮想マシンへの　java　のインストール

```
nmcadmin@ubuntu1804:~$ sudo apt install default-jre            
nmcadmin@ubuntu1804:~$ sudo apt install openjdk-11-jre-headless
nmcadmin@ubuntu1804:~$ sudo apt install openjdk-8-jre-headless 
```

### 仮想マシンへの　confluent-hub　のインストール

```
nmcadmin@ubuntu1804:~$ sudo apt update && apt upgrade
nmcadmin@ubuntu1804:~$ wget http://client.hub.confluent.io/confluent-hub-client-latest.tar.gz
nmcadmin@ubuntu1804:~$ tar zxvf confluent-hub-client-latest.tar.gz

※※※　再ログイン　※※※

nmcadmin@ubuntu1804:~$ confluent-hub
usage: confluent-hub <command> [ <args> ]

Commands are:
    help      Display help information
    install   install a component from either Confluent Hub or from a local file

See 'confluent-hub help <command>' for more information on a specific command.
```

### 仮想マシンへの　Docker Engine　のインストール

[Linuxサーバー環境のDockerインストールメモ](https://qiita.com/ohhara_shiojiri/items/486a54ad895d6bb3144e) を参考に...

```
nmcadmin@ubuntu1804:~$ sudo apt-get install apt-transport-https ca-certificates curl software-properties-common
nmcadmin@ubuntu1804:~$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
nmcadmin@ubuntu1804:~$ sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
nmcadmin@ubuntu1804:~$ sudo apt-get update
nmcadmin@ubuntu1804:~$ sudo apt-get install docker-ce
nmcadmin@ubuntu1804:~$ sudo gpasswd -a nmcadmin docker
```

#### Dockerの動作確認

```
※※※　再ログイン　※※※

## Dockerバージョンの確認
nmcadmin@ubuntu1804:~$ docker --version
Docker version 20.10.14, build a224086

## Dockerコンテナの起動
nmcadmin@ubuntu1804:~$ docker run --rm hello-world

## Dockeイメージの確認
nmcadmin@ubuntu1804:~$ docker images
REPOSITORY    TAG       IMAGE ID       CREATED        SIZE
hello-world   latest    feb5d9fea6a5   6 months ago   13.3kB
```

## Docker Image の Build

### Dockerfile の作成（内容の確認）

[Discover Kafka® connectors and more](https://www.confluent.io/hub/) で必要なモジュール情報を収集し、Dockerfileを作成します。

今回は、「confluentinc/cp-server-connect-base:6.1.0」 コンテナイメージに、９つのモジュールを組み込んで見ました。

```
## Dockerfile の内容
nmcadmin@ubuntu1804:~$ cat Dockerfile 
FROM confluentinc/cp-server-connect-base:6.1.0
RUN confluent-hub install --no-prompt confluentinc/kafka-connect-rabbitmq:latest
RUN confluent-hub install --no-prompt confluentinc/kafka-connect-influxdb:latest
RUN confluent-hub install --no-prompt debezium/debezium-connector-mysql:latest
RUN confluent-hub install --no-prompt confluentinc/kafka-connect-azure-blob-storage:latest
RUN confluent-hub install --no-prompt confluentinc/kafka-connect-azure-blob-storage-source:latest
RUN confluent-hub install --no-prompt microsoft/kafka-connect-iothub:latest
RUN confluent-hub install --no-prompt confluentinc/kafka-connect-azure-data-lake-gen2-storage:latest
RUN confluent-hub install --no-prompt confluentinc/kafka-connect-azure-sql-dw:latest
RUN confluent-hub install --no-prompt confluentinc/kafka-connect-jdbc:latest
RUN confluent-hub install --no-prompt microsoftcorporation/kafka-connect-cosmos:latest

    # confluentinc/kafka-connect-rabbitmq:                      RabbitMQ(Source)
    # confluentinc/kafka-connect-influxdb:                      InfluxDB(Source & Sink)
    # debezium/debezium-connector-mysql:                        MySQL(Source)
    # confluentinc/kafka-connect-azure-blob-storage             BLOB(Sink)
    # confluentinc/kafka-connect-azure-blob-storage-source      BLOB(Source)
    # microsoft/kafka-connect-iothub                            IoTHub(Source & Sink)
    # confluentinc/kafka-connect-azure-data-lake-gen2-storage   Gen2(Sink)
    # confluentinc/kafka-connect-azure-sql-dw                   Azure Synapse Analytics(Sink)
    # confluentinc/kafka-connect-jdbc                           JDBC(Source & Sink)
    # microsoftcorporation/kafka-connect-cosmos                 Azure Cosmos DB (Source & Sink)
```

### Dockerイメージビルド

```
## Buildの実行
nmcadmin@ubuntu1804:~$ docker build -t cp-connect-demo-cp610:1.1.1 .
Sending build context to Docker daemon  16.72MB
Step 1/11 : FROM confluentinc/cp-server-connect-base:6.1.0
6.1.0: Pulling from confluentinc/cp-server-connect-base
     :
    省略
     :
Completed 
Removing intermediate container 4529a7e5def6
 ---> 100153c40bd6
Successfully built 100153c40bd6
Successfully tagged cp-connect-demo-cp610:1.1.1


## Docker Images の確認
nmcadmin@ubuntu1804:~$ docker images
REPOSITORY                            TAG       IMAGE ID       CREATED         SIZE
cp-connect-demo-cp610                 1.1.1     100153c40bd6   2 minutes ago   2.05GB
confluentinc/cp-server-connect-base   6.1.0     061bd88f3432   7 months ago    1.83GB
hello-world                           latest    feb5d9fea6a5   7 months ago    13.3kB
```

## Azure Container Registry (ACR) へのプッシュ

| 項目 | 値 |
| :--- | :--- |
| Dockerイメージ名：タグ | cp-connect-demo-cp610:1.1.1 |
| ACRのリソースグループ | rg_ituru_acr |
| ACRログインサーバー名 | acr0ituru.azurecr.io |
| ACRロサーバー名 | acr0ituru |

### Azure へのログイン

```
## 下記コマンド実行後に表示されるメッセージ内のURLをローカルPCのブラウザからアクセスし、コードを入力すればOK！
nmcadmin@ubuntu1804:~$ az login --tenant <tenant-id>
To sign in, use a web browser to open the page https://microsoft.com/devicelogin and enter the code HOGE2HOGE to authenticate.

## 利用するサブスクリプションの定義
nmcadmin@ubuntu1804:~$ az account set --subscription '<Subscription Name>'
```

### ACR への イメージPush

```
## ACRログインサーバーアドレスの取得
nmcadmin@ubuntu1804:~$ az acr list --resource-group rg_ituru_acr --query "[].{acrLoginServer:loginServer}" --output tsv
acr0ituru.azurecr.io

## ACRへのログイン
nmcadmin@ubuntu1804:~$ az acr login --name acr0ituru
Login Succeeded

## イメージをACRにプッシュ
nmcadmin@ubuntu1804:~$ docker tag cp-connect-demo-cp610:1.1.1 acr0ituru.azurecr.io/cp-connect-demo-cp610:1.1.1
nmcadmin@ubuntu1804:~$ docker push acr0ituru.azurecr.io/cp-connect-demo-cp610:1.1.1
The push refers to repository [acr0ituru.azurecr.io/cp-connect-demo-cp610]
     :
    省略
     :
1.1.1: digest: sha256:973baf459d6e295550c6ba7717fccf4af5bdd177b2fbabd68d8440c8b03570bd size: 5366

## イメージ詳細の確認
nmcadmin@ubuntu1804:~$ az acr repository show --name acr0ituru --repository cp-connect-demo-cp610
{
  "changeableAttributes": {
    "deleteEnabled": true,
    "listEnabled": true,
    "readEnabled": true,
    "teleportEnabled": false,
    "writeEnabled": true
  },
  "createdTime": "2022-04-09T16:42:26.6041355Z",
  "imageName": "cp-connect-demo-cp610",
  "lastUpdateTime": "2022-05-11T01:52:57.5399684Z",
  "manifestCount": 2,
  "registry": "acr0ituru.azurecr.io",
  "tagCount": 2
}

## イメージタグの確認
nmcadmin@ubuntu1804:~$ az acr repository show-tags -n acr0ituru --repository cp-connect-demo-cp610 --output table
Result
--------
1.1.0
1.1.1

## イメージ一覧の表示
nmcadmin@ubuntu1804:~$ az acr repository list --name acr0ituru --output table
Result
----------------------
cp-connect-demo-cp610
```

### まとめ

これで、Kafka/ConfluentのConnectorに各種モジュールを組み込み、ACRにプッシュする仕組みができました。 Confluent Platform をコンテナアプリケーションとしてKubernetes（AKS等）での実行を前提に CI/CD に組み込んでいきたいですね、、、、

### 参考記事

以下の記事を参考にさせていただきました。感謝申し上げます。
[Linuxサーバー環境のDockerインストールメモ](https://qiita.com/ohhara_shiojiri/items/486a54ad895d6bb3144e)