A comprehensive platform engineering solution that provides application modernization blueprints, GitOps patterns, and developer self-service capabilities on Amazon EKS.
This code is used in associated Workshop: https://catalog.workshops.aws/platform-engineering-on-eks/en-US
This repository implements a complete platform engineering solution on Amazon EKS, enabling organizations to modernize applications and adopt cloud-native practices. It provides a production-ready platform with integrated developer portals, GitOps workflows, and progressive delivery capabilities.
The easiest way is to use CloudFormation to bootstrap the workshop architecture with an IDE to work from, pre-configured to interact with the platform.
Once you are logged into your AWS Console with the appropriate permissions, you can set up the environment to run the labs in your account. These instructions have been tested in the following AWS region and are not guaranteed to work in others without modification:
us-west-2
The first step is to run the cluster deployment script with the provided CloudFormation template. The easiest way to do this is using AWS CloudShell in the account where you will be running the lab exercises. Open CloudShell with the link below or by following this documentation:
Click here to access CloudShell in US-WEST-2
Once CloudShell has loaded, run the following commands:
ASSET_URL=https://ws-assets-prod-iad-r-pdx-f3b3f9f1a7d6a3d0.s3.us-west-2.amazonaws.com/daa2a765-04db-4399-aaa7-fddc8d07e9e1/peeks-workshop-team-stack-self.json
curl $ASSET_URL --output peeks-workshop.json
grep '"WORKSHOP_GIT_BRANCH":' peeks-workshop-* # should output: v0.1.3
bucketName="peeks-workshop-$(uuidgen | tr -d - | tr '[:upper:]' '[:lower:]')"
aws s3api create-bucket \
--bucket "$bucketName" \
--region us-west-2 \
--create-bucket-configuration LocationConstraint=us-west-2
aws cloudformation deploy --stack-name peeks-workshop \
--template-file ./peeks-workshop.json \
--parameter-overrides \
ParticipantAssumedRoleArn=$(aws sts get-caller-identity --query Arn --output text) \
--capabilities CAPABILITY_NAMED_IAM \
--s3-bucket $bucketName \
--disable-rollbackASSET_URL=https://ws-assets-prod-iad-r-fra-b129423e91500967.s3.eu-central-1.amazonaws.com/daa2a765-04db-4399-aaa7-fddc8d07e9e1/peeks-workshop-team-stack-self.json
curl $ASSET_URL --output peeks-workshop.json
grep '"WORKSHOP_GIT_BRANCH":' peeks-workshop-* # should output: v0.1.3
bucketName="peeks-workshop-$(uuidgen | tr -d - | tr '[:upper:]' '[:lower:]')"
aws s3api create-bucket \
--bucket "$bucketName" \
--region eu-central-1 \
--create-bucket-configuration LocationConstraint=eu-central-1
aws cloudformation deploy --stack-name peeks-workshop \
--template-file ./peeks-workshop.json \
--parameter-overrides \
ParticipantAssumedRoleArn=$(aws sts get-caller-identity --query Arn --output text) \
--capabilities CAPABILITY_NAMED_IAM \
--s3-bucket $bucketName \
--disable-rollbackIf you want support for additional regions you can ask the workshop team for the correct asset URL for your region.
You will then see the following output as your CloudFormation template is being deployed:
Waiting for changeset to be created..
Waiting for stack create/update to complete
Successfully created/updated stack - peeks-workshop
The CloudFormation stack will take roughly 90 minutes to deploy, and once completed you can retrieve the URL and password for the Visual Code Server IDE with the following command:
# Get IDE URL
aws cloudformation describe-stacks --stack-name peeks-workshop \
--query 'Stacks[0].Outputs[?OutputKey==`IdeUrl`].OutputValue' --output text
# Get IDE Password
aws cloudformation describe-stacks --stack-name peeks-workshop \
--query 'Stacks[0].Outputs[?OutputKey==`IdePassword`].OutputValue' --output textWhich will provide an output similar to the following, which you can use to access the IDE in a web browser (we recommend opening a new tab):
Example:
https://<your-ide-domain>/ide/?folder=/home/ec2-user/environment
The IDE should already be configured with lots of tools and extensions, and you can start working on the exercises right away.
In addition, the code repositories that we will use in this workshop have been downloaded into the ~/environment/platform-on-eks-workshop/ folder, and the Python prerequisites have been installed.
You can check all the addons deployed using the command:
argocd-syncThe platform URLs and credentials are exported as environment variables in ~/.bashrc.d/platform.sh on the IDE instance. Run source ~/.bashrc.d/platform.sh to reload them.
The gitops/ directory contains a complete GitOps-based addon management system using ArgoCD ApplicationSets, Helm charts, and Crossplane. See gitops/README.md for architecture, quick start, and operations guide.
When deployed via CloudFormation, config.local.yaml is generated automatically
during IDE bootstrap. If you need to (re)create it manually — for example on a
self-managed environment or to recover from a corrupted file — use the standalone
helper:
# Idempotent: skips if a valid config.local.yaml already exists
workshop/create-config.sh
# Force overwrite
FORCE=true workshop/create-config.sh
# Override the branch (e.g. when WORKSHOP_GIT_BRANCH points to a release tag)
REPO_REVISION=... workshop/create-config.shThis is a standalone script (not a Taskfile task) because every task reads
config.local.yaml at parse time, so a task cannot create the file when it does
not yet exist. It auto-detects the AWS account, region, IAM Identity Center
instance/group, and admin role name, and writes an insecure-mode config
(domain: "").
The peeks Kiro agent that ships in every participant IDE bundles a curated
subset of the APEX skills
(Amazon-authored EKS agent skills) so they are available by default — no
manual install step.
Vendored under hack/.kiro/skills/ alongside the PEEKS-authored skills
(troubleshoot-kro, troubleshoot-platform, manage-addons):
| APEX skill | Purpose |
|---|---|
eks-recon |
Discover and inventory an existing EKS environment |
eks-platform-engineering |
Platform/IDP patterns on EKS |
eks-best-practices |
EKS best-practice guidance (Auto Mode, Karpenter, networking, cost…) |
eks-security |
EKS security review guidance |
eks-upgrade-check |
Pre-upgrade readiness checks |
eks-cost-intelligence |
Cost analysis and optimization |
The exact pinned version (tag + commit SHA) is recorded in
hack/.kiro/skills/APEX_VERSION.
The peeks agent (hack/.kiro/agents/peeks.json) declares a knowledge-base
resource over file://.kiro/skills with include: ["**/SKILL.md"]. Every
vendored APEX skill has a top-level SKILL.md, so it is indexed automatically —
no change to peeks.json is required. During Workshop Studio provisioning the
SetupIDE step copies hack/.kiro/ into ~/.kiro/, so the skills land in
~/.kiro/skills/ on each IDE and the agent inherits them (default resource
inheritance is left enabled in hack/.kiro/settings/cli.json).
APEX skills are vendored — the skill files are checked into this repo under
hack/.kiro/skills/ at a pinned tag, rather than fetched from the network
when a workshop IDE boots. This is a deliberate choice for a workshop that is
provisioned and re-installed repeatedly.
How it works, end to end:
- Pin.
scripts/sync-apex-skills.shdeclares the exact upstream release in one place:APEX_REF="v1.2.0"(a tag, never a floating branch likemain). - Vendor. The script clones that tag, copies only the 6 EKS skills into
hack/.kiro/skills/, and writes the resolved tag and commit SHA tohack/.kiro/skills/APEX_VERSION. The skill files then live in Git and are reviewed in a PR like any other change. - Ship. During Workshop Studio provisioning, the SetupIDE step copies
hack/.kiro/into~/.kiro/on each IDE, so the skills are present at~/.kiro/skills/before the participant opens a shell — no download, no network call, no per-IDE variation. - Index. The
peeksagent picks them up automatically through its existingfile://.kiro/skills(**/SKILL.md) resource (see "How they reach the agent" above).
Because the bytes are frozen in Git, every IDE in every event gets exactly the same skills — reproducible and auditable, with zero boot-time dependency on GitHub availability or rate limits.
Updating is a maintainer task done in a dev/CI checkout, reviewed via PR — never edited by hand on an IDE:
- Find the new stable APEX tag you want (e.g. on the releases page).
- Edit
scripts/sync-apex-skills.shand bump the pin:(If the set of skills to ship changes, also edit theAPEX_REF="v1.3.0" # was v1.2.0
APEX_SKILLSarray in the same file.) - Re-run the script from the repo root:
scripts/sync-apex-skills.sh
- Review the diff and the updated
hack/.kiro/skills/APEX_VERSION(tag + SHA), then commit and open a PR.
The script is safe to re-run:
- Idempotent — re-running with the same
APEX_REFproduces byte-identical output (no spurious diff). - Non-destructive — it only manages the vendored
eks-*skills; it never touches the PEEKS-authored skills (troubleshoot-kro,troubleshoot-platform,manage-addons) and aborts if an APEX skill name would collide with one. - Fails cleanly — if the pinned tag doesn't exist or the network is unavailable, it exits with a clear error and leaves the vendored skills unchanged (it verifies every requested skill is present upstream before modifying anything).
To refresh an already-provisioned IDE without a full re-provision, re-copy the vendored skills into the running IDE's Kiro home:
cp -r hack/.kiro/skills/eks-* ~/.kiro/skills/Instead of vendoring, a run-once shell hook could fetch the skills on the first
interactive shell of each IDE — e.g. a hack/.bashrc.d/ script guarded by a
marker file (~/.apex-skills-installed) that performs a pinned git clone
(or npx apex-skills) into ~/.kiro/skills/ once.
Trade-offs:
- Pro: skills stay closer to the latest upstream without a repo refresh.
- Con: adds a network dependency at boot, makes each IDE non-deterministic (a participant hits a silent failure if GitHub is throttled or blocked), and slows first-shell startup.
For a workshop that must be reproducible and re-installable in a loop, the pinned vendoring above is the default. The clone-at-startup option is documented here only as an alternative and is intentionally not wired in.
We welcome contributions to the Modern Engineering on AWS initiative. Please read our CONTRIBUTING guide for details on our code of conduct and the process for submitting pull requests.
See CONTRIBUTING for more information on reporting security issues.
This library is licensed under the MIT-0 License. See the LICENSE file for details.
For any questions or feedback regarding Platform Engineering on Amazon EKS, please open an issue in this repository.

