Этот проект поддерживает деплой Java Lambda-функции в три облачных провайдера:
- AWS Lambda
- Azure Functions
- Google Cloud Functions
Проект использует общий модуль CommonService для бизнес-логики, который разделяется между всеми тремя облаками:
src/main/java/com/example/
├── Handler.java # AWS Lambda handler
├── AzureHandler.java # Azure Functions handler
├── GcpHandler.java # Google Cloud Functions handler
└── service/
└── CommonService.java # Общая бизнес-логика для всех облаков
Каждый handler (AWS, Azure, GCP) инициализирует Spring Boot контекст и использует CommonService через dependency injection:
- CommonService содержит общую бизнес-логику
- Каждый handler адаптирует запрос/ответ под специфику своего облака
- Spring Boot обеспечивает единообразное управление зависимостями
├── src/main/java/com/example/
│ ├── Handler.java # AWS Lambda handler
│ ├── AzureHandler.java # Azure Functions handler
│ ├── GcpHandler.java # Google Cloud Functions handler
│ └── service/
│ └── CommonService.java # Общая бизнес-логика
├── terraform/
│ ├── aws/main.tf # Terraform для AWS
│ ├── azure/main.tf # Terraform для Azure
│ └── gcp/main.tf # Terraform для GCP
├── .github/workflows/
│ └── deploy.yml # GitHub Actions workflow
└── pom.xml # Maven конфигурация с профилями
mvn clean package -DskipTests -Pawsmvn clean package -DskipTests -Pazuremvn clean package -DskipTests -PgcpСобранный jar-файл будет находиться в target/lambda-service.jar.
Чтобы добавить новую бизнес-логику, редактируйте только класс CommonService.java:
@Service
public class CommonService {
public String processRequest(Map<String, Object> input) {
// Ваша бизнес-логика здесь
return "Hello from Lambda";
}
}Изменения автоматически применятся ко всем трём облакам! 🎉
- Перейдите в директорию AWS Terraform:
cd terraform/aws- Инициализируйте Terraform:
terraform init- Примените конфигурацию:
terraform applyНеобходимые переменные окружения:
AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEYAWS_REGION(по умолчанию: us-east-1)
- Перейдите в директорию Azure Terraform:
cd terraform/azure- Инициализируйте Terraform:
terraform init- Примените конфигурацию:
terraform applyНеобходимые переменные окружения:
ARM_CLIENT_IDARM_CLIENT_SECRETARM_SUBSCRIPTION_IDARM_TENANT_ID
- Перейдите в директорию GCP Terraform:
cd terraform/gcp- Инициализируйте Terraform:
terraform init- Примените конфигурацию:
terraform apply -var="project=YOUR_GCP_PROJECT_ID"Необходимые переменные окружения:
GOOGLE_CREDENTIALS(JSON с credentials)GOOGLE_PROJECT(ID проекта GCP)
В настройках вашего GitHub репозитория добавьте следующие секреты:
AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEY
AZURE_CLIENT_IDAZURE_CLIENT_SECRETAZURE_SUBSCRIPTION_IDAZURE_TENANT_ID
GCP_CREDENTIALS(содержимое JSON файла с ключом сервисного аккаунта)GCP_PROJECT(ID проекта)
- Перейдите в раздел Actions вашего GitHub репозитория
- Выберите workflow "Deploy Lambda PoC"
- Нажмите "Run workflow"
- Выберите целевое облако:
aws,azureилиgcp - Нажмите "Run workflow" для запуска
Workflow автоматически:
- Соберёт проект с нужным профилем Maven
- Инициализирует Terraform для выбранного облака
- Задеплоит функцию в выбранное облако
- Handler:
com.example.Handler::handleRequest - Runtime:
java17 - Формат: Использует AWS Lambda API (
RequestHandler) - Вызов:
commonService.processRequest(input)
- Handler:
com.example.AzureHandler - Runtime: Java 17 на Linux
- Формат: Использует Azure Functions API (
HttpRequestMessage,ExecutionContext) - Вызов:
commonService.processRequest()
- Entry Point:
com.example.GcpHandler - Runtime:
java17 - Формат: Использует Google Cloud Functions API (
HttpFunction) - Вызов:
commonService.processRequest()
Отредактируйте файлы terraform/*/main.tf для изменения:
- Памяти (memory_size)
- Таймаута (timeout)
- Переменных окружения (environment_variables)
- Региона деплоя
Добавьте зависимости в pom.xml в секцию <dependencies>.
Создавайте новые сервисы в пакете com.example.service и используйте их в CommonService:
@Service
public class MyNewService {
public String doSomething() {
return "Result";
}
}
@Service
public class CommonService {
@Autowired
private MyNewService myNewService;
public String processRequest(Map<String, Object> input) {
return myNewService.doSomething();
}
}Для удаления задеплоенных ресурсов выполните в соответствующей директории terraform:
terraform destroyРешение: Убедитесь, что maven-shade-plugin правильно настроен и включает все классы.
Решение: Проверьте, что все необходимые переменные окружения установлены.
Решение: Проверьте логи в консоли облачного провайдера:
- AWS: CloudWatch Logs
- Azure: Application Insights / Log Stream
- GCP: Cloud Logging
Решение: Убедитесь, что все классы находятся в пакете com.example или его подпакетах.