Daily Workflow Reference¶
Quick reference for common daily tasks when working with SYNDI.
Common Workflows¶
Daily Development Cycle¶
# 1. Start development servers
make start-dev ENV=dev ORG=myorg
# 2. Make code changes (auto-reload handles updates)
# 3. Test changes
make test-all
# 4. Commit
git add .
git commit -m "Your changes"
git push
# 5. Deploy to staging
make rs-deploy-function ENV=stage ORG=myorg
Deploy Code Changes¶
# Quick code update (30 seconds)
make rs-deploy-function ENV=stage ORG=myorg
# Verify deployment
make check-rs ENV=stage ORG=myorg
# View logs
make rs-watch-log ENV=stage ORG=myorg
Deploy Configuration Changes¶
# 1. Edit config
vi infra/.config/lambda/stage-myorg.json
# 2. Deploy config change
make rs-deploy-only ENV=stage ORG=myorg
# 3. Verify
make check-rs ENV=stage ORG=myorg
Test Authentication¶
# Test JWT authentication
make test-jwt-aws ENV=stage ORG=myorg
# Get token for manual testing
TOKEN=$(make get-rs-token ENV=stage ORG=myorg \
USER_NAME=admin@myorg.com PASSWORD=YourPassword)
# Use token
curl -H "Authorization: Bearer ${TOKEN}" \
${API_ENDPOINT}/api/v1/sops/list
Create New User¶
# Get User Pool ID
USER_POOL_ID=$(aws cloudformation describe-stacks \
--stack-name rawscribe-stage-myorg \
--query 'Stacks[0].Outputs[?OutputKey==`CognitoUserPoolId`].OutputValue' \
--output text)
# Create user
aws cognito-idp admin-create-user \
--user-pool-id ${USER_POOL_ID} \
--username newuser@myorg.com \
--user-attributes Name=email,Value=newuser@myorg.com \
--temporary-password TempPass123! \
--message-action SUPPRESS
# Add to group
aws cognito-idp admin-add-user-to-group \
--user-pool-id ${USER_POOL_ID} \
--username newuser@myorg.com \
--group-name RESEARCHERS
# Set permanent password
aws cognito-idp admin-set-user-password \
--user-pool-id ${USER_POOL_ID} \
--username newuser@myorg.com \
--password SecurePass123! \
--permanent
Upload SOPs¶
# Get account ID
ACCOUNT_ID=$(aws sts get-caller-identity --query Account --output text)
# Upload SOP
aws s3 cp new-sop.yaml \
s3://rawscribe-forms-stage-myorg-${ACCOUNT_ID}/sops/
# Sync directory
aws s3 sync ./sops/ \
s3://rawscribe-forms-stage-myorg-${ACCOUNT_ID}/sops/
Check Deployment Status¶
# Quick status check
make check-rs ENV=stage ORG=myorg
# Stack status only
make check-rs-stack-status ENV=stage ORG=myorg
# View endpoint
make show-rs-endpoint ENV=stage ORG=myorg
View Logs¶
# Tail logs in real-time
make rs-watch-log ENV=stage ORG=myorg
# Last 10 minutes
aws logs tail /aws/lambda/rawscribe-stage-myorg-backend \
--since 10m
Quick Command Reference¶
Setup & Configuration¶
make setup-local ENV=dev ORG=myorg # Setup local environment
make config ENV=dev ORG=myorg # Deploy configuration
make clean-config # Remove generated configs
make sync-configs ENV=stage ORG=myorg # Sync from CloudFormation
Development¶
make start-backend ENV=dev ORG=myorg # Start backend only
make start-frontend ENV=dev ORG=myorg # Start frontend only
make start-dev ENV=dev ORG=myorg # Start both
make stop-all # Stop all servers
Testing¶
make test-all # All tests
make test-frontend # Frontend tests
make test-backend # Backend tests
make test-e2e # E2E tests
make test-jwt-aws ENV=stage ORG=myorg # JWT tests
make clean-test # Clean test artifacts
Building¶
make build-frontend ENV=stage ORG=myorg # Build frontend (clean)
make build-backend ENV=stage ORG=myorg # Build backend (clean)
make clean-frontend # Clean frontend
make clean-backend # Clean backend
AWS Deployment¶
make rs-deploy ENV=stage ORG=myorg # Full deploy (5-7 min)
make rs-deploy-only ENV=stage ORG=myorg # Deploy without build (1-2 min)
make rs-deploy-function ENV=stage ORG=myorg # Quick Lambda update (30 sec)
make rs-teardown ENV=stage ORG=myorg # Remove stack
Monitoring¶
make check-rs ENV=stage ORG=myorg # Check deployment
make rs-watch-log ENV=stage ORG=myorg # View logs
make show-rs-endpoint ENV=stage ORG=myorg # Show API endpoint
make show-rs-user-pool ENV=stage ORG=myorg # Show User Pool
Common Scenarios¶
Morning: Start Development¶
# Activate environment
conda activate syndi
# Pull latest code
git pull
# Start servers
make start-dev ENV=dev ORG=myorg
Fix Production Bug¶
# 1. Reproduce locally
make start-backend ENV=dev ORG=myorg
# 2. Fix code
vim backend/rawscribe/routes/sops.py
# 3. Test locally (auto-reload)
curl http://localhost:8000/api/v1/sops/list
# 4. Run tests
make test-backend
# 5. Deploy to staging
make rs-deploy-function ENV=stage ORG=myorg
# 6. Test on staging
make test-jwt-aws ENV=stage ORG=myorg
# 7. Deploy to production
make rs-deploy-function ENV=prod ORG=myorg
Add New Feature¶
# 1. Create feature branch
git checkout -b feature/new-feature
# 2. Develop with hot reload
make start-dev ENV=dev ORG=myorg
# 3. Write tests
vim frontend/tests/new-feature.spec.ts
vim backend/tests/test_new_feature.py
# 4. Run tests
make test-all
# 5. Build locally
make build-frontend ENV=stage ORG=myorg
make build-backend ENV=stage ORG=myorg
# 6. Test locally
make serve-webapp ENV=stage ORG=myorg &
make serve-lambda ENV=stage ORG=myorg
# 7. Commit
git add .
git commit -m "Add new feature"
git push origin feature/new-feature
# 8. Deploy to staging
make rs-deploy ENV=stage ORG=myorg
# 9. Test on staging
make start-frontend ENV=stage ORG=myorg
Update Configuration¶
# 1. Edit config
vi infra/.config/lambda/stage-myorg.json
# 2. Commit to config repo (if using)
cd infra/.config
git add lambda/stage-myorg.json
git commit -m "Update file size limit"
git push
cd ../..
# 3. Deploy config
make rs-deploy-only ENV=stage ORG=myorg
Onboard New User¶
# 1. Get User Pool ID
make show-rs-user-pool ENV=stage ORG=myorg
# 2. Create user (follow prompts)
aws cognito-idp admin-create-user \
--user-pool-id <pool-id> \
--username newuser@myorg.com \
--user-attributes Name=email,Value=newuser@myorg.com
# 3. Add to group
aws cognito-idp admin-add-user-to-group \
--user-pool-id <pool-id> \
--username newuser@myorg.com \
--group-name RESEARCHERS
# 4. Send credentials to user
Investigate Production Issue¶
# 1. Check deployment status
make check-rs ENV=prod ORG=myorg
# 2. View recent logs
make rs-watch-log ENV=prod ORG=myorg
# 3. Test authentication
make test-jwt-aws ENV=prod ORG=myorg
# 4. Check specific endpoint
TOKEN=$(make get-rs-token ENV=prod ORG=myorg \
USER_NAME=admin@myorg.com PASSWORD=YourPassword)
curl -H "Authorization: Bearer ${TOKEN}" \
${API_ENDPOINT}/api/v1/sops/list | jq
Time-Saving Tips¶
Use aliases for common commands:
alias sd='make start-dev ENV=dev ORG=myorg' alias ta='make test-all' alias df='make rs-deploy-function'
Set default ENV/ORG in shell profile:
export SYNDI_ENV=stage export SYNDI_ORG=myorg # Then use: make rs-deploy-function ENV=$SYNDI_ENV ORG=$SYNDI_ORG
Use command history - Search with Ctrl+R
Create org-specific scripts - Wrapper scripts for common tasks
Use make help - Quick reference:
make help