applyme.dev

Hiring a DevOps / Platform Engineer in Hamburg?

I am Alex, a DevOps and Platform Engineer in Phoenix, Arizona, with more than eight years of experience building and running AWS infrastructure, CI/CD pipelines and Kubernetes, and twelve in infrastructure overall.

I am relocating to Hamburg to be with my fiancée, and I am looking for a permanent DevOps or Platform Engineering role at a German company that can sponsor an EU Blue Card under the IT shortage occupation route — no university degree, qualified by professional experience.

The rest of this page is written as infrastructure code. That part is a joke. Every detail inside it is accurate, and the contact form at the bottom is real.

Sie suchen DevOps- oder Platform Engineers in Hamburg?

Ich bin Alex, DevOps- und Platform Engineer aus Phoenix, Arizona, mit über acht Jahren Erfahrung im Aufbau und Betrieb von AWS-Infrastruktur, CI/CD-Pipelines und Kubernetes und insgesamt zwölf Jahren in der Infrastruktur.

Ich ziehe zu meiner Verlobten nach Hamburg und suche eine Festanstellung als DevOps- oder Platform Engineer bei einem deutschen Unternehmen, das eine EU Blue Card über die Regelung für IT-Fachkräfte in Mangelberufen sponsern kann — ohne Hochschulabschluss, qualifiziert durch mehrjährige Berufserfahrung.

Der Rest dieser Seite ist als Infrastruktur-Code geschrieben. Das ist ein Scherz. Alle Angaben darin stimmen, und das Kontaktformular am Ende ist echt.

The moveDer Umzug

terraform planterraform plan

Expand any line for the real details behind it.Jede Zeile lässt sich für die Details aufklappen.

terraform plan -var-file=hamburg.tfvarsus-west-2 → eu-central-1
Terraform used the selected providers to generate the following execution
plan. Resource actions are indicated with the following symbols:
  + create
  - destroy

Terraform will perform the following actions:
# employment.current will be destroyed- resource "employment" "current" {
      - role                = "Senior DevOps Engineer" -> null
      - tenure_years        = 8 -> null
      ~ region              = "us-west-2" -> "eu-central-1" # forces replacement
      ~ work_authorization  = "us_citizen" -> "eu_blue_card" # forces replacement
      ~ timezone            = "America/Phoenix" -> "Europe/Berlin" # forces replacement
          # Region is not an in-place update. The resource has to be
    # destroyed in us-west-2 and created in eu-central-1.
    }
Work history
2023 — now — DevOps Engineer · IoT / proptech platform
Terraform-managed infrastructure across multiple AWS accounts for a platform supporting 1M+ connected IoT devices, with on-call via PagerDuty. Led the monolith CI/CD migration from CircleCI to GitHub Actions, cutting $20K a year and shortening feedback cycles. Blue-green and canary deploys with automated rollback. Moved a large Couchbase cluster off EC2 to containerised ECS, saving $50K a year. Provisioning and ops automation in Python and Bash. Deployed a large-scale AI application on AWS.
2022 — 2023 — DevOps Engineer · game studio
Owned the game's testing platform end to end. Supported developers writing and maintaining Python tests, built a front end for the platform that improved access and adoption, and worked release management to catch bugs before shipping.
2021 — 2022 — Platform Engineer · IoT / proptech platform
Multiple AWS organization accounts, Terraform modules, Datadog monitoring, on-call via OpsGenie. Automated log transfer from production accounts to disaster-recovery accounts with Lambda for business-continuity requirements. Wrote the Terraform module that migrated infrastructure from Heroku to AWS App Runner. Built the backend infrastructure for the largest internal support tool.
2020 — 2021 — DevOps Engineer · digital agency
Senior role across AWS organization accounts and customer deploys. Designed and operated a production Kubernetes cluster on AWS for a national client generating $500K in revenue, including stateful workloads on persistent storage. CI/CD pipelines for large WordPress customers. Migrated logging and monitoring to Datadog and led the move to GitHub Actions.
2018 — 2020 — DevOps Engineer · video delivery / CDN
Datacenters across North America and Europe with daily Linux deploys via SaltStack. Rancher and Docker orchestration across three environments. Replicated an AWS data pipeline in Azure, saving $20K a month and adding multi-cloud resilience. Automated 24/7 support coverage with Slack bots and PagerDuty. Led a national carrier transit partnership, deploying 150 Gbps of fiber across six US datacenters and cutting $18K a month. Flink and Kafka on Docker in Azure.
2014 — 2018 — Network Engineer · public sector
Linux and Windows administration for a 6,000-user network. Ticket escalation, supervised three technicians, hired and trained support staff. Replaced the core switch infrastructure and deployed network-wide monitoring. Promoted from Computer Technician in 2017.
Stack I have actually run in production
  • AWS, multi-account: Organizations, IAM, ECS/Fargate, Lambda, App Runner, EC2, RDS, S3, VPC design
  • Terraform: module authoring across multiple accounts, drift review, plan-gated pipelines
  • CI/CD: GitHub Actions, CircleCI, blue-green and canary releases with automated rollback
  • Containers: Docker, ECS, Kubernetes, Rancher
  • Observability + on-call: Datadog, PagerDuty, OpsGenie, release and incident management
  • Data infrastructure: Couchbase, Kafka, Flink
  • Automation: Python and Bash daily, SaltStack for config management, some Go
  • AWS Certified Cloud Practitioner
# employment.hamburg will be created+ resource "employment" "hamburg" {
      + role                = "DevOps / Platform Engineer"
      + region              = "eu-central-1"
      + location            = "Hamburg, hybrid or on-site"
      + work_authorization  = "eu_blue_card"
      + blue_card_route     = "IT shortage occupation, no degree"
      + notice_period       = "4 weeks"
      + working_language    = "English at the start, German improving"
      + employer            = (known after apply)
          # This is the one field I cannot fill in myself.
    }
What I want to do
Platform or DevOps work with real ownership: AWS accounts, Terraform, delivery pipelines, and the on-call that goes with them. Team size does not matter much. A company that has done a Blue Card before matters more.
What a sponsor is signing up for
An employment contract, salary above the IT shortage occupation threshold, and the Erklärung zum Beschäftigungsverhältnis. I handle the consulate appointment, the Anmeldung and the paperwork on my side.
Honest gaps
  • No Ansible. Config management experience is SaltStack, run daily from 2018 to 2020.
  • No GitLab CI. My depth is GitHub Actions and CircleCI.
  • No ArgoCD or Flux in production. I have read the docs and run Argo locally, nothing more.
  • Production Kubernetes was 2020 to 2021. Since then the work has been ECS and Fargate, so I would want a ramp-up week on current K8s tooling.
  • No formal degree. Blue Card route is the IT shortage occupation path, qualified by professional experience.
  • Basic German, improving. Working language would need to be English at the start.

Plan: 1 to add, 1 to destroy.

The day to dayDer Arbeitsalltag

deployment.yaml

kubectl apply -f deployment.yamlnamespace: hamburg
apiVersion: apps/v1
kind: Deployment
metadata:
  name: alex
  namespace: hamburg
  labels:
    app.kubernetes.io/name: alex
    app.kubernetes.io/component: platform-engineer
    app.kubernetes.io/version: "7.2.0"
  annotations:
    # There is no rolling update across an ocean.
    applyme.dev/notice-period: "4 weeks"
    applyme.dev/relocation: "one-way, with fiancee"
spec:
  replicas: 1
  # Recreate, not RollingUpdate. I cannot run in Phoenix and Hamburg at once.
  strategy:
    type: Recreate
  selector:
    matchLabels:
      app.kubernetes.io/name: alex
  template:
    metadata:
      labels:
        app.kubernetes.io/name: alex
    spec:
      # Hard requirement, not a preference. Remote-from-Arizona does not schedule.
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
              - matchExpressions:
                  - key: topology.kubernetes.io/region
                    operator: In
                    values:
                      - eu-central-1
      tolerations:
        # Will take the pager. Has taken the pager for seven years.
        - key: oncall
          operator: Equal
          value: "true"
          effect: NoSchedule
        # Yes, I will touch the Jenkins box nobody wants to touch.
        - key: legacy-ci
          operator: Exists
          effect: NoSchedule
      terminationGracePeriodSeconds: 2419200
      containers:
        - name: platform-engineer
          image: ghcr.io/alexraskin/alex:7.2.0
          imagePullPolicy: IfNotPresent
          command: ["/usr/bin/terraform", "apply", "-auto-approve"]
          envFrom:
            # Everything below is blocked until this Secret exists.
            - secretRef:
                name: blue-card
          env:
            - name: TZ
              value: Europe/Berlin
            - name: WORKING_LANGUAGE
              value: en
            - name: GERMAN_LEVEL
              value: basic
            - name: PAGER_ACCEPTED
              value: "true"
          ports:
            - name: standup
              containerPort: 900
              protocol: TCP
          readinessProbe:
            httpGet:
              path: /healthz
              port: standup
            # 12 weeks. Consulate appointment, then Ausländerbehörde.
            initialDelaySeconds: 7257600
            periodSeconds: 86400
            timeoutSeconds: 30
            failureThreshold: 3
          livenessProbe:
            exec:
              command: ["/bin/sh", "-c", "test -s /var/run/coffee"]
            periodSeconds: 3600
            failureThreshold: 2
          resources:
            requests:
              cpu: 500m
              memory: 2Gi
            limits:
              # The limit is real. Sustained overtime gets OOMKilled.
              cpu: "2"
              memory: 8Gi
          securityContext:
            allowPrivilegeEscalation: false
            runAsNonRoot: true
            readOnlyRootFilesystem: true
kubectl -n hamburg describe pod alex-7d4f9c8b6-x2blqPending
Name:             alex-7d4f9c8b6-x2blq
Namespace:        hamburg
Priority:         0
Node:             <none>
Labels:           app.kubernetes.io/name=alex
                  pod-template-hash=7d4f9c8b6
Status:           Pending
IP:
Controlled By:    ReplicaSet/alex-7d4f9c8b6
Containers:
  platform-engineer:
    Image:          ghcr.io/alexraskin/alex:7.2.0
    Port:           900/TCP
    Host Port:      0/TCP
    State:          Waiting
      Reason:       Unschedulable
    Ready:          False
    Restart Count:  0
    Limits:
      cpu:          2
      memory:       8Gi
    Requests:
      cpu:          500m
      memory:       2Gi
    Environment Variables from:
      blue-card     Secret  Optional: false
Conditions:
  Type           Status
  PodScheduled   False
Tolerations:       legacy-ci:NoSchedule op=Exists
                  oncall=true:NoSchedule
Events:
  Type     Reason            Age                   From               Message
  ----     ------            ----                  ----               -------
  Warning  FailedScheduling  7m12s                 default-scheduler  0/412 nodes are available: 412 node(s) didn't match Pod's node affinity/selector.
  Warning  FailedScheduling  3m4s (x63 over 237d)  default-scheduler  0/412 nodes are available: 412 node(s) didn't match Pod's node affinity/selector. preemption: 0/412 nodes are available: 412 Preemption is not helpful for scheduling.

StatusStatus

/status

  • 8,853km PHX → HAMkm PHX → HAM
  • 236days searchingTage Suche
  • 34applications sentBewerbungen
  • 30flights this yearFlüge dieses Jahr

ContactKontakt

Apply requires: 1 German employment contractApply requires: 1 German employment contract

If you are hiring, or you know a team that is, this reaches me directly. Recruiters welcome. Please say whether the role can sponsor.Wenn Sie einstellen oder ein passendes Team kennen, erreicht mich das direkt. Personalberatungen sind willkommen. Bitte geben Sie an, ob die Stelle sponsern kann.

+ employment.hamburg # employer = (known after apply)

"No" is not a dealbreaker. It only tells me how much of the process to explain.„Nein" ist kein Ausschlusskriterium. Es sagt mir nur, wie viel ich erklären sollte.