sravya
sravya

Reputation: 33

Is there any way I can add triggers to a lambda function in Terraform?

I am working with terraform, and I was wondering if there was a way to add triggers to a lambda function (e.g.:- a trigger when a S3 object). I know that we can add an event source mapping, but that is not what I am looking. Basically I want to know if I can include trigger functionality that is shown in the below image in my code Image shows lambda console with "add trigger" functionality highlighted

Upvotes: 3

Views: 817

Answers (2)

Miguel Conde
Miguel Conde

Reputation: 853

You can configure directly in your terraform code the subscription to events from a lot of resources and integrate with multiple notifiers in AWS. This is example to add a trigger to a lambda based in a subscription event from SNS.

data "aws_autoscaling_groups" "groups_servers" {
  depends_on = [
    aws_autoscaling_group.servers_cluster_asg_masters,
    aws_autoscaling_group.servers_cluster_asg_slaves
  ]
  filter {
    name   = "auto-scaling-group"
    values = "servers-masters-nodes"
  }
  filter {
    name   = "auto-scaling-group"
    values = "servers-slave-nodes"
  }
}

resource "aws_sns_topic" "sns_servers" {
  name = "sns_servers"
}

resource "aws_autoscaling_notification" "new_instances_notifications_servers" {
  group_names = data.aws_autoscaling_groups.groups_servers.names
  notifications = [
    "autoscaling:EC2_INSTANCE_LAUNCH"
  ]
  topic_arn = aws_sns_topic.sns_servers.arn
}

resource "aws_sns_topic_subscription" "sns_servers_servers_subscription" {
  depends_on = [
    aws_lambda_function.servers-cluster-orchestator
  ]
  topic_arn = aws_sns_topic.sns_servers.arn
  protocol  = "lambda"
  endpoint  = aws_lambda_function.servers-cluster-orchestator.arn
}

resource "aws_lambda_permission" "sns_permission_servers" {
  depends_on = [
    aws_lambda_function.servers-cluster-orchestator,
  ]
  statement_id  = "AllowExecutionFromSNS"
  action        = "lambda:InvokeFunction"
  function_name = aws_lambda_function.servers-cluster-orchestator.function_name
  principal     = "sns.amazonaws.com"
  source_arn    = var.sns_servers_topic
}

resource "aws_lambda_function" "servers-cluster-orchestator" {
  s3_bucket     = "my-bucket"
  s3_key        = "my-lambda.zip"
  function_name = "my-lambda"
  role          = aws_iam_role.iam_for_lambda_servers_cluster.arn
  handler       = "lambda_function.lambda_handler"
  runtime       = "python3.7"
  timeout       = "60"
}

Upvotes: 0

Marcin
Marcin

Reputation: 238747

I know that we can add an event source mapping, but that is not what I am looking

Event source mapping for SQS, DynamoDB and Kinesis is exactly what you are looking. What you are showing on the screenshot is just AWS Console representation of the Event source mapping for the 3 services.

Upvotes: 3

Related Questions