In this final section, you will set up CI/CD Pipeline, configure CloudWatch monitoring, and clean up all resources after completing the workshop.
Go to CodeBuild Console → Create build project
Project configuration:
daivietblood-backend-buildSource:
Environment:
Buildspec:
buildspec.yml file in your repository:version: 0.2
phases:
install:
runtime-versions:
nodejs: 18
commands:
- echo Installing dependencies...
- cd backend && npm ci
pre_build:
commands:
- echo Running tests...
- npm test || true
build:
commands:
- echo Building Lambda packages...
- mkdir -p dist
- zip -r dist/get-users.zip functions/get-users/
- zip -r dist/create-user.zip functions/create-user/
- zip -r dist/emergency-requests.zip functions/emergency-requests/
post_build:
commands:
- echo Updating Lambda functions...
- aws lambda update-function-code --function-name daivietblood-get-users --zip-file fileb://dist/get-users.zip
- aws lambda update-function-code --function-name daivietblood-create-user --zip-file fileb://dist/create-user.zip
- aws lambda update-function-code --function-name daivietblood-emergency-requests --zip-file fileb://dist/emergency-requests.zip
artifacts:
files:
- dist/**/*
Go to CodePipeline Console → Create pipeline
Pipeline settings:
daivietblood-pipelineSource stage:
Build stage:
daivietblood-backend-buildDeploy stage:
Click Create pipeline
codebuild-daivietblood-backend-build-service-role{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"lambda:UpdateFunctionCode",
"lambda:GetFunction"
],
"Resource": "arn:aws:lambda:ap-southeast-1:*:function:daivietblood-*"
}
]
}
Go to CloudWatch Console → Dashboards → Create dashboard
Dashboard name: DaiVietBlood-Monitoring
Add widgets:
Widget 1: Lambda Invocations
Widget 2: Lambda Errors
Widget 3: Lambda Duration
Widget 4: API Gateway Requests
Widget 5: RDS Connections
Alarm 1: Lambda Errors
daivietblood-alertsDaiVietBlood-Lambda-ErrorsAlarm 2: RDS CPU High
DaiVietBlood-RDS-CPU-HighAlarm 3: API Gateway 5XX Errors
DaiVietBlood-API-5XX-ErrorsGo to CloudWatch → Logs → Logs Insights
Select log groups:
/aws/lambda/daivietblood-get-users/aws/lambda/daivietblood-create-user/aws/lambda/daivietblood-emergency-requestsSample query - Find errors:
fields @timestamp, @message
| filter @message like /ERROR/
| sort @timestamp desc
| limit 50
fields @timestamp, @duration
| stats avg(@duration), max(@duration), min(@duration) by bin(1h)
⚠️ Important: Follow these steps to avoid unexpected charges.
Clean up in the following order to avoid dependency errors:
daivietblood-frontenddaivietblood-assets-*daivietblood-apidaivietblood-get-usersdaivietblood-create-userdaivietblood-emergency-requestsmysql2-layerdaivietblood-dbdelete me to confirmGo to VPC Console
Delete NAT Gateway:
Release Elastic IP:
Delete VPC Endpoints (if any):
Delete Security Groups (except default):
daivietblood-lambda-sg, daivietblood-rds-sgDelete DB Subnet Group:
daivietblood-db-subnet-groupDelete VPC:
daivietblood-vpc → Delete VPCdaivietblood-pipelinedaivietblood-backend-buildDaiVietBlood-Monitoring/aws/lambda/daivietblood-*daivietblood-lambda-rolecodebuild-daivietblood-*codepipeline-daivietblood-*💡 Tip: Set up Budget Alert in AWS Budgets to receive notifications when costs exceed threshold.
Congratulations! 🎉 You have completed the workshop on building a Serverless system on AWS.