lambda.tf 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. locals {
  2. # By default, We allow lambda to run 5 seconds less than the visibility timeout, unless
  3. # the visiblity timeout is > 300 (5 minutes)
  4. lambda_timeout = (var.source_sqs.visibility_timeout_seconds > 300 ? 300 : (var.source_sqs.visibility_timeout_seconds - 5))
  5. }
  6. resource "aws_lambda_event_source_mapping" "sqs_fair_queue" {
  7. event_source_arn = var.source_sqs.arn
  8. function_name = aws_lambda_function.sqs_fair_queue.arn
  9. batch_size = 100
  10. maximum_batching_window_in_seconds = 30 # How long to wait to gather a batch, max: 300
  11. }
  12. # To install prereqs:
  13. # pip install --target ./scripts jsonpath-ng
  14. data "archive_file" "sqs_fair_queue" {
  15. type = "zip"
  16. source_dir = "${path.module}/scripts/"
  17. output_path = "${path.module}/tmp/sqs_fair_queue.zip"
  18. }
  19. resource "aws_lambda_function" "sqs_fair_queue" {
  20. filename = data.archive_file.sqs_fair_queue.output_path
  21. function_name = "sqs_fair_queue_${var.sqs_prefix}"
  22. role = aws_iam_role.sqs_fair_queue.arn
  23. handler = "sqs_fair_queue.lambda_handler"
  24. timeout = local.lambda_timeout
  25. # NOTE: If it can't handle the batch in the time alloted, there is a chance for duplicates.
  26. source_code_hash = data.archive_file.sqs_fair_queue.output_base64sha256
  27. runtime = "python3.9"
  28. environment {
  29. variables = {
  30. #"SOURCE_SQS_ARN" = var.source_sqs.arn # Not needed?
  31. "SOURCE_SQS_URL" = var.source_sqs.url
  32. "SQS_PREFIX" = var.sqs_prefix
  33. "NUM_QUEUES" = var.num_queues
  34. "HASH_JSONPATH" = var.hash_jsonpath
  35. "DEBUG" = var.debug
  36. "BOTODEBUG" = var.botodebug
  37. }
  38. }
  39. # tfsec recommends tracing as a best practice
  40. tracing_config {
  41. mode = "Active"
  42. }
  43. tags = var.tags
  44. }
  45. resource "aws_lambda_permission" "sqs_fair_queue" {
  46. statement_id = "AllowExecutionFromSQS"
  47. action = "lambda:InvokeFunction"
  48. function_name = aws_lambda_function.sqs_fair_queue.function_name
  49. principal = "sqs.amazonaws.com"
  50. source_arn = var.source_sqs.arn
  51. }
  52. data "aws_iam_policy_document" "sqs_fair_queue" {
  53. statement {
  54. sid = "SQSIngest"
  55. effect = "Allow"
  56. resources = [var.source_sqs.arn]
  57. # tfsec:ignore:aws-iam-no-policy-wildcards Wildcards are fine and useful
  58. actions = ["sqs:*"] # TODO: Nail down
  59. # Probably:
  60. # "sqs:ReceiveMessage",
  61. # "sqs:SendMessage",
  62. # "sqs:GetQueueAttributes"
  63. # "sqs:GetQueueUrl"
  64. }
  65. statement {
  66. sid = "SQSPut"
  67. effect = "Allow"
  68. resources = tolist(aws_sqs_queue.queue[*].arn)
  69. # tfsec:ignore:aws-iam-no-policy-wildcards Wildcards are fine and useful
  70. actions = ["sqs:*"] # TODO: Nail down
  71. }
  72. }
  73. resource "aws_iam_policy" "sqs_fair_queue" {
  74. name = "sqs_fair_queue_${var.sqs_prefix}"
  75. path = "/sqs_fair_queue/"
  76. description = "SQS Fair Queueing Lambda Policy"
  77. policy = data.aws_iam_policy_document.sqs_fair_queue.json
  78. tags = var.tags
  79. }
  80. data "aws_iam_policy_document" "lambda_trust" {
  81. statement {
  82. sid = ""
  83. effect = "Allow"
  84. actions = ["sts:AssumeRole"]
  85. principals {
  86. type = "Service"
  87. identifiers = ["lambda.amazonaws.com"]
  88. }
  89. }
  90. }
  91. resource "aws_iam_role" "sqs_fair_queue" {
  92. name = "sqs_fair_queue_${var.sqs_prefix}"
  93. path = "/sqs_fair_queue/"
  94. assume_role_policy = data.aws_iam_policy_document.lambda_trust.json
  95. tags = var.tags
  96. }
  97. resource "aws_iam_role_policy_attachment" "sqs_fair_queue" {
  98. role = aws_iam_role.sqs_fair_queue.name
  99. policy_arn = aws_iam_policy.sqs_fair_queue.arn
  100. }
  101. resource "aws_iam_role_policy_attachment" "aws_managed_lambda" {
  102. role = aws_iam_role.sqs_fair_queue.name
  103. policy_arn = "arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole"
  104. }