Event-based Architecture

Trigger Lambda with EventBridge

resource "aws_lambda_function" "check_foo" {
    ...
}

resource "aws_cloudwatch_event_rule" "every_five_minutes" {
    name = "every-five-minutes"
    description = "Fires every five minutes"
    schedule_expression = "rate(5 minutes)"
}

resource "aws_cloudwatch_event_target" "check_foo_every_five_minutes" {
    rule = aws_cloudwatch_event_rule.every_five_minutes.name
    target_id = "some_id"
    arn = aws_lambda_function.check_foo.arn
}

resource "aws_lambda_permission" "allow_cloudwatch_to_call_check_foo" {
    statement_id = "AllowExecutionFromCloudWatch"
    action = "lambda:InvokeFunction"
    function_name = aws_lambda_function.check_foo.function_name
    principal = "events.amazonaws.com"
    source_arn = aws_cloudwatch_event_rule.every_five_minutes.arn
}

Read CSV files with Python

with open("file.csv", mode="r", encoding="utf-8", errors="ignore") as file:
  csv_reader = csv.reader(file, delimiter=",")
  for row in csv_reader:
    print(row)

Create S3 Bucket Notification w/ Lambda as Target

resource "aws_s3_bucket_notification" "bucket_notification" {
  bucket = aws_s3_bucket.name.id

  lambda_function {
    lambda_function_arn = aws_lambda_function.lambda_func.arn
    events              = ["s3:ObjectCreated:*"]
    filter_suffix       = ".csv"
  }
}

resource "aws_lambda_permission" "allow_bucket" {
  statement_id  = "AllowExecutionFromS3Bucket"
  action        = "lambda:InvokeFunction"
  function_name = aws_lambda_function.lambda_func.arn
  principal     = "s3.amazonaws.com"
  source_arn    = aws_s3_bucket.name.arn
}

resource "aws_lambda_function_event_invoke_config" "invoke_config" {
  function_name          = aws_lambda_function.lambda_func.function_name
  maximum_retry_attempts = 0

  depends_on = [
    aws_lambda_permission.allow_bucket
  ]
}