|
# Terraform template to have AWS EBS Node auto restart when shutdown |
|
|
|
provider "aws" { |
|
region = "us-east-1" |
|
} |
|
|
|
resource "aws_iam_role" "node_recovery_lambda_role" { |
|
name = "node_recovery_lambda_role" |
|
assume_role_policy = <<EOF |
|
{ |
|
"Version": "2012-10-17", |
|
"Statement": [ |
|
{ |
|
"Action": "sts:AssumeRole", |
|
"Principal": { |
|
"Service": "lambda.amazonaws.com" |
|
}, |
|
"Effect": "Allow" |
|
} |
|
] |
|
} |
|
EOF |
|
} |
|
|
|
resource "aws_iam_policy" "standard_lambda_policy" { |
|
name = "standard_lambda_policy" |
|
policy = <<EOF |
|
{ |
|
"Version": "2012-10-17", |
|
"Statement": [ |
|
{ |
|
"Action": [ |
|
"logs:CreateLogGroup", |
|
"logs:CreateLogStream", |
|
"logs:PutLogEvents" |
|
], |
|
"Effect": "Allow", |
|
"Resource": "*" |
|
} |
|
] |
|
} |
|
EOF |
|
} |
|
|
|
resource "aws_iam_policy" "node_recovery_ec2_lambda_policy" { |
|
name = "node_recovery_ec2_lambda_policy" |
|
policy = <<EOF |
|
{ |
|
"Version": "2012-10-17", |
|
"Statement": [ |
|
{ |
|
"Sid": "StmtEc2LambdaPolicy", |
|
"Effect": "Allow", |
|
"Action": [ |
|
"ec2:StartInstances" |
|
], |
|
"Resource": [ |
|
"arn:aws:ec2:us-east-1:"accountid":instance/*" |
|
] |
|
} |
|
] |
|
} |
|
EOF |
|
} |
|
|
|
resource "aws_iam_role_policy_attachment" "lambda_ec2_policy" { |
|
role = "${aws_iam_role.node_recovery_lambda_role.name}" |
|
policy_arn = "${aws_iam_policy.node_recovery_ec2_lambda_policy.arn}" |
|
} |
|
|
|
resource "aws_iam_role_policy_attachment" "lambda_lambda_policy" { |
|
role = "${aws_iam_role.node_recovery_lambda_role.name}" |
|
policy_arn = "${aws_iam_policy.standard_lambda_policy.arn}" |
|
} |
|
|
|
|
|
resource "aws_cloudwatch_event_rule" "node_recovery" { |
|
name = "lambda_node_recovery" |
|
description = "Trigger automated node recovery" |
|
|
|
event_pattern = <<PATTERN |
|
{ |
|
"source": [ |
|
"aws.ec2" |
|
], |
|
"detail-type": [ |
|
"EC2 Instance State-change Notification" |
|
], |
|
"detail": { |
|
"state": [ |
|
"stopped" |
|
] |
|
} |
|
} |
|
PATTERN |
|
} |
|
|
|
resource "aws_lambda_function" "node_recovery_lambda" { |
|
filename = "node-recovery/target/node-recovery-0.0.1-SNAPSHOT.jar" |
|
function_name = "node_recovery_lambda" |
|
role = "${aws_iam_role.node_recovery_lambda_role.arn}" |
|
handler = "com.srotya.lambda.noderecovery.NodeRecovery" |
|
source_code_hash = "${base64sha256(file("node-recovery/target/node-recovery-0.0.1-SNAPSHOT.jar"))}" |
|
runtime = "java8" |
|
memory_size = 512 |
|
timeout = 10 |
|
environment { |
|
variables = { |
|
foo = "bar" |
|
} |
|
} |
|
} |
|
|
|
resource "aws_lambda_alias" "node_recovery_lambda" { |
|
name = "node_recovery_lambda" |
|
description = "a sample description" |
|
function_name = "${aws_lambda_function.node_recovery_lambda.arn}" |
|
function_version = "$LATEST" |
|
} |
|
|
|
resource "aws_lambda_permission" "allow_cloudwatch" { |
|
statement_id = "AllowExecutionFromCloudWatch" |
|
action = "lambda:InvokeFunction" |
|
function_name = "${aws_lambda_function.node_recovery_lambda.function_name}" |
|
principal = "events.amazonaws.com" |
|
source_arn = "${aws_cloudwatch_event_rule.node_recovery.arn}" |
|
} |
|
|
|
resource "aws_cloudwatch_event_target" "node_recovery_lambda_target" { |
|
rule = "${aws_cloudwatch_event_rule.node_recovery.name}" |
|
target_id = "SendToLambda" |
|
arn = "${aws_lambda_function.node_recovery_lambda.arn}" |
|
} |