Stratpoint Engineering

Cloud Internship 2026

Sign in with your Stratpoint Google account to continue.

Cloud Engineering
Cloud Internship 2026
Chapter 5

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.

RequirementPointsWhat to build
EC2 Instance Launch20EC2 instance with correct AMI, instance type, and key pair
VPC Creation10VPC with at least one subnet and correct CIDR block
Role Association10IAM role attached to the EC2 instance with appropriate permissions
Tagging10All resources tagged with Name and identifying information
Security Group Rules5Correct inbound rules — SSH only from your IP, no 0.0.0.0/0 for SSH
SSH Access5Can SSH into the EC2 instance from your local machine
AWS CLI Testing40From 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:

ComponentRequirement
Jump host (bastion)EC2 in the public subnet. SSH accessible from your local machine.
Private EC2EC2 in the private subnet. Not directly accessible from the internet.
SSH chainMust be able to SSH from local → jump host → private EC2.
Full CloudFormationBoth instances, VPC, subnets, IGW, route tables, and security groups in a single CFN template.
GitLabAll code committed. Repository link submitted.
CheckHow It's VerifiedBlocking?
CloudFormation template is valid YAML — aws cloudformation validate-template passesCLI check before submissionYes
Stack deploys in ap-southeast-1 with no errorsInstructor runs create-stackYes
All resources are correctly taggedConsole reviewYes
Security group restricts SSH to your IP only, not 0.0.0.0/0Instructor checks SG rulesYes
AWS CLI S3 operations work from inside the EC2Instructor or self-demoYes
Final activity: SSH chain from local → jump host → private EC2 worksLive demoYes
Stack deleted after the activity — no orphaned resourcesConsole confirmedYes
All code committed to GitLabInstructor checks repo linkYes

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

CategoryResourceWhat You'll LearnURL
StratUCloud Basics Immersion Training ProgramCourse 372 — Cloud Practitioner foundations + CloudFormation activityclassroom.stratpoint.com/course/view.php?id=372
ACGAWS Cloud Practitioner (CLF-C02)Chapters 1-4: Foundations, Storage/Networking, Deployment, Monitoringacloud.guru (VPN required — credentials from L&D)
ACGAWS CloudFormation Templates: Getting StartedChapter 5 — automate infrastructure with CloudFormationacloud.guru (VPN required)
CloudFormationCloudFormation DocsTemplate anatomy, resource types, intrinsic functionsdocs.aws.amazon.com/cloudformation/
CloudFormationAWS::EC2::VPC ResourceVPC resource type referencedocs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpc.html
AWSAWS VPC User GuideSubnets, route tables, gateways, route tablesdocs.aws.amazon.com/vpc/latest/userguide/
AWSIAM Best PracticesLeast-privilege access, roles, policiesdocs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html
AWS CLIAWS CLI ReferenceAll CLI commands and optionsdocs.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.

ActivityComplete afterWhat to buildTagging format
Activity 1: My First Terraform ResourceUdemy Section 3VPC (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 VariablesUdemy Section 4EC2 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 ModulesUdemy Section 6VPC 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

CommandWhat it doesWhen to run
terraform initDownloads provider plugins, initialises backendOnce per new project, and after adding new providers
terraform fmtAuto-formats all .tf files to canonical styleBefore every commit
terraform validateChecks syntax and configuration validityBefore every plan
terraform planShows what will be created, changed, or destroyedBefore every apply — ALWAYS review the output
terraform applyProvisions the resourcesAfter reviewing plan output
terraform destroyRemoves all managed resourcesAfter every activity — do not leave resources running
terraform state listLists all resources in the state fileDebugging, verifying what Terraform manages
terraform outputShows output values after applyAfter 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

CategoryResourceWhat You'll LearnURL
StratUTerraform 101 Immersion Training ProgramCourse 373 — 3 activities, final project, resources and best practicesclassroom.stratpoint.com/course/view.php?id=373
UdemyHashiCorp Certified: Terraform Associate 2025Primary course — take Sections 3, 4, and 6 at minimumudemy.com/course/terraform-beginner-to-advanced/ (Udemy creds from HR L&D)
ACGHashiCorp Certified: Terraform AssociateAlternative/supplemental — ACG cert prep courseacloud.guru (VPN required, creds from L&D)
TerraformTerraform DocsLanguage reference, CLI commands, providersdeveloper.hashicorp.com/terraform/docs
TerraformTerraform AWS ProviderAll aws_* resource types and data sourcesregistry.terraform.io/providers/hashicorp/aws/latest/docs
TerraformInput Variablesvariable blocks, types, validation, defaultsdeveloper.hashicorp.com/terraform/language/values/variables
TerraformModulesCreating and calling reusable modulesdeveloper.hashicorp.com/terraform/language/modules
TerraformInstall CLITerraform CLI installation guidedeveloper.hashicorp.com/terraform/tutorials/aws-get-started/install-cli
Best Practice8 Terraform Best Practices (TechWorld with Nana)Video walkthrough of production best practicesyoutube.com/watch?v=gxPykhPxRW0
Best PracticeBest practices for using Terraform (GCP)Google Cloud Terraform guidelinescloud.google.com/docs/terraform/best-practices-for-terraform
ReferenceComplete Terraform Course (DevOps Directive)Free full-length Terraform course on YouTubeyoutube.com/watch?v=7xngnjfIlK4

Minimum Infrastructure Requirements

ComponentRequirementTerraform Resource
VPCMulti-AZ, CIDR /16aws_vpc
SubnetsPublic subnets in 2 AZs, private subnets in 2 AZsaws_subnet
Internet GatewayAttached to VPC, route in public route tableaws_internet_gateway, aws_route_table
Security GroupsLeast-privilege rules. Jump host, web tier, RDS each have separate SGs.aws_security_group
Jump HostSingle EC2 in public subnet. SSH access restricted to your IP.aws_instance
Launch TemplateAMI, instance type, user data script, SG attachedaws_launch_template
Auto Scaling GroupUses launch template. Min/Max/Desired defined. Spans 2 AZs.aws_autoscaling_group
Application Load BalancerInternet-facing. Listener on port 80. Target group pointing to ASG.aws_lb, aws_lb_listener, aws_lb_target_group
RDSMySQL or PostgreSQL. Multi-AZ enabled. In private subnets. Not publicly accessible.aws_db_instance, aws_db_subnet_group
S3 BucketPrivate, no public access. Lifecycle rule to move objects to Glacier after 90 days.aws_s3_bucket, aws_s3_bucket_lifecycle_configuration
Resource TaggingAll resources tagged with the following mandatory tags: Name: {Lastname}-FinalProject-{ResourceType} Engineer: {Lastname-Firstname} ProjectCode: Terraform101-CloudInterntags = {} on every resource

Milestone Breakdown

WeekMilestoneWhat to Have Done
4KickoffArchitecture diagram drafted. GitLab repo created. Folder structure and modules planned. Initial main.tf with provider config committed.
5Milestone 1: NetworkingVPC, all subnets, Internet Gateway, route tables, and all security groups provisioned and tested. terraform plan is clean.
6Milestone 2: ComputeJump host, launch template, Auto Scaling Group, and ALB provisioned. Can reach the ALB DNS name from a browser.
7Milestone 3: DataRDS Multi-AZ provisioned in private subnets. S3 bucket with lifecycle policy. Jump host can connect to RDS.
8FinalizationAll 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)

AreaRating 2 — Implemented and workingRating 1 — Incomplete or with errorsRating 0
Infrastructure provisioningAll resources deploy with terraform apply and no errorsPartial deployment or errors during applyNot attempted
AWS architecture and network designVPC, subnets, IGW, route tables all correct and functionalPresent but misconfiguredNot present
Security and access controlLeast-privilege SGs, no public RDS, SSH restricted, no secrets in codeSome security issues presentCritical issues or secrets in repo
Terraform best practicesModules, variables, outputs, clean file structurePartial — some hardcoding or missing outputsSingle flat file, no modules
Variables, outputs, and modulesAll three used correctly and meaningfullyPresent but incompleteNot used
Cost-efficient resource usageAppropriate instance types, resources destroyed after useMinor cost inefficienciesExpensive or orphaned resources
Testing and troubleshootingTesting notes document checks and any issues foundMinimal testing documentedNot documented
DocumentationREADME, architecture diagram, and deploy/destroy instructions clearPresent but incompleteMissing
GitLab repository qualityRegular commits, clear messages, clean .gitignoreInfrequent commits or poor messagesNo commits or secrets in repo
Capstone presentationArchitecture, code, blockers, and learnings all covered clearlyPresentation incompleteNot presented

Weeks 4–8 Official References

CategoryResourceWhat You'll LearnURL
AWSVPC User GuideSubnets, route tables, NACLs, IGWdocs.aws.amazon.com/vpc/latest/userguide/
AWSALB User GuideLoad balancer, listeners, target groupsdocs.aws.amazon.com/elasticloadbalancing/latest/application/
AWSEC2 Auto ScalingLaunch templates, ASG, scaling policiesdocs.aws.amazon.com/autoscaling/ec2/userguide/
AWSRDS User GuideMulti-AZ, subnet groups, securitydocs.aws.amazon.com/AmazonRDS/latest/UserGuide/
AWSS3 User GuideBucket policies, lifecycle, access controldocs.aws.amazon.com/AmazonS3/latest/userguide/
TerraformAWS Provider — Full IndexEvery aws_* resource with examplesregistry.terraform.io/providers/hashicorp/aws/latest/docs
Diagramsdraw.ioFree architecture diagram toolapp.diagrams.net
AWSAWS Architecture IconsOfficial icons for architecture diagramsaws.amazon.com/architecture/icons/

Project Immersion Expectations

ActivityWhat is Expected
ObservationAttend assigned project meetings or ceremonies. Listen and take notes. Do not interrupt unless invited.
DocumentationWrite structured notes after each session — tools observed, workflows, questions that came up.
Professional conductTreat the project team as clients. Be on time, be quiet, be respectful.
ConfidentialityNever 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).

LabWhat to submit
Basic Docker CommandsScreenshot of output
Basic Docker Commands (Docker Run)Screenshot of output
Docker ImagesScreenshot of output
Environment VariablesScreenshot of output
Command and EntrypointScreenshot of output
Docker ComposeScreenshot of output
Docker StorageScreenshot of output
Docker NetworkingScreenshot of output
Docker RegistryScreenshot 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

TaskWhat to buildSubmit
Task 1: Docker ReviewComplete the KodeKloud Docker Review labScreenshot of lab output
Task 2: Docker NetworkSet up and verify Docker networkingScreenshot of output
Task 3: Private Registry with SSLDeploy a private Docker registry with SSL enabledScreenshot of running registry
Task 4: Docker Compose OrchestrationOrchestrate a multi-service app with Docker ComposeScreenshot 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
RequirementWhat to do
Req 1: Containerise each serviceCreate a Dockerfile for api-nodejs, api-python, and webtool-nodejs
Req 2: Image registryBuild, tag, and push all images to a container registry
Req 3: Run and connectRun all three containers so they can communicate. Webtool must be accessible from a browser.
Req 4: Extract logsSave 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
LabSubmit
Lab: Familiarise with Lab EnvironmentScreenshot
Lab: PODs with YAMLScreenshot
Lab: Replica SetsScreenshot
Lab: DeploymentsScreenshot
Lab: ServicesScreenshot

Chapter 4 — Kubernetes Tasks (12 Tasks)

TaskTopic
Task 1Creating and Modifying Pods
Task 2Assigning Pods to Node
Task 3Basic Deployment
Task 4Advanced Deployment
Task 5Job and CronJob
Task 6DaemonSet
Task 7Services
Task 8Ingress
Task 9Volumes
Task 10ConfigMap
Task 11Secrets
Task 12Debugging — 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
RequirementWhat to do
Req 1: Deploy backendsDeploy api-nodejs and api-python services to Kubernetes
Req 2: Deploy webtoolDeploy webtool-nodejs to Kubernetes, accessible via browser
Req 3: Service networkingConfigure Services so backends can communicate
Req 4: ScreenshotsCapture 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.

TopicWhat to learn
IntroductionWorkshop format, required tools, cluster setup
FundamentalsManaged node groups, Fargate, EKS integrations with IAM and VPC

Chapter 5 — Infrastructure as Code on Kubernetes

ResourceTypeLink
Infrastructure as Code OverviewVideo (~8 min)youtube.com/watch?v=POPP2WTJ8es
CDK Overview — VideoVideo (optional)youtube.com/watch?v=MgfzMTKoQYY
CDK WorkshopWorkshop (optional)cdkworkshop.com
Terraform OverviewVideo (~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

TopicResourceTask
Prometheus and GrafanaVideo overview ~23 min + KodeKloud labTask 1: Screenshot Prometheus Web UI and Grafana Node Exporter Dashboard
Service Mesh — Istio overviewVideo ~16 minWatch and take notes
Istio setup walkthroughVideo ~28 min + KodeKloud labTask 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.

ServiceLanguageYour task
vote-webappPythonWrite Dockerfile + Kubernetes manifest
result-webappJavaScriptWrite Dockerfile + Kubernetes manifest
worker(provided)Write Dockerfile + Kubernetes manifest
RedisOfficial imageDeploy 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)

ScoreMeaning
2Functionality implemented and working without errors
1Functionality implemented but incomplete or with errors
0Functionality not implemented

Weeks 9–11 Official References

Weeks 9–11 Official References

CategoryResourceWhat You'll LearnURL
StratUCloud Native Immersion Training ProgramCourse 380 — Docker, Kubernetes, EKS, monitoring, CI/CD, final projectclassroom.stratpoint.com/course/view.php?id=380
KodeKloudDocker for Absolute BeginnersChapter 1 primary course (~3h 45m + ~9h labs)kodekloud.com/courses/docker-for-the-absolute-beginner/
KodeKloudKubernetes for Absolute BeginnersChapter 3 primary course (~5h 35m)kodekloud.com/courses/kubernetes-for-the-absolute-beginner-hands-on/
KodeKloudInteractive LabsLab environment for all Docker and K8s taskskodekloud.com
KillercodaKatacoda LabsAlternative browser-based K8s lab environmentkatacoda.com
DockerDocker DocsDockerfile, images, containers, volumes, networkingdocs.docker.com
KubernetesKubernetes DocsOfficial reference for all K8s objects and conceptskubernetes.io/docs/home/
Kuberneteskubectl Cheat SheetAll kubectl commands in one pagekubernetes.io/docs/reference/kubectl/cheatsheet/
AWSEKS WorkshopHands-on EKS labs: node groups, Fargate, integrationseksworkshop.com/docs/introduction/
MonitoringPrometheus and Grafana (TechWorld with Nana)~23 min video — setup and dashboardsyoutube.com/watch?v=h4Sl21AKiDg
Service MeshGetting Started with IstioStep-by-step Istio setup on Kubernetesyoutube.com/watch?v=voAyroDb6xk
GitLab CI/CDGitLab CI Tutorial for Beginners (TechWorld with Nana)Full pipeline for Python app with Docker and deploymentyoutube.com/watch?v=qP8kir2GUgo
GitLabGitLab CI/CD DocsPipelines, stages, jobs, runners, .gitlab-ci.yml referencedocs.gitlab.com/ee/ci/
IaCCDK WorkshopOptional: AWS CDK hands-on workshopcdkworkshop.com