Pentaho + AWSで、GUIなETLをコンテナ化してサーバー管理工数を減らしてみた(1/3)

# はじめに
PentahoはGUIでETLを定義できるETLツールですが、本番実行するには通常 RHELなどサーバーが必要です。
ただ１つサーバーで複数のETLジョブを同時実行すると、１つのETLジョブが原因で他のETLジョブが異常終了してしまうことがあります。

この問題はコンテナを活用することで解決できます。また、AWSのサービスを組み合わせることでサーバーの管理工数を減らすことができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4022493/a5f1b4d9-01ba-482a-b752-05d3f852a3fb.png)

本記事はPentahoのコンテナを作成し、他のETLジョブの影響を受けないETL環境を構築します。
また、AWSのサービスを組み合わせてサーバーの管理工数も減らします。

:::note warn
2025/06時点では日本国内においてコンテナ上でのPentahoの実行はサポートされておりませんが、ユーザー様独自で検証しPentahoをコンテナ上で実行した事例はあります。
:::


# この記事で分かること
* PentahoのETLコンテナの作成方法
* PentahoのETLジョブを安定運用しサーバーの管理コストを減らす構成例


# 構成図
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4022493/22dec50a-c02a-4b5d-993d-b0c43c466810.png)

1. ユーザーはブラウザーでAPI Gatewayにアクセスする
1. API GatewayはS3にアクセスし、HTML/JavaScriptのファイルをユーザーに返す。ユーザーはブラウザーの画面からS3に格納されたETL定義のパスを選択し実行ボタンを押す
1. 実行ボタンを押すと、API Gatewayを経由してLambdaを呼び出す
1. LambdaはAWS SDKを使用してECSのタスクを実行する
1. タスクはECRからPDIコンテナイメージをダウンロードする
1. PDIコンテナはS3からETL定義をダウンロードしてETLジョブを実行する

## ETLジョブの実行方法はブラウザーから
構築後、ETLジョブの実行はブラウザーからできるようになります。

1. ユーザーはETLジョブ定義を作成して、その定義をS3に保存します
2. ユーザーはブラウザーからその定義を選択してボタンをクリックします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4022493/81176a0c-1a8b-4679-800a-72230f5f7580.png)


## 記事の構成
記事は３つに分かれていています。

1. Pentahoのコンテナイメージを作成しAmazon ECR (以降、ECR)にpushする (←今回)
2. [1.のコンテナイメージをAmazon ECS で動かす](https://qiita.com/Tomohiko_Takeuchi/items/65b0c52299afa9f7e91b "1.のコンテナイメージをAmazon ECS で動かす")
3. [ETLジョブ実行用のWebUIを作成する](https://qiita.com/Tomohiko_Takeuchi/items/a178e17812799abae00c "ETLジョブ実行用のWebUIを作成する")

# 記事の対象読者
* ETLジョブを安定運用したい方
* ETLサーバーの管理工数を減らしたい方

# 記事の前提知識
* コンテナについて基本的な知識がある方
* AWSのネットワークやロールについて基本的な知識がある方

# 使用ソフトウェア
Pentaho 10.2 商用版

# 1. Pentahoコンテナの作成
Pentahoコンテナは、Pan, KitchenというETL実行コマンドでETLジョブを実行できるように作成します。
## 1-1. ディレクトリ構成
コンテナ作成時のディレクトリ構成は以下の通りです。
```aaa
pdi/
├── Dockerfile
├── media/
│   └── pdi-ee-client-10.2.0.<X>-<YYY>.zip   ・・・(1)
└── pentaho_conf/
    ├── .aws/
    │   ├── config   　 ・・・(2)
    │   └── credentials ・・・(2)
    └── .pentaho/
        └── metastore/
            └── pentaho/
                └── Amazon S3 Connection/
                    ├── .type.xml   ・・・(3)
                    └── s3.xml      ・・・(3)

```

| # | 内容 | 備考 |
|:--|:--|:--|
| (1)  | Pentaho 10.2 商用版に含まれるファイルです。   |   |
| (2)  | AWSへの接続情報です。 | [参考情報](https://qiita.com/Tomohiko_Takeuchi/items/caf07bdfaac7bbbc392d)    |
| (3)  | PentahoのVFSの設定情報です。  |[参考情報](https://qiita.com/Tomohiko_Takeuchi/items/caf07bdfaac7bbbc392d)|


## 1-2. Dockerfile
Dockerfileは以下のようになっています。
AWSへの接続情報や、PentahoのVFSの設定情報も格納します。
``` Docerfile
# ベースイメージとしてUbuntuを使用
FROM ubuntu:22.04
ARG INSTALLATION_PATH=/opt/pdi
ARG PDI_FILENAME=pdi-ee-client-10.2.0.<X>-<YYY>.zip
ARG INSTALLER_PATH=/opt/pentaho-installer


# 必要なパッケージをインストール
RUN apt-get update && \
    apt-get install -y openjdk-17-jdk unzip && \
    apt-get clean && \
    rm -rf /var/lib/apt/lists/*


# 環境変数を設定
ENV PENTAHO_UID=5000
ENV PENTAHO_USER=pentaho
ENV PENTAHO_HOME=/home/pentaho
ENV JAVA_HOME /usr/lib/jvm/java-17-openjdk-amd64
ENV PATH ${JAVA_HOME}/bin:${PATH}


# Pentahoをインストール
RUN mkdir -p ${INSTALLER_PATH}
COPY ./media/${PDI_FILENAME} ${INSTALLER_PATH}
RUN unzip -o ${INSTALLER_PATH}/${PDI_FILENAME} -d ${INSTALLATION_PATH} && \
    rm -rf ${INSTALLER_PATH}

# Pentahoの実行ユーザーの作成
RUN groupadd --gid ${PENTAHO_UID} ${PENTAHO_USER} \
    && useradd --home-dir ${PENTAHO_HOME} --create-home --uid ${PENTAHO_UID} \
    --gid ${PENTAHO_UID} --shell /bin/bash --skel /dev/null ${PENTAHO_USER}

# ファイルの所有者をPentahoの実行ユーザーに変更
RUN chown -R ${PENTAHO_USER}:root ${INSTALLATION_PATH}

# Pentaho用の環境変数を設定
ENV SKIP_WEBKITGTK_CHECK=1
ENV PENTAHO_LICENSE_INFORMATION_PATH=${INSTALLATION_PATH}/.elmLicInfo.plt
ENV PENTAHO_DI_JAVA_OPTIONS="-Dfile.encoding=utf8 -Xms1024m -Xmx2048m"


# ライセンス情報の登録 (省略)

# VFSの設定情報をコピー
RUN mkdir -p '/home/pentaho/.pentaho/metastore/pentaho/Amazon S3 Connection/'
COPY ["pentaho_conf/.pentaho/metastore/pentaho/Amazon S3 Connection/.type.xml","/home/pentaho/.pentaho/metastore/pentaho/Amazon S3 Connection/"]
COPY ["pentaho_conf/.pentaho/metastore/pentaho/Amazon S3 Connection/s3.xml","/home/pentaho/.pentaho/metastore/pentaho/Amazon S3 Connection/"]
RUN chown -R ${PENTAHO_USER}:root /home/pentaho/.pentaho

# AWSへの接続情報をコピー
RUN mkdir /home/pentaho/.aws
COPY pentaho_conf/.aws/config /home/pentaho/.aws
COPY pentaho_conf/.aws/credentials /home/pentaho/.aws
RUN chown -R ${PENTAHO_USER}:root /home/pentaho/.aws

# 実行ユーザーを設定
USER ${PENTAHO_USER}

# 作業ディレクトリを設定
WORKDIR ${INSTALLATION_PATH}/data-integration

# CMD命令は実行時に指定する

```

## 1-3. コンテナイメージのビルド
以下のような感じでコンテナをビルドします。
```
$ docker build -t pentaho/pdi .
```

# 2. コンテナイメージのテスト実行
以下のコマンドを実行してコンテナイメージをテスト実行します。出力されたログやファイルをみて正常に動作したことを確認します。
```
$ docker run pentaho/pdi  /opt/pdi/data-integration/pan.sh -file pvfs://s3/sample/kettle/s3sample.ktr
/opt/pdi/data-integration
DEBUG: Using JAVA_HOME
DEBUG: _PENTAHO_JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64
DEBUG: _PENTAHO_JAVA=/usr/lib/jvm/java-17-openjdk-amd64/bin/java
DEBUG: PENTAHO_LICENSE_INFORMATION_PATH=/opt/pdi/.elmLicInfo.plt
2025-05-30 07:25:11.469 - General - Logging plugin type found with ID: CheckpointLogTable
2025-05-30 07:25:12.194 - Pan - Start of run.
...
2025-05-30 07:25:15.271 - Pan - Processing ended after 1 seconds.
2025-05-30 07:25:15.271 - s3sample -
2025-05-30 07:25:15.271 - s3sample - Step Text file output.0 ended successfully, processed 3 lines. ( 3 lines/s)
2025-05-30 07:25:15.272 - s3sample - Step Write to log.0 ended successfully, processed 3 lines. ( 3 lines/s)
2025-05-30 07:25:15.273 - s3sample - Step Text file input.0 ended successfully, processed 3 lines. ( 3 lines/s)
2025-05-30 07:25:15.273 - s3sample - Step Calculator.0 ended successfully, processed 3 lines. ( 3 lines/s)
$
```


# 3. コンテナイメージをECRにpush


ECRに以下のコマンドでコンテナイメージをpushします。
```
$ aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin xxxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com
$ docker tag pentaho/pdi:latest xxxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com/pentaho/pdi:latest
$ docker push xxxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com/pentaho/pdi:latest
```
:::note info
ECRが無ければ以下の記事を参考に作成してください。
:::

https://qiita.com/suzuki0430/items/7e0ad9903d26dd5f2529

# その他
製品の改良により予告なく記載されている仕様が変更になることがあります。
### 他社商品名、商標等の引用に関する表示
* Amazon Web Services、AWS、Powered by AWS ロゴ、Amazon EC2、Amazon Elastic Container Service、Amazon ECS、Amazon S3、Amazon Virtual Private Cloud、Amazon VPC、AWS Lambda、AWS Fargate、は、Amazon.com, Inc. またはその関連会社の商標です。
* Linuxは，Linus Torvalds氏の米国およびその他の国における登録商標です。
* Oracle®、Java、MySQL及びNetSuiteは、Oracle、その子会社及び関連会社の米国及びその他の国における登録商標です。文中の社名、商品名等は各社の商標または登録商標である場合があります。
* Pentahoは、Hitachi Vantara LLCの商標または登録商標です。
* HITACHIは，株式会社 日立製作所の商標または登録商標です。
* その他記載の会社名，製品名などは，それぞれの会社の商標もしくは登録商標です。