vague memory

うろ覚えを無くしていこうともがき苦しむ人の備忘録

Datadog (dogコマンド) tag編

Datadog公式のツール dog 使用方法まとめ tag 編です。

f:id:htnosm:20170318051327p:plain


目次


tag Modes

ユーザタグの操作が行えます。 Datadog Agent や インテグレーションで付与されるタグの更新はできません。
ホスト指定は host:タグ の値です。

サブコマンド 説明
add ホストへユーザタグ追加(既存ユーザタグを保持)
replace ホストのユーザタグ置換(既存ユーザタグは削除)
show ユーザタグを出力
detach ホストのユーザタグを全削除

add

usage: dog tag add [-h] host tag [tag ...]

positional arguments:

引数 説明
host 対象ホスト
tag 追加するタグ(スペース区切り)

実行例

追加したユーザタグと既に付与済みのユーザタグがレスポンスです。 (完全な初回実行時にはレスポンスはありませんでした。一度追加した後は、空の状態からでもレスポンスがありました。)
既に付与済みのユーザタグを指定してもエラーはありません。

単一タグ指定

$ dog tag add i-XXXXXXXXXXXXXXXXX TestTag
testtag

f:id:htnosm:20170318051328p:plain

複数タグ指定

$ dog tag add i-XXXXXXXXXXXXXXXXX TestStage:dev OS:linux alias:tag-test-instance
teststage:dev
os:linux
testtag
alias:tag-test-instance

f:id:htnosm:20170318051329p:plain

replace

ユーザタグを置き換えます。 個別のタグ指定はできず、指定したタグリストと完全に置き換わります。

usage: dog tag replace [-h] host tag [tag ...]

positional arguments:

引数 説明
host 対象ホスト
tag 置換するタグ(スペース区切り)

実行例

  • 実行前に付与されているユーザタグ
teststage:dev           #→ stage:stg を指定
os:linux                #→ 同一値を指定
testtag                 #→ updatetesttag を指定
alias:tag-test-instance #→指定しない
$ dog tag replace i-XXXXXXXXXXXXXXXXX stage:stg os:linux updatetesttag
updatetesttag
os:linux
stage:stg

f:id:htnosm:20170318051330p:plain

show

タグを出力します。ユーザタグに加え、Datadog Agent や インテグレーションで付与されるタグも併せて出力します。

usage: dog tag show [-h] host

positional arguments:

引数 説明
host 対象ホストの全ユーザタグ表示
all 全てのホストの全ユーザタグ表示

host

$ dog tag show i-XXXXXXXXXXXXXXXXX

f:id:htnosm:20170318051331p:plain

  • raw オプションでの出力結果

f:id:htnosm:20170318051332p:plain

  • pretty オプションでの出力結果
    • 出力オプション未指定と同じです。

all

“タグ ホスト” 形式で出力されます。ユーザタグか否かの区別はつきません。

$ dog tag show all

f:id:htnosm:20170318051333p:plain

  • raw オプションでの出力結果
    • tag を key とした形式

f:id:htnosm:20170318051334p:plain

  • pretty オプションでの出力結果
    • インデントが付いた形式
    • 区切りに"()“行が出力

f:id:htnosm:20170318051335p:plain

detach

ホストからユーザタグを削除します。個別のタグ指定はできません。(全ユーザタグが削除されます)

usage: dog tag detach [-h] host

positional arguments:

引数 説明
host 対象ホスト

実行例

f:id:htnosm:20170322093632p:plain

Datadog (dogコマンド) metric編

Datadog公式のツール dog 使用方法まとめ metric 編です。

f:id:htnosm:20170317233257p:plain


目次


metric Modes

ヘルプに Post metrics. とある通り、現在時刻でのメトリクス投稿が行えます。 現時点では参照系は未対応です。

サブコマンド 説明
post メトリクス投稿

post

usage: dog metric post [-h] [--host HOST] [--no_host] [--device DEVICE]
                       [--tags TAGS] [--localhostname] [--type TYPE]
                       name value

positional arguments:

引数 説明
name メトリクス名
value メトリクス値

optional arguments:

ロングオプション 説明
–host 関連ホスト名(デフォルトはローカルホスト名)
–no_host 関連ホスト無し(–hostオプションは無視される)
–device 関連デバイス
–tags タグのリスト(カンマ区切り)
–localhostname 非推奨オプション(–hostオプションがない場合のデフォルトの挙動)
–type メトリクスのタイプ指定。gauge(32bit float) or counter(64bit integer)

実行例

単純実行

name,value のみで投稿します。 成功時のレスポンスは特にありません。

$ dog metric post TestMetrics 1
$

f:id:htnosm:20170317233258p:plain

hostオプションを使用していないため、実行 hostname に紐付けられます。

f:id:htnosm:20170317233302p:plain

1分以下の間隔で投稿

グラフ上最短の丸め間隔である 20秒 を基準に挙動を確認してみます。

20秒間隔

投稿毎の値が表示できます。

f:id:htnosm:20170317233259p:plain

5秒間隔

丸められます。

f:id:htnosm:20170317233300p:plain

登録データ確認(pointlist)

登録されているデータ自体も20秒間隔となるようです。

f:id:htnosm:20170317233301p:plain

小数点(decimal)

まず必要になることはなさそうですが、precision(有効桁) = 9 でしょうか。

以下のような値を連続で投稿してみます。

0.1
0.12
0.123
0.1234
0.12345
0.123456
0.1234567
0.12345678
0.123456789
0.12345678910
0.1234567891011
0.123456789101112
0.12345678910111213
0.1234567891011121314
0.123456789101112131415
0.12345678910111213141516
0.1234567891011121314151617
0.123456789101112131415161718
0.12345678910111213141516171819
0.1234567891011121314151617181920

f:id:htnosm:20170317233303p:plain f:id:htnosm:20170317233304p:plain

hostオプション

dog metric post --host hogehost TestMetrics 5

指定した hostname で投稿できます。

f:id:htnosm:20170317233305p:plain

no_hostオプション
# host有
dog metric post --host hogehost --no_host TestMetrics 10
# host無
dog metric post --no_host TestMetrics 3

host:N/A となります。

f:id:htnosm:20170317233306p:plain

deviceオプション

DatadogAgent を導入するとディスク関連のメトリクスが device タグとして登録されます。 その device タグに関連させるオプションと思われます。
存在しない device タグでも投稿はできるので、 device タグを付与するオプション と言い換えて良さそうです。

  • 存在する device タグ

f:id:htnosm:20170317233307p:plain

# 存在しないdeviceタグ
$ dog metric post --device sda1 TestMetrics 5
# 存在するdeviceタグ
$ dog metric post --device tmpfs TestMetrics 4

f:id:htnosm:20170317234608p:plain

tagオプション

任意のタグ名とタグに関連付けが行えます。

$ dog metric post --tags tag1,tag2:2,hoge:fuga TestMetrics 15
$ dog metric post --tags tag1,tag2:3,hoge:hoge TestMetrics 7

f:id:htnosm:20170317233309p:plain

localhostnameオプション

helpから削除してもらいたいオプションです。 非推奨なので、 WARNING が出力されます。

$ dog metric post --localhostname TestMetrics 1
WARNING: `--localhostname` command line flag is deprecated, made default when no `--host` is specified. See the `--host` option for more information.

動作としては、 –host オプションを使用しない(デフォルト)で実行した結果と同様、実行 hostname に紐付けられます。

f:id:htnosm:20170317233310p:plain

typeオプション

違いがわかりませんでした。
type が任意の値でも登録されること、APIでサポートしているのは guage のみという記載があることから、実際は guage で登録されているのかもしれません。

HTTP API Submission

For the API all metrics are submitted the same way, with the type specified as a parameter.

Gauge Stored in Web App as GAUGE type

# gauge 整数
$ dog metric post --type gauge TestMetrics 1
# gauge 少数
$ dog metric post --type gauge TestMetrics 2.123
# counter 整数
$ dog metric post --type counter TestMetrics 3
# counter 少数
$ dog metric post --type counter TestMetrics 4.456
# type オプション無し
$ dog metric post TestMetrics 5
$ dog metric post TestMetrics 6.789
# type に適当な値指定
$ dog metric post --type xxxxx TestMetrics 7

f:id:htnosm:20170317233311p:plain

  • gauge と counter を同時に投稿した結果

f:id:htnosm:20170317233312p:plain

実行時エラー

value に数値以外を指定するとエラーが返ります。

$ dog metric post TestMetrics XXXXX
usage: dog metric post [-h] [--host HOST] [--no_host] [--device DEVICE]
                       [--tags TAGS] [--localhostname] [--type TYPE]
                       name value
dog metric post: error: argument value: invalid float value: 'XXXXX'

metric編まとめ

カスタムメトリクスを投稿する際、APIを使用するより簡単に扱えると思います。
今回 value 不正以外のエラーを発生させることが出来ませんでしたが、タグやタイプを間違えていても基本的には受け付けてしまうようです。

Datadog (dogコマンド) search編

Datadog公式のツール dog 使用方法まとめ search 編です。

f:id:htnosm:20170316053400p:plain

search Modes

ヘルプには Search datadog. としかないので、何を検索できるのか謎でしたが、APIリファレンスに記載がありました。

過去24時間のエンティティを検索します。 検索可能なエンティティは hostmetrics です。

サブコマンド 説明
query faset検索

ここで言う hostmetrics は faset と呼ぶそうです。 query 部分は facet:query_string の形式になります。

結果を先に書いてしまうと、これと言った用途が見つけられませんでした。 新規導入した host や metrics が Datadog 側に正常に登録されたことを確認する等でしょうか。

APIを見ると api.Infrastructure.search と記載があるので、恐らく WebUI 上の Infrastructure での検索なのかと思います。 f:id:htnosm:20170320151251p:plain

query

usage: dog search query [-h] query

全検索

query の後ろに空文字(クォート囲み)を入れると、metrics、hostsのリストが返ってきます。 空文字を入れないとエラーとなります。

# 空文字で実行
$ dog search query ""
metrics system.uptime
metrics system.swap.used
metrics system.swap.total
・・・
metrics aws.dynamodb.online_index_percentage_progress
metrics gcp.logging.dropped_log_entry_count
hosts   hoge.ap-northeast-1.elb.amazonaws.com
hosts   i-XXXXXXXX
# 引数無しで実行
$ dog search query
usage: dog search query [-h] query
dog search query: error: too few arguments

facetのみ指定

全検索とほぼ同じですが、指定したfacetのみ出力されます。

$ dog search query "hosts:"
hosts   hoge.ap-northeast-1.elb.amazonaws.com
・・・
hosts   i-XXXXXXXX
$ dog search query "metrics:"
metrics system.uptime
・・・
metrics gcp.logging.dropped_log_entry_count

facet:query_string 指定

絞り込めます。が、facet指定無しでも同じ結果が返ってきました。

$ dog search query "metrics:aws.ec2.cpucredit_usage"
metrics aws.ec2.cpucredit_usage
$ dog search query "aws.ec2.cpucredit_usage"
metrics aws.ec2.cpucredit_usage

query_stringのみ指定

中間一致でfacetを跨いでの結果が返ってきました。

$ dog search query "load"
metrics system.load.1
hosts   load-test.xxxxxxxxxxxx.ap-northeast-1.rds.amazonaws.com

使い所がわからないので良いユースケースがあれば教えてほしいです。

Datadog (dogコマンド) comment編

Datadog公式のツール dog 使用方法まとめ comment 編です。

f:id:htnosm:20170314212522p:plain


目次


comment Modes

Events に表示されるコメント(メッセージ)の操作が行えます。 f:id:htnosm:20170314205807p:plain

サブコマンド 説明
post コメント送信
update コメント更新
reply コメントへの返信
show コメント情報取得
delete コメント削除

コメントの一覧を取得するAPIは用意されていません。 更新系の操作はコメントIDを引数として与える必要がありますが、Web UIでIDを確認する、postしたコメントで戻り値を取得しておく等、IDを取得する術を用意しなくてはならず使い勝手はよくないです。(利用頻度は低そうです)

  • コメントID取得例

f:id:htnosm:20170314205806p:plain

post

usage: dog comment post [-h] [--handle HANDLE] [comment]

実行例

$ dog comment post "PostTest"
id      9999999999999999999
url     /event/event?id=9999999999999999999
resource    /api/v1/comments/9999999999999999999
handle      hoge@example.com
message     u'PostTest'

f:id:htnosm:20170314205803p:plain

HANDLE にはDatadogのユーザを指定するようです。存在しないユーザの場合はエラーとなります。

$ dog comment post --handle "hoge" "PostTest hoge"
ERROR: The value provided for parameter 'handle' is invalid
$ dog comment post --handle "user@example.com" "PostTest user"
id      9999999999999999999
url     /event/event?id=9999999999999999999
resource    /api/v1/comments/9999999999999999999
handle      user@example.com
message     u'PostTest user'

update

対象の comment_id が必要です。 対象コメントが直接書き換わります。(履歴は残りません)

usage: dog comment update [-h] [--handle HANDLE] comment_id [comment]

実行例

$ dog comment update 9999999999999999999 "CommentUpdate"
id      9999999999999999999
url     /event/event?id=9999999999999999999
resource    /api/v1/comments/9999999999999999999
handle      hoge@example.com
message     u'CommentUpdate'

f:id:htnosm:20170314205804p:plain

replay

対象の comment_id が必要です。 対象コメントへ返信の付与になります。

usage: dog comment reply [-h] [--handle HANDLE] comment_id [comment]

実行例

$ dog comment reply 9999999999999999999 "ReplyTest"
id      9999999999999999990
url     /event/event?id=9999999999999999990
resource    /api/v1/comments/9999999999999999990
handle      hoge@example.com
message     u'ReplyTest'

f:id:htnosm:20170314205805p:plain

show

対象の comment_id が必要です。一覧取得はできません。

usage: dog comment show [-h] comment_id

実行例

返信(reply)のコメントID指定は取得できません(エラーになります)

# コメントを指定
$ dog comment show 9999999999999999999
id      9999999999999999999
url     /event/event?id=9999999999999999999
resource    /api/v1/events/9999999999999999999
message     u'CommentUpdate'
# コメントのreplyを指定
$ dog comment show 9999999999999999990
ERROR: No event matches that comment_id.

delete

対象の comment_id が必要です。 対象コメント・返信を削除します。(responseも無く、履歴は残りません) コメントを削除するとそのコメントに対する返信もまとめて消えます。 存在しない id 指定は 500 エラーが返ります。

usage: dog comment delete [-h] comment_id

実行例

# コメントのreplyを指定
$ dog comment delete 9999999999999999990
# コメントを指定
$ dog comment delete 9999999999999999999
# 削除済みコメントを指定
$ dog comment delete 9999999999999999999
Traceback (most recent call last):
  File "/usr/bin/dog", line 9, in <module>
    load_entry_point('datadog==0.15.0', 'console_scripts', 'dog')()
  File "/usr/lib/python2.7/site-packages/datadog/dogshell/__init__.py", line 69, in main
    args.func(args)
  File "/usr/lib/python2.7/site-packages/datadog/dogshell/comment.py", line 166, in _delete
    res = api.Comment.delete(id)
  File "/usr/lib/python2.7/site-packages/datadog/api/resources.py", line 110, in delete
    return APIClient.submit('DELETE', cls._class_url + "/" + str(id), **params)
  File "/usr/lib/python2.7/site-packages/datadog/api/api_client.py", line 129, in submit
    proxies=_proxies, verify=_cacert
  File "/usr/lib/python2.7/site-packages/datadog/api/http_client.py", line 84, in request
    raise HTTPError(e.response.status_code, result.reason)
datadog.api.exceptions.HTTPError: Datadog returned a bad HTTP response code: 500 - Internal Server Error. Please try again later. If the problem persists, please contact support@datadoghq.com

サポートへのメッセージポストで利用できるかなと思いました。(他に用途が浮かびませんでした)

Messages in the event stream containing @support-datadog will reach our Support Team.

Datadog (dogコマンド) 導入編

Datadog のコマンドラインツール dog (dogshell) を使ってみようと思いましたが、あまり情報が無かったのでまとめてみます。

f:id:htnosm:20170314205801p:plain

Datadog公式のツールで、ライブラリをインストールすることにより使用できるようになります。


目次


インストール

README を参考にインストールを行います。 今回は素に近い CentOS7 で試してます。必要パッケージは環境により変わると思います。

# cat /etc/redhat-release
CentOS Linux release 7.1.1503 (Core)
# yum install python2-pip openssl-devel python-devel libffi-devel
・・・
Complete!
# pip -V
pip 8.1.2 from /usr/lib/python2.7/site-packages (python 2.7)
# pip install -U pip datadog
・・・
Successfully installed datadog-0.15.0 decorator-4.0.11 pip-9.0.1 requests-2.13.0 simplejson-3.10.0
# pip -V
pip 9.0.1 from /usr/lib/python2.7/site-packages (python 2.7)
# dog -v
dog 0.15.0

設定ファイル(.dogrc)の作成

コマンド実行時に .dogrc が存在しないと作成するように促されます。 コマンド実行時に使用する api key、application key を設定します。

  • app.datadoghq.com/account/settings#api

f:id:htnosm:20170314205802p:plain

$ dog comment post "PostTest"
/home/hoge/.dogrc does not exist. Would you like to create it? [Y/n] Y
What is your api key? (Get it here: https://app.datadoghq.com/account/settings#api) 
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
What is your application key? (Generate one here: https://app.datadoghq.com/account/settings#api) XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Wrote /home/hoge/.dogrc
# 以下コマンド実行結果
id      9999999999999999999
url     /event/event?id=9999999999999999999
resource    /api/v1/comments/9999999999999999999
handle      hoge@example.com
message     u'PostTest'

実行後、 .dogrc ファイルが作成されます。

$ cat /home/hoge/.dogrc
[Connection]
apikey = XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
appkey = XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

オプション

dog -h でヘルプが出力されます。

optional arguments:

オプション ロングオプション 説明
-h –help ヘルプ出力
–config 設定ファイルのパス指定。デフォルト “~/.dogrc”
api-key API key 指定
–application-key Application key 指定
–pretty 整形して出力
–raw 返却されたJSONをそのまま出力
–timeout タイムアウト(秒) デフォルト10
-v –version バージョン出力

出力オプション

デフォルト(指定無し)

$ dog comment show 9999999999999999999
id      9999999999999999999
url     /event/event?id=9999999999999999999
resource    /api/v1/events/9999999999999999999
message     u'PostTest'

raw

JSONで返却、date_happened(UNIXTIME)等の情報も出力されます。

$ dog --raw comment show 9999999999999999999
{"event": {"date_happened": 00000000, "alert_type": "user_update", "handle": "hoge@example.com", "title": null, "url": "/event/event?id= 9999999999999999999", "text": "PostTest", "tags": [], "device_name": null, "priority": "normal", "host": null, "resource": "/api/v1/events/9999999999999999999", "id": 9999999999999999999}}

pretty

TAB区切りと改行で項目が別れて出力されるようです。

$ dog --pretty comment show 9999999999999999999
id      9999999999999999999
url     /event/event?id=9999999999999999999
resource    /api/v1/events/9999999999999999999
message
    PostTest
  • 結果を cat -A で表示した例
id^I^I9999999999999999999$
url^I^I/event/event?id=9999999999999999999$
resource^I/api/v1/events/9999999999999999999$
message$
    PostTest$

番外(複数指定)

raw と pretty の両方を指定した場合は後勝ちでした。

# 後に pretty
$ dog --raw --pretty comment show 3778268868988899329
id      9999999999999999999
url     /event/event?id=9999999999999999999
resource    /api/v1/events/9999999999999999999
message
    PostTest
# 後に raw
$ dog --pretty --raw comment show 3778268868988899329
{"event": {"date_happened": 00000000, "alert_type": "user_update", "handle": "hoge@example.com", "title": null, "url": "/event/event?id= 9999999999999999999", "text": "PostTest", "tags": [], "device_name": null, "priority": "normal", "host": null, "resource": "/api/v1/events/9999999999999999999", "id": 9999999999999999999}}

Modes:

基本的には用意されているAPIを叩いているので、APIが用意されていない操作はできません。 現在は一部のAPIがサポートされている状況のようです。

コマンド 説明 リンク
comment コメント操作 Datadog (dogコマンド) comment編
search  24時間以内の hosts,metrics の検索 Datadog (dogコマンド) search編
metric  メトリクス操作 Datadog (dogコマンド) metric編
tag  タグ操作 Datadog (dogコマンド) tag編
event イベント操作 Datadog (dogコマンド) event編
monitor モニター操作 Datadog (dogコマンド) monitor編
timeboard タイムボード操作 Datadog (dogコマンド) timeboard編
screenboard スクリーンボード操作 Datadog (dogコマンド) screenboard編
host host の mute/unmute Datadog (dogコマンド) host編
downtime ダウンタイム設定操作 Datadog (dogコマンド) downtime編
service_check カスタムステータスチェック送信 Datadog (dogコマンド) service_check編

各コマンドを一通り使用してみたいと思います。

Mackerel Webhook で Lambda 起動

f:id:htnosm:20170226021308p:plain

Mackerel のアップデートで Webhook の API Gateway 対応が発表されました。

Webhook のリクエスト先に API Gateway のエンドポイントを指定できるようになりました 通知先として選択できる Webhook の対応証明書が拡張され、Webhookの対応先が増えました。 これにより多くの要望を頂いておりました Amazon API Gateway にも対応しました。 AWS Lambda を Amazon API Gateway 経由で呼び出すことも可能です。

アップデート前は通知先に直接 API Gateway の指定は行えていなかったようです。(アップデート前に検証はしてませんでした)
個人的に色々 Webhook からの Lambda 起動を検証していた際のタイムリーなアップデートだったので、Mackerelでも実施してみました。

Mackerel Webhook 設定

Monitors → チャンネル設定 から Webhook を作成します。URLに API GatewayInvoke URL を指定します。

f:id:htnosm:20170226021309p:plain

実行例

Mackerel から Webhook のテスト通知を送ると Lambda Function の起動を確認できます。

  • Lambda Function Log

f:id:htnosm:20170226021310p:plain

実行元の制限

API Gateway を指定できるようになったとは言え、ヘッダー付与等は行えないようなので API Key による制限はまだ行えません。

CloudFront 経由で AWS WAF での IP アドレス制限を考えましたが、AWS WAF で IPアドレス制限を書ける場合は設定できるIPアドレスレンジが限定されており、少々面倒だなと思いました。

Mackerelからの通知のリクエスト元IPアドレスレンジは、 59.106.108.64/26 です

AWS WAF supports /8, /16, /24, and /32 IPv4 address ranges

API Gateway の $context 変数

API Gateway で sourceIp が使用できるので、 Lambda Function 側で制限を掛けてみます。

API Gatewayマッピングテンプレート追加

Method Execution → Integration Request → Body Mapping Template に Context-Type application/json を追加します。 今回は、用意されているテンプレート Method Request passthrough をそのまま使用します。

f:id:htnosm:20170226021311p:plain

実行例

SourceIp が渡されていることが確認できます。

  • Lambda Function Log

f:id:htnosm:20170226021312p:plain

Lambda Function に判定処理を追加

IPアドレス判定に使えそうなライブラリとして、 Python のバージョン 3.3 からは ipaddress というライブラリがあります。 残念ながら、 Lambda の Python は 2.7 ということで使えません。
Google先生検索結果から、以下参考URLのソースをそのまま使わせてもらいました。

Lambda Function の処理先頭でMackerel のリクエスト元IPアドレスレンジ以外は弾くようにして、制限を掛ける事ができました。

    ### Check Source IpAddress
    source_ip = str(event['context']['source-ip'])
    if not is_in_subnet(source_ip, "59.106.108.64/26"):
        return {'message': 'None'}
    ### Check Source IpAddress
  • 適当な場所から API を叩いた場合
$ curl -H "Content-Type: application/json" -X POST "https://XXXXXXXXXX.execute-api.ap-northeast-1.amazonaws.com/prod/webhook" -d "{\"hoge\":\"fuga\"}"
{"message": "None"}

Mackerel 側で Webhook に x-api-key を追加できるようになると良いですね。

Datadog Monitor から Webhook で Lambda 起動

f:id:htnosm:20170219061829p:plain

前回 Datadog から SNS 経由で Lambda Function を起動を行いました。

別の方法を探してみた所、Webhook Integration が使えそうだったので試してみました。

1) API Gateway と Lambda Function を作成

API Gateway を trigger として Lambda Function を作成します。APIへは AccessKey認証 とします。

f:id:htnosm:20170219061830p:plain f:id:htnosm:20170220065001p:plain

今回使用した Lambda Function は、受け取った内容をそのまま Slack へポストするだけの物です。

2) CloudFront Distribution 作成

API Gateway の Endpoint をそのまま叩けば良いかと考えたのですが、Datadog の Webhook が SSLv3 を使用しているようで以下のようなエラーが発生します。

f:id:htnosm:20170219061832p:plain

Datadog 側での設定変更は無いようだったので、CloudFront を挟む事で回避させます。

Origin Domain Name へ API GatewayInvoke URL を入力します。 (Origin Path、Origin ID は自動的に入力されます。)

f:id:htnosm:20170219061833p:plain

また、AccessKey認証のため WhiteList Headers に x-api-key を設定します。

f:id:htnosm:20170219061834p:plain

3) Datadog Webhook Integration 設定

Integration → Webhooks → Configuration に CloudFrontのエンドポイントと API GatewayAPI Key を設定します。

f:id:htnosm:20170219061836p:plain

正常に登録できていれば、Monitor の Nortify 設定で Webhook: 〜 が選択できるようになります。

f:id:htnosm:20170219061835p:plain

実行例

Datadogのアラート発行をトリガーに、Lambda Function が起動した事を確認できます。

  • Lambda Function Log

f:id:htnosm:20170219061837p:plain

  • Slack

f:id:htnosm:20170219061838p:plain


CloudFront を介す必要がありますが、 メッセージのカスタマイズもある程度可能なため、 SNSでの通知より柔軟に処理設定できるのではないでしょうか。