Cloud foundations
Infrastructure as code with Pulumi, Terraform, and AWS CDK. Repeatable environments, clear boundaries, and configurations people can review.
AWS · IaC · ServerlessDevOps · Infrastructure automation
I’m James Jenkins. I turn cloud infrastructure, delivery pipelines, and operational workflows into systems that are easier to build, understand, and run.
Based in Utah / Jenkins Cloud Solutions

Build it deliberately.
Make it repeatable.
Leave a clear path for the next person.
01 / Practice
I work across the lifecycle: provision the environment, ship the application, and make the next change easier to reason about.
Infrastructure as code with Pulumi, Terraform, and AWS CDK. Repeatable environments, clear boundaries, and configurations people can review.
AWS · IaC · ServerlessKubernetes, EKS, Helm, and GitLab pipelines. Deployment workflows that connect a source change to an identifiable release and a recovery path.
Kubernetes · Helm · CI/CDPython services, AWS Lambda, API Gateway, and AI-assisted workflows. Reduce repetitive work while keeping decisions and results inspectable.
Python · APIs · AI workflowsSelected engineering work
Two examples of my contribution. Client identities and internal implementation details are omitted.
I created a parallel compilation pipeline that makes shared prerequisites, worker isolation, and final packaging explicit.
As an AWS DevOps Consultant, I used browser automation to check an internal tool and reuse authentication state between checks.
Public repositories / Workbench
A shared namespace access policy for existing EKS, AKS, and GKE clusters, with Terraform identity mappings and automated allow/deny checks on a local kind cluster.
GitLab-to-cloud OIDC federation with scoped trust, temporary credentials, separate dev/prod storage, and rejection tests. Cloud deployment jobs are disabled until federation and storage are configured.
A local Kubernetes and Docker Compose lab connecting an instrumented Python API to Prometheus SLOs, Grafana dashboards, OpenTelemetry traces, and controlled fault injection.
A Python/AWS CDK example for an EKS cluster and Helm-deployed NGINX application, including ALB ingress and CI configuration.
Python ingestion examples using Kinesis/Firehose, S3, and DynamoDB, with Terraform/EKS and Helm deployment configuration.
Descriptions reflect the public source and README. Each repository documents its setup, scope, and validation; the examples are available to explore and adapt.
Part of the delivery / Documentation
I leave clear, practical documentation alongside my work, so another engineer can set it up, understand the decisions, troubleshoot a problem, and carry it forward.
Prerequisites, setup, validation, limitations, and cleanup.
Explain what to run, which signals matter, and how to interpret the result.
Define healthy behavior and the checks that confirm it.
Record evidence, decisions, and follow-up actions for the next engineer.
A public guide to investigating error-budget burn and missing telemetry in my local Kubernetes SRE lab, with commands, interpretation, recovery checks, and a postmortem handoff.
Identify the service and SLO, compare user-facing request signals, and inspect both alert windows.
Correlate logs with a trace ID and inspect the request and dependency spans in Grafana and Tempo.
Stop the local fault traffic, supply healthy baseline traffic, then confirm successful requests and alert recovery.
One documented check · local Compose lab
docker compose logs --since=10m app otel-collector tempo02 / Architecture & standards
Architecture is a set of decisions you can explain: who can act, where traffic flows, what gets deployed, and how the system recovers.
Explore compute patterns for AWS, Azure, and Google Cloud, alongside delivery, access, and engineering standards. These illustrative designs make the boundaries and decisions visible.
An Application Load Balancer accepts HTTPS and forwards application requests to its registered targets.
An EC2 Auto Scaling group places application instances in private subnets across two Availability Zones.
Use demand metrics for scaling and configure load-balancer health checks for instance replacement.
The application connects to the RDS primary through its database endpoint, with network access scoped to the application tier.
An RDS Multi-AZ DB instance synchronously replicates to a standby in another Availability Zone. That standby supports failover; it does not serve reads.
Public ingress, private compute, and database access have distinct network boundaries.
Multiple Availability Zones and health-based replacement reduce dependence on one instance.
Application scale-out and database failover solve different problems.
Application Gateway WAF v2 provides the public entry point in its own dedicated subnet.
The gateway routes requests to application VMs in a scale set across availability zones.
Health probes and autoscale rules support routing and capacity decisions. Plan instance repair and upgrades explicitly.
A private endpoint gives Azure SQL a private address reachable from the application virtual network. Azure SQL remains a managed service outside the VNet.
Private DNS maps the database hostname to the endpoint. Configure database authentication and public-network access separately.
Application Gateway uses its own subnet, separate from application VMs.
Availability zones, probes, scaling, and repair each need an explicit configuration.
The SQL service and its private endpoint are different parts of the architecture.
A global external Application Load Balancer accepts HTTPS and forwards traffic to the backend service. The global edge sits outside the customer VPC.
A regional managed instance group distributes application VMs across zones in the region.
Load-balancer health checks guide routing. Configure autoscaling and MIG autohealing for their respective jobs.
A Private Service Connect endpoint in the customer VPC connects the application to the managed Cloud SQL service.
Use scoped VM service accounts for Google APIs, configure database authentication, and select the database availability and backup options the application needs.
The global load-balancing edge and regional compute fleet have different scopes.
Regional MIG distribution adds redundancy across zones.
Cloud SQL private IP depends on configured connectivity and permissions.
GitLab CI exchanges its OIDC token for a scoped AWS role. The trust policy defines which jobs may assume it.
The pipeline publishes an image to ECR. An image digest identifies the bytes selected for deployment.
HTTPS traffic enters through an application load balancer and reaches the application in an EKS workload boundary.
The application uses its own scoped AWS identity for S3 access. Its permissions are separate from the pipeline’s role.
CI authority and application permissions are separate identities.
Account, network, and workload boundaries are part of the design.
A release points to a specific image digest.
Record ownership, access scope, expected behavior, and the conditions for a successful release.
Review infrastructure and application changes, then run relevant tests and policy checks.
Retain the source commit, pipeline result, and immutable artifact identifier.
Use deployment gates, verify health and the real request path, and keep the previous release available.
Use metrics, logs, and runbooks to feed operational evidence into the next change.
The proposed change and its evidence can be inspected together.
A successful job is followed by checks of actual behavior.
A known release and a usable restore procedure are retained.
The workload runs as apps:pod-observer. Identity alone does not grant permissions.
The binding names the subject and points to the Role in the apps namespace.
Allow get, list, and watch on Pods, plus get on the pods/log subresource.
The grant applies to the named namespace. Check other bindings too: RBAC grants are additive.
Use a workload-specific ServiceAccount.
Name the required resources and operations.
Check both required access and operations outside the grant.
A small example / RBAC
A useful permission model explains what an identity can do—and gives you a way to check where that access ends.
Try this policy sketch: a service account can read Pods in the observability namespace.
system:serviceaccount:observability:reader
CHECK$ kubectl auth can-i get pods
-n observability
--as=system:serviceaccount:observability:readerThe Role grants read access to Pods in this namespace.
Illustrative policy · runs entirely in your browser
03 / Engineering notes
Practical guides on access, diagnosis, and delivery. Written to be useful at the terminal, with links to the source documentation.
Start with identity, scope, and concrete operations. Then verify both the access a workload needs and the boundaries it should keep.
A repeatable path from a failing request to the responsible layer: workload state, process logs, probes, routing, and resource signals.
Connect pipeline rules, immutable artifacts, deployment authority, temporary cloud credentials, and a practical recovery path.
04 / Engineering community
I share what I learn on Stack Overflow: answering questions, investigating the details, and following up when the first explanation leaves something unresolved.
Member since
Behind every technical question is someone trying to move a project forward. I aim to leave them with a clearer explanation and a concrete next step.
See my Stack Overflow contributionsFind me as jdj333
An engineer wanted to provision Keycloak realms from a local script, but getting and using an administrator token was blocking the setup.
I explained how to use the built-in admin-cli client with bootstrap administrator credentials, and why the administrator’s permissions determine what the token can do.
When the edited script still returned 401, I reproduced it on Keycloak 26.8.2. The token extracted with jq kept its JSON quotes; raw extraction with jq -r removed them, and the same realm-creation request returned 201. I also pointed out the password-variable mismatch and checking HTTP errors before continuing.
I’m a DevOps and infrastructure automation engineer based in Utah.
Through Jenkins Cloud Solutions, I work across AWS infrastructure as code, serverless services, Kubernetes, and automated delivery. My focus is making complex environments repeatable, improving developer workflows, and building systems teams can understand and operate with confidence.
My background spans frontend and Java development, DevOps engineering, and cloud consulting. That mix keeps me interested in both the infrastructure and the people who depend on it.
Jenkins Cloud Solutions LLCDevOps + AI Engineer Contractor
Amazon Web ServicesDevOps Consultant
bioMérieuxSenior DevOps Engineer
Enterprise software engineeringFrontend & Java development → DevOps engineering
Background drawn from my LinkedIn profile; repository descriptions reflect their public documentation.
Keep the conversation going