https://github.com/fiap-8soat-tc-one/poc-az-serverless
PoC para analisar a viabilidade de se trabalhar com conceitos serverless, cloud agnostic em kubernetes, utilizando o framework do azure-function em docker
https://github.com/fiap-8soat-tc-one/poc-az-serverless
azure-functions java keda kubernetes mysql outbox-pattern rabbitmq sendgrid serverless workflow-pattern
Last synced: 6 months ago
JSON representation
PoC para analisar a viabilidade de se trabalhar com conceitos serverless, cloud agnostic em kubernetes, utilizando o framework do azure-function em docker
- Host: GitHub
- URL: https://github.com/fiap-8soat-tc-one/poc-az-serverless
- Owner: fiap-8soat-tc-one
- Created: 2025-03-12T00:59:23.000Z (7 months ago)
- Default Branch: main
- Last Pushed: 2025-03-12T01:29:47.000Z (7 months ago)
- Last Synced: 2025-03-25T00:47:28.425Z (6 months ago)
- Topics: azure-functions, java, keda, kubernetes, mysql, outbox-pattern, rabbitmq, sendgrid, serverless, workflow-pattern
- Language: Java
- Homepage:
- Size: 25.4 KB
- Stars: 0
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# 🚀 POC az-fiap-hackathon
## ✅ Pré-requisitos
Antes de iniciar, certifique-se de que possui as seguintes ferramentas instaladas:
-
🏗️ [Azure Functions Tools para desenvolvimento local](https://learn.microsoft.com/en-us/azure/azure-functions/functions-run-local?tabs=windows%2Cisolated-process%2Cnode-v4%2Cpython-v2%2Chttp-trigger%2Ccontainer-apps&pivots=programming-language-java)
- 🐳 [Docker](https://www.docker.com/)
- ☸️ [Kubernetes](https://kubernetes.io/)
- ☕ [Java 17+](https://openjdk.org/projects/jdk/17/) / [Maven](https://maven.apache.org/)
- 🛢️ [MySQL](https://www.mysql.com/) instalado localmente ou via container
- 📩 [RabbitMQ](https://www.rabbitmq.com/) instalado localmente ou via container
- 🚀 [Intellij](https://www.jetbrains.com/pt-br/idea/download/?section=windows) Como IDE recomendada e a instalação do
plugin [Azure Toolkit Intellij](https://plugins.jetbrains.com/plugin/8053-azure-toolkit-for-intellij)## Execução Local
1. Para execução local, primeiro criar o seguinte arquivo na raiz do projeto:
- **🔹 Nome do arquivo:** `local.settings.json`
- **🔹 Conteúdo:**```json
{
"IsEncrypted": false,
"Values": {
"AzureWebJobsStorage": "UseDevelopmentStorage=true",
"FUNCTIONS_WORKER_RUNTIME": "java",
"MySqlConnectionString": "Server=localhost;Port=30081;Database=test;Uid=test_user;Pwd=test_password;",
"RabbitMqConnectionString": "amqp://admin:admin@localhost:30088/",
"RabbitMqOutQueueName": "outputQueue",
"SendGridApiKey": "",
"NotifyQueue": "notifyQueue"
}
}```
## 🛠️ Configuração do MySQL
1. Configure o usuário/senha do banco na `connectionString`:
- **🔹 Para execução local**: defina dentro do arquivo `local.settings.json`.
- **🔹 Para execução no Kubernetes**: defina dentro do arquivo `kubernetes/infra/secrets`.2. Utilize a interface gráfica de sua preferência e execute o script localizado em `scripts/mysql.sql` para criar o
banco de dados e a tabela.3. Para configurar o MySQL dentro do cluster Kubernetes local, utilize o seguinte comando **Helm**:
```sh
helm install mysql-demo bitnami/mysql --namespace fiap-hackathon \
--set auth.rootPassword=rootpassword \
--set auth.database=test \
--set auth.username=test_user \
--set auth.password=test_password
```**⚠️ Nota:** A *secret* versionada neste repositório já contempla a `connectionString` correspondente a essa
configuração. Qualquer alteração precisa ser revalidada.4. Se o cluster local for gerado pelo script KIND (`kubernetes/infra/kc.yaml`), exponha o MySQL na porta `30081` com o
seguinte comando:```sh
kubectl patch svc mysql-demo -p '{"spec": {"type": "NodePort", "ports": [{"port": 3306, "nodePort": 30081}]}}'
```## 📨 Configuração do RabbitMQ
1. Crie duas filas dentro do RabbitMQ:
- 📌 `notifyQueue` (para notificações)
- 📌 `outputQueue` (para processamento)Caso os nomes das filas sejam diferentes, atualize os arquivos:
- **📍 Para execução local**: `local.settings.json`
- **📍 Para execução no Kubernetes**: manifestos dentro de `kubernetes/funcs`2. Para configurar o RabbitMQ dentro do cluster Kubernetes local, utilize o seguinte comando **Helm**:
```sh
helm install rabbitmq bitnami/rabbitmq --namespace fiap-hackathon --create-namespace \
--set auth.username=admin --set auth.password=admin --set persistence.enabled=false
```**⚠️ Nota:** A *secret* versionada neste repositório já contempla a `connectionString` correspondente a essa
configuração. Qualquer alteração precisa ser revalidada.3. Se o cluster local for gerado pelo script KIND (`kubernetes/infra/kc.yaml`), exponha o RabbitMQ nas portas `30088` (
broker) e `30086` (portal de gerenciamento) com o seguinte comando:```sh
kubectl patch svc rabbitmq -n fiap-hackathon -p '{"spec": {"type": "NodePort", "ports": [{"port": 5672, "nodePort": 30088}, {"port": 15672, "nodePort": 30086}]}}'
```## ☸️ Configuração do Cluster Kubernetes Local
Utilize a tecnologia que melhor lhe convier, como **K3s**, **KIND** ou **MicroK8s**.
### 🔹 Recomendações
Minha recomendação é utilizar o [KIND](https://kind.sigs.k8s.io/docs/user/quick-start/#installation). Caso opte por ele,
será necessário instalar o **metric-server**:```sh
kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
kubectl patch deployment metrics-server -n kube-system --type='json' -p='[{"op": "add", "path": "/spec/template/spec/containers/0/args/-", "value": "--kubelet-insecure-tls"}]'
```### ⚡ Instalação do KEDA
```sh
helm repo add kedacore https://kedacore.github.io/charts
helm repo update
helm install keda kedacore/keda --namespace keda --create-namespace
```## 🏗️ Execução do Ambiente Kubernetes
Siga os passos abaixo para configurar e executar o ambiente Kubernetes:
1️⃣ **Criar o Cluster Kubernetes**
2️⃣ **Configurar o metric-server** (caso ainda não esteja configurado)
3️⃣ **Configurar o KEDA**
4️⃣ **Instalar o MySQL via Helm**
5️⃣ **Instalar o RabbitMQ via Helm**
6️⃣ **Criar o namespace `fiap-hackathon`** (caso ainda não esteja criado)
7️⃣ **Executar o arquivo de *secrets*** do diretório `kubernetes/infra/secrets.yaml`
8️⃣ **Executar os manifestos do diretório `kubernetes/funcs/*.yaml`**
**A ordem de execução dos arquivos dentro de `kubernetes/funcs/` não é relevante, pois cada arquivo é independente.**