Skip to main content

ECR Authentication

This guide shows you how to configure AWS Elastic Container Registry (ECR) authentication using Atmos integrations for automatic Docker login.

Overview​

Atmos provides native ECR authentication through the integrations system. Integrations are client-only credential materializations that derive credentials from your AWS identity for service-specific access.

Key benefits:

  • Automatic login: ECR credentials are provisioned when you authenticate with an identity
  • Multi-registry support: Configure multiple ECR registries across accounts and regions
  • Zero configuration: Credentials are written to ~/.docker/config.json and work immediately with Docker
  • CI/CD ready: Works seamlessly in GitHub Actions, GitLab CI, and other pipelines

Quick Start​

Basic ECR Integration​

The simplest ECR setup links an integration to an existing AWS identity:

auth:
providers:
company-sso:
kind: aws/iam-identity-center
region: us-east-1
start_url: https://company.awsapps.com/start/

identities:
dev-admin:
kind: aws/permission-set
via:
provider: company-sso
principal:
name: AdministratorAccess
account: dev

integrations:
dev/ecr:
kind: aws/ecr
via:
identity: dev-admin
spec:
registry:
account_id: "123456789012"
region: us-east-2

Authenticate and use Docker:

# Login triggers ECR automatically (auto_provision defaults to true)
atmos auth login dev-admin

# Docker commands now work
docker pull 123456789012.dkr.ecr.us-east-2.amazonaws.com/my-app:latest
docker push 123456789012.dkr.ecr.us-east-2.amazonaws.com/my-app:v1.0.0

Understanding Integrations​

Why Integrations vs Identities?​

ECR login is fundamentally different from AWS identities:

ConceptIAM User/RoleDocker Login (ECR)
Stored identity objectYesNo
Policy attachmentYesNo
Server-side lifecycleYesNo
Client-only materializationNoYes

Integrations are things that use an identity to materialize client-side credentials. This separation keeps your configuration clean and explicit.

Integration Configuration​

Each ECR integration requires:

integrations:
my-ecr-integration: # Unique name for this integration
kind: aws/ecr # Integration type
via:
identity: my-identity # Which identity provides AWS credentials
spec:
auto_provision: true # Auto-trigger on identity login (default)
registry:
account_id: "123456789012"
region: us-east-2

Common Patterns​

Multi-Environment Setup​

Configure separate integrations for each environment:

auth:
identities:
dev-admin:
kind: aws/permission-set
via:
provider: company-sso
principal:
name: AdministratorAccess
account: dev

prod-deployer:
kind: aws/permission-set
via:
provider: company-sso
principal:
name: ContainerDeploy
account: production

integrations:
# Dev environment ECR
dev/ecr:
kind: aws/ecr
via:
identity: dev-admin
spec:
registry:
account_id: "111111111111"
region: us-east-2

# Production ECR
prod/ecr:
kind: aws/ecr
via:
identity: prod-deployer
spec:
registry:
account_id: "222222222222"
region: us-east-1

Usage:

# Development work
atmos auth login dev-admin
docker pull 111111111111.dkr.ecr.us-east-2.amazonaws.com/my-app:dev

# Production deployment
atmos auth login prod-deployer
docker push 222222222222.dkr.ecr.us-east-1.amazonaws.com/my-app:v1.0.0

Multi-Region Registries​

One identity can link to multiple ECR registries across regions:

auth:
identities:
platform-admin:
kind: aws/permission-set
via:
provider: company-sso
principal:
name: PlatformAdmin
account: platform

integrations:
platform/ecr/us-east:
kind: aws/ecr
via:
identity: platform-admin
spec:
registry:
account_id: "333333333333"
region: us-east-1

platform/ecr/us-west:
kind: aws/ecr
via:
identity: platform-admin
spec:
registry:
account_id: "333333333333"
region: us-west-2

platform/ecr/eu-west:
kind: aws/ecr
via:
identity: platform-admin
spec:
registry:
account_id: "333333333333"
region: eu-west-1

Login to all regions at once:

atmos auth login platform-admin
# ✓ ECR login: 333333333333.dkr.ecr.us-east-1.amazonaws.com (expires in 11h59m)
# ✓ ECR login: 333333333333.dkr.ecr.us-west-2.amazonaws.com (expires in 11h59m)
# ✓ ECR login: 333333333333.dkr.ecr.eu-west-1.amazonaws.com (expires in 11h59m)

Cross-Account Access​

Access ECR registries in different AWS accounts:

auth:
integrations:
# Your account's ECR
my-account/ecr:
kind: aws/ecr
via:
identity: dev-admin
spec:
registry:
account_id: "111111111111"
region: us-east-2

# Shared services account ECR (requires cross-account permissions)
shared/ecr:
kind: aws/ecr
via:
identity: dev-admin
spec:
registry:
account_id: "999999999999"
region: us-east-1

Optional Integrations​

Disable auto-provisioning for integrations you only need occasionally:

auth:
integrations:
# Always provision on login
dev/ecr/primary:
kind: aws/ecr
via:
identity: dev-admin
spec:
registry:
account_id: "123456789012"
region: us-east-2

# Only provision when explicitly requested
dev/ecr/legacy:
kind: aws/ecr
via:
identity: dev-admin
spec:
auto_provision: false # Don't auto-trigger
registry:
account_id: "123456789012"
region: eu-west-1

Usage:

# Normal login only provisions primary ECR
atmos auth login dev-admin

# Explicitly login to legacy ECR when needed
atmos auth ecr-login dev/ecr/legacy

Standalone ECR Login​

You can trigger ECR login independently of identity authentication:

By Integration Name​

atmos auth ecr-login dev/ecr

By Identity​

Trigger all integrations linked to an identity:

atmos auth ecr-login --identity dev-admin

By Explicit Registry URL​

Use current AWS credentials from the environment:

# Single registry
atmos auth ecr-login --registry 123456789012.dkr.ecr.us-east-2.amazonaws.com

# Multiple registries
atmos auth ecr-login \
--registry 123456789012.dkr.ecr.us-east-2.amazonaws.com \
--registry 987654321098.dkr.ecr.us-west-2.amazonaws.com

CI/CD Integration​

GitHub Actions​

# .github/workflows/build.yaml
name: Build and Push

on:
push:
branches: [main]

jobs:
build:
runs-on: ubuntu-latest
permissions:
id-token: write
contents: read

steps:
- uses: actions/checkout@v4

- name: Install Atmos
uses: cloudposse/github-action-setup-atmos@v2

- name: Authenticate and Login to ECR
run: |
# Option A: Identity login (triggers auto-provisioned integrations)
atmos auth login ci-deployer

# Option B: Explicit integration
# atmos auth ecr-login ci/ecr

- name: Build and Push
run: |
docker build -t 123456789012.dkr.ecr.us-east-2.amazonaws.com/my-app:${{ github.sha }} .
docker push 123456789012.dkr.ecr.us-east-2.amazonaws.com/my-app:${{ github.sha }}

GitLab CI​

# .gitlab-ci.yml
build:
image: docker:24
services:
- docker:24-dind
before_script:
- apk add --no-cache curl
- curl -fsSL https://atmos.tools/install.sh | bash
- atmos auth login ci-deployer
script:
- docker build -t 123456789012.dkr.ecr.us-east-2.amazonaws.com/my-app:$CI_COMMIT_SHA .
- docker push 123456789012.dkr.ecr.us-east-2.amazonaws.com/my-app:$CI_COMMIT_SHA

IAM Permissions​

The identity used for ECR login needs the ecr:GetAuthorizationToken permission:

{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "ecr:GetAuthorizationToken",
"Resource": "*"
},
{
"Effect": "Allow",
"Action": [
"ecr:BatchCheckLayerAvailability",
"ecr:GetDownloadUrlForLayer",
"ecr:BatchGetImage",
"ecr:PutImage",
"ecr:InitiateLayerUpload",
"ecr:UploadLayerPart",
"ecr:CompleteLayerUpload"
],
"Resource": "arn:aws:ecr:*:123456789012:repository/*"
}
]
}

Credential Storage​

Location​

ECR credentials are stored in ~/.docker/config.json by default. This is the standard Docker config location, which means:

  • No additional environment variables required
  • Docker commands work immediately after login
  • Credentials are merged with existing Docker config entries
  • Has restricted permissions (0600)

If you need to use a custom location, set the DOCKER_CONFIG environment variable before running atmos auth ecr-login:

export DOCKER_CONFIG=/custom/path
atmos auth ecr-login dev/ecr

Troubleshooting​

Token Expired​

ECR tokens expire after approximately 12 hours. Re-authenticate to refresh:

atmos auth login dev-admin
# or
atmos auth ecr-login dev/ecr

Permission Denied​

Ensure your identity has ecr:GetAuthorizationToken permission:

# Test with AWS CLI
aws ecr get-authorization-token --region us-east-2

Wrong Credentials Used​

Check that ~/.docker/config.json contains the ECR registry:

cat ~/.docker/config.json | jq '.auths | keys'

If using a custom DOCKER_CONFIG, verify it's set correctly:

echo $DOCKER_CONFIG

Registry Not Found​

Verify the registry URL format:

  • Must be {account_id}.dkr.ecr.{region}.amazonaws.com
  • ECR Public (public.ecr.aws) is not supported
  • China/GovCloud regions are not supported

Next Steps​