Alibaba CloudのLog ServiceをAnsibleにて導入す – TECH4ALL

Alibaba CloudのLog ServiceをAnsibleにて導入す – TECH4ALL

Alibaba CloudのLog ServiceをAnsibleにて導入す

概要

Alibaba Cloudを使用する上でLog Serviceはとても有用です。
各種サーバのログはもとより、Server Load Balancerのアクセスログ、Function Computeの実行ログなど様々なログをここに集約させることができます。
集約したログはObject Storage Servie(OSS)に保存したり、FlinkやStormに流して解析を行ったりすることができます。
本稿では前半にLog Serviceの構成要素を大まかに説明し、後半にはサーバからのログ収集に必要なLogtailを、Ansibleを用いてセットアップする方法を解説します。
Log Serviceの記事と見せかけて、半分はAnsibleの記事です。
個々の内容は深堀りしていませんが、実録の読みものとしてお楽しみください。

Log Service概説

Log Serviceはその名の通りログを扱うサービスです。
何かしらの方法で出力されたログはLogHubに収集され、コンシューマによって消費されます。
ここでいうコンシューマとは、FlinkやStormといった分散処理基盤やSDKを用いた任意の解析プログラムなどを表します。
また、LogShipperによってOSSに転送する機能も提供されています。
これはサーバのログをOSSに退避するための仕組みが提供されているということを意味します。

構成要素

Log Serviceの中で最も大きな括りとなる要素がプロジェクトです。この要素自体には名前と説明しか設定項目がない枠みたいなものです。

Logstoreはログを格納するストレージのようなもので、プロジェクトに複数配置することができます。OSSへの保存や分散処理基盤との連携はこのLogstoreの粒度で設定するため、ログの種類ごとに作成するのがいいと思われます。Logstore作成時にシャード数を指定しますが、これは読み書きのスペックに関係するものです。
シャードのドキュメントには、

  • 書き込み: 5 MB/秒、2000回/秒
  • 読み取り: 10 MB/秒、100回/秒

とあるので、必要な容量に合わせたシャード数にしましょう。とはいえ後から分割・結合できるのでよくわからなければ一旦デフォルトの値でも問題ありません。

LogHubはHubという名前が表す通り、ログの流れを制御する場所です。LogHubは明示的に作成するリソースではなく、Logstore毎に存在する結合点のようなものと理解しています。

LogtailはLogHubにログを送信するためのエージェントです。
Elastic Compute Service(ECS)に限らず、任意のサーバにLogtailをインストールすればLog Serviceにログを集約させることができます。
Logtailのインストールや設定は後ほどAnsibleを用いた例をご紹介します。

Logtailがどのようにログを収集するかはLogtail構成で設定します。Logtail構成はLogstoreに対して複数設定できます。Logtail構成ではエージェントがどのパスにあるログファイルを収集するかを指定します。ワイルドカードも使えるのでディレクトリの中身丸ごと収集することもできますが、あまり混ぜ込みすぎても扱いづらくなってしまうので程々がよいでしょう。

マシングループはログ収集を行うマシンの集合を表します。Logtail構成とは多対多の関係にあります。
Logtail構成にマシングループを紐づけることで、どのマシンからどのログを収集するかが決定されます。
マシングループとマシンの紐づけはIPアドレスの羅列のほか、ユーザ定義IDという方法で動的に変わるIPアドレス以外の識別子で識別させることもできます。

LogShipperはログをOSSにアーカイブしてくれる機構です。Logstoreごとに設定します。バケット名、プレフィクス、ディレクトリ構成など直感的に設定可能な項目が並ぶ中、いきなりRAMロールのArnを求められます。これはLog ServiceがOSSに書き込むための許可と思い(実際そうなのですが)頑張ってRAMロールを作成しても正しく書き込めませんでした。RAMクイック認証ページで「権限付与に同意」をクリックするとAliyunLogDefaultRoleというロールが作成されます。自力で作成したロールと内容は同じでした。謎が深いです。

AnsibleでLogtailをインストールする

前述の通りサーバのログをLogHubにて収集するためにはLogtailをインストールする必要があります。
本項ではオートメーションツールAnsibleを用いてLogtailをインストールするためのPlaybookについて解説します。
動作確認はローカルのCentOS 7.6.1810からECSのCentOS 7.6.1810に向けて行いましたが、Ansibleが利用できる環境からECSに向けてであれば挙動に大差はないと思われます。
また、Ansibleの基本的な使い方の説明は含まれません。悪しからず。

ドキュメントにあるインストール方法

まずは公式ドキュメントにあるLogtailのインストール方法をご覧ください。
長いページですが、手順としては単純です。

$ wget http://logtail-release-cn-hangzhou.oss-cn-hangzhou.aliyuncs.com/linux64/logtail.sh -O logtail.sh;chmod 755 logtail.sh  $ ./logtail.sh install auto  

autoで失敗する場合やAlibaba Cloudの外のサーバにインストールする場合は auto の部分を明示的に指定する必要があります。
後続の説明は上記の手順を前提に進めますので必要に応じて読み替えてください。

悪手

「ふーんシェル二行ね」

- name: install logtail.    shell: |      wget http://logtail-release-cn-hangzhou.oss-cn-hangzhou.aliyuncs.com/linux64/logtail.sh -O logtail.sh;chmod 755 logtail.sh      ./logtail.sh install auto  

Ansibleにも警告されると思いますが、shellモジュールでwgetやcurlを使うのは大抵ダメです。get_urlを使いましょう。
誰に何と言われようともインストールできればいい場合はこれで完了です。

get_urlに置き換える

「ほう、get_urlですか」

- name: download logtail installer.    get_url:      url: http://logtail-release-cn-hangzhou.oss-cn-hangzhou.aliyuncs.com/linux64/logtail.sh      dest: /tmp/logtail.sh      mode: "0755"  - name: install logtail.    command: /tmp/logtail.sh install auto  

このPlaybookには足りないものがあります。冪等性(べきとうせい)です。
初回は問題なくインストールできます。
二回目に実行したらどうでしょうか。
おそらくこうなるはずです。

hostname                   : ok=1   changed=1 ....  

何も変化が無いのにchangedになってしまうのはよろしくありません。
ついでに加えると/tmp/ディレクトリはいつ空になってもおかしくないのでここも改める必要があります。

冪統制を担保する

いくつか方法はありますが、単純なのはcommandモジュールの creates パラメータです。要はこのファイルが有ったら実行しないというパラメータです。

- name: download logtail installer.    get_url:      url: http://logtail-release-cn-hangzhou.oss-cn-hangzhou.aliyuncs.com/linux64/logtail.sh      dest: /usr/local/src/logtail.sh      mode: "0755"  - name: install logtail.    command: /usr/local/src/logtail.sh install auto    args:      creates: /etc/init.d/ilogtaild  

他にはチェックサムを用いて一致した場合はchangedではなくokになるようにする方法もあります。

- name: download logtail installer.    get_url:      url: http://logtail-release-cn-hangzhou.oss-cn-hangzhou.aliyuncs.com/linux64/logtail.sh      dest: /usr/local/src/logtail.sh      mode: "0755"      force: yes      sha256sum: edec7eeb4e687847b26a770fa50c7d84e60d5bf6d91d7a3722636e1fac583c9e    register: download_installer  - name: install logtail.    command: /usr/local/src/logtail.sh install auto    when: download_installer|changed  

ダウンロード元が更新されるとエラーになるので、バージョンアップに追随するけど一応事前に検知はしておきたい場合向けです。バージョンを完全に固定したい場合は予めダウンロードしたファイルをcopyモジュールでコピーして使用する方式も検討しましょう。

Auto Scalingに対応する

だいぶAnsibleの話に寄ってきましたが最後にユーザ定義IDについて説明します。
ユーザ定義IDはマシングループを定義する際にIPアドレスではない方法で指定するためのものです。
IPアドレス指定ではAuto Scalingによってサーバの増減があった際にマシングループに過不足が生じてしまいます。
ユーザ定義ID指定であればサーバ台数の変化に柔軟に対応できます。

ユーザ定義IDは /etc/ilogtail/user_defined_id にベタっとテキストで記載します。
ユーザ定義IDに関するドキュメントには文字種別について言及されていませんが、英数字とハイフン、アンダースコアあたりに留めておいた方が無難かと思われます。

これもPlaybook化します。

- name: enable user defined ID.    shell: |      echo 'user-defined-id' > /etc/ilogtail/user_defined_id    creates: /etc/ilogtail/user_defined_id  

サーバ種別ごとに内容を変えたいのであればtemplateモジュールにgroup_varsを組み合わせて動的に設定することもできます。

これでマシングループのユーザ定義IDにファイルの内容(上記の例では「user-defined-id」)を指定すれば、動的にログ収集対象が増減します。

まとめ

  • Log Service便利
  • AnsibleでLogtailインストールしてみた
  • Playbookの冪統制だいじ

とりとめもなく終わりますが、皆様のご理解の一助となれば幸いです。