lambda.tf 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  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. }
  36. }
  37. # tfsec recommends tracing as a best practice
  38. tracing_config {
  39. mode = "Active"
  40. }
  41. tags = var.tags
  42. }
  43. resource "aws_lambda_permission" "sqs_fair_queue" {
  44. statement_id = "AllowExecutionFromSQS"
  45. action = "lambda:InvokeFunction"
  46. function_name = aws_lambda_function.sqs_fair_queue.function_name
  47. principal = "sqs.amazonaws.com"
  48. source_arn = var.source_sqs.arn
  49. }
  50. data "aws_iam_policy_document" "sqs_fair_queue" {
  51. statement {
  52. sid = "SQSIngest"
  53. effect = "Allow"
  54. resources = [var.source_sqs.arn]
  55. # tfsec:ignore:aws-iam-no-policy-wildcards Wildcards are fine and useful
  56. actions = ["sqs:*"] # TODO: Nail down
  57. # Probably:
  58. # "sqs:ReceiveMessage",
  59. # "sqs:SendMessage",
  60. # "sqs:GetQueueAttributes"
  61. # "sqs:GetQueueUrl"
  62. }
  63. statement {
  64. sid = "SQSPut"
  65. effect = "Allow"
  66. resources = tolist(aws_sqs_queue.queue[*].arn)
  67. # tfsec:ignore:aws-iam-no-policy-wildcards Wildcards are fine and useful
  68. actions = ["sqs:*"] # TODO: Nail down
  69. }
  70. }
  71. resource "aws_iam_policy" "sqs_fair_queue" {
  72. name = "sqs_fair_queue_${var.sqs_prefix}"
  73. path = "/sqs_fair_queue/"
  74. description = "SQS Fair Queueing Lambda Policy"
  75. policy = data.aws_iam_policy_document.sqs_fair_queue.json
  76. tags = var.tags
  77. }
  78. data "aws_iam_policy_document" "lambda_trust" {
  79. statement {
  80. sid = ""
  81. effect = "Allow"
  82. actions = ["sts:AssumeRole"]
  83. principals {
  84. type = "Service"
  85. identifiers = ["lambda.amazonaws.com"]
  86. }
  87. }
  88. }
  89. resource "aws_iam_role" "sqs_fair_queue" {
  90. name = "sqs_fair_queue_${var.sqs_prefix}"
  91. path = "/sqs_fair_queue/"
  92. assume_role_policy = data.aws_iam_policy_document.lambda_trust.json
  93. tags = var.tags
  94. }
  95. resource "aws_iam_role_policy_attachment" "sqs_fair_queue" {
  96. role = aws_iam_role.sqs_fair_queue.name
  97. policy_arn = aws_iam_policy.sqs_fair_queue.arn
  98. }
  99. resource "aws_iam_role_policy_attachment" "aws_managed_lambda" {
  100. role = aws_iam_role.sqs_fair_queue.name
  101. policy_arn = "arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole"
  102. }