Vylara
ci-cdawsarchitecture

GitHub Actions to your own AWS account, without a DevOps hire

How small teams wire GitHub to AWS deploys in their own account: what a GitHub Actions workflow can do, where it stops, and where an agent fills the gap.

Written byVylara Team
5 min read
GitHub Actions → your own AWS account

If you want to deploy to your own AWS account from a Git workflow without hiring a DevOps engineer, a GitHub Actions pipeline gets you most of the build-and-ship loop — but it does not create the cloud environment for you. Actions can build a Docker image, push it to ECR, and roll a new task, but only once the underlying infrastructure (VPC, load balancer, database, cache, IAM roles) already exists. Standing that infrastructure up the first time is the part teams underestimate, and it’s the part Vylara handles: the agent engine reads your repo, provisions the environment in your account on the first deploy, and hands you a workflow that ships every subsequent change.

This distinction matters because most "deploy to AWS with GitHub Actions" tutorials quietly assume the hard 80% is done. They start with a working ECS cluster, a target group, an ALB listener, and an IAM role the workflow can assume. Getting to that starting line — correctly, securely, without a static access key sitting in a repo secret — is where a small team burns a week and where the mistakes end up on your bill later.

What a GitHub Actions workflow actually does #

A CI/CD workflow is a build-and-promote machine, not an infrastructure creator. On push to your main branch, it checks out code, builds the container, authenticates to AWS, pushes the image to a registry, and asks the orchestrator to run the new version. That last step is only meaningful if the service, the network, and the data stores are already there. The honest mental model: Git events move code and images; a separate provisioning step moves infrastructure. Conflating the two is why so many first attempts fail with a green build and a service that never comes up.

The single most common footgun is authentication. Long-lived AWS access keys stored as repo secrets are the wrong default — they don’t rotate, they leak, and they grant standing access. The correct pattern is OIDC: GitHub Actions requests a short-lived token, and AWS trusts your GitHub org to assume a role you scoped. If you’re still keeping credentials in chat or CI variables, our post on why your secrets are in Slack right now walks through the exit plan. A minimal OIDC-based job looks like this:

yaml
permissions:
  id-token: write
  contents: read
jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - uses: aws-actions/configure-aws-credentials@v4
        with:
          role-to-assume: arn:aws:iam::123456789012:role/gha-deploy
          aws-region: us-east-1
      - run: |
          docker build -t $ECR/app:$GITHUB_SHA .
          aws ecr get-login-password | docker login --username AWS --password-stdin $ECR
          docker push $ECR/app:$GITHUB_SHA

That’s the shippable core. What it hides: the gha-deploy role, its trust policy, the ECR repo, the ECS service and task definition, the ALB and its health-checked target groups, the security groups, and a database the app can actually reach. Each of those is a decision with a cost and a security implication, and none of them are created by the workflow above. The YAML is the last 20%; the missing environment is the first 80%.

The part the tutorials skip: standing up the environment #

This is where Vylara starts. You install the Vylara GitHub App and pick a repository, and the agent engine clones it and detects the stack: language, framework, and the databases and caches your dependencies imply. A prisma import means a PostgreSQL database (roughly ~$15/mo as a managed instance); ioredis means a Redis cache (~$8/mo); an S3 client means a storage bucket (~$1/mo). You see a plain "Your app needs" card and choose "Create for me" or "I already have one" per resource — not a wall of infrastructure modules to hand-write.

The generated Dockerfile, CI/CD pipeline, and deployment configs arrive as a pull request from vylara-ai[bot], shown in a diff view with explanations. Nothing lands in your repo without your approval, and merging that PR only updates your repository — it does not touch AWS. The cloud environment is created on the first deploy, when the agent provisions resources into your own account using a blue/green rollout, so the initial release and every one after it is zero-downtime with an instant rollback path. Because Vylara never hosts your workloads, the servers, database, and load balancer all live in your account, and your AWS bill comes straight from AWS.

Credentials are the other thing done right by default. Vylara connects to your account through cross-account IAM using an external ID rather than storing static keys — the same pattern our cross-account IAM with external IDs walkthrough covers end to end — and you can revoke access at any time while keeping everything that was created. Environment variables detected in your code are synced to AWS Secrets Manager and injected at deploy time, so no secret has to live in a workflow file.

Who should still hand-roll a workflow #

Be honest with yourself about the trade. If you already run a solid ECS or Fargate setup, have your IAM story sorted, and just need a build-and-push step, a hand-written GitHub Actions workflow is fine and you don’t need much else. The value of an agent engine is concentrated in the first-deploy gap — turning a repo into a running environment — and in the ongoing management that a tiny team can’t staff. AI-generated infrastructure is not magic, either: sizing is a guess until real traffic pins it, and stateful database migrations are genuinely harder than stateless service rollouts. That’s why every provisioning and every write action passes through a human approval step rather than applying unsupervised.

After launch, the in-app chat reads your service status, logs, and metrics on demand — it can tell you a 502 is a downed Redis instance and offer a one-click restart, with any change requiring your confirmation. For the broader picture of running production AWS on a small team without a dedicated hire, the deploy-without-DevOps guide ties these pieces together, and our post on managing AWS without a DevOps engineer covers the day-two habits. The short version: let GitHub Actions do what it’s good at — moving code and images — and let an agent handle the environment underneath it.

Try Vylara on your repo

Review your cloud plan in Vylara, merge delivery changes as Git PRs, and deploy into your own AWS or Azure account when you’re ready.

Start free

Frequently asked questions

Does merging a pull request create my AWS infrastructure?
No. Merging a PR only updates your repository — it adds the Dockerfile, CI/CD pipeline, and deployment configs. Your cloud environment is created on the first deploy, when Vylara provisions resources into your own AWS account with a blue/green rollout.
How does a GitHub Actions workflow authenticate to AWS securely?
Use OIDC instead of static access keys: grant the job id-token permission and have it assume a scoped IAM role, so GitHub gets a short-lived token per run. Vylara connects the same way — via cross-account IAM with an external ID — so no long-lived AWS keys sit in your repo secrets.
Can Vylara deploy to Azure or GCP as well as AWS?
Deploys today target AWS in your own account. Vylara never hosts your workloads — servers, databases, and caches are all created in your AWS account, billing flows directly from AWS, and you can revoke Vylara's access at any time while keeping everything it created.

Related posts