Skip to content

Commit 47e555f

Browse files
authored
feat: create produce endpoint to write SQS message (#7)
1 parent 2c84f08 commit 47e555f

File tree

7 files changed

+65
-6
lines changed

7 files changed

+65
-6
lines changed

api/main.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,17 @@
22
Main API handler that defines all routes.
33
"""
44

5+
import json
6+
import os
7+
from datetime import datetime
8+
9+
import boto3
510
from fastapi import FastAPI
611
from mangum import Mangum
712

13+
MESSAGE_QUEUE_NAME = os.environ.get("MESSAGE_QUEUE_NAME", None)
14+
REGION = os.environ.get("AWS_REGION", "ca-canada-1")
15+
816
app = FastAPI(
917
title="AWS + FastAPI",
1018
description="AWS API Gateway, Lambdas and FastAPI (oh my)",
@@ -17,5 +25,21 @@ def hello():
1725
return {"Hello": "World"}
1826

1927

28+
@app.get("/produce")
29+
def produce():
30+
"Produce an SQS message"
31+
32+
if MESSAGE_QUEUE_NAME is None:
33+
return {"error": "Message queue name not set"}
34+
35+
message = {"date": datetime.now(), "flavour": "delicious"}
36+
37+
sqs = boto3.resource("sqs", region_name=REGION)
38+
queue = sqs.get_queue_by_name(QueueName=MESSAGE_QUEUE_NAME)
39+
response = queue.send_message(MessageBody=json.dumps(message))
40+
41+
return {"message_id": response.get("MessageId")}
42+
43+
2044
# Mangum allows us to use Lambdas to process requests
2145
handler = Mangum(app=app)

api/requirements.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
1+
boto3==1.17.*
12
fastapi==0.67.0
23
mangum==0.12.1

api/tests/test_main.py

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,34 @@
1+
import json
12
import main
3+
from unittest.mock import call, MagicMock, patch
24

35

46
def test_hello():
57
assert main.hello() == {"Hello": "World"}
8+
9+
10+
@patch("main.boto3")
11+
@patch("main.datetime")
12+
@patch("main.MESSAGE_QUEUE_NAME", "Muffins")
13+
@patch("main.REGION", "us-east-1")
14+
def test_produce(MockDateTime, MockBoto):
15+
response = MagicMock()
16+
response.get.return_value = "42"
17+
queue = MagicMock()
18+
queue.send_message.return_value = response
19+
sqs = MagicMock()
20+
sqs.get_queue_by_name.return_value = queue
21+
MockBoto.resource.return_value = sqs
22+
MockDateTime.now.return_value = "1970-01-01"
23+
24+
assert main.produce() == {"message_id": "42"}
25+
26+
MockBoto.resource.assert_called_with("sqs", region_name="us-east-1")
27+
sqs.get_queue_by_name.assert_called_with(QueueName="Muffins")
28+
queue.send_message.assert_called_with(
29+
MessageBody=json.dumps({"date": "1970-01-01", "flavour": "delicious"})
30+
)
31+
32+
33+
def test_produce_no_queue():
34+
assert main.produce() == {"error": "Message queue name not set"}

infra/env/dev/api-gateway/terragrunt.hcl

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,16 +21,16 @@ dependency "sqs" {
2121

2222
mock_outputs_allowed_terraform_commands = ["init", "fmt", "validate", "plan", "show"]
2323
mock_outputs = {
24-
message_queue_arn = ""
25-
message_queue_url = ""
24+
message_queue_arn = ""
25+
message_queue_name = ""
2626
}
2727
}
2828

2929
inputs = {
3030
lambda_subnet_ids = dependency.network.outputs.lambda_subnet_ids
3131
lambda_security_group_id = dependency.network.outputs.lambda_security_group_id
3232
message_queue_arn = dependency.sqs.outputs.message_queue_arn
33-
message_queue_url = dependency.sqs.outputs.message_queue_url
33+
message_queue_name = dependency.sqs.outputs.message_queue_name
3434
}
3535

3636
terraform {

infra/modules/api-gateway/lambda.tf

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,8 @@ resource "aws_lambda_function" "api_lambda" {
2020

2121
environment {
2222
variables = {
23-
message_queue_url = var.message_queue_url
23+
MESSAGE_QUEUE_NAME = var.message_queue_name
24+
REGION = var.region
2425
}
2526
}
2627

infra/modules/api-gateway/variables.tf

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ variable "message_queue_arn" {
1313
type = string
1414
}
1515

16-
variable "message_queue_url" {
17-
description = "URL of the SQS to send messages to"
16+
variable "message_queue_name" {
17+
description = "Name of the SQS to send messages to"
1818
type = string
1919
}

infra/modules/sqs/output.tf

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,10 @@ output "message_queue_arn" {
22
value = aws_sqs_queue.message_queue.arn
33
}
44

5+
output "message_queue_name" {
6+
value = aws_sqs_queue.message_queue.name
7+
}
8+
59
output "message_queue_url" {
610
value = aws_sqs_queue.message_queue.url
711
}

0 commit comments

Comments
 (0)