jaws20140117
TRANSCRIPT
Copyright © 2014 AGREX INC.
チャラチャッチャチャラッチャーでちょっと良いものができた話
14年1月18日土曜日
Copyright © 2014 AGREX INC. 2
まず、ごめんなさい
14年1月18日土曜日
Copyright © 2014 AGREX INC. 2
まず、ごめんなさい
素晴らしいお話の数々の後では、完全にお耳汚しですw
14年1月18日土曜日
Copyright © 2014 AGREX INC. 3
プロフィールてるい まさし
照井 将士http://www.facebook.com/marcy.terui
(株)アグレックス 札幌事業所 システム部
AWS Certified Solutions Architect
1987年 東京都大田区生まれ1992年 札幌移住2011年 (株)アグレックス入社
役職:下っ端・雑用係
好きなサービスRoute53、CloudWatch、RDS(MySQL)
14年1月18日土曜日
Copyright © 2014 AGREX INC. 3
プロフィールてるい まさし
照井 将士http://www.facebook.com/marcy.terui
(株)アグレックス 札幌事業所 システム部
AWS Certified Solutions Architect
1987年 東京都大田区生まれ1992年 札幌移住2011年 (株)アグレックス入社
役職:下っ端・雑用係
好きなサービスRoute53、CloudWatch、RDS(MySQL)
14年1月18日土曜日
Copyright © 2014 AGREX INC. 3
プロフィールてるい まさし
照井 将士http://www.facebook.com/marcy.terui
(株)アグレックス 札幌事業所 システム部
AWS Certified Solutions Architect
1987年 東京都大田区生まれ1992年 札幌移住2011年 (株)アグレックス入社
役職:下っ端・雑用係
好きなサービスRoute53、CloudWatch、RDS(MySQL)
14年1月18日土曜日
Copyright © 2014 AGREX INC. 3
プロフィールてるい まさし
照井 将士http://www.facebook.com/marcy.terui
(株)アグレックス 札幌事業所 システム部
AWS Certified Solutions Architect
1987年 東京都大田区生まれ1992年 札幌移住2011年 (株)アグレックス入社
役職:下っ端・雑用係
好きなサービスRoute53、CloudWatch、RDS(MySQL)
AWSチームリーダーにクラスアップしました!※注 現状1人チームだからリーダーなだけw
14年1月18日土曜日
Copyright © 2014 AGREX INC. 4
とある問題がありました。
14年1月18日土曜日
Copyright © 2014 AGREX INC. 4
とある問題がありました。
アカウントが増えてきて、CloudWatchのアラート状況の把握が難しくなってきた。
14年1月18日土曜日
Copyright © 2014 AGREX INC. 4
とある問題がありました。
アカウントが増えてきて、CloudWatchのアラート状況の把握が難しくなってきた。コンソールからは当然アカウント単位でしか見れない。でも、データストアとか監視サーバの管理しなくて良いし、アカウント単位で誰かに見せたくなったらIAMユーザ使ったりできて良い所も一杯あるから、辞めてZabbixに集約とかっていうのも微妙なんですよね~
14年1月18日土曜日
Copyright © 2014 AGREX INC. 5
ウチにはこんな子が居ます。
ウチの警子ちゃんhttp://www.isa-j.co.jp/keiko-10th/index[1].html
14年1月18日土曜日
Copyright © 2014 AGREX INC. 5
ウチにはこんな子が居ます。
ウチの警子ちゃんhttp://www.isa-j.co.jp/keiko-10th/index[1].htmlピピピピ
CloudWatchのアラームが上がると…
14年1月18日土曜日
Copyright © 2014 AGREX INC. 5
ウチにはこんな子が居ます。
ウチの警子ちゃんhttp://www.isa-j.co.jp/keiko-10th/index[1].htmlピピピピ
なんで鳴ってるの…?アラートメールどこ行った??
CloudWatchのアラームが上がると…
14年1月18日土曜日
Copyright © 2014 AGREX INC. 6
ということで
クロスアカウントで、アラーム状態を集約して見られるダッシュボード的なものが欲しい!
14年1月18日土曜日
Copyright © 2014 AGREX INC. 7
ということで
作ってみました。
14年1月18日土曜日
Copyright © 2014 AGREX INC. 8
どんな感じで作った?
こんな感じです。
14年1月18日土曜日
Copyright © 2014 AGREX INC. 9
ミュージックスタート!古いって言わないでwww
14年1月18日土曜日
Copyright © 2014 AGREX INC. 9
ミュージックスタート!古いって言わないでwww
右左
ォ" __,,,.. 、 `、 チ,, _,,..、"" ,,,ィェェォーン`''" 、 ヾ ヽ、 イ;;: :./~`''" ‾‾ ¨ ¨`リ、"ヾ、 、 、 ヽ f;;::/ ミヾ ヽ 、 、 .}
. ∨ .::::... ミ 、 、 ;'i
. { ..:;::.. ミ゛ 、 、', .}
,ァ'ー-、:{i:t,,..--'"`ヽ、`ヽ:::::`ヾ、 ` 、', }
'"''t--=ゞ、`ー三''"‾` `:::: | 、',. .|
无エニ=/ ::(アエエ=-、_,.::: | y=、 .リ 广;;''/ ::.`ー ''"~ ::. | チ''" ィ''ヾヽ リ { .::/ .....::、 .......::::::: | / , 、ヾ ノ / ,'
`、 ( ,zzュ,,リ:. ....::::::::: | / r' イ='./ / ,'
|,ィエェエta、 :::. ..::::. | .|::("'´゛./ ,/
キ'"、__`ヾッ, :: ~´;;;;`ーイ ,'
,,,..ィ==t、 `、¨`ー'"ア"::.. ..:::::: /;;; :| ,'
以zzt、;;;;`、 ヾ、,,,;:'"....;;;;;;..:::: /;;;;; :| .,'
f三三~`,,`、} |i |;;;ミ ,,.イ;;;;;;;;; :| ,'
〉==- 、三;/ {ヾt;;;ミ_,,,,,.ィツ;;;;;;;;;;;;;;;; ツ_ / `ヾナ `ー====マ-''";;;;;;;;;;;; ∨` i
. / ./ リt;;;;;;;;; :::: / `t、 / /. / :i;;;;::.... / / `、. / / ,. ィ"i `、;;;:: ,.イ / ヽ、 / / ,. - '" | `、;: ,. イ / `ー /~\ ,... /,. - ' " /-- .、 〉-r''" /
,. ィ''",,.. 、 `Y |" f:::::::::__/`ー-ナ--――-ァ /,'
r'"‾ `ヽ、!、 〉 {::::::ー''リ、;;;;チ`ー=ニ_::::::/ / ./
{,,.. =---''`ヽ、`}:: .{ ',::::::::::/~`、ヾ`ヽ,,::: / / ,'
チャラチャッチャチャラッチャ~♪
14年1月18日土曜日
Copyright © 2014 AGREX INC. 9
ミュージックスタート!古いって言わないでwww
(((((【右から】c(・ェ・c`)三(´っ・ェ・)っ((((((【左へ】受け流す~♪
右左
ォ" __,,,.. 、 `、 チ,, _,,..、"" ,,,ィェェォーン`''" 、 ヾ ヽ、 イ;;: :./~`''" ‾‾ ¨ ¨`リ、"ヾ、 、 、 ヽ f;;::/ ミヾ ヽ 、 、 .}
. ∨ .::::... ミ 、 、 ;'i
. { ..:;::.. ミ゛ 、 、', .}
,ァ'ー-、:{i:t,,..--'"`ヽ、`ヽ:::::`ヾ、 ` 、', }
'"''t--=ゞ、`ー三''"‾` `:::: | 、',. .|
无エニ=/ ::(アエエ=-、_,.::: | y=、 .リ 广;;''/ ::.`ー ''"~ ::. | チ''" ィ''ヾヽ リ { .::/ .....::、 .......::::::: | / , 、ヾ ノ / ,'
`、 ( ,zzュ,,リ:. ....::::::::: | / r' イ='./ / ,'
|,ィエェエta、 :::. ..::::. | .|::("'´゛./ ,/
キ'"、__`ヾッ, :: ~´;;;;`ーイ ,'
,,,..ィ==t、 `、¨`ー'"ア"::.. ..:::::: /;;; :| ,'
以zzt、;;;;`、 ヾ、,,,;:'"....;;;;;;..:::: /;;;;; :| .,'
f三三~`,,`、} |i |;;;ミ ,,.イ;;;;;;;;; :| ,'
〉==- 、三;/ {ヾt;;;ミ_,,,,,.ィツ;;;;;;;;;;;;;;;; ツ_ / `ヾナ `ー====マ-''";;;;;;;;;;;; ∨` i
. / ./ リt;;;;;;;;; :::: / `t、 / /. / :i;;;;::.... / / `、. / / ,. ィ"i `、;;;:: ,.イ / ヽ、 / / ,. - '" | `、;: ,. イ / `ー /~\ ,... /,. - ' " /-- .、 〉-r''" /
,. ィ''",,.. 、 `Y |" f:::::::::__/`ー-ナ--――-ァ /,'
r'"‾ `ヽ、!、 〉 {::::::ー''リ、;;;;チ`ー=ニ_::::::/ / ./
{,,.. =---''`ヽ、`}:: .{ ',::::::::::/~`、ヾ`ヽ,,::: / / ,'
チャラチャッチャチャラッチャ~♪
14年1月18日土曜日
Copyright © 2014 AGREX INC. 9
ミュージックスタート!古いって言わないでwww
右左
ォ" __,,,.. 、 `、 チ,, _,,..、"" ,,,ィェェォーン`''" 、 ヾ ヽ、 イ;;: :./~`''" ‾‾ ¨ ¨`リ、"ヾ、 、 、 ヽ f;;::/ ミヾ ヽ 、 、 .}
. ∨ .::::... ミ 、 、 ;'i
. { ..:;::.. ミ゛ 、 、', .}
,ァ'ー-、:{i:t,,..--'"`ヽ、`ヽ:::::`ヾ、 ` 、', }
'"''t--=ゞ、`ー三''"‾` `:::: | 、',. .|
无エニ=/ ::(アエエ=-、_,.::: | y=、 .リ 广;;''/ ::.`ー ''"~ ::. | チ''" ィ''ヾヽ リ { .::/ .....::、 .......::::::: | / , 、ヾ ノ / ,'
`、 ( ,zzュ,,リ:. ....::::::::: | / r' イ='./ / ,'
|,ィエェエta、 :::. ..::::. | .|::("'´゛./ ,/
キ'"、__`ヾッ, :: ~´;;;;`ーイ ,'
,,,..ィ==t、 `、¨`ー'"ア"::.. ..:::::: /;;; :| ,'
以zzt、;;;;`、 ヾ、,,,;:'"....;;;;;;..:::: /;;;;; :| .,'
f三三~`,,`、} |i |;;;ミ ,,.イ;;;;;;;;; :| ,'
〉==- 、三;/ {ヾt;;;ミ_,,,,,.ィツ;;;;;;;;;;;;;;;; ツ_ / `ヾナ `ー====マ-''";;;;;;;;;;;; ∨` i
. / ./ リt;;;;;;;;; :::: / `t、 / /. / :i;;;;::.... / / `、. / / ,. ィ"i `、;;;:: ,.イ / ヽ、 / / ,. - '" | `、;: ,. イ / `ー /~\ ,... /,. - ' " /-- .、 〉-r''" /
,. ィ''",,.. 、 `Y |" f:::::::::__/`ー-ナ--――-ァ /,'
r'"‾ `ヽ、!、 〉 {::::::ー''リ、;;;;チ`ー=ニ_::::::/ / ./
{,,.. =---''`ヽ、`}:: .{ ',::::::::::/~`、ヾ`ヽ,,::: / / ,'
チャラチャッチャチャラッチャ~♪
14年1月18日土曜日
Copyright © 2014 AGREX INC. 10
わかりましたか?
すいません。ちゃんと説明します。
14年1月18日土曜日
Copyright © 2014 AGREX INC. 11
こんな感じです。require dirname(__DIR__) . '/init.php';
use Aws\CloudWatch\CloudWatchClient;use DashBoard\Util\Propaties;
$data = array();foreach (new DirectoryIterator(PROPATIES_DIR) as $fileInfo) { if($fileInfo->isDot()) continue; $prop = new Propaties(PROPATIES_DIR . "/" . $fileInfo->getFilename()); $cloudwatch = CloudWatchClient::factory(array( 'key' => $prop->get(PROPATIES_ACCESS_KEY), 'secret' => $prop->get(PROPATIES_SECRET_KEY), 'region' => AWS_REGION )); $model = $cloudwatch->describeAlarms(); $data[$prop->get(PROPATIES_SYSTEM_NAME)] = $model->get("MetricAlarms");}
$rows = "";foreach ($data as $systemName => $alarms) { foreach ($alarms as $alarm) { $rows .= "['{$systemName}', '{$alarm['AlarmName']}', '{$alarm['AlarmDescription']}', '{$alarm['MetricName']}', '{$alarm['StateValue']}'],\n"; }}
$date = date("Y-m-d H:i:s");$content = "<html> <head> <script type='text/javascript' src='https://www.google.com/jsapi'></script> <script type='text/javascript'> google.load('visualization', '1', {packages:['table']}); google.setOnLoadCallback(drawTable); function drawTable() { var data = new google.visualization.DataTable(); data.addColumn('string', 'SystemName'); data.addColumn('string', 'AlarmName'); data.addColumn('string', 'AlarmDescription'); data.addColumn('string', 'MetricName'); data.addColumn('string', 'StateValue'); data.addRows([ {$rows} ]); var table = new google.visualization.Table(document.getElementById('table_div')); var formatter = new google.visualization.ColorFormat(); formatter.addRange('ALARM', 'INSUFFICIENT_DATA', 'white', 'red'); formatter.addRange('INSUFFICIENT_DATA', 'OK', 'white', 'orange'); formatter.addRange('OK', null, 'white', '#33ff33'); formatter.format(data, 4); table.draw(data, {allowHtml: true, showRowNumber: true}); } </script> </head> <body> <h1>{$date}時点</h1> <div id='table_div'></div> </body></html>";echo $content;
14年1月18日土曜日
Copyright © 2014 AGREX INC. 11
こんな感じです。require dirname(__DIR__) . '/init.php';
use Aws\CloudWatch\CloudWatchClient;use DashBoard\Util\Propaties;
$data = array();foreach (new DirectoryIterator(PROPATIES_DIR) as $fileInfo) { if($fileInfo->isDot()) continue; $prop = new Propaties(PROPATIES_DIR . "/" . $fileInfo->getFilename()); $cloudwatch = CloudWatchClient::factory(array( 'key' => $prop->get(PROPATIES_ACCESS_KEY), 'secret' => $prop->get(PROPATIES_SECRET_KEY), 'region' => AWS_REGION )); $model = $cloudwatch->describeAlarms(); $data[$prop->get(PROPATIES_SYSTEM_NAME)] = $model->get("MetricAlarms");}
$rows = "";foreach ($data as $systemName => $alarms) { foreach ($alarms as $alarm) { $rows .= "['{$systemName}', '{$alarm['AlarmName']}', '{$alarm['AlarmDescription']}', '{$alarm['MetricName']}', '{$alarm['StateValue']}'],\n"; }}
$date = date("Y-m-d H:i:s");$content = "<html> <head> <script type='text/javascript' src='https://www.google.com/jsapi'></script> <script type='text/javascript'> google.load('visualization', '1', {packages:['table']}); google.setOnLoadCallback(drawTable); function drawTable() { var data = new google.visualization.DataTable(); data.addColumn('string', 'SystemName'); data.addColumn('string', 'AlarmName'); data.addColumn('string', 'AlarmDescription'); data.addColumn('string', 'MetricName'); data.addColumn('string', 'StateValue'); data.addRows([ {$rows} ]); var table = new google.visualization.Table(document.getElementById('table_div')); var formatter = new google.visualization.ColorFormat(); formatter.addRange('ALARM', 'INSUFFICIENT_DATA', 'white', 'red'); formatter.addRange('INSUFFICIENT_DATA', 'OK', 'white', 'orange'); formatter.addRange('OK', null, 'white', '#33ff33'); formatter.format(data, 4); table.draw(data, {allowHtml: true, showRowNumber: true}); } </script> </head> <body> <h1>{$date}時点</h1> <div id='table_div'></div> </body></html>";echo $content;
①AWS CloudWatch APIからデータもらう ×アカウント数
14年1月18日土曜日
Copyright © 2014 AGREX INC. 11
こんな感じです。require dirname(__DIR__) . '/init.php';
use Aws\CloudWatch\CloudWatchClient;use DashBoard\Util\Propaties;
$data = array();foreach (new DirectoryIterator(PROPATIES_DIR) as $fileInfo) { if($fileInfo->isDot()) continue; $prop = new Propaties(PROPATIES_DIR . "/" . $fileInfo->getFilename()); $cloudwatch = CloudWatchClient::factory(array( 'key' => $prop->get(PROPATIES_ACCESS_KEY), 'secret' => $prop->get(PROPATIES_SECRET_KEY), 'region' => AWS_REGION )); $model = $cloudwatch->describeAlarms(); $data[$prop->get(PROPATIES_SYSTEM_NAME)] = $model->get("MetricAlarms");}
$rows = "";foreach ($data as $systemName => $alarms) { foreach ($alarms as $alarm) { $rows .= "['{$systemName}', '{$alarm['AlarmName']}', '{$alarm['AlarmDescription']}', '{$alarm['MetricName']}', '{$alarm['StateValue']}'],\n"; }}
$date = date("Y-m-d H:i:s");$content = "<html> <head> <script type='text/javascript' src='https://www.google.com/jsapi'></script> <script type='text/javascript'> google.load('visualization', '1', {packages:['table']}); google.setOnLoadCallback(drawTable); function drawTable() { var data = new google.visualization.DataTable(); data.addColumn('string', 'SystemName'); data.addColumn('string', 'AlarmName'); data.addColumn('string', 'AlarmDescription'); data.addColumn('string', 'MetricName'); data.addColumn('string', 'StateValue'); data.addRows([ {$rows} ]); var table = new google.visualization.Table(document.getElementById('table_div')); var formatter = new google.visualization.ColorFormat(); formatter.addRange('ALARM', 'INSUFFICIENT_DATA', 'white', 'red'); formatter.addRange('INSUFFICIENT_DATA', 'OK', 'white', 'orange'); formatter.addRange('OK', null, 'white', '#33ff33'); formatter.format(data, 4); table.draw(data, {allowHtml: true, showRowNumber: true}); } </script> </head> <body> <h1>{$date}時点</h1> <div id='table_div'></div> </body></html>";echo $content;
①AWS CloudWatch APIからデータもらう ×アカウント数
②受け取った内容を軽く整形する
14年1月18日土曜日
Copyright © 2014 AGREX INC. 11
こんな感じです。require dirname(__DIR__) . '/init.php';
use Aws\CloudWatch\CloudWatchClient;use DashBoard\Util\Propaties;
$data = array();foreach (new DirectoryIterator(PROPATIES_DIR) as $fileInfo) { if($fileInfo->isDot()) continue; $prop = new Propaties(PROPATIES_DIR . "/" . $fileInfo->getFilename()); $cloudwatch = CloudWatchClient::factory(array( 'key' => $prop->get(PROPATIES_ACCESS_KEY), 'secret' => $prop->get(PROPATIES_SECRET_KEY), 'region' => AWS_REGION )); $model = $cloudwatch->describeAlarms(); $data[$prop->get(PROPATIES_SYSTEM_NAME)] = $model->get("MetricAlarms");}
$rows = "";foreach ($data as $systemName => $alarms) { foreach ($alarms as $alarm) { $rows .= "['{$systemName}', '{$alarm['AlarmName']}', '{$alarm['AlarmDescription']}', '{$alarm['MetricName']}', '{$alarm['StateValue']}'],\n"; }}
$date = date("Y-m-d H:i:s");$content = "<html> <head> <script type='text/javascript' src='https://www.google.com/jsapi'></script> <script type='text/javascript'> google.load('visualization', '1', {packages:['table']}); google.setOnLoadCallback(drawTable); function drawTable() { var data = new google.visualization.DataTable(); data.addColumn('string', 'SystemName'); data.addColumn('string', 'AlarmName'); data.addColumn('string', 'AlarmDescription'); data.addColumn('string', 'MetricName'); data.addColumn('string', 'StateValue'); data.addRows([ {$rows} ]); var table = new google.visualization.Table(document.getElementById('table_div')); var formatter = new google.visualization.ColorFormat(); formatter.addRange('ALARM', 'INSUFFICIENT_DATA', 'white', 'red'); formatter.addRange('INSUFFICIENT_DATA', 'OK', 'white', 'orange'); formatter.addRange('OK', null, 'white', '#33ff33'); formatter.format(data, 4); table.draw(data, {allowHtml: true, showRowNumber: true}); } </script> </head> <body> <h1>{$date}時点</h1> <div id='table_div'></div> </body></html>";echo $content;
①AWS CloudWatch APIからデータもらう ×アカウント数
②受け取った内容を軽く整形する
③Google Charts APIに投げる
14年1月18日土曜日
Copyright © 2014 AGREX INC. 12
つまり
Cloudwatch API (右) からGoogle Charts API (左) に渡す(受け流す)だけ
14年1月18日土曜日
Copyright © 2014 AGREX INC. 13
…で、こんなんできましたー
14年1月18日土曜日
Copyright © 2014 AGREX INC. 13
…で、こんなんできましたー
INSUFICIENT_DATAがオレンジALARMが赤になる各ヘッダをクリックすると昇順降順の並べ替えができる
14年1月18日土曜日
Copyright © 2014 AGREX INC. 14
参考とまとめ
14年1月18日土曜日
Copyright © 2014 AGREX INC. 14
参考とまとめAWS SDK for PHP(他にもJava、.NET、Ruby、Python、Node.jsとかあります)http://docs.aws.amazon.com/aws-sdk-php/guide/latest/index.html
14年1月18日土曜日
Copyright © 2014 AGREX INC. 14
参考とまとめAWS SDK for PHP(他にもJava、.NET、Ruby、Python、Node.jsとかあります)http://docs.aws.amazon.com/aws-sdk-php/guide/latest/index.html
Google Chartshttps://google-developers.appspot.com/chart/
14年1月18日土曜日
Copyright © 2014 AGREX INC. 14
参考とまとめAWS SDK for PHP(他にもJava、.NET、Ruby、Python、Node.jsとかあります)http://docs.aws.amazon.com/aws-sdk-php/guide/latest/index.html
Google Chartshttps://google-developers.appspot.com/chart/
ムーディ○山の現在http://blog.livedoor.jp/aokichanyon444/archives/54385877.html
14年1月18日土曜日
Copyright © 2014 AGREX INC. 14
参考とまとめAWS SDK for PHP(他にもJava、.NET、Ruby、Python、Node.jsとかあります)http://docs.aws.amazon.com/aws-sdk-php/guide/latest/index.html
Google Chartshttps://google-developers.appspot.com/chart/
ムーディ○山の現在http://blog.livedoor.jp/aokichanyon444/archives/54385877.html
思わず歌っちゃうほど簡単に、ちょっと良いものができました。
他にも、異なるAPI同士を組み合わせることで、
手間無く良いものができたりする例は一杯ありそう。
14年1月18日土曜日
Copyright © 2014 AGREX INC. 15
ありがとうございました!
14年1月18日土曜日