terraform cloudwatchの通知先をsnsにしてsns subscriptionをlambdaで登録する
iamを作って、lambdaをつくってsnsを作っていきます。
lambdaで指定するzipの中身は、index.jsにコードを記述して
zip dev-notify_to_slack.zip index.js
したものです。ここでファイル名をミスっててもエラーになりません。
AWSコンソール上で見るとlambdaのコードが見えない状態になってました。
slackに通知するlambdaは下記からいただきました。
#--------------------------------------------------------------
# iam
#--------------------------------------------------------------
resource "aws_iam_role" "lambda" {
name = "lambda"
assume_role_policy = "${file("./iam/lambda_assume.policy")}"
}
resource "aws_iam_policy" "lambda" {
name = "lambda"
path = "/"
description = "for lamdbda policy"
policy = "${file("./iam/lambda_role.policy")}"
}
resource "aws_iam_policy_attachment" "lambda_role_attachment" {
name = "lambda_role_attachment"
roles = ["${aws_iam_role.lambda.name}"]
policy_arn = "${aws_iam_policy.lambda.arn}"
}
#--------------------------------------------------------------
# Lambda
#--------------------------------------------------------------
resource "aws_lambda_function" "notify_to_slack" {
filename = "lambda/dev-notify_to_slack.zip"
function_name = "notify-to-slack"
role = "${aws_iam_role.lambda.arn}"
handler = "index.handler"
}
#--------------------------------------------------------------
# SNS
#--------------------------------------------------------------
resource "aws_sns_topic" "notify_to_slack" {
name = "notify_to_slack"
}
resource "aws_sns_topic_subscription" "notify_to_slack" {
topic_arn = "${aws_sns_topic.notify_to_slack.arn}"
protocol = "lambda"
endpoint = "${aws_lambda_function.notify_to_slack.arn}"
}
後はaws_cloudwatch_metric_alarm
のactionsに登録していきます。
alarm_actions = [ "${aws_sns_topic.notify_to_slack.arn}" ]
これで完成といいたいところですが
aws_sns_topic_subscription
のprotocol
にはlambda
がサポートされてません。
そのせいか、AWSコンソール上でCreate Subscriptionしたときには作られる、lambdaのEvent SourceにSNSが登録されていないのです。
仕方がないのでここだけ手で登録してあげます。
成功すればcloudwatchからslackへの通知が来るはずです。
cloudwatchのactionにSNSが登録されてくれるだけでも嬉しいのでバージョンアップで対応されることを期待します(それっぽいissueは上がってました)。