Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Speaker Deck
PRO
Sign in
Sign up for free
ぼんやりとしてたサーバレスアプリの監視を本格的に行おうとした話
Koji Ishida
April 18, 2018
Technology
0
510
ぼんやりとしてたサーバレスアプリの 監視を本格的に行おうとした話
Koji Ishida
April 18, 2018
Tweet
Share
More Decks by Koji Ishida
See All by Koji Ishida
サーバレスでDynamoDBレスなIoTアプリ開発
kojiisd
0
340
AWSAmplifyHappyDev.pdf
kojiisd
1
1.9k
はじめてのCloudFormation
kojiisd
0
1.5k
機械学習で異常や障害予兆を検出
kojiisd
1
1k
Other Decks in Technology
See All in Technology
Modern Android dependency injection
hugovisser
1
120
データチームの境界を考える
yummydum
0
190
2022年度新卒技術研修「エンジニアマインド」講義
excitejp
PRO
0
370
OPENLOGI Company Profile
hr01
0
320
ひとりでも安定して 組織を変える活動を続けていくための ストレスマネジメント
pastelinc
0
790
アジャイル推進活動におけるBeAgileへの変化の兆し/Signs_of_Change_to_"Be_Agile"_in_Agile_Promotion_Activities
m_iyama
0
130
Persistence in Serverless Applications - ServerlessDays NYC
marcduiker
0
200
ログ基盤をCloudWatchLogからNewRelic Logs + S3に変えたら 利便性も上がってコストも下がった話
onohiroshi1
0
170
視座とアジャイル / shiza_and_agile
kyoshimoto
0
180
SI企業が「アジャイル推し」になったら 幸せになれますか?/Can SI company be happy if it becomes “Agile stan” ?
chinmo
1
1.1k
WACATE 2022 夏 ワークショップの目的
imtnd
0
120
UIKitのアップデート #WWDC22
akatsuki174
3
190
Featured
See All Featured
Designing with Data
zakiwarfel
91
3.9k
Fashionably flexible responsive web design (full day workshop)
malarkey
396
62k
Debugging Ruby Performance
tmm1
65
10k
Clear Off the Table
cherdarchuk
79
280k
How To Stay Up To Date on Web Technology
chriscoyier
780
250k
Making the Leap to Tech Lead
cromwellryan
113
7.4k
Java REST API Framework Comparison - PWX 2021
mraible
PRO
11
4.7k
From Idea to $5000 a Month in 5 Months
shpigford
373
44k
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
12
920
The Brand Is Dead. Long Live the Brand.
mthomps
46
2.7k
Principles of Awesome APIs and How to Build Them.
keavy
113
15k
Testing 201, or: Great Expectations
jmmastey
21
5.4k
Transcript
ぼんやりとしてたサーバレスアプリの 監視を本格的に行おうとした話 2018/04/18 Acroquest Technology 株式会社 石田 浩司 Copyright ©
Acroquest Technology Co., Ltd. All rights reserved.
自己紹介 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 の構成での開発に興味あり
Copyright © Acroquest Technology Co., Ltd. All rights reserved. 3
サーバレスでアプリを 構築したとき 監視ってどうしてます?
Copyright © Acroquest Technology Co., Ltd. All rights reserved. 4
最近サーバレス(AWS Lambda) で開発をする案件が増えてきまして 僕がミャンマーにいる間に
Copyright © Acroquest Technology Co., Ltd. All rights reserved. 5
サーバレスアプリケーションの 監視について考えることも 多くなりまして 僕がミャンマーにいる間に
Copyright © Acroquest Technology Co., Ltd. All rights reserved. 6
AWSでの監視といえば
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/ 今回はログ監視で実現したい
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/ 一見するととてもよさそう
やりたいことは・・・ 1. CloudWatch Logsに出力しているログの分析 2. 定期的にチェックしたい(緩めの監視) 3. ロググループを串刺しで監視したい 4. 問題発生時に送付するメールの文面は自由に編集したい
5. この辺を格安でやりたい Copyright © Acroquest Technology Co., Ltd. All rights reserved. 9
Copyright © Acroquest Technology Co., Ltd. All rights reserved. 10
実際に適用を 考えてみたら・・・
かゆいところに手が届かない感じ 1. 予期せぬエラーログが出ているかどうか、定期的にメー ル通知したい。(割と緩い監視) 2. 指定するエラーログは正規表現で書きたい。 3. 複数のロググループをまとめて1つの設定で監視したい。 4. メール通知には、エラーログの内容を含めたい。
5. お金かけたくない(組み合わせで料金かかるイメージ)。 Copyright © Acroquest Technology Co., Ltd. All rights reserved. 11 CloudWatchのメトリクスフィルタ・サブスクリプションで 実現しようとするも・・・
かゆいところに手が届かない感じ 1. 予期せぬエラーログが出ているかどうか、定期的にメー ル通知したい。(割と緩い監視) 2. 指定するエラーログは正規表現で書きたい。 3. 複数のロググループをまとめて1つの設定で監視したい。 4. メール通知には、エラーログの内容を含めたい。
5. お金かけたくない(組み合わせで料金かかるイメージ)。 Copyright © Acroquest Technology Co., Ltd. All rights reserved. 12 メトリクスフィルタの場合 1. 通知するエラーログを正規表現で指定できない。 2. 各ロググループ単位でしかエラー通知の設定ができない。 3. エラーログの内容をメールの文面に含められない。 ?
かゆいところに手が届かない感じ 1. 予期せぬエラーログが出ているかどうか、定期的にメー ル通知したい。(割と緩い監視) 2. 指定するエラーログは正規表現で書きたい。 3. 複数のロググループをまとめて1つの設定で監視したい。 4. メール通知には、エラーログの内容を含めたい。
5. お金かけたくない(組み合わせで料金かかるイメージ)。 Copyright © Acroquest Technology Co., Ltd. All rights reserved. 13 CloudWatch Logs サブスクリプションの場合 1. 通知するエラーログを正規表現で指定するために、ログ出力ごとに 通知を処理する必要がある。(手間) 2. 各ロググループ単位でしかエラー通知の設定ができない。 ?
Copyright © Acroquest Technology Co., Ltd. All rights reserved. 14
そもそも今後も末永く適用する 予定なので、安易にお金払って AWSのサービスというのも いかがなものか ※あくまで個人の見解です
Copyright © Acroquest Technology Co., Ltd. All rights reserved. 15
書くか・・・
仕様の整理 1. 定期的に実行される。(Lambda cron) 2. S3から前回実行時刻を取得する。S3にデータがなければ、1日 前を前回実行時刻とする。処理終了時に実行時刻を更新する。 3. 前回実行時刻から現在時刻までの全ログ(/aws/lambdaで始ま るログ)グループの最初のストリームをCloudWatchから取得
する。(ログのprefixは複数指定可能) 4. 取得したログ情報をテキストに加工し、環境変数で設定した SNSのトピックARNへ通知する。 Copyright © Acroquest Technology Co., Ltd. All rights reserved. 16
仕様の整理(動作イメージ) こんな感じの動作にしました。 Copyright © Acroquest Technology Co., Ltd. All rights
reserved. 17 1. Cronから呼び出されたParent Lambdaが、S3から前回実行時刻 を取得する。 2. Parent Lambdaが指定した prefixごとに子Lambdaを呼びだ す。 3. 呼び出された子Lambdaが指 定prefixグループのログを収集し、 前回実行時刻以降のログに絞り込 む。 4. ログ内容を整形し、SNSへ通知。
各種呼び出しは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呼び出し
結果・・・ 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/
同僚が会社ブログでまとめてます 詳細はWebで。 Copyright © Acroquest Technology Co., Ltd. All rights
reserved. 20 http://acro-engineer.hatenablog.com/entry/2018/01/30/121000
Copyright © Acroquest Technology Co., Ltd. All rights reserved. 21
DynamoDBの監視もしたい。 キャパシティユニットの消費量を 割合で監視するイメージで。 JAWS-UGで話すならネタあげるよ(^^ by とても部下想いな上司
キャパシティユニットとは 1. DynamoDBテーブルのスループット設定。読み込みと 書き込みの性能を事前に定義し、テーブルのパフォーマ ンスを確保する。 Copyright © Acroquest Technology Co.,
Ltd. All rights reserved. 22 詳細は公式ページで https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/HowItWorks.ProvisionedThroughput.html
CloudWatchメトリクスでは使用量のみ取得可能 1. CloudWatchメトリクスでキャパティティユニットの監 視は可能だが、取得できるのは使用「量」のみ。 ① ConsumedReadCapacityUnits / ConsumedWriteCapacityUnits Copyright ©
Acroquest Technology Co., Ltd. All rights reserved. 23 事前に定義したキャパシティユニット (ProvisionedRead/WriteCapacityUnits) を踏まえた割合計算には実装が必要
Copyright © Acroquest Technology Co., Ltd. All rights reserved. 書くか・・・
仕様の整理(動作イメージ) こんな感じの動作を作る。 Copyright © Acroquest Technology Co., Ltd. All rights
reserved. 25 ① CloudWatchが定期的に DynamoDBの消費キャパシティを 記録してくれる。 ② 定期実行でLambdaスクリプト が開始し、DynamoDBに設定され ている最新のキャパシティユニット 設定値を取得する。 ③ 過去1時間分のメトリクスを、5 分間隔でキャパシティユニット平均 使用量を取得する。 ④ 設定値と実際の値からユニット 使用割合を計算する。 ①メトリクス記録 (自動) ③メトリクス取得 (定期実行) ②設定値取得 (定期実行) ④割合計算
実装しました メトリクスはこんな実装で取得できる。 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 例:読み込みキャパシティ使用量取得
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
会社のツールにも組み込んだよ!(今日) Copyright © Acroquest Technology Co., Ltd. All rights reserved.
28 だれかテストして! 割合計算&設定回数の 閾値超えでメール送付、という処理を追加。
Copyright © Acroquest Technology Co., Ltd. All rights reserved. DEMO
まとめ 1. AWS Lambdaで開発したアプリケーションの監視を CloudWatch Logsからログ収集して実施するスクリプ トを開発しました。 2. DynamoDBのキャパシティユニット消費量を、使用量 ではなく割合で監視できるスクリプトを開発しました。
3. 各AWSサービスのできること/できないことを理解し て適用を考えることが重要 4. 誰かさっきのスクリプトテストして! Copyright © Acroquest Technology Co., Ltd. All rights reserved. 30
まとめ 1. AWS Lambdaで開発したアプリケーションの監視を CloudWatch Logsからログ収集して実施するスクリプ トを開発しました。 2. DynamoDBのキャパシティユニット消費量を、使用量 ではなく割合で監視できるスクリプトを開発しました。
3. 各AWSサービスのできること/できないことを理解し て適用を考えることが重要 4. サーバレスの監視って、いろいろな人と話をしたい 5. 誰かさっきのスクリプトテストして! Copyright © Acroquest Technology Co., Ltd. All rights reserved. 31
Copyright © Acroquest Technology Co., Ltd. All rights reserved. 32
Infrastructures Evolution ご清聴ありがとうございました