For local development, install:
- docker
- just
- aws-vault (only for special profiles; can skip)
- localstack
- samlocal
- sops
- awslocal cli
- playwright
- uv (only for Python scripts to bootstrap AWS IAM roles; can skip)
Start the local AWS environment:
just run-localstackDeploy the SAM stack to LocalStack:
just deploy-stack localInstall Lambda packages:
just lambda install-allor for a single module:
just lambda install <module-name>Local development uses:
samlocalinstead ofsamawslocalinstead ofaws
The project has four environments:
| Environment | Purpose | Infrastructure |
|---|---|---|
| local | Developer environment | LocalStack |
| testing | CI integration tests | LocalStack in GitHub Actions |
| staging | Pre-production validation | AWS account |
| production | Production workload | AWS account |
The testing environment runs in CI:
- executed in GitHub Actions
- uses LocalStack
- runs automated integration tests
Staging is deployed automatically after merging to main.
- runs on real AWS infrastructure
- used for smoke tests
- artifacts are stored for reproducible production deployments
Staging:
https://d1kcc3fdgope53.cloudfront.net/
Production deployment is manually triggered after staging succeeds.
- separate AWS account
- only validated artifacts are promoted
- deployment happens via release workflow
Production:
https://d1ldsga5pjglgd.cloudfront.net/
- Frontend: React & Tailwind CSS
- Backend: Java 21
secrets/
Contains local development secrets (e.g. LocalStack auth token).
infra/
Contains AWS SAM templates.
bootstrap/
Contains AWS account setup.
lambda/
Contains backend code running on AWS Lambda.
Structure:
-
common-utils/Shared utilities and common code. -
backend-api-lambda/Core platform logic. -
sqs-dispatcher-lambda/Consumes build jobs from SQS and starts CodeBuild jobs to build and push Docker images to ECR. -
function-deployer-lambda/Creates isolated Lambda functions for users after CodeBuild completion.
infra/samconfig.toml is the single source of truth for:
- AWS region
- stack name
- environment variables
Ran once per AWS account (staging / production) to create:
- GitHub OIDC deployment role
- Artifact bucket (staging only)
The artifact bucket must exist before the first deployment.
For staging and production use:
saminstead ofsamlocalawsinstead ofawslocal
Triggered automatically after merge to main.
Steps:
-
Build artifacts
- latest tag metadata
- main SHA tag metadata
-
Upload artifacts to S3
-
Run smoke tests
Triggered manually:
- Admin starts release workflow
- Release tag is created
- Production deployment workflow runs
CI runs after opening a PR against main.
Only changed modules are tested.
Checks include:
- build
- linting
- code analysis
- unit tests
- integration tests
Flow:
Pull Request
|
v
CI checks
|
v
Merge to main
|
v
Staging deployment
|
v
Manual production release
- Create feature branch
- Open PR against
main - Wait for CI checks
- Merge to
main - Staging deployment starts automatically
cd lambda && mvn wrapper:wrapperLocalStack token format:
KEY: valueEncrypt using SOPS.
More information: https://technotim.com/posts/secret-encryption-sops/