Loggie は、Golang をベースとした軽量・高性能・クラウドネイティブなログ収集エージェントです。カスタムランタイムを用いる関数において、Loggie エージェントを活用してファイルからログを収集し、Simple Log Service (SLS) へ送信・保存・分析することができます。
前提条件
プロジェクトおよび Logstore を作成します。詳細については、「プロジェクトの管理」および「Logstore の作成」をご参照ください。
作成するプロジェクトは、対象の関数と同一リージョンに配置する必要があります。
操作手順
ステップ 1:関数の作成
まず、Function Compute コンソール にログインし、左側ナビゲーションバーから を選択します。
上部ナビゲーションバーでリージョンを選択します。その後、関数 ページで 関数を作成 をクリックします。
表示されるダイアログボックスで、Web 関数 を選択し、次へ をクリックします。
関数の作成 ページで、以下のパラメーターを設定し、その他のパラメーターはデフォルト値のままにして、作成 をクリックします。
各パラメーターの詳細については、「関数の作成」をご参照ください。
基本設定: 関数名 を設定します。
エラスティックポリシー:リソース仕様および単一インスタンス同時実行数については、デフォルト値をそのまま使用します。
コード:関数のランタイムおよびコードを設定します。
パラメーター
例
ランタイム環境
コードのアップロード方法
フォルダー内のコードのアップロード を選択します。アップロードするフォルダ名は
codeであり、codeディレクトリ内のファイルはapp.pyです。app.pyのサンプルコードは以下のとおりです。from flask import Flask from flask import request import logging import os REQUEST_ID_HEADER = 'x-fc-request-id' app = Flask(__name__) format_str = '[%(asctime)s] %(levelname)s in %(module)s: %(message)s' logging.basicConfig(filename='/tmp/log/fc-flask.log', filemode='w', format=format_str, encoding='utf-8', level=logging.DEBUG) @app.route("/invoke", methods = ["POST"]) def hello_world(): rid = request.headers.get(REQUEST_ID_HEADER) logger = logging.getLogger() print("FC Invoke Start RequestId: " + rid) logger.info("FC Invoke Start RequestId: " + rid) data = request.stream.read() print(str(data)) logger.info("receive event: {}".format(str(data))) print("FC Invoke End RequestId: " + rid) logger.info("FC Invoke Start RequestId: " + rid) return "Hello, World!" if __name__ == '__main__': app.run(host='0.0.0.0',port=9000)説明コード内の
filename='/tmp/log/fc-flask.log'を変更することで、ログファイルのパスを指定できます。このパスは、ステップ 2 のsources.paths設定と一致させる必要があります。起動コマンド
/code/bootstrap説明bootstrap ファイルは、ステップ 2 で作成します。
リスニングポート
9000
ステップ 2:bootstrap ファイルの作成
関数を作成した後、コード タブで WebIDE を使用し、
bootstrapファイルをcodeディレクトリ内に作成します。以下に、
bootstrapファイルの内容の例を示します。#!/bin/bash # 1. pipelines.yml ファイルを作成します。 mkdir -p /tmp/log /code/etc cat << EOF > /code/etc/pipelines.yml pipelines: - name: demo sources: - type: file name: fc-demo addonMeta: true fields: topic: "loggie" fieldsUnderRoot: true paths: - "/tmp/log/*.log" sink: type: sls endpoint: ${LOGGIE_SINK_SLS_ENDPOINT} accessKeyId: ${LOGGIE_SINK_SLS_ACCESS_ID} accessKeySecret: ${LOGGIE_SINK_SLS_ACCESS_SECRET} project: ${LOGGIE_SINK_SLS_PROJECT} logstore: ${LOGGIE_SINK_SLS_LOGSTORE} topic: ${LOGGIE_SINK_SLS_TOPIC} EOF # 2. loggie.yml ファイルを作成します。 cat << EOF > /code/etc/loggie.yml EOF # 3. Loggie エージェントを起動し、バックグラウンドプロセスとして実行します。 /opt/bin/loggie -config.system=/code/etc/loggie.yml -config.pipeline=/code/etc/pipelines.yml > /tmp/loggie.log 2>&1 & # 4. アプリケーションを起動します。 exec python app.pyこのスクリプトは、以下の処理を行います:
構成ファイル pipelines.yml を作成します。pipelines.yml はパイプライン構成ファイルです。
構成ファイル loggie.yml を作成します。loggie.yml は Loggie のシステム構成ファイルです。
空のファイルはデフォルト構成を意味します。本トピックの例では、デフォルト構成方式を採用しており、loggie.yml ファイルが存在することを前提としています。ファイルが空でない場合は、「Loggie システム構成」をご参照のうえ、具体的なパラメーターについて確認してください。
Loggie エージェントを起動し、バックグラウンドプロセスとして実行します。エージェントの実行ログは /tmp/loggie.log に書き込まれます。
アプリケーションを起動します。本例では Python を使用していますが、実際のランタイムに応じたコマンドを使用してください。
bootstrapファイルに実行権限を付与します。WebIDE で を選択し、
chmod 777 bootstrapコマンドを実行してファイルの権限を設定します。デプロイメントコード をクリックしてデプロイメントを完了します。
ステップ 3:Loggie エージェントのパブリックレイヤーの追加
設定 タブをクリックします。詳細設定 を見つけ、右側の 変更 をクリックします。高度な設定パネルで、レイヤー セクションを編集します。
レイヤー エリアで、 を選択し、Loggie エージェントを構成します。
以下に、Loggie エージェントのパブリックレイヤーの概要を示します。
レイヤー名
互換性のあるランタイム
レイヤーのバージョン
ARN
Loggie エージェント
カスタムランタイム
本例ではバージョン 1 を使用します。
acs:fc:{region}:official:layers/Loggie13x/versions/1
デプロイ をクリックして Loggie エージェントのレイヤーを追加します。
ステップ 4:環境変数の設定
設定 タブで、詳細設定 を見つけ、変更 をクリックし、詳細設定 パネル内の 環境変数 セクションを編集します。
環境変数 パネルで、以下の環境変数を追加します。詳細については、「環境変数の設定」をご参照ください。
FC_EXTENSION_SLS_LOGGIE=true環境変数を設定します。この環境変数を追加すると、呼び出し終了後に関数インスタンスが即座にフリーズされず、Loggie エージェント拡張によるログの正常なアップロードを保証するために 10 秒間待機します。
重要呼び出しが終了してからインスタンスがフリーズされるまでの待機期間についても課金されます。課金ルールは、インスタンスの呼び出しフェーズと同一です。詳細については、「課金」をご参照ください。
pipelines.yml ファイル内で参照される環境変数を設定します。これらには、
LOGGIE_SINK_SLS_ENDPOINT、LOGGIE_SINK_SLS_ACCESS_ID、LOGGIE_SINK_SLS_ACCESS_SECRET、LOGGIE_SINK_SLS_PROJECT、LOGGIE_SINK_SLS_LOGSTORE、およびLOGGIE_SINK_SLS_TOPICが含まれます。環境変数
説明
LOGGIE_SINK_SLS_ENDPOINTSimple Log Service のエンドポイントです。詳細については、「エンドポイント」をご参照ください。
LOGGIE_SINK_SLS_ACCESS_IDご利用の AccessKey ID です。AccessKey ID の取得方法については、「AccessKey ペアの作成」をご参照ください。
LOGGIE_SINK_SLS_ACCESS_SECRETご利用の AccessKey Secret です。AccessKey Secret の取得方法については、「AccessKey ペアの作成」をご参照ください。
LOGGIE_SINK_SLS_PROJECT送信先 Logstore を含むプロジェクトです。
LOGGIE_SINK_SLS_LOGSTOREログの保存に使用する Logstore です。
LOGGIE_SINK_SLS_TOPICログのトピックです。任意の値を指定できます。
デプロイ をクリックします。関数の設定が更新された後、実行ログは Loggie を経由して Simple Log Service へアップロードされるようになります。
ステップ 5:結果の検証
コード タブで、関数のテスト をクリックして、コンソール上で関数のデバッグを行います。
設定後の初回呼び出しでは若干の遅延が発生することがあります。複数回呼び出して確認することを推奨します。
Simple Log Service コンソール にログインし、pipelines.yml ファイルで指定したリージョン、プロジェクト、Logstore を基にログをクエリします。以下に例を示します。

body:ログメッセージ。state.*:ログ収集状態に関するメタデータ。hostnameフィールドは、関数が実行されるインスタンスの ID です。
トラブルシューティング
Loggie エージェントは関数インスタンス内で独立して実行されます。Function Compute は、Loggie エージェントが正常に動作しているかどうかを検出できないため、エージェントの障害が関数の実行に影響を与えることはありません。
数秒経過しても Simple Log Service に Loggie エージェントからのログが表示されない場合は、以下の手順でトラブルシューティングを行ってください。
関数が正常に実行される場合
関数が正常に実行される場合、呼び出し終了後も数分間はインスタンスがアクティブな状態が続きます。この期間中にインスタンスにログインし、Loggie エージェントの実行状態およびログを確認できます。詳細については、「インスタンスのコマンドライン操作」をご参照ください。
ログが存在しない場合は、コマンドラインから Loggie エージェントを起動してみてください。
Loggie のログが存在する場合は、それらを用いてトラブルシューティングを行ってください。
pipelines.yml ファイルの構成が正しいか確認してください。
SLS シンクが正常に起動したか確認してください。ログには、
pipeline sink(sink/sls)-0 invoke loop startに類似したエントリが記録されているはずです。ログファイルが正しく収集されているか確認してください。
start collect file: /tmp/log/fc-flask.logに類似したログエントリが存在するか確認します。該当するログエントリがない場合は、paths設定で指定された pipelines.yml ファイルのパスにログファイルが生成されているか確認してください。
Simple Log Service の Logstore への初回接続時には、ログ取り込みに遅延が発生することがあります。エージェントのログが正常である場合は、関数をさらに数回呼び出し、数分待ってから Simple Log Service で関数のログをクエリしてください。
関数が正常に実行されない場合
Loggie エージェントは外部拡張であり、通常は関数の正常な動作に影響を与えません。関数が失敗する場合は、まず bootstrap ファイルから Loggie エージェントの起動ロジックを削除し、関数単体で正常に動作することを確認してください。プロセスの終了またはタイムアウトエラーが発生する場合は、関数のメモリまたは CPU を増加させてみてください。
関連ドキュメント
Loggie の詳細については、「Loggie ドキュメント」をご参照ください。
本例では、Loggie がログを収集してそのままアップロードしています。JSON 形式のログの解析や DEBUG ログの除外など、ログデータをアップロード前に処理する必要がある場合は、pipelines.yml ファイルにインターセプタ構成を追加できます。詳細については、「 Loggie-インターセプタ」をご参照ください。