Weekly Activities
Study each pattern before starting the activity. The official references are at the end of each section.
What to Deliver
All work must be done in the Singapore region (ap-southeast-1). Submit via your GitLab repository.
| Requirement | Points | What to build |
|---|---|---|
| EC2 Instance Launch | 20 | EC2 instance with correct AMI, instance type, and key pair |
| VPC Creation | 10 | VPC with at least one subnet and correct CIDR block |
| Role Association | 10 | IAM role attached to the EC2 instance with appropriate permissions |
| Tagging | 10 | All resources tagged with Name and identifying information |
| Security Group Rules | 5 | Correct inbound rules — SSH only from your IP, no 0.0.0.0/0 for SSH |
| SSH Access | 5 | Can SSH into the EC2 instance from your local machine |
| AWS CLI Testing | 40 | From inside the EC2: list S3 files (10pts), upload file (10pts), download file (10pts), delete file (10pts) |
Final Activity
After completing the weekly activity, build the following using CloudFormation:
| Component | Requirement |
|---|---|
| Jump host (bastion) | EC2 in the public subnet. SSH accessible from your local machine. |
| Private EC2 | EC2 in the private subnet. Not directly accessible from the internet. |
| SSH chain | Must be able to SSH from local → jump host → private EC2. |
| Full CloudFormation | Both instances, VPC, subnets, IGW, route tables, and security groups in a single CFN template. |
| GitLab | All code committed. Repository link submitted. |
| Check | How It's Verified | Blocking? |
|---|---|---|
| CloudFormation template is valid YAML — aws cloudformation validate-template passes | CLI check before submission | Yes |
| Stack deploys in ap-southeast-1 with no errors | Instructor runs create-stack | Yes |
| All resources are correctly tagged | Console review | Yes |
| Security group restricts SSH to your IP only, not 0.0.0.0/0 | Instructor checks SG rules | Yes |
| AWS CLI S3 operations work from inside the EC2 | Instructor or self-demo | Yes |
| Final activity: SSH chain from local → jump host → private EC2 works | Live demo | Yes |
| Stack deleted after the activity — no orphaned resources | Console confirmed | Yes |
| All code committed to GitLab | Instructor checks repo link | Yes |
Deliverable Checklist
- Submit via GitLab repository + share link with your instructor:
- [ ] GitLab repo link with CloudFormation template(s) committed
- [ ] Screenshot of CREATE_COMPLETE in the AWS Console (Singapore region)
- [ ] Screenshot of successful SSH to jump host
- [ ] Screenshot of SSH from jump host into private EC2
- [ ] Screenshot of AWS CLI S3 operations from inside the EC2
- [ ] Screenshot of DELETE_COMPLETE after cleanup
5.1 CloudFormation Template Structure
# template.yaml
AWSTemplateFormatVersion: "2010-09-09"
Description: "Activity 1 - Basic AWS infrastructure"
Parameters:
Environment:
Type: String
Default: dev
AllowedValues: [dev, staging, prod]
VpcCidr:
Type: String
Default: "10.0.0.0/16"
Resources:
MyVpc:
Type: AWS::EC2::VPC
Properties:
CidrBlock: !Ref VpcCidr
EnableDnsSupport: true
EnableDnsHostnames: true
Tags:
- Key: Name
Value: !Sub "${Environment}-vpc"
PublicSubnet:
Type: AWS::EC2::Subnet
Properties:
VpcId: !Ref MyVpc
CidrBlock: "10.0.1.0/24"
AvailabilityZone: !Select [0, !GetAZs ""]
MapPublicIpOnLaunch: true
WebSecurityGroup:
Type: AWS::EC2::SecurityGroup
Properties:
GroupDescription: "Allow HTTP and SSH"
VpcId: !Ref MyVpc
SecurityGroupIngress:
- IpProtocol: tcp
FromPort: 22
ToPort: 22
CidrIp: "0.0.0.0/0" # Restrict to your IP in production
- IpProtocol: tcp
FromPort: 80
ToPort: 80
CidrIp: "0.0.0.0/0"
Outputs:
VpcId:
Description: "VPC ID"
Value: !Ref MyVpc
SubnetId:
Description: "Public Subnet ID"
Value: !Ref PublicSubnet
5.2 CloudFormation CLI Commands
# Validate template aws cloudformation validate-template --template-body file://template.yaml # Create stack aws cloudformation create-stack \ --stack-name activity1-stack \ --template-body file://template.yaml \ --parameters ParameterKey=Environment,ParameterValue=dev # Check stack status aws cloudformation describe-stacks --stack-name activity1-stack \ --query "Stacks[0].StackStatus" # Delete stack (always run this after the activity) aws cloudformation delete-stack --stack-name activity1-stack # Confirm deletion aws cloudformation describe-stacks --stack-name activity1-stack # Should return "Stack with id ... does not exist"
Week 1 Official References
| Category | Resource | What You'll Learn | URL |
|---|---|---|---|
| StratU | Cloud Basics Immersion Training Program | Course 372 — Cloud Practitioner foundations + CloudFormation activity | classroom.stratpoint.com/course/view.php?id=372 |
| ACG | AWS Cloud Practitioner (CLF-C02) | Chapters 1-4: Foundations, Storage/Networking, Deployment, Monitoring | acloud.guru (VPN required — credentials from L&D) |
| ACG | AWS CloudFormation Templates: Getting Started | Chapter 5 — automate infrastructure with CloudFormation | acloud.guru (VPN required) |
| CloudFormation | CloudFormation Docs | Template anatomy, resource types, intrinsic functions | docs.aws.amazon.com/cloudformation/ |
| CloudFormation | AWS::EC2::VPC Resource | VPC resource type reference | docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpc.html |
| AWS | AWS VPC User Guide | Subnets, route tables, gateways, route tables | docs.aws.amazon.com/vpc/latest/userguide/ |
| AWS | IAM Best Practices | Least-privilege access, roles, policies | docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html |
| AWS CLI | AWS CLI Reference | All CLI commands and options | docs.aws.amazon.com/cli/latest/reference/ |
Activity Specifications (from Course 373)
Complete each after finishing the corresponding Udemy course section. Submit your GitLab repository link for each.
| Activity | Complete after | What to build | Tagging format |
|---|---|---|---|
| Activity 1: My First Terraform Resource | Udemy Section 3 | VPC (10.0.0.0/16), 2 public subnets (10.0.1.0/24, 10.0.2.0/24), 2 private subnets (10.0.3.0/24, 10.0.4.0/24), 1 Internet Gateway. All via resource blocks. | Name: {Lastname}-TFAct1-{ResourceType} |
| Activity 2: Using Variables | Udemy Section 4 | EC2 instance (t2.micro, latest Amazon Linux AMI) + supporting VPC resources using same spec as Act 1. Must use variables.tf and terraform.tfvars — no hardcoded values in resource blocks. | Name: {Lastname}-TFAct2-{ResourceType} |
| Activity 3: Using Modules | Udemy Section 6 | VPC using modules — same subnet spec as Act 1. VPC logic extracted into a reusable module with its own variables.tf and outputs.tf. Root calls via module block. | Name: {Lastname}-TFAct3-{ResourceType} |
Deliverable Checklist
- For each activity, submit your GitLab repository link to your instructor:
- [ ] GitLab repo link — activity folder with all .tf files committed
- [ ] Screenshot of terraform apply output (resources created, correct names)
- [ ] Screenshot of terraform destroy output (all resources cleaned up)
- [ ] Tags confirmed in AWS Console — Name format: {Lastname}-TFActN-{ResourceType}
- [ ] Ready to walk through: explain each resource block, variable usage, and the terraform workflow
5.3 Terraform File Structure
my-terraform-project/
main.tf # resource definitions
variables.tf # input variable declarations
outputs.tf # output value declarations
terraform.tfvars # variable values (do NOT commit if it has secrets)
providers.tf # provider configuration
versions.tf # required_providers and terraform version constraint
# Module structure:
modules/
vpc/
main.tf
variables.tf
outputs.tf
README.md
5.4 providers.tf and versions.tf
# versions.tf
terraform {
required_version = ">= 1.6"
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 5.0"
}
}
}
# providers.tf
provider "aws" {
region = var.aws_region
# Credentials come from environment or ~/.aws/config — NEVER hardcoded
}
5.5 variables.tf and terraform.tfvars
# variables.tf
variable "aws_region" {
description = "AWS region to deploy into"
type = string
default = "ap-southeast-1"
}
variable "environment" {
description = "Deployment environment (dev, staging, prod)"
type = string
validation {
condition = contains(["dev","staging","prod"], var.environment)
error_message = "environment must be dev, staging, or prod."
}
}
variable "vpc_cidr" {
description = "CIDR block for the VPC"
type = string
default = "10.0.0.0/16"
}
# terraform.tfvars (values for the above)
aws_region = "ap-southeast-1"
environment = "dev"
vpc_cidr = "10.1.0.0/16"
5.6 Module Pattern
# modules/vpc/main.tf
resource "aws_vpc" "this" {
cidr_block = var.vpc_cidr
enable_dns_support = true
enable_dns_hostnames = true
tags = { Name = "${var.environment}-vpc" }
}
resource "aws_subnet" "public" {
count = length(var.public_subnet_cidrs)
vpc_id = aws_vpc.this.id
cidr_block = var.public_subnet_cidrs[count.index]
availability_zone = var.availability_zones[count.index]
map_public_ip_on_launch = true
tags = { Name = "${var.environment}-public-${count.index + 1}" }
}
# modules/vpc/outputs.tf
output "vpc_id" { value = aws_vpc.this.id }
output "public_subnet_ids" { value = aws_subnet.public[*].id }
# root main.tf — calling the module
module "vpc" {
source = "./modules/vpc"
environment = var.environment
vpc_cidr = var.vpc_cidr
public_subnet_cidrs = ["10.0.1.0/24","10.0.2.0/24"]
availability_zones = ["ap-southeast-1a","ap-southeast-1b"]
}
5.7 The Terraform Workflow — Every Time
| Command | What it does | When to run |
|---|---|---|
| terraform init | Downloads provider plugins, initialises backend | Once per new project, and after adding new providers |
| terraform fmt | Auto-formats all .tf files to canonical style | Before every commit |
| terraform validate | Checks syntax and configuration validity | Before every plan |
| terraform plan | Shows what will be created, changed, or destroyed | Before every apply — ALWAYS review the output |
| terraform apply | Provisions the resources | After reviewing plan output |
| terraform destroy | Removes all managed resources | After every activity — do not leave resources running |
| terraform state list | Lists all resources in the state file | Debugging, verifying what Terraform manages |
| terraform output | Shows output values after apply | After apply to see IPs, IDs, etc. |
Watch Out
Always run terraform plan before terraform apply. Read the output carefully.
Never run terraform destroy without checking what will be destroyed first.
If state is corrupted or you manually deleted resources in the Console: tell your instructor before trying to fix it yourself.
Weeks 2–3 Official References
| Category | Resource | What You'll Learn | URL |
|---|---|---|---|
| StratU | Terraform 101 Immersion Training Program | Course 373 — 3 activities, final project, resources and best practices | classroom.stratpoint.com/course/view.php?id=373 |
| Udemy | HashiCorp Certified: Terraform Associate 2025 | Primary course — take Sections 3, 4, and 6 at minimum | udemy.com/course/terraform-beginner-to-advanced/ (Udemy creds from HR L&D) |
| ACG | HashiCorp Certified: Terraform Associate | Alternative/supplemental — ACG cert prep course | acloud.guru (VPN required, creds from L&D) |
| Terraform | Terraform Docs | Language reference, CLI commands, providers | developer.hashicorp.com/terraform/docs |
| Terraform | Terraform AWS Provider | All aws_* resource types and data sources | registry.terraform.io/providers/hashicorp/aws/latest/docs |
| Terraform | Input Variables | variable blocks, types, validation, defaults | developer.hashicorp.com/terraform/language/values/variables |
| Terraform | Modules | Creating and calling reusable modules | developer.hashicorp.com/terraform/language/modules |
| Terraform | Install CLI | Terraform CLI installation guide | developer.hashicorp.com/terraform/tutorials/aws-get-started/install-cli |
| Best Practice | 8 Terraform Best Practices (TechWorld with Nana) | Video walkthrough of production best practices | youtube.com/watch?v=gxPykhPxRW0 |
| Best Practice | Best practices for using Terraform (GCP) | Google Cloud Terraform guidelines | cloud.google.com/docs/terraform/best-practices-for-terraform |
| Reference | Complete Terraform Course (DevOps Directive) | Free full-length Terraform course on YouTube | youtube.com/watch?v=7xngnjfIlK4 |
Minimum Infrastructure Requirements
| Component | Requirement | Terraform Resource |
|---|---|---|
| VPC | Multi-AZ, CIDR /16 | aws_vpc |
| Subnets | Public subnets in 2 AZs, private subnets in 2 AZs | aws_subnet |
| Internet Gateway | Attached to VPC, route in public route table | aws_internet_gateway, aws_route_table |
| Security Groups | Least-privilege rules. Jump host, web tier, RDS each have separate SGs. | aws_security_group |
| Jump Host | Single EC2 in public subnet. SSH access restricted to your IP. | aws_instance |
| Launch Template | AMI, instance type, user data script, SG attached | aws_launch_template |
| Auto Scaling Group | Uses launch template. Min/Max/Desired defined. Spans 2 AZs. | aws_autoscaling_group |
| Application Load Balancer | Internet-facing. Listener on port 80. Target group pointing to ASG. | aws_lb, aws_lb_listener, aws_lb_target_group |
| RDS | MySQL or PostgreSQL. Multi-AZ enabled. In private subnets. Not publicly accessible. | aws_db_instance, aws_db_subnet_group |
| S3 Bucket | Private, no public access. Lifecycle rule to move objects to Glacier after 90 days. | aws_s3_bucket, aws_s3_bucket_lifecycle_configuration |
| Resource Tagging | All resources tagged with the following mandatory tags: Name: {Lastname}-FinalProject-{ResourceType} Engineer: {Lastname-Firstname} ProjectCode: Terraform101-CloudIntern | tags = {} on every resource |
Milestone Breakdown
| Week | Milestone | What to Have Done |
|---|---|---|
| 4 | Kickoff | Architecture diagram drafted. GitLab repo created. Folder structure and modules planned. Initial main.tf with provider config committed. |
| 5 | Milestone 1: Networking | VPC, all subnets, Internet Gateway, route tables, and all security groups provisioned and tested. terraform plan is clean. |
| 6 | Milestone 2: Compute | Jump host, launch template, Auto Scaling Group, and ALB provisioned. Can reach the ALB DNS name from a browser. |
| 7 | Milestone 3: Data | RDS Multi-AZ provisioned in private subnets. S3 bucket with lifecycle policy. Jump host can connect to RDS. |
| 8 | Finalization | All terraform test and connectivity checks done. Architecture diagram final. README complete. Resources destroyed. Presentation delivered. |
Capstone Terraform Structure
capstone/
main.tf # calls all modules
variables.tf
outputs.tf
terraform.tfvars # do not commit secrets
versions.tf
providers.tf
README.md
docs/
architecture.png # architecture diagram
testing-notes.md
modules/
networking/ # VPC, subnets, IGW, route tables
main.tf
variables.tf
outputs.tf
security-groups/ # all security group definitions
compute/ # launch template, ASG, jump host
load-balancer/ # ALB, listener, target group
database/ # RDS, subnet group
storage/ # S3 bucket and lifecycle
Key Terraform Patterns for the Capstone
Security Group with Least-Privilege Rules
resource "aws_security_group" "web" {
name = "${var.environment}-web-sg"
description = "Web tier — allow HTTP from ALB only"
vpc_id = var.vpc_id
ingress {
description = "HTTP from ALB"
from_port = 80
to_port = 80
protocol = "tcp"
security_groups = [var.alb_sg_id] # NOT 0.0.0.0/0
}
egress {
from_port = 0
to_port = 0
protocol = "-1"
cidr_blocks = ["0.0.0.0/0"]
}
tags = { Name = "${var.environment}-web-sg" }
}
Auto Scaling Group with ALB Integration
resource "aws_autoscaling_group" "web" {
name = "${var.environment}-web-asg"
min_size = 1
max_size = 3
desired_capacity = 2
vpc_zone_identifier = var.private_subnet_ids # private subnets
target_group_arns = [aws_lb_target_group.web.arn]
health_check_type = "ELB"
launch_template {
id = aws_launch_template.web.id
version = "$Latest"
}
tag {
key = "Name"
value = "${var.environment}-web"
propagate_at_launch = true
}
}
RDS Multi-AZ
resource "aws_db_instance" "main" {
identifier = "${var.environment}-db"
engine = "mysql"
engine_version = "8.0"
instance_class = "db.t3.micro"
allocated_storage = 20
db_name = "appdb"
username = var.db_username
password = var.db_password # use secrets manager in production
db_subnet_group_name = aws_db_subnet_group.main.name
vpc_security_group_ids = [var.rds_sg_id]
multi_az = true
publicly_accessible = false
skip_final_snapshot = true # set to false in production
tags = { Name = "${var.environment}-rds" }
}
Capstone Deliverables
Deliverable Checklist
- Submit or present all of the following in Week 8:
- [ ] GitLab repository link — all Terraform code with clean commit history
- [ ] Tags verified in AWS Console — Name: {Lastname}-FinalProject-{ResourceType}
- [ ] Tags verified — Engineer: {Lastname-Firstname} ProjectCode: Terraform101-CloudIntern
- [ ] Architecture diagram (draw.io or Lucidchart PNG committed to docs/)
- [ ] README: architecture overview, how to deploy, how to destroy, known issues
- [ ] Testing notes: ALB accessible via browser, SSH to jump host, RDS reachable
- [ ] terraform destroy confirmed — all resources cleaned up AFTER presentation
- [ ] Individual capstone presentation delivered
Capstone Evaluation (3-point scale per area)
| Area | Rating 2 — Implemented and working | Rating 1 — Incomplete or with errors | Rating 0 |
|---|---|---|---|
| Infrastructure provisioning | All resources deploy with terraform apply and no errors | Partial deployment or errors during apply | Not attempted |
| AWS architecture and network design | VPC, subnets, IGW, route tables all correct and functional | Present but misconfigured | Not present |
| Security and access control | Least-privilege SGs, no public RDS, SSH restricted, no secrets in code | Some security issues present | Critical issues or secrets in repo |
| Terraform best practices | Modules, variables, outputs, clean file structure | Partial — some hardcoding or missing outputs | Single flat file, no modules |
| Variables, outputs, and modules | All three used correctly and meaningfully | Present but incomplete | Not used |
| Cost-efficient resource usage | Appropriate instance types, resources destroyed after use | Minor cost inefficiencies | Expensive or orphaned resources |
| Testing and troubleshooting | Testing notes document checks and any issues found | Minimal testing documented | Not documented |
| Documentation | README, architecture diagram, and deploy/destroy instructions clear | Present but incomplete | Missing |
| GitLab repository quality | Regular commits, clear messages, clean .gitignore | Infrequent commits or poor messages | No commits or secrets in repo |
| Capstone presentation | Architecture, code, blockers, and learnings all covered clearly | Presentation incomplete | Not presented |
Weeks 4–8 Official References
| Category | Resource | What You'll Learn | URL |
|---|---|---|---|
| AWS | VPC User Guide | Subnets, route tables, NACLs, IGW | docs.aws.amazon.com/vpc/latest/userguide/ |
| AWS | ALB User Guide | Load balancer, listeners, target groups | docs.aws.amazon.com/elasticloadbalancing/latest/application/ |
| AWS | EC2 Auto Scaling | Launch templates, ASG, scaling policies | docs.aws.amazon.com/autoscaling/ec2/userguide/ |
| AWS | RDS User Guide | Multi-AZ, subnet groups, security | docs.aws.amazon.com/AmazonRDS/latest/UserGuide/ |
| AWS | S3 User Guide | Bucket policies, lifecycle, access control | docs.aws.amazon.com/AmazonS3/latest/userguide/ |
| Terraform | AWS Provider — Full Index | Every aws_* resource with examples | registry.terraform.io/providers/hashicorp/aws/latest/docs |
| Diagrams | draw.io | Free architecture diagram tool | app.diagrams.net |
| AWS | AWS Architecture Icons | Official icons for architecture diagrams | aws.amazon.com/architecture/icons/ |
Project Immersion Expectations
| Activity | What is Expected |
|---|---|
| Observation | Attend assigned project meetings or ceremonies. Listen and take notes. Do not interrupt unless invited. |
| Documentation | Write structured notes after each session — tools observed, workflows, questions that came up. |
| Professional conduct | Treat the project team as clients. Be on time, be quiet, be respectful. |
| Confidentiality | Never share client information, repository contents, or project details outside the internship. |
Watch Out
Project observation is a privilege. The project team is working on real deliverables.
You will NOT be given production access or asked to make changes to live systems.
Bring questions to your instructor, not directly to the project team.
Chapter 1 — Docker Fundamentals
Complete the KodeKloud course: Docker for Absolute Beginners (~3h 45m lectures + ~9h labs).
| Lab | What to submit |
|---|---|
| Basic Docker Commands | Screenshot of output |
| Basic Docker Commands (Docker Run) | Screenshot of output |
| Docker Images | Screenshot of output |
| Environment Variables | Screenshot of output |
| Command and Entrypoint | Screenshot of output |
| Docker Compose | Screenshot of output |
| Docker Storage | Screenshot of output |
| Docker Networking | Screenshot of output |
| Docker Registry | Screenshot of output |
# Core Docker commands to know docker build -t my-app:latest . docker run -p 8080:3000 my-app:latest docker ps # list running containers docker exec -it <container-id> sh # open shell in container docker compose up -d # start all services docker compose down # stop and remove docker system prune -f # clean up unused resources
Chapter 2 — Docker Tasks
| Task | What to build | Submit |
|---|---|---|
| Task 1: Docker Review | Complete the KodeKloud Docker Review lab | Screenshot of lab output |
| Task 2: Docker Network | Set up and verify Docker networking | Screenshot of output |
| Task 3: Private Registry with SSL | Deploy a private Docker registry with SSL enabled | Screenshot of running registry |
| Task 4: Docker Compose Orchestration | Orchestrate a multi-service app with Docker Compose | Screenshot of all services running |
Milestone 1 — Dockerizing an Application
Case study: Stratpoint is helping a client containerise a microservices app with two backend APIs and a web tool.
# Repository structure (private GitLab or GitHub repo):
./docker
./apps
./api-nodejs # Node.js backend API
./api-python # Python backend API
./webtool-nodejs # User-facing web tool
./logs # Extracted container logs
./screenshots # Required screenshots
| Requirement | What to do |
|---|---|
| Req 1: Containerise each service | Create a Dockerfile for api-nodejs, api-python, and webtool-nodejs |
| Req 2: Image registry | Build, tag, and push all images to a container registry |
| Req 3: Run and connect | Run all three containers so they can communicate. Webtool must be accessible from a browser. |
| Req 4: Extract logs | Save container logs to ./logs directory |
Deliverable Checklist
- Submit to Kevin Ventura (kventura@stratpoint.com) and Toni Louise Tumnog (ttumnog@stratpoint.com):
- [ ] Private GitLab/GitHub repository link (shared with both emails above)
- [ ] Dockerfile for each of the three services committed
- [ ] Screenshots in ./screenshots: running containers, webtool accessible in browser
- [ ] Logs in ./logs: extracted from running containers
Chapter 3 — Kubernetes Fundamentals
Complete the KodeKloud course: Kubernetes for Absolute Beginners (~5h 35m). Then set up a local cluster.
# Recommended: Rancher Desktop (easiest on macOS/Windows) # https://rancherdesktop.io # Alternative: Minikube minikube start kubectl get nodes # Verify kubectl kubectl version --client
| Lab | Submit |
|---|---|
| Lab: Familiarise with Lab Environment | Screenshot |
| Lab: PODs with YAML | Screenshot |
| Lab: Replica Sets | Screenshot |
| Lab: Deployments | Screenshot |
| Lab: Services | Screenshot |
Chapter 4 — Kubernetes Tasks (12 Tasks)
| Task | Topic |
|---|---|
| Task 1 | Creating and Modifying Pods |
| Task 2 | Assigning Pods to Node |
| Task 3 | Basic Deployment |
| Task 4 | Advanced Deployment |
| Task 5 | Job and CronJob |
| Task 6 | DaemonSet |
| Task 7 | Services |
| Task 8 | Ingress |
| Task 9 | Volumes |
| Task 10 | ConfigMap |
| Task 11 | Secrets |
| Task 12 | Debugging — Deployment and Service |
# deployment.yaml — example for reference
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app
spec:
replicas: 2
selector:
matchLabels:
app: my-app
template:
metadata:
labels:
app: my-app
spec:
containers:
- name: my-app
image: my-app:latest
ports:
- containerPort: 3000
resources:
requests:
cpu: "100m"
memory: "128Mi"
limits:
cpu: "250m"
memory: "256Mi"
---
apiVersion: v1
kind: Service
metadata:
name: my-app-svc
spec:
selector:
app: my-app
ports:
- port: 80
targetPort: 3000
type: LoadBalancer
Milestone 2 — Migrating to Kubernetes
Extend your Milestone 1 repository. Deploy the same containerised app to Kubernetes.
# Add to the same repository from Milestone 1: ./kubernetes ./manifest # Kubernetes YAML manifests ./logs # kubectl logs output ./screenshots # Required screenshots
| Requirement | What to do |
|---|---|
| Req 1: Deploy backends | Deploy api-nodejs and api-python services to Kubernetes |
| Req 2: Deploy webtool | Deploy webtool-nodejs to Kubernetes, accessible via browser |
| Req 3: Service networking | Configure Services so backends can communicate |
| Req 4: Screenshots | Capture all running pods, services, and the webtool in browser |
Deliverable Checklist
- Submit to the same repository and same reviewers as Milestone 1:
- [ ] Kubernetes manifest files committed to ./kubernetes/manifest
- [ ] kubectl logs saved to ./kubernetes/logs
- [ ] Screenshots: all pods Running, services created, webtool accessible
Chapter 4.1 — EKS Workshop
Self-directed: complete the AWS EKS Workshop at eksworkshop.com. Focus on Introduction and Fundamentals sections.
| Topic | What to learn |
|---|---|
| Introduction | Workshop format, required tools, cluster setup |
| Fundamentals | Managed node groups, Fargate, EKS integrations with IAM and VPC |
Chapter 5 — Infrastructure as Code on Kubernetes
| Resource | Type | Link |
|---|---|---|
| Infrastructure as Code Overview | Video (~8 min) | youtube.com/watch?v=POPP2WTJ8es |
| CDK Overview — Video | Video (optional) | youtube.com/watch?v=MgfzMTKoQYY |
| CDK Workshop | Workshop (optional) | cdkworkshop.com |
| Terraform Overview | Video (~18 min) | youtube.com/watch?v=l5k1ai_GBDE |
Task 1: Deploy an NGINX container using Terraform (KodeKloud lab). Submit screenshot.
Chapter 6 — Monitoring and Service Mesh
| Topic | Resource | Task |
|---|---|---|
| Prometheus and Grafana | Video overview ~23 min + KodeKloud lab | Task 1: Screenshot Prometheus Web UI and Grafana Node Exporter Dashboard |
| Service Mesh — Istio overview | Video ~16 min | Watch and take notes |
| Istio setup walkthrough | Video ~28 min + KodeKloud lab | Task 2: Screenshot BookInfo app, Grafana Istio dashboard, K8s objects in default namespace |
Chapter 7 — GitLab CI/CD
Reference course: GitLab CI/CD Tutorial for Beginners (TechWorld with Nana, YouTube). Covers: pipelines, jobs, stages, runners, Docker image builds, and deployment.
# .gitlab-ci.yml — example pipeline
stages:
- validate
- build
- deploy
terraform:validate:
stage: validate
image:
name: hashicorp/terraform:1.6
entrypoint: [""]
script:
- terraform init -backend=false
- terraform validate
docker:build:
stage: build
image: docker:24
services:
- docker:dind
script:
- docker build -t $CI_REGISTRY_IMAGE:$CI_COMMIT_SHORT_SHA .
- docker push $CI_REGISTRY_IMAGE:$CI_COMMIT_SHORT_SHA
only:
- main
Final Project: Let's Vote App
Case study: Stratpoint built an internal voting app to decide cloud provider focus. Deploy it fully on Kubernetes.
| Service | Language | Your task |
|---|---|---|
| vote-webapp | Python | Write Dockerfile + Kubernetes manifest |
| result-webapp | JavaScript | Write Dockerfile + Kubernetes manifest |
| worker | (provided) | Write Dockerfile + Kubernetes manifest |
| Redis | Official image | Deploy as a Kubernetes Service (caching layer) |
Deliverable Checklist
- Submit to Kevin Ventura (kventura@stratpoint.com) and Toni Louise Tumnog (ttumnog@stratpoint.com):
- [ ] Private GitLab/GitHub repository link (shared with both reviewers)
- [ ] Dockerfile for vote-webapp, result-webapp, and worker
- [ ] Kubernetes manifests for all services
- [ ] Screenshots: all pods Running, vote-webapp accessible in browser, result-webapp showing real-time updates
Final Project Rubric (2 / 1 / 0 per criterion)
| Score | Meaning |
|---|---|
| 2 | Functionality implemented and working without errors |
| 1 | Functionality implemented but incomplete or with errors |
| 0 | Functionality not implemented |
Weeks 9–11 Official References
Weeks 9–11 Official References
| Category | Resource | What You'll Learn | URL |
|---|---|---|---|
| StratU | Cloud Native Immersion Training Program | Course 380 — Docker, Kubernetes, EKS, monitoring, CI/CD, final project | classroom.stratpoint.com/course/view.php?id=380 |
| KodeKloud | Docker for Absolute Beginners | Chapter 1 primary course (~3h 45m + ~9h labs) | kodekloud.com/courses/docker-for-the-absolute-beginner/ |
| KodeKloud | Kubernetes for Absolute Beginners | Chapter 3 primary course (~5h 35m) | kodekloud.com/courses/kubernetes-for-the-absolute-beginner-hands-on/ |
| KodeKloud | Interactive Labs | Lab environment for all Docker and K8s tasks | kodekloud.com |
| Killercoda | Katacoda Labs | Alternative browser-based K8s lab environment | katacoda.com |
| Docker | Docker Docs | Dockerfile, images, containers, volumes, networking | docs.docker.com |
| Kubernetes | Kubernetes Docs | Official reference for all K8s objects and concepts | kubernetes.io/docs/home/ |
| Kubernetes | kubectl Cheat Sheet | All kubectl commands in one page | kubernetes.io/docs/reference/kubectl/cheatsheet/ |
| AWS | EKS Workshop | Hands-on EKS labs: node groups, Fargate, integrations | eksworkshop.com/docs/introduction/ |
| Monitoring | Prometheus and Grafana (TechWorld with Nana) | ~23 min video — setup and dashboards | youtube.com/watch?v=h4Sl21AKiDg |
| Service Mesh | Getting Started with Istio | Step-by-step Istio setup on Kubernetes | youtube.com/watch?v=voAyroDb6xk |
| GitLab CI/CD | GitLab CI Tutorial for Beginners (TechWorld with Nana) | Full pipeline for Python app with Docker and deployment | youtube.com/watch?v=qP8kir2GUgo |
| GitLab | GitLab CI/CD Docs | Pipelines, stages, jobs, runners, .gitlab-ci.yml reference | docs.gitlab.com/ee/ci/ |
| IaC | CDK Workshop | Optional: AWS CDK hands-on workshop | cdkworkshop.com |