|
@@ -0,0 +1,102 @@
|
|
|
+resource "aws_lambda_event_source_mapping" "sqs_fair_queue" {
|
|
|
+ event_source_arn = var.source_sqs_arn
|
|
|
+ function_name = aws_lambda_function.sqs_fair_queue.arn
|
|
|
+ batch_size = 100
|
|
|
+ maximum_batching_window_in_seconds = 30 # How long to wait to gather a batch, max: 300
|
|
|
+}
|
|
|
+
|
|
|
+# To install prereqs:
|
|
|
+# pip install --target ./scripts jsonpath-ng
|
|
|
+data "archive_file" "sqs_fair_queue" {
|
|
|
+ type = "zip"
|
|
|
+ source_dir = "${path.module}/scripts/"
|
|
|
+ output_path = "${path.module}/tmp/sqs_fair_queue.zip"
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+resource "aws_lambda_function" "sqs_fair_queue" {
|
|
|
+ filename = data.archive_file.sqs_fair_queue.output_path
|
|
|
+ function_name = "sqs_fair_queue_${var.sqs_prefix}"
|
|
|
+ role = aws_iam_role.sqs_fair_queue.arn
|
|
|
+ handler = "sqs_fair_queue.lambda_handler"
|
|
|
+
|
|
|
+ source_code_hash = data.archive_file.sqs_fair_queue.output_base64sha256
|
|
|
+
|
|
|
+ runtime = "python3.9"
|
|
|
+
|
|
|
+ environment {
|
|
|
+ variables = {
|
|
|
+ "SOURCE_SQS_ARN" = var.source_sqs_arn
|
|
|
+ "SQS_PREFIX" = var.sqs_prefix
|
|
|
+ "NUM_QUEUES" = var.num_queues
|
|
|
+ "HASH_JSONPATH" = var.hash_jsonpath
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+resource "aws_lambda_permission" "sqs_fair_queue" {
|
|
|
+ statement_id = "AllowExecutionFromSQS"
|
|
|
+ action = "lambda:InvokeFunction"
|
|
|
+ function_name = aws_lambda_function.sqs_fair_queue.function_name
|
|
|
+ principal = "sqs.amazonaws.com"
|
|
|
+ source_arn = var.source_sqs_arn
|
|
|
+}
|
|
|
+
|
|
|
+data "aws_iam_policy_document" "sqs_fair_queue" {
|
|
|
+ statement {
|
|
|
+ sid = "SQSIngest"
|
|
|
+ effect = "Allow"
|
|
|
+ resources = [var.source_sqs_arn]
|
|
|
+ actions = ["sqs:*"] # TODO: Nail down
|
|
|
+ # Probably:
|
|
|
+ # "sqs:ReceiveMessage",
|
|
|
+ # "sqs:SendMessage",
|
|
|
+ # "sqs:GetQueueAttributes"
|
|
|
+ # "sqs:GetQueueUrl"
|
|
|
+ }
|
|
|
+
|
|
|
+ statement {
|
|
|
+ sid = "SQSPut"
|
|
|
+ effect = "Allow"
|
|
|
+ resources = tolist(aws_sqs_queue.queue[*].arn)
|
|
|
+ actions = ["sqs:*"] # TODO: Nail down
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+resource "aws_iam_policy" "sqs_fair_queue" {
|
|
|
+ name = "sqs_fair_queue_${var.sqs_prefix}"
|
|
|
+ path = "/sqs_fair_queue/"
|
|
|
+ description = "SQS Fair Queueing Lambda Policy"
|
|
|
+ policy = data.aws_iam_policy_document.sqs_fair_queue.json
|
|
|
+}
|
|
|
+
|
|
|
+data "aws_iam_policy_document" "lambda_trust" {
|
|
|
+ statement {
|
|
|
+ sid = ""
|
|
|
+ effect = "Allow"
|
|
|
+ actions = ["sts:AssumeRole"]
|
|
|
+
|
|
|
+ principals {
|
|
|
+ type = "Service"
|
|
|
+ identifiers = ["lambda.amazonaws.com"]
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+resource "aws_iam_role" "sqs_fair_queue" {
|
|
|
+ name = "sqs_fair_queue_${var.sqs_prefix}"
|
|
|
+ path = "/sqs_fair_queue/"
|
|
|
+ assume_role_policy = data.aws_iam_policy_document.lambda_trust.json
|
|
|
+}
|
|
|
+
|
|
|
+resource "aws_iam_role_policy_attachment" "sqs_fair_queue" {
|
|
|
+ role = aws_iam_role.sqs_fair_queue.name
|
|
|
+ policy_arn = aws_iam_policy.sqs_fair_queue.arn
|
|
|
+}
|
|
|
+
|
|
|
+resource "aws_iam_role_policy_attachment" "aws_managed_lambda" {
|
|
|
+ role = aws_iam_role.sqs_fair_queue.name
|
|
|
+ policy_arn = "arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole"
|
|
|
+}
|
|
|
+
|
|
|
+
|