{"id":24534421,"url":"https://github.com/maxsonferovante/sqs-listener-in-python-using-fastapi","last_synced_at":"2026-05-09T06:04:37.543Z","repository":{"id":273457205,"uuid":"919781249","full_name":"maxsonferovante/sqs-listener-in-python-using-fastapi","owner":"maxsonferovante","description":"Este projeto demonstra como criar uma tarefa em segundo plano no FastAPI para escutar mensagens do AWS SQS.","archived":false,"fork":false,"pushed_at":"2025-02-02T23:10:46.000Z","size":30,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-06-20T03:40:33.537Z","etag":null,"topics":["aws","fastapi","python","sqs","uv"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/maxsonferovante.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2025-01-21T02:08:58.000Z","updated_at":"2025-02-02T23:10:49.000Z","dependencies_parsed_at":null,"dependency_job_id":"658ab8a3-b328-4b1a-aea1-719680c9b3e7","html_url":"https://github.com/maxsonferovante/sqs-listener-in-python-using-fastapi","commit_stats":null,"previous_names":["maxsonferovante/sqs-listener-in-python-using-fastapi"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/maxsonferovante/sqs-listener-in-python-using-fastapi","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/maxsonferovante%2Fsqs-listener-in-python-using-fastapi","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/maxsonferovante%2Fsqs-listener-in-python-using-fastapi/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/maxsonferovante%2Fsqs-listener-in-python-using-fastapi/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/maxsonferovante%2Fsqs-listener-in-python-using-fastapi/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/maxsonferovante","download_url":"https://codeload.github.com/maxsonferovante/sqs-listener-in-python-using-fastapi/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/maxsonferovante%2Fsqs-listener-in-python-using-fastapi/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":267317714,"owners_count":24068482,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-07-27T02:00:11.917Z","response_time":82,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["aws","fastapi","python","sqs","uv"],"created_at":"2025-01-22T11:17:08.764Z","updated_at":"2026-05-09T06:04:32.525Z","avatar_url":"https://github.com/maxsonferovante.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Listener SQS em Python usando FastAPI\n\nEste projeto demonstra como criar uma tarefa em segundo plano no FastAPI para escutar mensagens do AWS SQS.\n\n## Estrutura do Projeto\n\n- `background_tasks.py`: Define a classe `BackgroudTask` que executa uma tarefa em segundo plano em intervalos especificados.\n- `server.py`: Configura o servidor FastAPI e integra a tarefa em segundo plano.\n- `app.py`: Ponto de entrada para executar a aplicação FastAPI usando Uvicorn.\n- `listen_sqs.py`: Contém a função para escutar mensagens do AWS SQS.\n\n## Arquivos\n\n### `background_tasks.py`\n\nEste arquivo contém a classe `BackgroudTask` que herda de `threading.Thread`. Ela valida o nome da tarefa, intervalo e função, e executa a tarefa no intervalo especificado.\n\n```python\nimport threading\nimport time\n\nclass BackgroudTask(threading.Thread):\n    def __init__(self, name: str, func: callable, interval: int):\n        super().__init__()\n        self.name = self.__validate_name(name)\n        self.interval = self.__validate_interval(interval)\n        self.func = self.__validate_func(func)\n\n    async def __aenter__(self):\n        return self\n\n    async def __aexit__(self, exc_type, exc, tb):\n        self.join()\n\n    def __validate_name(self, name):\n        if name is None:\n            return \"Background Task - \" + str(time.time())\n        if not isinstance(name, str):\n            raise ValueError(\"Name must be a string\")\n        return name\n\n    def __validate_interval(self, interval):\n        if interval \u003c 0:\n            raise ValueError(\"Interval must be greater than 0\")\n        if interval \u003c 1:\n            raise ValueError(\"Interval must be an integer\")\n        if interval \u003e 60:\n            raise ValueError(\"Interval must be less than 60\")\n        return interval\n\n    def __validate_func(self, func):\n        if not callable(func):\n            raise ValueError(\"Func must be callable\")\n        return func\n\n    def run(self, *args, **kwargs):\n        print(f\"Running task {self.name}\")\n\n        while True:\n            print(f\"Task {self.name} is running\")\n            self.func()\n            time.sleep(self.interval)\n```\n\n### `server.py`\n\nEste arquivo configura o servidor FastAPI e integra a tarefa em segundo plano usando um gerenciador de contexto assíncrono.\n\n```python\nimport logging\nfrom contextlib import asynccontextmanager\nfrom fastapi import FastAPI\nfrom src.background_tasks.background_tasks import BackgroudTask\nfrom src.sqs_listener.listen_sqs import listen_sqs\n\nlogger = logging.getLogger(__name__)\n\nSERVICE_NAME = \"sqs_listener_service\"\n\n@asynccontextmanager\nasync def lifespan(app: FastAPI):\n    async with BackgroudTask(name=SERVICE_NAME, func=listen_sqs, interval=2) as task:\n        yield\n        task.start()\n\napp = FastAPI(lifespan=lifespan)\n\n@app.get(\"/\")\nasync def read_root():\n    return {\"Hello\": \"World\"}\n```\n\n### `app.py`\n\nEste é o ponto de entrada para executar a aplicação FastAPI usando Uvicorn.\n\n```python\nimport uvicorn as uvicorn\nfrom src.server import app\n\nif __name__ == \"__main__\":\n    uvicorn.run(app, host=\"0.0.0.0\", port=8000, workers=5, timeout_keep_alive=600, reload=False)\n```\n\n### `listen_sqs.py`\n\nEste arquivo contém a função `listen_sqs` que escuta mensagens do AWS SQS e as processa.\n\n```python\nimport json\nimport boto3\nimport os\nimport logging\n\nlogger = logging.getLogger(__name__)\n\ndef listen_sqs():\n    try:\n        sqs = boto3.client('sqs', region_name=os.environ['AWS_REGION'])\n        logger.info(\"Listening to SQS - %s\", os.environ['SQS_QUEUE_URL'])\n        response = sqs.receive_message(\n            QueueUrl=os.environ['SQS_QUEUE_URL'],\n            AttributeNames=['All'],\n            MaxNumberOfMessages=1,\n            WaitTimeSeconds=20\n        )\n        if \"Messages\" in response:\n            for message in response['Messages']:\n                body = json.loads(message['Body'])\n                message_receipt_handle = message['ReceiptHandle']\n\n                logger.info(\"Message received: %s\", body)\n                logger.info(\"Message Receipt Handle: %s\", message_receipt_handle)\n\n                sqs.delete_message(\n                    QueueUrl=os.environ['SQS_QUEUE_URL'],\n                    ReceiptHandle=message_receipt_handle\n                )\n        else:\n            logger.info(\"No messages in queue\")\n    except Exception as e:\n        logger.error(\"Error in listening to SQS - %s\", e)\n```\n\n## Executando a Aplicação\n\n1. Configure suas credenciais AWS e variáveis de ambiente para `AWS_REGION` e `SQS_QUEUE_URL`.\n2. Execute a aplicação usando o seguinte comando:\n   ```bash\n   python app.py\n   ```\n\nIsso iniciará o servidor FastAPI e a tarefa em segundo plano para escutar mensagens do SQS.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmaxsonferovante%2Fsqs-listener-in-python-using-fastapi","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmaxsonferovante%2Fsqs-listener-in-python-using-fastapi","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmaxsonferovante%2Fsqs-listener-in-python-using-fastapi/lists"}