Docs

Supporting resources

Supporting resources are the image registry, build jobs, and cloud identities behind a stack: ArtifactRegistry, Build, and ServiceAccount. Most stacks never declare them, because Alien adds what a stack needs.

You declare one directly when a workload (a Worker, Container, or Daemon) pushes or pulls images itself, starts build jobs in the customer's cloud, or needs an identity with an inline permission set.

ResourceWhat it isAWSGCPAzure
ArtifactRegistryContainer image registryECRArtifact RegistryContainer Registry
BuildOn-demand build jobsCodeBuildCloud BuildContainer Apps jobs
ServiceAccountWorkload identityIAM roleService accountManaged identity

All three are always "frozen": the customer's admin creates them during initial setup (see Frozen and live). None has .enabled().

Names in deployment status lists what every resource Alien adds is called in the portal and the dashboard.

ArtifactRegistry

An ArtifactRegistry is a set of container image repositories in the customer's cloud, with shared identity and access control. You provision one per stack, and Alien's build and release flow creates repositories inside it and pushes images into them.

ArtifactRegistry("images")     provisioned once: the cloud registry and its pull and push identities
  ├── images/app-a             repositories created as images are built and pushed
  ├── images/app-b
  └── images/app-c

Declare one when your stack builds and runs container images, for example for Container, Daemon, or Build resources, and you want Alien to own the registry, its IAM, and cross-account image distribution.

alien.ts
import * as alien from "@alienplatform/core"

const images = new alien.ArtifactRegistry("images")
  .replicationRegions(["us-west-2", "eu-west-1"]) // AWS only
  .build()

export default new alien.Stack("acme")
  .add(images, "frozen")
  .build()

The management identity can still create repositories inside a frozen registry and manage access.

Options

MemberTypeDefaultNotes
new alien.ArtifactRegistry(id)string[A-Za-z0-9-_], up to 64 characters.
.replicationRegions(regions)string[][]AWS only. Replicates images pushed in the home region to these regions, so compute in another region pulls from a nearby endpoint. Lambda needs this when it runs in a different region from the registry.

ArtifactRegistry has no SDK client, and your code doesn't resolve it at runtime. Alien's release flow and Build resources that link it push images into it.

To push or pull with the cloud's own tools from a workload, grant a permission set:

alien.ts
.permissions({
  profiles: { builder: { images: ["artifact-registry/push"] } },
})

Registry platforms

The registry is created during initial setup. Repositories are created inside it as images are built and released.

PlatformBacking serviceWhat initial setup createsWhat creating repository my-app does
AWSAmazon ECRIAM roles for pull and push. ECR has no registry resource to create.Creates an ECR repository named {prefix}-my-app with CreateRepository.
GCPArtifact RegistryA Docker repository, plus service accounts for pull and push.Nothing. Image paths are created on first push. Returns the full image path.
AzureAzure Container RegistryA container registry.Nothing. ACR creates the repository on first push. Returns the repository URI.
KubernetesAn external registryNothing. Supply an external binding to your registry.
MachinesNot provisioned.
LocalA local registryNothing. It connects to the local registry alien dev runs.Pushes a marker manifest to create the repository.

A repository is addressed by its routable name: the full, cloud-specific path used for credentials and cross-account grants.

PlatformRoutable name for my-app
AWS{prefix}-my-app. Underscores allowed.
GCP{project}/{repository}/my-app. Each /-separated part uses lowercase letters, digits, dots, underscores, and hyphens, and starts and ends with a letter or digit. Other names fail with INVALID_INPUT instead of being rewritten.
Azuremy-app
Local{binding}/my-app, for example artifacts/my-app

A project id like prj_abc123 works on every cloud.

Registry guarantees

  • Short-lived credentials. Generated credentials carry the requested permission, pull or push-and-pull, and expire. On AWS they're scoped to one repository. On GCP they reach the whole Artifact Registry repository, since every name is an image path inside it.
  • Isolated cross-account grants. A grant names specific accounts, service accounts, and service types. Granting pull access to one account doesn't affect any other.
  • No widened grants on GCP. Artifact Registry has no IAM below a repository, so a grant on one name would reach every name's images. Alien refuses such a grant with OPERATION_NOT_SUPPORTED instead of widening it.
    • Only the registry's own pull and push service accounts can be named.
    • To give tenants separate access, use a separate ArtifactRegistry per tenant.
  • Old images stay readable after a rename. On AWS, when the registry's repository prefix changes, images released under the old prefix stay readable and keep their cross-account grants. Pushes to the old prefix are refused.

Cross-account access

On AWS and GCP, Alien can let other cloud accounts pull images from the registry, for example when compute in a customer's account runs images released from yours.

PlatformHow access is granted
AWSECR repository policies naming AWS account ids and IAM role ARNs. Lambda workers in another account also need permissions on their execution role.
GCPIAM bindings on the Artifact Registry repository, naming project numbers and service account emails. Covers every name in the repository.
AzureNot supported through Alien. Cross-subscription access isn't exposed.

Grants stay cloud-specific because AWS and GCP use different identity models, and a single abstraction would lose one side.

Replication is AWS-only for a similar reason. ECR has native cross-region replication; GCP offers multi-region repositories through a different mechanism.

Registry limits

LimitValueNotes
Resource id[A-Za-z0-9-_], up to 64 characters
Credential lifetime, AWSUp to 12 hoursFrom GetAuthorizationToken, a base64 username and password pair. Longer requests are capped.
Credential lifetime, GCPUp to 1 hourA short-lived access token from service account impersonation. Longer requests are capped.
Credential lifetime, AzureAbout 5 minutesA stateless exchange: Entra ID token, ACR refresh token, scoped access token. No persistent tokens or scope maps are created.
Images per repository100,000 on ECRAn ECR quota. GCP and Azure have higher or no documented limits.
Cross-account pullAWS and GCPNot on Azure. On GCP a grant covers the whole repository.
ReplicationAWS only

Per-cloud details:

  • AWS. Pulls aren't throttled per repository for authenticated requests.
  • GCP. No presigned URLs: layers are fetched through the registry API with a bearer token. Alien uses only the Docker format.
  • Azure. The tier sets limits:
    • Basic: 10 GB, 10 writes a minute, 1,000 reads a minute. Alien's direct provisioning creates Basic.
    • Standard: 100 GB, 100 writes, 3,000 reads.
    • Premium: 500 GB, 2,000 writes, 10,000 reads. The Terraform setup template creates Premium with admin access turned off.
  • Local. A local registry with basic auth and no cross-account access, for development and tests.

Pricing

The customer pays the cloud provider for the registry on their own cloud bill. Alien lists ArtifactRegistry as a free resource on Pricing.

Prices are list prices as of October 2026 in AWS us-east-1, GCP us-central1, and Azure East US.

CloudServicePriceNotes
AWSECR$0.10 per GB a monthNo base fee.
GCPArtifact Registry$0.10 per GB a monthFirst 0.5 GB free.
AzureACR Basic$0.1666 a day, about $5.07 a month10 GB included, then $0.10 per GB.
AzureACR Standard$0.6666 a day, about $20.28 a month100 GB included, then $0.10 per GB.
AzureACR Premium$1.6666 a day, about $50.69 a month500 GB included, then $0.10 per GB. Geo-replication available.

For 10 GB of images a month:

CloudMonthly cost
AWS ECR$1.00
GCP Artifact Registry$0.95 (9.5 GB billed after the free 0.5 GB)
Azure ACR Basic$5.07 flat
Azure ACR Premium$50.69 flat
  • Pulls within the same region are usually free or close to it. Cross-region and internet egress follow standard data transfer pricing.
  • On AWS, replicated images are billed as storage in each region.
  • ACR Basic's 10 writes a minute can slow down release pipelines.

Sources: Amazon ECR pricing, Artifact Registry pricing, Azure Container Registry pricing.

Registry permissions

SetGrants
artifact-registry/pullPulling images and reading repository metadata.
artifact-registry/pushPushing and pulling images.
artifact-registry/provisionCreating the registry during initial setup.
artifact-registry/management, artifact-registry/heartbeatUsed by the management identity to manage repositories and access, and to check health.

Build

A Build resource is a build project in the customer's cloud that runs a bash script in a container image on demand, for compiling, testing, or packaging code.

alien.ts
import * as alien from "@alienplatform/core"

const images = new alien.ArtifactRegistry("images").build()

const builder = new alien.Build("builder")
  .computeType("large")
  .environment({ TARGET: "release" })
  .link(images)
  .permissions("builder")
  .build()

export default new alien.Stack("acme")
  .add(images, "frozen")
  .add(builder, "frozen")
  .permissions({
    profiles: { builder: { images: ["artifact-registry/push"] } },
  })
  .build()

Build options

MethodTypeDefaultNotes
.permissions(profile)stringrequiredPermission profile the build runs with.
.computeType(type)"small" | "medium" | "large" | "x-large""medium"Each cloud maps it to its own sizes. See Compute types.
.environment(vars)Record<string, string>{}Variables for every run.
.link(resource)ResourcenoneRepeatable.

Start a build

Build has no TypeScript or Python binding. Rust workloads start runs through the alien-bindings build binding:

MethodNotes
start_build(config)config has image, script (bash), environment, timeout_seconds, compute_type, and optional log monitoring. Returns a BuildExecution.
get_build_status(build_id)BuildExecution with status QUEUED, RUNNING, SUCCEEDED, FAILED, CANCELLED, or TIMED_OUT.
stop_build(build_id)Cancels a run.

The resource output identifier is the provider's project id (ARN on AWS, project id on GCP, resource id on Azure). See the Rust SDK.

Build platforms

PlatformProvisions
AWSCodeBuild project
GCPCloud Build
AzureContainer Apps jobs
KubernetesKubernetes Jobs
MachinesNot supported
LocalNot supported

Compute types

computeTypeAWS CodeBuildGCP Cloud BuildAzure Container Apps job
smallBUILD_GENERAL1_SMALLE2_MEDIUM0.25 vCPU, 0.5 GiB
mediumBUILD_GENERAL1_MEDIUME2_MEDIUM0.5 vCPU, 1 GiB
largeBUILD_GENERAL1_LARGEE2_HIGHCPU_81 vCPU, 2 GiB
x-largeBUILD_GENERAL1_2XLARGEE2_HIGHCPU_322 vCPU, 4 GiB

On AWS the CodeBuild project takes the compute type from .computeType(). On GCP and Azure each run applies compute_type from its config.

Runs

  • Script. Each run executes script with bash. Alien wraps it to forward logs to the optional monitoring OTLP endpoint (path /v1/logs by default, TLS on and verified by default).
  • Image. On GCP, Azure, and Kubernetes the run uses image from the run's config. On AWS the CodeBuild project uses the Alien builder image (ghcr.io/alienplatform/alien-builder) set at initial setup.
  • Timeout. timeout_seconds bounds the run on GCP, Azure (replica timeout), and Kubernetes (activeDeadlineSeconds). On AWS the project's CodeBuild timeout applies.
  • Retries. Kubernetes doesn't retry a failed run (backoffLimit: 0). Azure allows one replica retry.
  • Logs. On AWS, logs go to CloudWatch Logs. On GCP, to Cloud Logging only.

Build permissions

SetGrants
build/executeStarting, stopping, and monitoring runs.
build/logs-and-artifactsLets the build write logs and build reports.
build/provision, build/management, build/heartbeatUsed by initial setup and the management identity.

ServiceAccount

A ServiceAccount is a non-human cloud identity that workloads run as: an IAM role, a GCP service account, or an Azure managed identity.

You rarely declare one. Alien creates a ServiceAccount for each permission profile in the stack, and every workload with .permissions("<profile>") runs as it:

alien.ts
import * as alien from "@alienplatform/core"

const files = new alien.Storage("files").build()

const api = new alien.Worker("api")
  .code({ type: "source", src: "./api", toolchain: { type: "typescript" } })
  .permissions("execution")
  .build()

// Alien adds a ServiceAccount for the "execution" profile
export default new alien.Stack("acme")
  .add(files, "frozen")
  .add(api, "live")
  .permissions({ profiles: { execution: { files: ["storage/data-read"] } } })
  .build()

To declare one directly with an inline permission set:

alien.ts
const reader = new alien.ServiceAccount("reader")
  .stackPermissionSet({
    id: "custom/read-objects",
    description: "Read objects from every bucket in the stack",
    platforms: {
      aws: [{ grant: { actions: ["s3:GetObject"] }, binding: { stack: { resources: ["*"] } } }],
    },
  })
  .build()

ServiceAccount options

MethodTypeDefaultNotes
.stackPermissionSet(set)PermissionSetnoneRepeatable. Inline sets only, with id, description, and platforms. Built-in set names go in permission profiles instead.

ServiceAccount has no SDK binding. Workloads get its credentials automatically from the platform.

ServiceAccount platforms

PlatformProvisions
AWSIAM role
GCPService account
AzureUser-assigned managed identity
KubernetesNothing. Uses ServiceAccounts created by the Helm chart.
MachinesNot supported
LocalLocal identity record

Outputs

FieldAWSGCPAzure
identityRole ARNService account emailManaged identity client id
resourceIdRole nameService account unique idManaged identity resource id

Identity behavior

  • One identity per profile. A profile named execution becomes a ServiceAccount with id execution-sa. The cloud identity is named after the stack prefix and that id.
  • Stack-wide grants. Permission sets under "*" in the profile attach to the identity directly. On AWS they're an inline policy on the role.
  • Resource-scoped grants. Sets scoped to one resource are applied by that resource when it's created, so the grant names the exact bucket, queue, or secret.
  • Grants survive their profile. A frozen ServiceAccount keeps the grants captured during initial setup, even after the profile that produced them is removed from alien.ts. Changing them takes the customer's admin running initial setup again.
  • Impersonation. service-account/impersonate lets one identity act as another. On AWS it grants sts:AssumeRole on roles with the stack prefix, and the target role's trust policy lists the callers.
LimitValue
Id[A-Za-z0-9-_], up to 64 characters. Immutable.
GCP service account idUp to 30 characters, a GCP limit
LifecycleFrozen only

ServiceAccount permissions

SetGrants
service-account/impersonateActing as this identity from another workload.
service-account/provisionCreating roles, service accounts, and managed identities. Used by initial setup.
service-account/management, service-account/heartbeatUsed by the management identity.

Names in deployment status

The deployment portal and the dashboard show each resource Alien adds under a built-in name, next to its ID. A stack gets only the ones it needs, each in the category for its type (see Categories).

AWS

NameIDCategory
Networkdefault-networkNetworking and access
Management identitymanagementNetworking and access
Service account (profile)<profile>-saNetworking and access
Remote resource accessaccessNetworking and access
Compute clustercomputeCompute
Sandbox egress gatewaysandbox-egress-gatewayCompute
Application secretssecretsSecrets and keys
Deployer secretsdeployer-secretsSecrets and keys

Google Cloud

NameIDCategory
Networkdefault-networkNetworking and access
Management identitymanagementNetworking and access
Service account (profile)<profile>-saNetworking and access
Remote resource accessaccessNetworking and access
Service API, such as Cloud Run APIenable-<service>, such as enable-cloud-runNetworking and access
Agent Platform engine (sandbox)<sandbox>-engineNetworking and access
Compute clustercomputeCompute
Application secretssecretsSecrets and keys
Deployer secretsdeployer-secretsSecrets and keys

Google Cloud APIs appear only when the stack needs them: Artifact Registry API, Cloud Build API, Cloud Firestore API, Cloud KMS API, Cloud Quotas API, Cloud Resource Manager API, Cloud Run API, Cloud SQL Admin API, Cloud Storage API, Compute Engine API, IAM Service Account Credentials API, Identity and Access Management (IAM) API, Kubernetes Engine API, Pub/Sub API, Secret Manager API, Security Token Service API, and Vertex AI API.

Azure

NameIDCategory
Networkdefault-networkNetworking and access
Resource groupdefault-resource-groupNetworking and access
Storage accountdefault-storage-accountNetworking and access
Container Apps environmentdefault-container-envNetworking and access
Service Bus namespacedefault-service-bus-namespaceNetworking and access
Management identitymanagementNetworking and access
Service account (profile)<profile>-saNetworking and access
Remote resource accessaccessNetworking and access
Microsoft.Service provider, such as Microsoft.App providerenable-<service>, such as enable-appNetworking and access
Compute clustercomputeCompute
Application secretssecretsSecrets and keys
Deployer secretsdeployer-secretsSecrets and keys

Provider registrations appear only when the stack needs them: Microsoft.App, Microsoft.ContainerRegistry, Microsoft.ContainerService, Microsoft.DBforPostgreSQL, Microsoft.EventGrid, Microsoft.KeyVault, Microsoft.Network, Microsoft.ServiceBus, and Microsoft.Storage.

Kubernetes

NameIDCategory
Kubernetes clusterkubernetesNetworking and access
Sandbox egress gatewaysandbox-egress-gatewayCompute

Kubernetes on a cloud can also get a Network. See Network.

Your machines

NameIDCategory
Compute clustercomputeCompute

Next

On this page