Alibaba Cloud におけるログ活用(2)

## はじめに
前回の記事では Python スクリプトから直接 Log Service にログを投入する方法を紹介させていただきました。Log Service は直近のログ分析を行うには良いサービスですが、一定期間で保持されたログを削除するため、長期的なデータ分析を行うためには向いておりません。OSS にログを移す機能がありますが、実際にログ分析として活用するにはさらに RDS など別のサービスへのインポートが必要となります。

そこで、今回は [DataWorks](https://jp.alibabacloud.com/help/product/30254.htm?spm=a21mg.m28257.a1.34.19852f9fd94jSF) を利用して OSS から ApsaraDB for RDS(MySQL) へデータをインポートする方法を紹介いたします。

## DataWorks とは?
>DataWorks は、Alibaba Cloud によってリリースされた大きなデータPaaSプラットフォームです。ワンストップの DW 機能プラットフォームとして、データ統合、データ開発、データ管理、データガバナンスなど、幅広い製品とサービスを提供しています。

<img width="777" alt="data1.png" src="https://qiita-image-store.s3.amazonaws.com/0/256105/a131d222-eb90-32bc-9ebc-35c12868c1d2.png">

上記、公式より引用したものです。OSS から RDS,RDS から OSS などデータを移行したり、データ加工(ETL処理)などが行えるサービスというイメージですかね。

## 事前準備
* Log Service へのログ投入
  * 詳細は前回作成したこの[記事](https://qiita.com/feel_good/items/82f7c5c8812f3332dcb9)を参考にしてください。
  * ログ転送周りについては前回同様こちらの[記事](https://qiita.com/deadcheat/items/c3b474590501d9aeb978)を合わせて参考にしてください。

* ApsaraDB for RDS(MySQL) 初期設定
  * こちらの[記事](https://qiita.com/ngratin/items/19af577929c6d168eb9f)がわかりやすいです。

## やってみる
### Log Service から OSS への転送
前回、以下の様な形式でログを保存している状態でした。

<img width="827" alt="log1.png" src="https://qiita-image-store.s3.amazonaws.com/0/256105/1acb4547-a96b-5813-3190-0a908ffae23c.png">

上記のログを OSS LogShipper を使用し OSS に転送します。設定内容のサンプルは以下です。

<img width="583" alt="data0.png" src="https://qiita-image-store.s3.amazonaws.com/0/256105/c01cec28-1397-b6fb-e458-2156e88d5bff.png">

ポイントとしては CSV キーがそのままテーブルのキーとなるため、ログ生成の時点でそれなりの設計を行う必要があります。また、デリミタはデフォルトでは "," となっていますが、タブに変更しています。ユーザ入力が含まれるパターンでは "," が含まれる事が多く、排除もしにくいためです。コストを考えれば圧縮すべき等ありますが、詳細はケースに合わせ変更しましょう。

以下のようなファイルが OSS 内に出力されました。

<img width="219" alt="data3.png" src="https://qiita-image-store.s3.amazonaws.com/0/256105/2ecb2832-f3bf-0e7d-510f-8e8c200143cf.png">

### ApsaraDB for RDS(MySQL) の起動と DB, Table 等の準備
OSS ファイルのインポート先として DB, テーブルを準備します。今回は以下 DB, Table, カラム構成としています。

<img width="409" alt="data4.png" src="https://qiita-image-store.s3.amazonaws.com/0/256105/e2deb0c9-764e-a136-d5ba-9f79535cc1ed.png">

### DataWorks 初期設定
サービスを有効化していない場合は有効化しましょう。続いてアクセスキーの作成を求められます(最初はメインアカウントで作成する必要があるかもしれません)。

<img width="1355" alt="data14.png" src="https://qiita-image-store.s3.amazonaws.com/0/256105/f28109af-fa3f-f05b-763b-f5a18d1b5ca3.png">

アクセスキーを作成すると以下の様な画面に変わります。今回は Data Integration の機能を利用したいので、赤枠の Go Buy をクリックします。

<img width="1356" alt="data15-1.png" src="https://qiita-image-store.s3.amazonaws.com/0/256105/336b49c9-d31b-f204-2f7b-8f41a32d61d3.png">

利用対象のリージョンを選択し、購入します。

<img width="1383" alt="data16.png" src="https://qiita-image-store.s3.amazonaws.com/0/256105/1b38d27a-1ddd-409f-3b98-43b691cdfedb.png">

Data Integration 左のチェックボックスにチェックを付けた上で次へ進みます。

<img width="1043" alt="data18.png" src="https://qiita-image-store.s3.amazonaws.com/0/256105/2d5d757a-56f3-7222-d668-ef27ee698052.png">

必要項目に適当に入力した上で Create Project をクリックします。私の場合、何故か1回目はアクセスキーが存在しないとのエラーが出力され失敗しました...。少し時間を置いてからもう一度クリックしたところ成功しています。

<img width="1039" alt="data19.png" src="https://qiita-image-store.s3.amazonaws.com/0/256105/738549d4-3814-227c-aa83-14b71f66ccc7.png">

で、Project の作成が完了。

### DataWorks Source 設定
続いて、DataWorks の Source 設定を行います。

#### Sourceとは?
DataWorks では各サービス間へデータ移行を行う機能がありますが、事前に対象サービスに接続するための設定を Source と呼んでいます。

先程、作成したプロジェクトをクリックすると以下のような画面になります。続いて、画面上部の Data Integration をクリックしましょう。

<img width="898" alt="data21.png" src="https://qiita-image-store.s3.amazonaws.com/0/256105/bd43dcd9-6824-0dba-238b-495a7e328026.png">

遷移した画面で左ペインの Data Source という項目をクリック。

<img width="683" alt="data22.png" src="https://qiita-image-store.s3.amazonaws.com/0/256105/6a5434bf-46e8-0f4c-459f-6630e3088c76.png">

画面右上の New Source をクリックし、Source 設定が行えます。

<img width="759" alt="data23.png" src="https://qiita-image-store.s3.amazonaws.com/0/256105/c43e50c1-bc7f-8c47-1065-a201cd458ab5.png">

#### OSS Source 設定
色々設定可能なデータソースが表示されますが、まず OSS を選択します。入力項目は以下を参考にしてください。

| 項目名 | 値 |
|:-----------:|:------------:|
| Name | 適当な一意となる名前をつけてください。 |
| Description | 説明文です。必須ではありません。 |
| Endpoint | OSS の Endpoint です。[こちら](https://jp.alibabacloud.com/help/doc-detail/31837.htm)を参照ください。 https もサポートしているとありますが、http で入力しないとエラーになりました。東京リージョンであれば http://oss-ap-northeast-1.aliyuncs.com と入力してください。|
| Bucket | 転送元となる CSV ファイルがある Bucket を指定してください。 |
| Access Id | DataWorks が OSS アクセスに利用するアクセスキーを必要な権限を付与した上で指定してください。 |
| Access Key | 上記と同様。 |

#### ApsaraDB for RDS(MySQL) Source 設定
続いて RDS。以下、説明を参考にしてください。

| 項目名 | 値 |
|:-----------:|:------------:|
| Type | 今回は ali cloud database (rds) を指定します。|
| Name | 適当な一意となる名前をつけてください。 |
| Description | 説明文です。必須ではありません。 |
| Instance ID of RDS | RDS のインスタンス ID を指定します。 |
| Main Buyer of RDS | メインアカウントの ID です。何で必要なんだろうか? |
| Database Name | インポート先の DB 名です。 |
| Username | インポート先の DB のユーザ名です。 |
| Password | インポート先の DB のパスワードです。 |

RDS を利用する場合は事前に DataWorks が利用する IP レンジをホワイトリストに入れておく必要があります。対象の IP は[こちら](https://www.alibabacloud.com/help/zh/doc-detail/60024.htm)を参照ください(中国語のドキュメントにしか記載がない様子?)。

### DataWorks Sync Tasks 作成と実行　
画面左ペインの Sync Tasks をクリックします。

<img width="328" alt="data26.png" src="https://qiita-image-store.s3.amazonaws.com/0/256105/a42decd7-6ca1-e6a2-1b8e-a8d4004d244f.png">

Wizard Mode で OSS から RDS へデータをインポートするタスクを作成しましょう。

<img width="836" alt="data27.png" src="https://qiita-image-store.s3.amazonaws.com/0/256105/741ed546-cd7f-5c00-a975-798ebde64526.png">

まず、データソースとして OSS を選択。各項目を入力していきます。デリミタはタブ(\t)に変更しています。各項目入力後、data preview でインポートするデータのプレビューが閲覧可能です。

<img width="1543" alt="data29.png" src="https://qiita-image-store.s3.amazonaws.com/0/256105/7480aafe-850e-042c-1168-52c32586a80f.png">

続いてデータの投入先となる RDS と Table を指定。事前に準備が済んで入ればプルダウンから選択するだけで完了です。

<img width="1419" alt="data30.png" src="https://qiita-image-store.s3.amazonaws.com/0/256105/4658e3fd-8667-d774-7254-3036a3b91c57.png">

続いて、csv のカラムと table のキーのマッピングを行います。csv の方がわかりにくいですが、プレビューの順番通りになるので Col1 が "source",Col2 が "topic", Col3 が "message" です。

<img width="2039" alt="data31.png" src="https://qiita-image-store.s3.amazonaws.com/0/256105/b73f759f-0665-c2d9-b797-3a6bdaea983b.png">

次はジョブを実行するリソースの設定。とりあえずそのままで進めます。

<img width="1448" alt="data32.png" src="https://qiita-image-store.s3.amazonaws.com/0/256105/165a35b3-7557-293f-b982-b14ec1c71ede.png">

で、今回設定した同期タスクの命名。適当に付けて OK をクリックします。

<img width="797" alt="data33.png" src="https://qiita-image-store.s3.amazonaws.com/0/256105/b0132084-0f22-b52a-db2c-7b1ad0a71268.png">

すると、画面左ペインに今回作成したタスクが表示されるので、選択した上で "Run" をクリックします。

<img width="824" alt="data34.png" src="https://qiita-image-store.s3.amazonaws.com/0/256105/1445caab-aa5f-7028-9ccb-ece23dffa3eb.png">

画面下部の log 部分にメッセージがずらずらと並びますが、処理が終わるとストップします。

<img width="1422" alt="data35.png" src="https://qiita-image-store.s3.amazonaws.com/0/256105/f7e93a59-7152-2b18-79d1-dbfe366a5d88.png">

今回用意したテーブルを確認したところ、ちゃんとデータが投入されていることが確認できました。

<img width="326" alt="data36.png" src="https://qiita-image-store.s3.amazonaws.com/0/256105/235ea430-e93c-9bf0-d041-37a8cdf43e8a.png">

以上、簡単ではありますが、DataWorks による Data Integration の実行方法の紹介になります。

## おわりに
今回は DataWorks の機能の一つである Data Integration について紹介しました。ビッグデータなど大規模なログ分析を行う上では必須となるサービスです。Alibaba Cloud には他にもログを活用する上で便利なサービスが色々あります。機会があればまた紹介させていただこうと思います。

ここまで読んでいただきありがとうございました。