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

## はじめに
前回、Alibaba Cloud SDK for Python を使用して Alibaba Cloud の ECS を操作する方法を紹介しました。今回は Pythonスクリプト上で取得したデータを Alibaba Cloud の提供するログ管理サービス[Log Service](https://jp.alibabacloud.com/help/product/28958.htm?spm=a21mg.m28257.a1.28.121a2f9faSQHCo)へ投入する方法を紹介したいと思います。

## 何故、スクリプトから直接 Log Service へログを投入するのか?
ログの一元管理として Log Service を利用する事は有用です。Log Service にはログ収集機能がありますが、何故、スクリプトから直接 Log Service へ投入するのか何点かメリットを上げてみます。

1. **リアルタイムなアドホック分析利用のため**
Log Service にはログ解析の機能があります。最新の情報を利用して分析業務を行うためには即時にログ投入する仕組みが必要となるでしょう。

2. **データ保護のため**
サーバのローカルへログを保管した上で何らかの仕組みで Log Service へログを転送する場合、例えば転送完了するまでの間にサーバが壊れバックアップから戻す際に一部のログは失われることになります。直接 Log Service へログを入れてしまえばその心配はありません。

3. **サーバのパフォーマンスを高めるため**
高負荷システムではログの出力による I/O 負荷もなるべく避けたいものです。サーバを介さず直接 Log Service に投入すればその負荷を軽減する事が可能です。

4. **サーバレス化のための準備**
サーバを利用せず、例えば Function Compute(AWS でいう Lambda)でサービスを提供する場合、ログ取得のための仕組みが必要となります。

## 事前準備
* Alibaba Cloud Python SDK 実行環境
  * CentOS7.4。Python 2.7.5 の利用を想定しています。詳細は前回作成したこの[記事](https://qiita.com/feel_good/items/7fa5f14564be7ab63b40)を参考にしてください。

* Alibaba Cloud Log Service 初期設定
  * こちらの[記事](https://qiita.com/deadcheat/items/c3b474590501d9aeb978)がわかりやすいです。

## やってみる
### 権限の付与
今回作成するスクリプトでは Log Service の操作が必要になります。
AliyunLogFullAccess の権限を付与しましょう。

<img width="1362" alt="log1.png" src="https://qiita-image-store.s3.amazonaws.com/0/256105/f4b0c469-e12b-3ec2-1af3-09a0afdb6f84.png">

### Log Service 環境準備
プロジェクトを作成します。

| 項目名 | 値 |
|:-----------:|:------------:|
| プロジェクト名 | asia-ne1-logservice |
| リージョン | Asia Pacific NE 1 (Tokyo) |

<img width="1354" alt="log2.png" src="https://qiita-image-store.s3.amazonaws.com/0/256105/3df53647-ea08-475f-7496-4902d9ba52c8.png">

次に LogStore を作成します。

| 項目名 | 値 |
|:-----------:|:------------:|
| ログストア名 | asia-ne1-logstore |

<img width="1353" alt="log3.png" src="https://qiita-image-store.s3.amazonaws.com/0/256105/c1679291-ca45-060d-eb34-8ecbd4b8f1c2.png">

### SDK の導入
```
# Install the Log Service management library
sudo pip install aliyun-log-python-sdk
```

### Python スクリプトからのログ投入
では、実際にコードを記載していきましょう。
まずは必要なモジュールを import します。

```
from aliyun.log.logitem import LogItem
from aliyun.log.logclient import LogClient
from aliyun.log.putlogsrequest import PutLogsRequest

import time
```

LogClient を初期化します。access-key-id と access-key-secret は Log Service に対する権限を付与したアカウントのキーを入力してください。endpoint は[こちら](https://jp.alibabacloud.com/help/doc-detail/29008.htm)のリンクを参照してください。例えば、日本リージョンなら ap-northeast-1.log.aliyuncs.com を記載します。

```
# Initialize LogService Client
endpoint = 'xxxxx'      
accessKeyId = 'xxxxx'
accessKey = 'xxxxx'

client = LogClient(endpoint, accessKeyId, accessKey)
```

利用する Log Service のプロジェクトとログストア名を指定します。topic や source は投入するログに与えられるパラメータです。検索の際に topic や source を利用する事が可能です。

```
# Setting LogService
project = "asia-ne1-logservice"
logstore = "asia-ne1-logstore"
topic = "topic"
source = "source"
```

ログを生成、logitem にログの記録時刻やインデックス、ログメッセージの中身を設定した上でリクエストを投げます。

```
# put LogService
logitemList = []

for i in range(10):
  contents = [('index', "log message" +str(i))]
  logItem = LogItem()
  logItem.set_time(int(time.time()))
  logItem.set_contents(contents)
  logitemList.append(logItem)

request = PutLogsRequest(project, logstore, topic, source, logitemList)
response = client.put_logs(request)
response.log_print()
```

ログを Log Service に登録することが確認できました。

<img width="1363" alt="log4.png" src="https://qiita-image-store.s3.amazonaws.com/0/256105/f71ee41c-8085-2e29-243e-91a9d4a6320c.png">

## おわりに
今回は Python スクリプトから Log Service にログを登録する方法を紹介させていただきました。Log Service はログを統合管理し、また分析業務を行うのに便利なサービスです。

ただし、長期間保存するのには向いていないため、必要であれば OSS への転送及び[DataWorks](https://jp.alibabacloud.com/help/product/30254.htm?spm=a21mg.m28257.a1.34.743b2f9fkh1w5H)による他ソースへのインポートを検討しましょう。

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