A comprehensive assessment platform designed for evaluating cloud skills knowledge and preparing for certification exams.
This application provides a platform for creating, managing, and taking skills practice tests to allow organisations to get a reflection of areas of strength and improvement across your engineers. It allows administrators to create customised tests with various question types, while users can test their knowledge in a simulated exam environment.
Whilst there are many exam simulation tools (paid and free) available, this provides the ability to host your own serverless solution with centralised reporting across a number of skills tracks. The tool can also be used for non-technical assessments based on your own organisational requirements with the ability to create bespoke categories and questions.
- Multiple Question Types: Support for single-choice questions with explanations
- Categorization: Questions organized by service and certification path
- Difficulty Levels: Support for different certification levels (CP, SAA, DVA, SOA, Terraform, FinOps)
- Custom Test Creation: Create targeted assessments for specific skill areas
- Randomization: Option to randomize question and answer order
- Time Limitations: Configurable time limits to simulate exam conditions
- Tab/Window Monitoring: Detects when users navigate away from the test
- Copy/Paste Prevention: Blocks attempts to copy question content
- Time Analysis: Identifies suspicious answering patterns
- Alert System: Warns users about potential violations
- Progressive Enforcement: Escalating responses from warnings to test termination
- Performance Metrics: Score distribution and comparison
- Category Analysis: Strength/weakness identification by topic
- Time Analysis: Time spent per question and section
- Progress Tracking: Improvement monitoring over multiple attempts
- Test Statistics: Overview of completion rates and average scores
- React: UI library
- TypeScript: Type-safe JavaScript
- Material UI: Component library for consistent design
- React Router: Navigation and routing
- Chart.js: Data visualization
- Amazon Cognito: Authentication
- AWS Serverless Architecture:
- Lambda: Serverless computing
- API Gateway: RESTful API endpoints
- DynamoDB: NoSQL database
- S3: Static website hosting
- CloudFront: Content delivery network
- Cognito: User authentication and authorization
- SAM (Serverless Application Model): Infrastructure as code
The application follows a modern serverless architecture pattern built entirely on AWS services:
- Single-Page Application: React-based SPA hosted on S3 and distributed via CloudFront
- Authentication Flow: Integrates with Amazon Cognito using JWT tokens for secure authentication
- State Management: React context API for global state (AuthContext)
- Routing: React Router with protected routes based on authentication status and user roles
- UI Framework: Material UI components with responsive design
- API Layer: REST API built with Amazon API Gateway with Cognito authorizers
- Business Logic: Lambda functions handling CRUD operations for questions, tests, and responses
- Database Layer:
- DynamoDB tables with GSIs for efficient querying
QuestionTable
: Stores questions with category/difficulty indexesTestTable
: Manages test configurations and settingsResponseTable
: Tracks user test attempts and results
- Authentication & Authorization:
- Cognito User Pools for identity management
- User groups (Admin, User) for role-based permissions
- JWT token validation for API access
- Anti-Cheating System: Detects tab switching, copy/paste operations, and suspicious behavior
- API Authorization: API Gateway with Cognito authorizers to validate JWT tokens
- CORS Configuration: Strict origin policies to prevent unauthorized access
- Content Delivery: CloudFront with origin access identities for secure S3 access
- Infrastructure as Code: AWS SAM templates for consistent deployments
- Resource Naming: Environment-based naming conventions for multi-environment support
- CORS Configuration: Properly configured for secure cross-origin requests
- CloudFront Distribution: Efficient global content delivery with proper cache settings
- Administrator creates questions in the question bank through the admin interface
- Questions are categorized and tagged for organization
- Administrator creates a test by specifying parameters (difficulty, categories, time limit)
- Test configuration is stored in DynamoDB with reference to selected questions
- User logs in via Cognito authentication
- User enters a test ID to access a specific assessment
- System validates test availability and eligibility
- Anti-cheating module initializes to monitor user behavior
- Questions are presented according to test configuration (random or sequential)
- User responses are periodically saved to prevent data loss
- System tracks time spent on each question and overall test
- User submits test or time expires
- System calculates score and generates detailed results
- Results are stored for historical analysis and improvement tracking
- Primary Key:
id
(UUID) - GSIs:
byCategory
: For querying questions by categorybyDifficulty
: For querying questions by difficulty level
- Attributes:
text
: The question textoptions
: Answer options (array of objects with id and text)correctAnswer
: ID of the correct optionexplanation
: Explanation for the correct answercategory
: Question category (e.g., Compute, Storage)difficulty
: Question difficulty (e.g., CP, SAA)tags
: Array of tags for additional categorization
- Primary Key:
id
(UUID) - GSIs:
byActive
: For querying active/inactive tests
- Attributes:
name
: Test namedescription
: Test descriptiontimeLimit
: Time limit in minutesnumQuestions
: Number of questionsdifficulty
: Array of difficulty levelscategories
: Array of categoriesactive
: Whether the test is activeclosureDate
: Optional date when the test becomes unavailablequestions
: Array of question IDssettings
: Test settings (randomization, retakes, etc.)
- Primary Key:
id
(UUID) - GSIs:
byTest
: For querying responses by test IDbyUser
: For querying responses by user ID
- Attributes:
testId
: Associated test IDuserId
: User who took the testuserName
: User's display namestartTime
: When the test startedendTime
: When the test endedanswers
: Array of user answers with correctnessscore
: Calculated score percentagecompleted
: Whether the test was completedcheatingAttempts
: Number of detected cheating attemptscheatingDetails
: Details about cheating incidents
- Node.js (v20 or higher)
- npm or yarn
- AWS CLI configured with appropriate credentials
- AWS SAM CLI
-
Clone the repository
git clone https://github.com/yourusername/aws-cloud-skills-assessment.git cd aws-cloud-skills-assessment
-
Install frontend dependencies
cd frontend npm install
-
Create .env file with required environment variables
cp .env.example .env
-
Update the .env file with your configuration
VITE_USER_POOL_ID=your-cognito-user-pool-id VITE_USER_POOL_CLIENT_ID=your-cognito-client-id VITE_USER_POOL_CLIENT_SECRET=your-client-secret-if-applicable VITE_COGNITO_DOMAIN=your-cognito-domain VITE_AWS_REGION=your-aws-region VITE_API_URL=your-api-gateway-url
-
Start the development server
npm run dev
-
Navigate to the backend directory
cd ../backend
-
Update the SAM template parameters in template.yaml if needed
Parameters: Environment: Type: String Default: dev Author: Type: String Default: yourusername
-
Deploy using SAM
sam build sam deploy --guided
-
During guided deployment, you'll need to:
Specify a unique S3 bucket name for deployment artifacts Confirm IAM role creation permissions Set the appropriate environment parameter Configure CloudFormation stack name
- Upon successful deployment, note the outputs:
ApiUrl: The API Gateway endpoint URL UserPoolId and UserPoolClientId: Required for frontend configuration CloudFrontURL: The distribution URL for your frontend
-
Build the frontend
cd ../frontend npm run build
-
Deploy to S3
aws s3 sync dist/ s3://your-bucket-name/ --delete
-
Create CloudFront invalidation (if using CloudFront)
aws cloudfront create-invalidation --distribution-id YOUR_DISTRIBUTION_ID --paths "/*"
Variable | Description |
---|---|
VITE_USER_POOL_ID | Cognito User Pool ID |
VITE_USER_POOL_CLIENT_ID | Cognito App Client ID |
VITE_USER_POOL_CLIENT_SECRET | Cognito App Client Secret (if applicable) |
VITE_COGNITO_DOMAIN | Cognito Domain Name |
VITE_AWS_REGION | AWS Region |
VITE_API_URL | API Gateway URL |
- Login: Access the admin dashboard using admin credentials
- Question Management: Create, edit, and import questions
- Test Creation: Design tests with specific parameters:
- Difficulty levels
- Categories
- Time limits
- Randomization options
- Analytics: View test statistics and participant results
- Login/Register: Create an account or sign in
- Take Test: Enter the test ID provided by your administrator
- Complete Test: Answer questions within the time limit
- Review Results: Analyze performance and review explanations
- Track Progress: Monitor improvement over multiple attempts
Contributions are welcome! Please feel free to submit a Pull Request.
- Fork the repository
- Create your feature branch (
git checkout -b feature/amazing-feature
) - Commit your changes (
git commit -m 'Add some amazing feature'
) - Push to the branch (
git push origin feature/amazing-feature
) - Open a Pull Request
This project is licensed under the MIT License - see the LICENSE file for details.
- AWS Documentation and Sample Code
- React and Material UI Teams
- All contributors who have helped improve this project