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
Thegecko-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
- Gecko provides
- You generate
Set it up
1
Apply the Terraform
Download and unpack the versioned module (for example 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.
gecko-blackstone-v1.0),
then apply it from that directory: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:
- Authentication → select Assume role.
- Queue — Queue URL →
sqsQueueUrl; Signing secret →sqsMessageSecret(must be 64 lowercase hex chars or it won’t save); Region →sqsRegion. - Cross-account access — IAM role ARN →
roleArn; External ID →externalId(must match the role’s trust policy exactly). - Storage — S3 URL →
s3Url; Region →s3Region.
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 overridescanner_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.