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

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

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

記事の全体像は[前回](https://qiita.com/Tomohiko_Takeuchi/items/ddd198f7ac2e7d368a2d)をご参照ください。

今回は前回作成したコンテナイメージをAmazon ECS(以下ECS)で動かします。
コンテナイメージをキャッシュしてETLジョブを早く開始できるように、ECSをEC2上で動かします。

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


# ECSの構成
ECSの構成は以下のようになっています。コンテナはインバウンド接続不要なので、ECSをプライベートサブネットで動かします。
Amazon S3やECRに接続するためNAT gatewayを使用しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4022493/b93fc600-98b4-4f2d-80f5-102db0f7e438.png)

# 事前準備
- 構成図に合うようにVPC、パブリックサブネット、プライベートサブネット、ルートテーブル、インターネットゲートウェイを作成する
- EC2インスタンス用のセキュリティグループを作成する。今回はインバウンド接続不要です
- EC2インスタンスにログインできるようにキーペアを作成する。(EC2インスタンスへのログインは不要だと思いますが、ログインすることになればフリートマネージャで接続します。)


# 1. ECSクラスターを作成する

1. Amazon Management ConsoleからECSを選択します。 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4022493/4ef13b43-c0fb-44a9-a12e-9294f1497e8f.png)
2. ECS画面の右上の[クラスターの作成]をクリックします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4022493/1b20da49-18ab-43f1-8392-359f117fcc09.png)
 
## 1.1 クラスター設定
クラスター名を入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4022493/e9a788ec-568d-4997-8925-ceb6d1523086.png)

## 1.2 インフラストラクチャ
インフラストラクチャは以下のように設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4022493/5d784ba1-8b0d-47e6-9f66-7a07a1df376f.png)

| 項目 | 設定内容 | 備考 |
|:--|:--|:--|
|キャパシティプロバイダ| [Amazon EC2 インスタンス] を選択します|   |
|EC2インスタンスタイプ|[t3.xlarge]を選択します |コンテナ実行時のリソースに合わせて変更します。|
|必要な容量|最低:1、最大:1 と設定します。|とりあえずコンテナを実行できる最低容量にしています。|
|SSHキーペア|事前に作成していたキーペアを選択します。|   |

# 1.3 Amazon EC2 インスタンスのネットワーク設定
ネットワークは以下のように設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4022493/88a3a50d-4bbc-4e2a-ae49-8e8a32a463bf.png)

| 項目 | 設定内容 | 備考 |
|:--|:--|:--|
|VPC| 事前に作成していたVPCを選択します|   |
|サブネット| 事前に作成していたプライベートサブネットを選択します|   |
|セキュリティグループ| 事前に作成していたセキュリティグループを選択します|   |
|パブリック IP の自動割り当て|パブリックIPは不要なのでオフにします|   |

## 1.4 ECSクラスターの作成
残りの項目についてはデフォルトのままでよいので、右下の[作成]ボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4022493/6e2b9414-26a0-490c-acce-e2880644d64d.png)

ECSクラスターの作成後は、タスク定義を作成します。

# 2. タスク定義の作成
1. ECS画面の左ペインの[タスク定義]をクリックします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4022493/a01dd447-df3c-4507-bf61-3772c925cc14.png)
2. 右側の[新しいタスク定義の作成]をクリックし、[新しいタスク定義の作成]をクリックします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4022493/700c2f88-3db0-48b1-b63f-00eb5e0363eb.png)

## 2.1 タスク定義の設定
タスク定義ファミリー名を入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4022493/dcb84ad0-485f-4cc5-aac0-5307b184734b.png)

## 2.2 インフラストラクチャの要件
以下のように設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4022493/c929f926-f782-447c-b49a-6f27f7f6e55a.png)

| 項目 | 設定内容 | 備考 |
|:--|:--|:--|
|起動タイプ| [Amazon EC2インスタンス]を選択します|   |
|ネットワークモード|[bridge]を選択します。|アウトバウンド接続ができればよいので、Linuxのデフォルトである[bridge]を選択します|
|タスクサイズ|CPU: 2vCPU, メモリ: 4GB|実行するETLジョブに応じて変更します|

## 2.3 コンテナ - 1
PDIのコンテナを設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4022493/e54f3224-0c54-4b7b-847b-c1aacc331c63.png)

| 項目 | 設定内容 | 備考 |
|:--|:--|:--|
|名前|コンテナの名前を設定します。|
|イメージURI|前の記事で登録したイメージのURLを入力します|入力補完が効かないようなので、ECRの画面を開いてURIをコピーして貼り付けるのが楽だと思います|
|ポートマッピング|デフォルトで１個追加されていますので削除します。|   |

この画面以降にも設定が続きますが、デフォルトのままでOKです。

# 3. タスクの作成
1. 先ほど作成したタスク定義の右上の[デプロイ]をクリックし、[タスクの実行]をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4022493/71790059-c332-4df4-ac25-044d0fc2e39f.png)

## 3.1. タスクの詳細
デフォルトのままで問題ありません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4022493/03b1fc04-84d8-41ec-9aa7-ffd2cdd843df.png)

## 3.2. 環境
先ほど作成したクラスターを選択します。それ以外はデフォルトのままでOKです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4022493/dbbae101-1d50-4d17-9a29-1aad75a7e5e2.png)

## 3.3. コンテナの上書き
pan,kitchenのコマンドのパスとkettleのパスを以下のような感じで指定します。
区切り文字は','です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4022493/267ebf56-de42-4a3a-a741-8a75b1a3e167.png)

# 4. 作成(実行)
他の項目はデフォルトでOKです。
作成ボタンを押してタスクを作成(実行)します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4022493/506a6f9d-64d0-4505-ab81-9d4fa56a041a.png)

タスクを作成すると以下のような画面になり、タスクをクリックするとログも確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4022493/ed66e541-eb25-4d82-b07a-9c8dc2637eac.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4022493/2ef029ed-aae3-4e90-9ccc-53bceb23008e.png)




# 参考記事

https://qiita.com/k2-hara/items/bb2ebb3bc5efc3000729

# その他
製品の改良により予告なく記載されている仕様が変更になることがあります。

### 他社商品名、商標等の引用に関する表示
* 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. またはその関連会社の商標です。
* Pentahoは、Hitachi Vantara LLCの商標または登録商標です。
* HITACHIは，株式会社 日立製作所の商標または登録商標です。
* その他記載の会社名，製品名などは，それぞれの会社の商標もしくは登録商標です。