Amazon LinuxにOpenMetadataを構築

## 目的
AWS環境 (Amazon Linux) に OpenMetadata を導入したい。それだけ (だと思ってた)。
後述の通りバージョン違いなどによる影響で何度かインスタンスを立てなおしたり、エラーにはまってひたすら時間を溶かしたりしたので共有します。

## 環境
 - Amazon Linux 2
 - OpenMetadata 1.1.1
 - Docker 20.10.25
 - Docker Compose v2.26.1
 - Python 3.7.16

## 手順
[1. EC2インスタンス構築](#ec2インスタンス構築)
[2. GUI環境構築](#gui環境構築)
[3. 各モジュールの導入](#各モジュールの導入)
[4. Dockerコンテナ起動](#dockerコンテナ起動)
[5. OpenMetadataにログイン](#openmetadataにログイン)
[6. Airflowにログイン](#airflowにログイン)

### EC2インスタンス構築
まず、下記要件を満たす必要があります。
> Minimum sizing recommendations for OpenMetadata deployment include 2 vCPUs and 4 GiB of RAM, with 20 GiB of volume size for logs.

https://www.restack.io/docs/openmetadata-knowledge-openmetadata-system-requirements

加えて、Linuxの場合はGUI環境が構築可能であること。

今回は下記設定でインスタンス作成。
 - AMI
     - Amazon Linux 2 with .NET 6, PowerShell, Mono, and MATE Desktop Environment
 - インスタンスタイプ
     - t2.large
 - Storage
     - 20 GB
 - Security Group
     - 社内ネットワークからのRDP, sshを許可

今回は導入の検証のため public subnet にインスタンスを配置します。
細かい構築手順は割愛します。

#### おまけ: Amazon Linux 2023 を使わない理由
Amazon Linux 2023 が最新ですが、GUI環境を構築できなかったので Amazon Linux 2 を採用しました。そのうち出来るようになるかもしれませんね。

https://repost.aws/questions/QUpKlYAHccTyaFv7AaSJx4kw/how-to-install-a-gui-in-amazon-linux-2023

### GUI環境構築
以下、こちらを参考にしています。

https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/amazon-linux-ami-mate.html

#### パッケージ最新化と再起動
```
sudo yum update
sudo reboot
```
#### xrdpをインストール & 有効化
```
sudo amazon-linux-extras install epel
sudo yum install xrdp
sudo systemctl start xrdp
sudo systemctl enable xrdp
```
#### パスワード設定
認証のためパスワードを設定。
RDP接続時に利用します。
```
sudo passwd ec2-user
```
※ユーザー名がec2-userの場合

#### 証明書ファイルとキーの作成
```
sudo openssl req -x509 -sha384 -newkey rsa:3072 -nodes -keyout /etc/xrdp/key.pem -out /etc/xrdp/cert.pem -days 365
```
ここで Country Name などを聞かれるので、回答してあげます。↓記事内の「証明書署名要求(CSR)を作成する」を参照。

https://www.tohoho-web.com/ex/openssl.html


#### xrdp 再起動
```
sudo systemctl restart xrdp
```

#### 接続確認
ローカルからリモートデスクトップ接続できればOKです。
username と password は「パスワード設定」で設定したものです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3777293/c4307cf1-6694-896c-1b93-3a882804d657.png)


#### 接続できない場合に確認したいこと
 - セキュリティグループ (RDP許可)
 - xrdpのステータス確認 (`sudo systemctl status xrdp`)
 - インスタンスの状態
 - パブリック IP の確認 (Elastic IPを使っていない場合、再起動の度にIPが変わる)


### 各モジュールの導入
#### Docker インストール
version 20.10.0 以上が必要です。
```
sudo yum update -y
sudo yum -y install docker
sudo systemctl start docker
sudo systemctl enable docker
```
バージョン確認
```
docker --version
```

https://sid-fm.com/support/vm/guide/install-docker-amazonlinux2.html

#### Docker Compose インストール
version 2.1.1 以上が必要です。実行権限も付与します。

```
DOCKER_CONFIG=${DOCKER_CONFIG:-$HOME/.docker}
curl -SL https://github.com/docker/compose/releases/download/v2.26.1/docker-compose-linux-x86_64 -o $DOCKER_CONFIG/cli-plugins/docker-compose
chmod +x $DOCKER_CONFIG/cli-plugins/docker-compose
```
バージョン確認
```
docker compose version
```

https://docs.docker.com/compose/install/linux/#install-using-the-repository

#### コンテナ用ディレクトリ作成・移動
```
mkdir openmetadata-docker && cd openmetadata-docker
```
※ディレクトリ名は任意
#### 仮想環境の構築・有効化
```
python3 -m venv env
source env/bin/activate
```
#### pip setuptools のインストール
```
pip3 install pip setuptools==66.0.0
```
筆者は最初 version 68.0.0 をインストールしましたが、Dockerコンテナの起動で失敗しました。
バージョン 66.0.0 前後が推奨されていますが、厳密にどのバージョンまでOKかは不明です。

#### OpenMetadata モジュールのアップデート
```
pip3 install --upgrade "openmetadata-ingestion[docker]”
```
#### ユーザーをdockerグループに追加
sudo なしで docker コマンド実行できるようにします。
```
sudo usermod -a -G docker ec2-user
```
#### 再起動
コンテナ起動する前にインスタンスを再起動しましょう。

### Dockerコンテナ起動
```
metadata docker --start
```
数分~10分ほど待ちます。

`OpenMetadata is up and running` が返ってくればOKです。

#### おまけ:コンテナ起動時に発生したエラー
 - `No space left on device`
     - ディスク容量不足などの場合はここでエラーになります
     - 自分は最初デフォルトの 8 GB で作成していて引っかかりました
 - `Docker Service is not up and running`
     - status 確認しても running なのになぜ...? と、かなり時間を溶かしました
     - ec2-user を docker グループに追加したところ解消しました
### 再起動用設定
検証用環境なので利用していない時間はインスタンスを停止したい。
そのまま再起動してもコンテナは勝手に起動してくれない (厳密には OpenMetadata用コンテナは起動しているようだが Airflow 用コンテナが起動していない？) ため、以下コマンドで自動的にコンテナを起動するよう設定。
```
docker update --restart unless-stopped $(docker ps -q)
```

### OpenMetadataにログイン
1. 構築したインスタンスにRDP接続・サインイン
1. デスクトップ左下のメニューから「Applications > Internet > Chromium Web Browser」を選択
1. `http://localhost:8585/` に接続
1. 管理者としてログインする場合は username, passwordともに admin で通ります

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3777293/affef7b6-92df-caaf-d998-088c00d85688.png)
(ここまで長かった)

### Airflowにログイン
上と基本は同じで、`http://localhost:8080/` に接続します。
いくつかサンプルのDAGが用意されており、 sample_data などを実行するとサンプルデータがOpenMetadata上に登録されます。
実行はDAG名の右の方にある再生ボタンを押し、「Trigger DAG」を選択するだけです。

## 終わりに
最初に作ったインスタンスが GUI 対応していなかったり、 `Docker compose` と `Docker-compose` を間違えていたりで何度かインスタンスを立て直すこととなりました。
色々な記事を参照した結果、バージョン違いによる影響をかなり受けたので、今回は一連の流れをまとめてみました。
以上、Qiita執筆デビューでした。