In the ever-evolving world of cloud computing, the most effective way to master new technologies is through practical, hands-on experience. This project offers a perfect opportunity for beginners to dive into AWS and Terraform by creating a serverless resume application. By integrating AWS Lambda, API Gateway, DynamoDB, and CloudFront, you’ll learn to build and deploy a robust cloud-native solution, all while automating infrastructure management with Terraform and GitHub Actions.
Objective
This project guides you through building a fully serverless resume application that demonstrates key cloud computing concepts. You’ll create an AWS Lambda function to fetch resume data from a DynamoDB database and deliver it via an API Gateway in JSON format. The static frontend, built with React, will be deployed to an S3 bucket and distributed globally through CloudFront, ensuring fast and reliable access. Leveraging Terraform and GitHub Actions, you’ll automate the deployment of these resources, providing a comprehensive introduction to modern cloud infrastructure and continuous integration practices.
Features
- Serverless API: Utilizes AWS Lambda to handle API requests, eliminating the need for server management and scaling automatically with demand.
- Resume Data Storage: Stores and retrieves resume data from DynamoDB, ensuring high availability and performance.
- Scalable Frontend: Deploys the frontend static assets to S3 and leverages CloudFront to ensure fast and reliable delivery to users worldwide.
- Infrastructure as Code: Managed using Terraform for easy provisioning and management of the AWS resources
How It Works
- API Gateway: Routes requests to the AWS Lambda function.
- AWS Lambda: Executes serverless code to fetch resume data from DynamoDB based on the provided ID, and returns it in JSON format.
- DynamoDB: A NoSQL database that stores and organizes resume data in a structured format for efficient retrieval by the Lambda function.
- S3: Hosts static assets created with React for the frontend. These assets interact with the API Gateway to fetch and display resume data.
- CloudFront: Distributes and caches the static frontend assets from the S3 bucket, providing low-latency access and improving the overall performance of the website
Setup and Deployment
1. Define Infrastructure Using Terraform:
Start by defining your AWS infrastructure with Terraform. Your Terraform configuration files, including main.tf, will specify the resources required for the project: Lambda functions, DynamoDB tables, S3 buckets, and API Gateway.Link your GitHub repository with Terraform Cloud to manage your Terraform state file and trigger deployments automatically.Set up Terraform Cloud to monitor your GitHub repository for changes. Terraform Cloud will automatically trigger runs and apply updates as changes are detected. Ensure your Terraform Cloud workspace is configured with the necessary AWS credentials and environment variables.
2. Sync Frontend Assets to S3:
Configure your GitHub Actions workflow to automate the deployment of your static assets to an S3 bucket. This can be achieved by creating a GitHub Actions workflow that uses the AWS CLI to sync the contents of your React dist folder with your S3 bucket.
3. Upload DynamoDB Items:
Enhance your GitHub Actions workflow to include a step for updating DynamoDB:
Add DynamoDB Upload Step: Ensure your workflow uploads JSON data to DynamoDB, keeping your database updated with the latest resume information as part of your continuous deployment process.
4. Deploy API:
Make sure your API Gateway and Lambda functions are correctly deployed and linked. This should be managed within your Terraform configuration, and any updates should be applied via Terraform Cloud.
5. Deploy React Application on S3 and Create CloudFront Distribution:
Upload your React application’s dist directory files to the S3 bucket.
Create a CloudFront distribution to serve your static assets from the S3 bucket. Configure CloudFront to use the S3 bucket as the origin and set up the distribution settings according to your needs.
Challenges Faced During Project Development
- Debugging serverless functions can be challenging, particularly when dealing with asynchronous processes or integration with other AWS services. Ensuring that the Lambda function interacts correctly with DynamoDB and S3 requires thorough testing
- Designing an efficient schema for DynamoDB, including partition and sort keys, can be complex. It’s essential to ensure that data retrieval is optimized for performance.
- Configuring CloudFront distributions, including caching policies and origin settings, requires attention to detail to ensure optimal performance and proper content delivery.
A special thanks to Rishab Kumar for creating this amazing challenge, which has significantly expanded my cloud computing knowledge. For anyone embarking on their cloud journey, I highly recommend starting with these kinds of challenges—they provide a valuable head start and hands-on experience.
For more details, including the complete code and API endpoints, please check out my GitHub repository. If you found this post helpful, don’t forget to leave a like and share your thoughts. Thank you!