Amazon Kinesis Agent for Windows を使用して、集中化された Microsoft Exchange サーバーのログ管理
Amazon Kinesis Agent for Windows を使用して、集中化された Microsoft Exchange サーバーのログ管理:
Microsoft Exchange サーバーは様々な種類のログを保管しています。これらのログには、メッセージ追跡、Exchange ウェブサービス(EWS)、Information Services(IIS)、およびアプリケーション/システムイベントログの種類が含まれます。グローバルにデプロイされた Exchange サーバーでは、これらのサーバーのローカルで複数のディレクトリにログが散在している場合があります。この場合、Exchange 管理者が各サーバーにログインして、ステータス、ヘルス、およびイベントをモニタリングする必要があります。Exchange 管理者は、これらのログを集中化し、有用なメトリクスに変換することで、各サーバーにログインすることなく、高負荷やサービス/アプリケーションエラーなどの多くの問題を特定できます。
このブログ記事では、Microsoft Exchange サーバーのログをストリーミング、分析、および保存するための効率的なアーキテクチャについて説明します。頻繁なクエリと運用分析用に、Amazon Elasticsearch Service(Amazon ES)と Kibana を使用してリアルタイムで可視化を行います。例えば、さまざまな種類のレポートを提供します。これらのレポートは、上位のメール送信者と受信者、IIS ログの上位 HTTP ステータスコード、EWS ログの上位エラーコード、負荷/エラーのスパイク絞り込みに関するものです。監査、法的要件、コンプライアンス要件などの低頻度クエリについては、Amazon S3 を最終宛先として使用しています。標準SQL を使用した簡単なクエリ向けに、低コストのストレージオプションと高い耐久性、Amazon Athena を提供します。
Amazon Kinesis Agent for Microsoft Windows(Kinesis Agent for Windows)は、構成可能で拡張可能な高度なエージェントです。Kinesis Agent for Windows は、Amazon Kinesis Data Streams、Amazon Kinesis Data Firehose、Amazon CloudWatch など、さまざまな AWS のサービスに、ログ、イベント、およびメトリクスを、収集、解析、変換、ストリーム配信します。Windows ベースのサービスからログを集中化するために、より効率的で信頼性の高い方法を提供します。これにより、問題の及ぶ範囲を確認したり、問題をモニタリングしたり、エラーや負荷が特定のしきい値を超えた場合にアラームを生成したりすることができます。Kinesis Agent for Windows について詳しくは、Amazon Kinesis Agent for Microsoft Windowsとはを参照してください。
AWS Lambda は Amazon ES のログを定期的に分析し、統計を CloudWatch メトリクスに投稿します。CloudWatch アラームは、投稿されたメトリクスで検出された異常をトリガーするために使用されます。
Kibana はログデータを可視化します。グラフのスパイクや異常を探して、特定のログデータをドリルダウンすることができます。Exchange サービスの特定の問題を診断するのに役立ちます。また、いくつかの認証機能によって、 Kibana へのアクセスが保護されます。Amazon Cognito を ID プロバイダで使用する方法については、Amazon Cognito Authentication for Kibana を参照してください。
指定されたディレクトリの下に .log 拡張子を持つすべてのファイルをクエリするソース設定の例を次に示します。ExchangeLogSource がタイプに設定されている場合、ヘッダーのログ行が動的に解析されます。次に、「タイムスタンプ」に必要な列が自動的に選択されます。
メッセージ追跡ログは、次のサンプルと同様になります。
2018-10-22T10:53:13.404Z, 10.00.00.00, ExchangeServer01,10.00.00.00,ExchangeServer01,;250 2.0.0 OK;ClientSubmitTime:2018-10-22T10:53:10.680Z,Intra-Organization SMTP Send Connector,SMTP,SEND,157882997807893,<6d606502441648f993b7b6d1b8fbb5fb@ExchangeServer01>,9b3f4489-a158-4126-0d41-08d6380c8f0f,recipient@Somedomain.com,250 2.1.5 Recipient OK,sender@Somedomain.com, return-path@Somedomain.com,…
// Sinks (Destinations) は、ログの行き先を定義します
次に、ログが保存されるシンクまたは宛先を定義します。また、ロールがストリームにアクセスできる場合を想定して、別の AWS アカウントの Kinesis データストリームにログをストリーミングすることもできます。アクセスを設定する方法については、シンクセキュリティの構成を参照してください。形式 が指定されると、ログは JSON に変換されます。
// Pipesは 、ソースとシンクを接続します。
パイプは、ソースと宛先を接続します。宛先に複数のソースを取り込む必要がある場合、またはその逆の場合に役立ちます。
Kinesis Agent for Windows は、Kinesis Data Streams にログを送信する前に、各ログラインを JSON BLOB に変換します。以下のサンプルをご覧ください。
例えば、次の Kibana グラフは、Amazon ES のデータを視覚化します。時間ウィンドウに上位のメール送信者を示します。グラフには、上位の送信者 spam@somedomain.com が表示されます。これについてはさらに調査する必要があります。Amazon ES API コールを使用すると、集約された結果を取得し、プログラムでアクションを実行できます。このデータにアラートを配置することで、早期検出が可能になり、スパム削除アクションに繋がり、より多くのスパムを防くことができます。Kibana で視覚化を作成する方法について詳しくは、視覚化作成を参照してください。
以下は、Amazon CloudWatch の線グラフで、Amazon ES からの AWS Lambda クエリーログによって投稿された統計を示しています。
しきい値およびアラームは、CloudWatch アラームでアラートを設定できます。
Amazon ES エンドポイントをクエリする Python のAWS Lambda コードの例を示します。最新 15 分間の Microsoft Exchange メッセージ追跡ログから上位 5 つの送信者が返されます。次に、最上位の送信者が送信したメッセージの数を CloudWatch メトリクスに送信します。
Microsoft Exchange サーバーは様々な種類のログを保管しています。これらのログには、メッセージ追跡、Exchange ウェブサービス(EWS)、Information Services(IIS)、およびアプリケーション/システムイベントログの種類が含まれます。グローバルにデプロイされた Exchange サーバーでは、これらのサーバーのローカルで複数のディレクトリにログが散在している場合があります。この場合、Exchange 管理者が各サーバーにログインして、ステータス、ヘルス、およびイベントをモニタリングする必要があります。Exchange 管理者は、これらのログを集中化し、有用なメトリクスに変換することで、各サーバーにログインすることなく、高負荷やサービス/アプリケーションエラーなどの多くの問題を特定できます。
このブログ記事では、Microsoft Exchange サーバーのログをストリーミング、分析、および保存するための効率的なアーキテクチャについて説明します。頻繁なクエリと運用分析用に、Amazon Elasticsearch Service(Amazon ES)と Kibana を使用してリアルタイムで可視化を行います。例えば、さまざまな種類のレポートを提供します。これらのレポートは、上位のメール送信者と受信者、IIS ログの上位 HTTP ステータスコード、EWS ログの上位エラーコード、負荷/エラーのスパイク絞り込みに関するものです。監査、法的要件、コンプライアンス要件などの低頻度クエリについては、Amazon S3 を最終宛先として使用しています。標準SQL を使用した簡単なクエリ向けに、低コストのストレージオプションと高い耐久性、Amazon Athena を提供します。
Amazon Kinesis Agent for Microsoft Windows(Kinesis Agent for Windows)は、構成可能で拡張可能な高度なエージェントです。Kinesis Agent for Windows は、Amazon Kinesis Data Streams、Amazon Kinesis Data Firehose、Amazon CloudWatch など、さまざまな AWS のサービスに、ログ、イベント、およびメトリクスを、収集、解析、変換、ストリーム配信します。Windows ベースのサービスからログを集中化するために、より効率的で信頼性の高い方法を提供します。これにより、問題の及ぶ範囲を確認したり、問題をモニタリングしたり、エラーや負荷が特定のしきい値を超えた場合にアラームを生成したりすることができます。Kinesis Agent for Windows について詳しくは、Amazon Kinesis Agent for Microsoft Windowsとはを参照してください。
ログの解析
Amazon ES には JSON 形式のデータが必要です。Kinesis Agent for Windows は、CSV 形式の Exchange ログ行を効率的に解析し、JSON に変換します。Kinesis Agent for Windows を使用すると、ホスト名、EC2 インスタンス ID、およびカスタム日付と時刻形式などの詳細を追加して、ログに記録された正確な問題を特定するのに役立ちます。Kinesis Agent for Windows は動的にログヘッダーを計算します。ヘッダー名が変更された場合、またはサービスを再起動するために単一のログファイルに複数のヘッダー行がある場合でも実行されます。 ログをローテーションしても、正しいデータをストリーミングします。ログのフロー
この使用例では、同じログを、リアルタイム分析するために Amazon ES へ、 Amazon Athena をオフライン分析するために Amazon S3 へと両方に送信します。ホストから各宛先にデータを 2 回ストリーミングする代わりに、Kinesis Agent for Windows を構成して、Kinesis データストリームに一度ストリーミングすることができます。ストリームから Amazon Kinesis Data Firehose がログを収集し、Amazon ES に配信します。別の Kinesis Data Firehose は、同じログを収集し、Amazon Athena の Amazon S3 バケットに配信します。ログを別の宛先に送信する必要がある場合は、別の Kinesis Data Firehose インスタンスを使用できます。AWS Lambda は Amazon ES のログを定期的に分析し、統計を CloudWatch メトリクスに投稿します。CloudWatch アラームは、投稿されたメトリクスで検出された異常をトリガーするために使用されます。
Kibana はログデータを可視化します。グラフのスパイクや異常を探して、特定のログデータをドリルダウンすることができます。Exchange サービスの特定の問題を診断するのに役立ちます。また、いくつかの認証機能によって、 Kibana へのアクセスが保護されます。Amazon Cognito を ID プロバイダで使用する方法については、Amazon Cognito Authentication for Kibana を参照してください。
Agent の設定
Kinesis Agent for Windows の設定は、%PROGRAMFILES%\Amazon\AWSKinesisTap\ の appsettings.json にて説明されています。ここでは、ソース(ログの位置)、シンク(Kinesis Data Stream information)、およびソースとシンクを接続するパイプを定義します。指定されたディレクトリの下に .log 拡張子を持つすべてのファイルをクエリするソース設定の例を次に示します。ExchangeLogSource がタイプに設定されている場合、ヘッダーのログ行が動的に解析されます。次に、「タイムスタンプ」に必要な列が自動的に選択されます。
"Sources": [
{
"Id": "MessageTracking-LogsSource",
"SourceType": "ExchangeLogSource",
"Directory": "C:\\Program Files\\Microsoft\\Exchange Server\\V15\\TransportRoles\\Logs\\MessageTracking",
"FileNameFilter": "*.log",
"TimeZoneKind": "UTC",
"TimeStampField": "date-time" //Optional.ExchangeLogSource can automatically detect if the TimestampField name is "date-time" or "DateTime".For other names, please specify
}
]
2018-10-22T10:53:13.404Z, 10.00.00.00, ExchangeServer01,10.00.00.00,ExchangeServer01,;250 2.0.0 OK;ClientSubmitTime:2018-10-22T10:53:10.680Z,Intra-Organization SMTP Send Connector,SMTP,SEND,157882997807893,<6d606502441648f993b7b6d1b8fbb5fb@ExchangeServer01>,9b3f4489-a158-4126-0d41-08d6380c8f0f,recipient@Somedomain.com,250 2.1.5 Recipient OK,sender@Somedomain.com, return-path@Somedomain.com,…
// Sinks (Destinations) は、ログの行き先を定義します
次に、ログが保存されるシンクまたは宛先を定義します。また、ロールがストリームにアクセスできる場合を想定して、別の AWS アカウントの Kinesis データストリームにログをストリーミングすることもできます。アクセスを設定する方法については、シンクセキュリティの構成を参照してください。形式 が指定されると、ログは JSON に変換されます。
"Sinks": [
{
"Id": "MessageTracking-Kinesis-Sink",
"SinkType": "KinesisStream",
"Region": "us-west-2",
"RoleARN": "arn:aws:iam::<another aws account>::role/exch-kinesis-log", // only if logs are sent to Kinesis Data Stream in another account.
"StreamName": "ex-messagetracking",
"Format": "json"
}
]
パイプは、ソースと宛先を接続します。宛先に複数のソースを取り込む必要がある場合、またはその逆の場合に役立ちます。
"Pipes": [
{
"Id": "MessageTracking-Kinesis-Pipe",
"SourceRef": "MessageTracking-LogsSource",
"SinkRef": "MessageTracking-Kinesis-Sink"
}
]
{
"date-time": "2018-10-22T10:53:13.404Z",
"client-ip": "10.00.00.00",
"client-hostname": "ExchangeServer01",
"server-ip": "10.00.00.00",
"server-hostname": "ExchangeServer01",
"source-context": ";250 2.0.0 OK;ClientSubmitTime:2018-10-22T10:53:10.680Z",
"connector-id": "Intra-Organization SMTP Send Connector",
"source": "SMTP",
"event-id": "SEND",
"internal-message-id": "157882997807893",
"message-id": "<6d606502441648f993b7b6d1b8fbb5fb@ExchangeServer01>",
"network-message-id": "9b3f4489-a158-4126-0d41-08d6380c8f0f",
"recipient-address": "recipient@Somedomain.com",
"recipient-status": "250 2.1.5 Recipient OK",
"sender-address": "sender@Somedomain.com",
"return-path": "return-path@Somedomain.com",
….
}
視覚化による操作分析停電や深刻な問題に取り組んでいるとき、ログをすぐに利用できるようになります。
以下に例を示します。スパムがの可能性があるため、上位の送信者と受信者を知る必要があります。問題が発生したときにこれらの結果が得られれば、Exchange 管理者がスパムメッセージを削除するルールを作成して、リスクを緩和できます。例えば、次の Kibana グラフは、Amazon ES のデータを視覚化します。時間ウィンドウに上位のメール送信者を示します。グラフには、上位の送信者 spam@somedomain.com が表示されます。これについてはさらに調査する必要があります。Amazon ES API コールを使用すると、集約された結果を取得し、プログラムでアクションを実行できます。このデータにアラートを配置することで、早期検出が可能になり、スパム削除アクションに繋がり、より多くのスパムを防くことができます。Kibana で視覚化を作成する方法について詳しくは、視覚化作成を参照してください。
以下は、Amazon CloudWatch の線グラフで、Amazon ES からの AWS Lambda クエリーログによって投稿された統計を示しています。
しきい値およびアラームは、CloudWatch アラームでアラートを設定できます。
Amazon ES エンドポイントをクエリする Python のAWS Lambda コードの例を示します。最新 15 分間の Microsoft Exchange メッセージ追跡ログから上位 5 つの送信者が返されます。次に、最上位の送信者が送信したメッセージの数を CloudWatch メトリクスに送信します。
import datetime
import logging
import boto3
import os
from aws_requests_auth.aws_auth import AWSRequestsAuth
from elasticsearch import Elasticsearch, RequestsHttpConnection
#Constants Declarations
epoch = datetime.datetime.utcfromtimestamp(0)
session = boto3.Session()
credentials = session.get_credentials().get_frozen_credentials()
es_host = 'search-ex-messagetracking-xxxxxxxxxxxxxxxxxxxxxxxxxx.us-west-2.es.amazonaws.com'
#Main function
def lambda_handler(event, context):
now_time = datetime.datetime.now()
query_end_time = unix_time_millis(now_time)
query_start_time = unix_time_millis(now_time - datetime.timedelta(minutes=15))
awsauth = AWSRequestsAuth(
aws_access_key=credentials.access_key,
aws_secret_access_key=credentials.secret_key,
aws_token=credentials.token,
aws_host=es_host,
aws_region=session.region_name,
aws_service='es'
)
es = Elasticsearch(
hosts=[{'host': es_host, 'port': 443}],
http_auth=awsauth,
use_ssl=True,
verify_certs=True,
connection_class=RequestsHttpConnection
)
querybody = construct_agg_query("sender-address.keyword", query_start_time, query_end_time)
log2CW("TopSenders","NoOfMsgsByTopSender",query_es(es,querybody))
# Function Declarations
def query_es(es_param,querybody_param):
es_results = es_param.search(index="timestamp-*", body=querybody_param)
parsed_value = es_results['aggregations']['3']['buckets']
print(parsed_value)
print(parsed_value[0]['doc_count'])
return parsed_value[0]['doc_count']
def unix_time_millis(dt):
return int((dt - epoch).total_seconds() * 1000.0)
def construct_agg_query(query_keyword, start_time, end_time):
return_query_body = {
"query": {
"bool": {
"must": [
{
"match_all": {}
},
{
"range": {
"date-time": {
"gte": start_time,
"lte": end_time,
"format": "epoch_millis"
}
}
}
],
"must_not": []
}
},
"size": 0,
"_source": {
"excludes": []
},
"aggs": {
"3": {
"terms": {
"field": query_keyword,
"size": 5,
"order": {
"_count": "desc"
}
}
}
}
}
return return_query_body
def log2CW (dimension_value, error_code, error_value):
cloudwatch = boto3.client('cloudwatch')
response = cloudwatch.put_metric_data(
MetricData = [
{
'MetricName': error_code,
'Dimensions': [
{
'Name': 'TransportService',
'Value': dimension_value
}
],
'Unit': 'None',
'Value': error_value
}
],
Namespace = 'Exchange/TransportService'
)
まとめ
Amazon Kinesis Agent for Microsoft Windows は解析し、ログラインを JSON に変換し、データを Amazon Kinesis Data Streams にストリームします。このブログ記事のユースケースでは、数百の Microsoft Exchange Server ログを Amazon Kinesis Data Streams に 1 分以内にストリーミングしました。Kinesis Agent for Windows は、AWS のサービスとのネイティブ統合により、集中化された AWS ストレージおよび AWS 分析サービスに効率的にログを反映します。お客様のユースケースと楽しいログもお知らせください!その他のリソース
- Kinesis Agent for Windows ユーザーガイド
- Kinesis Agent for Windows ダウンロード
- Kinesis Agent for Windows ソースコード
- ブログ : Amazon Kinesis Agent for Microsoft Windows を使用して、Windows イベント、ログ、およびメトリックを収集、解析、変換、ストリーム配信する
- ブログ: Persist Streaming Data to Amazon S3 using Amazon Kinesis Firehose and AWS Lambda
コメント
コメントを投稿