main.tf 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. ######################################
  2. # The fair queueing module example
  3. module "sqs_fair_queue" {
  4. source = "./module_sqs_fair_queueing"
  5. source_sqs = aws_sqs_queue.queue
  6. #deadletter = aws_sqs_queue.deadletter
  7. sqs_prefix = local.sqs_prefix
  8. num_queues = 16
  9. hash_jsonpath = "$" # This will evenly distribute all messages
  10. tags = local.tags
  11. }
  12. ######################################
  13. # Example Resources for testing
  14. # tfsec:ignore:aws-s3-enable-bucket-logging Logging is a good idea, but we don't here.
  15. # tfsec:ignore:aws-s3-enable-versioning Versioning is a good idea, but we don't here.
  16. resource "aws_s3_bucket" "bucket" {
  17. bucket = "mbox-fair-queueing-test"
  18. force_destroy = true
  19. tags = merge(local.tags, {
  20. Name = "mbox-fair-queueing-test"
  21. Environment = "Dev"
  22. Purpose = "POC bucket for S3 fair queueing"
  23. })
  24. }
  25. resource "aws_s3_bucket_acl" "bucket" {
  26. bucket = aws_s3_bucket.bucket.id
  27. acl = "private"
  28. }
  29. resource "aws_s3_bucket_public_access_block" "bucket" {
  30. bucket = aws_s3_bucket.bucket.id
  31. block_public_acls = true
  32. block_public_policy = true
  33. ignore_public_acls = true
  34. restrict_public_buckets = true
  35. }
  36. # tfsec:ignore:aws-s3-encryption-customer-key AWS managed key is sufficient
  37. resource "aws_s3_bucket_server_side_encryption_configuration" "bucket" {
  38. bucket = aws_s3_bucket.bucket.bucket
  39. rule {
  40. apply_server_side_encryption_by_default {
  41. sse_algorithm = "AES256"
  42. }
  43. }
  44. }
  45. # SQS configuration for the root bucket
  46. #
  47. # NOTE! Only this first sqs needs to be set up.
  48. # The module will set up the sqs queues for FIFO.
  49. #
  50. # Remember that the consumer service needs access to the FIFO queues,
  51. # not these.
  52. resource "aws_sqs_queue" "queue" {
  53. name = "mbox-bucket-notification"
  54. sqs_managed_sse_enabled = true
  55. policy = <<POLICY
  56. {
  57. "Version": "2012-10-17",
  58. "Statement": [
  59. {
  60. "Effect": "Allow",
  61. "Principal": "*",
  62. "Action": "sqs:SendMessage",
  63. "Resource": "arn:aws:sqs:*:*:mbox-bucket-notification",
  64. "Condition": {
  65. "ArnEquals": { "aws:SourceArn": "${aws_s3_bucket.bucket.arn}" }
  66. }
  67. }
  68. ]
  69. }
  70. POLICY
  71. redrive_policy = jsonencode({
  72. deadLetterTargetArn = aws_sqs_queue.deadletter.arn
  73. maxReceiveCount = 4
  74. })
  75. # NOTE: If you set this below about 15, then you must decrease how many
  76. # messages are processed per batch by lambda.
  77. visibility_timeout_seconds = 30
  78. depends_on = [aws_s3_bucket.bucket]
  79. tags = local.tags
  80. }
  81. resource "aws_sqs_queue" "deadletter" {
  82. name = "mbox-bucket-notification-dlq"
  83. sqs_managed_sse_enabled = true
  84. }
  85. resource "aws_sqs_queue_redrive_allow_policy" "deadletter" {
  86. queue_url = aws_sqs_queue.deadletter.id
  87. redrive_allow_policy = jsonencode({
  88. redrivePermission = "allowAll" # Must allow all if > 9 bins
  89. #sourceQueueArns = [aws_sqs_queue.queue.arn, local.sqs_wildcard_arn]
  90. #sourceQueueArns = concat([aws_sqs_queue.queue.arn], module.sqs_fair_queue.arns)
  91. })
  92. }
  93. resource "aws_s3_bucket_notification" "bucket_notification" {
  94. bucket = aws_s3_bucket.bucket.id
  95. queue {
  96. queue_arn = aws_sqs_queue.queue.arn
  97. events = ["s3:ObjectCreated:*"]
  98. filter_prefix = "incoming/"
  99. }
  100. depends_on = [aws_sqs_queue.queue, aws_s3_bucket.bucket]
  101. }