infra/modules/lambda/main.tf (85 lines of code) (raw):
#########
# Lambda
#########
data "archive_file" "ecs-scaledown-file" {
source_file = "${path.module}/ecs-scaledown-lambda/index.py"
output_path = "ecs-scaledown-lambda.zip"
type = "zip"
}
resource "aws_lambda_function" "ecs-asg" {
function_name = "${var.project_name}-${var.stack_name}-ecs-asg"
role = "${var.iam_role_lambda_ecs_asg_arn}"
handler = "index.lambda_handler"
runtime = "python2.7"
timeout = 300
filename = "${data.archive_file.ecs-scaledown-file.output_path}"
source_code_hash = "${data.archive_file.ecs-scaledown-file.output_base64sha256}"
}
resource "aws_lambda_permission" "allow_sns" {
statement_id = "AllowExecutionFromSNS"
action = "lambda:InvokeFunction"
function_name = "${aws_lambda_function.ecs-asg.function_name}"
principal = "sns.amazonaws.com"
source_arn = "${var.sns_topic_asg_arn}"
}
resource "aws_sns_topic_subscription" "lambda-sns" {
topic_arn = "${var.sns_topic_asg_arn}"
protocol = "lambda"
endpoint = "${aws_lambda_function.ecs-asg.arn}"
}
resource "aws_cloudwatch_log_group" "ecs-asg" {
name = "/aws/lambda/${var.project_name}-${var.stack_name}-ecs-asg"
retention_in_days = "${var.log_retention}"
}
data "archive_file" "ecs-unprotect-file" {
source_file = "${path.module}/ecs-unprotect-lambda/index.py"
output_path = "ecs-unprotect-lambda.zip"
type = "zip"
}
resource "aws_lambda_function" "ecs-asg-unprotect" {
function_name = "${var.project_name}-${var.stack_name}-ecs-unprotect-asg"
role = "${var.iam_role_lambda_ecs_unprotect_asg_arn}"
handler = "index.lambda_handler"
runtime = "python2.7"
timeout = 300
filename = "${data.archive_file.ecs-unprotect-file.output_path}"
source_code_hash = "${data.archive_file.ecs-unprotect-file.output_base64sha256}"
environment {
variables = {
ECS_CLUSTER_NAME = "${var.ecs_cluster_name}"
ASG_GROUP_NAME = "${var.asg_name}"
RETAIN_INSTANCES = "${var.asg_min_size}"
}
}
}
resource "aws_cloudwatch_event_rule" "unprotect-scheduler" {
name = "${var.project_name}-${var.stack_name}-unprotect-scheduler"
event_pattern = <<PATTERN
{
"source": [
"aws.ecs"
],
"detail-type": [
"ECS Task State Change"
],
"detail": {
"clusterArn": [
"${var.ecs_cluster_id}"
]
}
}
PATTERN
}
resource "aws_cloudwatch_event_target" "asg-unprotect" {
rule = "${aws_cloudwatch_event_rule.unprotect-scheduler.name}"
target_id = "LambdaEcsAsgUnprotect"
arn = "${aws_lambda_function.ecs-asg-unprotect.arn}"
}
resource "aws_lambda_permission" "allow_cloudwatch_to_call_ecs-asg-unprotect" {
statement_id = "AllowExecutionFromCloudWatch"
action = "lambda:InvokeFunction"
function_name = "${aws_lambda_function.ecs-asg-unprotect.function_name}"
principal = "events.amazonaws.com"
source_arn = "${aws_cloudwatch_event_rule.unprotect-scheduler.arn}"
}
resource "aws_cloudwatch_log_group" "ecs-asg-unprotect" {
name = "/aws/lambda/${var.project_name}-${var.stack_name}-ecs-unprotect-asg"
retention_in_days = "${var.log_retention}"
}