Skip to main content
In a hybrid deployment, the scanner, S3 storage, and all AI inference run inside your AWS account. Gecko hosts only the dashboard, database, and scan orchestration. This page covers the assume-role model, where Gecko reaches into your account by assuming a single, narrowly-scoped IAM role.
You’ll need: Gecko Enterprise with hybrid enabled for your team, AWS admin access to run Terraform, and the ability to publish a container image to a private ECR repository. The Deployment settings page appears in Gecko once the feature is enabled — ask the Gecko team to turn it on.

How it works

Ingress is one-directional and queue-based. Gecko never opens an inbound connection to your account. It assumes a role, signs a job, and drops it on your SQS queue; everything after that runs inside your account and reaches out to Gecko to post findings. Two security properties hold by design:
  • Gecko’s trust is pinned to one exact principal, gated by a shared ExternalId (a confused-deputy guard). A leaked role ARN alone grants nothing.
  • A leaked queue URL alone cannot launch a scan. Every message is HMAC-signed by Gecko and re-verified by the Lambda before any compute starts.

Who hosts what

Gecko cloud

Dashboard, Postgres, SSO/Auth, scan orchestration. Stores your GitHub credential and minimal metadata only (repo names, usernames/emails, ~5–6 line snippets).

Your AWS account

SQS queue + DLQ, S3 artifact bucket, ECS Fargate scanner, the SQS-consumer Lambda, and all AI inference via Bedrock. Your source code stays in your account.

What the Terraform provisions

The gecko-blackstone Terraform module (versioned — pin to a release, e.g. gecko-blackstone-v1.0) creates everything in your account:
There’s no image to build or publish. The scanner image ships from Gecko’s public ECR, and the module presets scanner_image_url to it, so ECS pulls it directly. To run your own mirror instead, see Use your own image registry.

The four IAM roles

Values: who provides what

terraform.tfvars is gitignored, but these secrets land in Terraform state in plaintext. Use an encrypted, access-controlled remote backend, or treat the state file as a secret.

Set it up

1

Apply the Terraform

Download and unpack the versioned module (for example gecko-blackstone-v1.0), then apply it from that directory:
ECS pulls the scanner image straight from Gecko’s public ECR, so there’s no image step — once the apply completes, the infrastructure is ready.
2

Hand the config back to Gecko

The module emits exactly the shape the dashboard expects:
This output is sensitive (it contains the ExternalId and HMAC secret) — share it over a secure channel. Either Gecko enters it for your team, or you enter it yourself next.
3

Configure the dashboard

In Gecko, go to Settings > Deployment and set, in order:
  1. Authentication → select Assume role.
  2. Queue — Queue URL → sqsQueueUrl; Signing secret → sqsMessageSecret (must be 64 lowercase hex chars or it won’t save); Region → sqsRegion.
  3. Cross-account access — IAM role ARN → roleArn; External ID → externalId (must match the role’s trust policy exactly).
  4. Storage — S3 URL → s3Url; Region → s3Region.
Settings auto-save once every required field is valid — there’s no Save button. Watch the Status line change to Connected.
4

Test the connection

Click Test connection. Gecko assumes the role and sends a signed test message; the Lambda verifies the signature and intentionally skips starting a task for tests. A green result means the full chain works: AssumeRole → SendMessage → receive → signature verify.
5

Run your first scan

Connect GitHub under Settings > Git, then start a scan with + New Scan. Watch it flow through your account:
Findings appear in the dashboard under Scans, Repositories, and Vulnerabilities.

Troubleshooting

Use your own image registry (optional)

By default ECS pulls the scanner image from Gecko’s public ECR, which needs no setup. If your policy requires images to come from a registry you control — or you want SOCI (Seekable OCI) lazy-loading for faster cold starts — mirror the image into your own private ECR and override scanner_image_url.
1

Mirror the image into your private ECR

Pull Gecko’s public image and push it to a private ECR repository in your account.
2

Add a SOCI index (optional, for faster starts)

SOCI is purely an image-registry property — there’s no ECS or Terraform flag for it. Generate a SOCI index for the mirrored image and push it alongside, then tag the SOCI image index soci-latest. Fargate lazy-loads only when a matching SOCI index exists next to the image, and only from private ECR — public ECR doesn’t qualify.
3

Point the module at your image

Set scanner_image_url to your private ECR image (use the soci-latest tag if you published a SOCI index) and re-apply.

Security model

Gecko’s reach into your account is exactly two actions — SendMessage to one queue and PutObject under uploads/* — through a single role that trusts one specific Gecko principal and only when presented with the shared ExternalId. That role cannot read your code or run tasks. Every queue message is signed and re-verified inside your account before compute starts, so neither a leaked role ARN nor a leaked queue URL is enough on its own to run a scan. All inference runs on your Bedrock, and your source only ever exists in the scanner task’s ephemeral storage, wiped before and after each run.