Slide 1

Slide 1 text

ぼんやりとしてたサーバレスアプリの 監視を本格的に行おうとした話 2018/04/18 Acroquest Technology 株式会社 石田 浩司 Copyright © Acroquest Technology Co., Ltd. All rights reserved.

Slide 2

Slide 2 text

自己紹介 Copyright © Acroquest Technology Co., Ltd. All rights reserved. 2 • 石田浩司(@kojiisd) ‒ Acroquest Technology Co., Ltd. ‒ AWS系開発エンジニア/ミャンマー支社CEO ‒ 2012/10 – 2015/10 ミャンマー支社CTO ‒ 2015/10 JavaOne スピーカー ‒ 2016/11 JAWS-UG 横浜支部 ‒ 2017/06 – 2018/03 ミャンマー支社CEO/CTO ‒ 2018/03 – 本社@新横浜勤務 フロント:kintone バック :AWS の構成での開発に興味あり

Slide 3

Slide 3 text

Copyright © Acroquest Technology Co., Ltd. All rights reserved. 3 サーバレスでアプリを 構築したとき 監視ってどうしてます?

Slide 4

Slide 4 text

Copyright © Acroquest Technology Co., Ltd. All rights reserved. 4 最近サーバレス(AWS Lambda) で開発をする案件が増えてきまして 僕がミャンマーにいる間に

Slide 5

Slide 5 text

Copyright © Acroquest Technology Co., Ltd. All rights reserved. 5 サーバレスアプリケーションの 監視について考えることも 多くなりまして 僕がミャンマーにいる間に

Slide 6

Slide 6 text

Copyright © Acroquest Technology Co., Ltd. All rights reserved. 6 AWSでの監視といえば

Slide 7

Slide 7 text

CloudWatch 1. AWSリソースとAWSで実行しているアプリケーション をリアルタイムでモニタリング 2. CloudWatch Logs を使用して、ログファイルに対する モニタリング、保存、アクセスを、Amazon EC2 イン スタンス、AWS CloudTrail、その他のリソースから行 う。 Copyright © Acroquest Technology Co., Ltd. All rights reserved. 7 出展:https://aws.amazon.com/jp/documentation/cloudwatch/ 今回はログ監視で実現したい

Slide 8

Slide 8 text

CloudWatch 1. AWSリソースとAWSで実行しているアプリケーション をリアルタイムでモニタリング 2. CloudWatch Logs を使用して、ログファイルに対する モニタリング、保存、アクセスを、Amazon EC2 イン スタンス、AWS CloudTrail、その他のリソースから行 う。 Copyright © Acroquest Technology Co., Ltd. All rights reserved. 8 出展:https://aws.amazon.com/jp/documentation/cloudwatch/ 一見するととてもよさそう

Slide 9

Slide 9 text

やりたいことは・・・ 1. CloudWatch Logsに出力しているログの分析 2. 定期的にチェックしたい(緩めの監視) 3. ロググループを串刺しで監視したい 4. 問題発生時に送付するメールの文面は自由に編集したい 5. この辺を格安でやりたい Copyright © Acroquest Technology Co., Ltd. All rights reserved. 9

Slide 10

Slide 10 text

Copyright © Acroquest Technology Co., Ltd. All rights reserved. 10 実際に適用を 考えてみたら・・・

Slide 11

Slide 11 text

かゆいところに手が届かない感じ 1. 予期せぬエラーログが出ているかどうか、定期的にメー ル通知したい。(割と緩い監視) 2. 指定するエラーログは正規表現で書きたい。 3. 複数のロググループをまとめて1つの設定で監視したい。 4. メール通知には、エラーログの内容を含めたい。 5. お金かけたくない(組み合わせで料金かかるイメージ)。 Copyright © Acroquest Technology Co., Ltd. All rights reserved. 11 CloudWatchのメトリクスフィルタ・サブスクリプションで 実現しようとするも・・・

Slide 12

Slide 12 text

かゆいところに手が届かない感じ 1. 予期せぬエラーログが出ているかどうか、定期的にメー ル通知したい。(割と緩い監視) 2. 指定するエラーログは正規表現で書きたい。 3. 複数のロググループをまとめて1つの設定で監視したい。 4. メール通知には、エラーログの内容を含めたい。 5. お金かけたくない(組み合わせで料金かかるイメージ)。 Copyright © Acroquest Technology Co., Ltd. All rights reserved. 12 メトリクスフィルタの場合 1. 通知するエラーログを正規表現で指定できない。 2. 各ロググループ単位でしかエラー通知の設定ができない。 3. エラーログの内容をメールの文面に含められない。 ?

Slide 13

Slide 13 text

かゆいところに手が届かない感じ 1. 予期せぬエラーログが出ているかどうか、定期的にメー ル通知したい。(割と緩い監視) 2. 指定するエラーログは正規表現で書きたい。 3. 複数のロググループをまとめて1つの設定で監視したい。 4. メール通知には、エラーログの内容を含めたい。 5. お金かけたくない(組み合わせで料金かかるイメージ)。 Copyright © Acroquest Technology Co., Ltd. All rights reserved. 13 CloudWatch Logs サブスクリプションの場合 1. 通知するエラーログを正規表現で指定するために、ログ出力ごとに 通知を処理する必要がある。(手間) 2. 各ロググループ単位でしかエラー通知の設定ができない。 ?

Slide 14

Slide 14 text

Copyright © Acroquest Technology Co., Ltd. All rights reserved. 14 そもそも今後も末永く適用する 予定なので、安易にお金払って AWSのサービスというのも いかがなものか ※あくまで個人の見解です

Slide 15

Slide 15 text

Copyright © Acroquest Technology Co., Ltd. All rights reserved. 15 書くか・・・

Slide 16

Slide 16 text

仕様の整理 1. 定期的に実行される。(Lambda cron) 2. S3から前回実行時刻を取得する。S3にデータがなければ、1日 前を前回実行時刻とする。処理終了時に実行時刻を更新する。 3. 前回実行時刻から現在時刻までの全ログ(/aws/lambdaで始ま るログ)グループの最初のストリームをCloudWatchから取得 する。(ログのprefixは複数指定可能) 4. 取得したログ情報をテキストに加工し、環境変数で設定した SNSのトピックARNへ通知する。 Copyright © Acroquest Technology Co., Ltd. All rights reserved. 16

Slide 17

Slide 17 text

仕様の整理(動作イメージ) こんな感じの動作にしました。 Copyright © Acroquest Technology Co., Ltd. All rights reserved. 17 1. Cronから呼び出されたParent Lambdaが、S3から前回実行時刻 を取得する。 2. Parent Lambdaが指定した prefixごとに子Lambdaを呼びだ す。 3. 呼び出された子Lambdaが指 定prefixグループのログを収集し、 前回実行時刻以降のログに絞り込 む。 4. ログ内容を整形し、SNSへ通知。

Slide 18

Slide 18 text

各種呼び出しはPythonでサクッと実装 Copyright © Acroquest Technology Co., Ltd. All rights reserved. 18 // S3バケット読み込み s3 = boto3.session.Session().resource('s3') bucket_name = os.environ['ALERT_LOG_BUCKET'] bucket = s3.Bucket(bucket_name) key = os.environ['ALERT_LOG_KEY'] object = bucket.Object(key) last_updated_time_str = object.get()['Body'].read().decode('utf-8') result = int(last_updated_time_str) ... // S3バケット書き込み object = bucket.Object(key) object.put( Body=str(last_exec_time).encode('utf-8'), ContentEncoding='utf-8', ContentType='text/plain‘ ) S3呼び出し function_name = os.environ['FILTERED_ALERT_LOGS'] lambda_client = boto3.session.Session().client('lambda') lambda_client.invoke( FunctionName=function_name, InvocationType='Event', LogType='Tail', Payload=json.dumps(request) ) Lambda呼び出し // ロググループの取得 client = boto3.session.Session().client('logs') response = client.describe_log_groups( logGroupNamePrefix=prefix ) ... // ログストリームの取得 response = client.describe_log_streams( logGroupName=group_name, orderBy='LastEventTime', descending=True, limit=limit ) ... // ログイベントの取得 logs = client.get_log_events( logGroupName=group_name, logStreamName=stream_name, startTime=start_time, endTime=end_time, startFromHead=True ) CloudWatch呼び出し message = '整形したCloudWatchログ‘ topic_arn = os.environ['ALERT_LOG_TOPIC_ARN'] subject = os.environ['ALERT_LOG_SUBJECT'] sns_request_params = { 'TopicArn': topic_arn, 'Message': message, 'Subject': subject } sns_client = boto3.session.Session().client('sns') sns_client.publish(**sns_request_params) SNS呼び出し

Slide 19

Slide 19 text

結果・・・ Copyright © Acroquest Technology Co., Ltd. All rights reserved. 19 1. 予期せぬエラーログが出ているかどうか、定期的にメール通知 したい。(割と緩い監視) OK 2. 指定するエラーログは正規表現で書きたい。 OK 3. 複数のロググループをまとめて1つの設定で監視したい。 OK 4. メール通知には、エラーログの内容を含めたい。 OK 5. お金かけたくない(組み合わせで料金かかるイメージ)。 たぶんOK https://github.com/acroquest/aws-cloudwatch-logwatcher/

Slide 20

Slide 20 text

同僚が会社ブログでまとめてます 詳細はWebで。 Copyright © Acroquest Technology Co., Ltd. All rights reserved. 20 http://acro-engineer.hatenablog.com/entry/2018/01/30/121000

Slide 21

Slide 21 text

Copyright © Acroquest Technology Co., Ltd. All rights reserved. 21 DynamoDBの監視もしたい。 キャパシティユニットの消費量を 割合で監視するイメージで。 JAWS-UGで話すならネタあげるよ(^^ by とても部下想いな上司

Slide 22

Slide 22 text

キャパシティユニットとは 1. DynamoDBテーブルのスループット設定。読み込みと 書き込みの性能を事前に定義し、テーブルのパフォーマ ンスを確保する。 Copyright © Acroquest Technology Co., Ltd. All rights reserved. 22 詳細は公式ページで https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/HowItWorks.ProvisionedThroughput.html

Slide 23

Slide 23 text

CloudWatchメトリクスでは使用量のみ取得可能 1. CloudWatchメトリクスでキャパティティユニットの監 視は可能だが、取得できるのは使用「量」のみ。 ① ConsumedReadCapacityUnits / ConsumedWriteCapacityUnits Copyright © Acroquest Technology Co., Ltd. All rights reserved. 23 事前に定義したキャパシティユニット (ProvisionedRead/WriteCapacityUnits) を踏まえた割合計算には実装が必要

Slide 24

Slide 24 text

Copyright © Acroquest Technology Co., Ltd. All rights reserved. 書くか・・・

Slide 25

Slide 25 text

仕様の整理(動作イメージ) こんな感じの動作を作る。 Copyright © Acroquest Technology Co., Ltd. All rights reserved. 25 ① CloudWatchが定期的に DynamoDBの消費キャパシティを 記録してくれる。 ② 定期実行でLambdaスクリプト が開始し、DynamoDBに設定され ている最新のキャパシティユニット 設定値を取得する。 ③ 過去1時間分のメトリクスを、5 分間隔でキャパシティユニット平均 使用量を取得する。 ④ 設定値と実際の値からユニット 使用割合を計算する。 ①メトリクス記録 (自動) ③メトリクス取得 (定期実行) ②設定値取得 (定期実行) ④割合計算

Slide 26

Slide 26 text

実装しました メトリクスはこんな実装で取得できる。 Copyright © Acroquest Technology Co., Ltd. All rights reserved. 26 cloud_watch.get_metric_statistics( Namespace=parameters['namespace'], MetricName=parameters['metric_name'], Dimensions=[ { 'Name': parameters['dimension_name'], 'Value': parameters['dimension_value'] } ], StartTime=parameters['start_time'], EndTime=parameters['end_time'], Period=parameters['period'], Statistics=parameters['statistics'], Unit=parameters['unit']) Key Value Namespace AWS/DynamoDB MetricName ConsumedReadCapacity Dimensions.Name TableName Dimensions.Value [DynamoDBテーブル名] StartTime 開始時刻 EndTime 終了時刻(現在時刻) Period 期間(秒) Statistics [‘Average’] Unit Count 例:読み込みキャパシティ使用量取得

Slide 27

Slide 27 text

Copyright © Acroquest Technology Co., Ltd. All rights reserved. 27 https://camo.qiitausercontent.com/9c7fe153a3ed69ed92643cb5b1fb8b 70c5911145/68747470733a2f2f71696974612d696d6167652d73746f72 652e73332e616d617a6f6e6177732e636f6d2f302f3133333833382f303 93265656430612d373466332d663762662d373637362d366436623263 6537616537322e706e67 詳しくは で https://qiita.com/kojiisd/items/c7f0fe22e1353eecb909

Slide 28

Slide 28 text

会社のツールにも組み込んだよ!(今日) Copyright © Acroquest Technology Co., Ltd. All rights reserved. 28 だれかテストして! 割合計算&設定回数の 閾値超えでメール送付、という処理を追加。

Slide 29

Slide 29 text

Copyright © Acroquest Technology Co., Ltd. All rights reserved. DEMO

Slide 30

Slide 30 text

まとめ 1. AWS Lambdaで開発したアプリケーションの監視を CloudWatch Logsからログ収集して実施するスクリプ トを開発しました。 2. DynamoDBのキャパシティユニット消費量を、使用量 ではなく割合で監視できるスクリプトを開発しました。 3. 各AWSサービスのできること/できないことを理解し て適用を考えることが重要 4. 誰かさっきのスクリプトテストして! Copyright © Acroquest Technology Co., Ltd. All rights reserved. 30

Slide 31

Slide 31 text

まとめ 1. AWS Lambdaで開発したアプリケーションの監視を CloudWatch Logsからログ収集して実施するスクリプ トを開発しました。 2. DynamoDBのキャパシティユニット消費量を、使用量 ではなく割合で監視できるスクリプトを開発しました。 3. 各AWSサービスのできること/できないことを理解し て適用を考えることが重要 4. サーバレスの監視って、いろいろな人と話をしたい 5. 誰かさっきのスクリプトテストして! Copyright © Acroquest Technology Co., Ltd. All rights reserved. 31

Slide 32

Slide 32 text

Copyright © Acroquest Technology Co., Ltd. All rights reserved. 32 Infrastructures Evolution ご清聴ありがとうございました