Aller au contenu principal

Amazon ECR


1 - Présentation

Amazon ECR (Elastic Container Registry) est un registre Docker entièrement managé pour stocker, gérer et déployer des images de conteneurs.


2 - Création et configuration

2.1 Créer un repository

# Créer un repository privé
aws ecr create-repository \
--repository-name mon-app \
--image-scanning-configuration scanOnPush=true \
--encryption-configuration encryptionType=AES256 \
--tags Key=Project,Value=MonProjet

# Créer avec immutabilité des tags
aws ecr create-repository \
--repository-name mon-app-immutable \
--image-tag-mutability IMMUTABLE

2.2 Via CloudFormation

AWSTemplateFormatVersion: '2010-09-09'

Resources:
ECRRepository:
Type: AWS::ECR::Repository
Properties:
RepositoryName: mon-application
ImageTagMutability: MUTABLE
ImageScanningConfiguration:
ScanOnPush: true
EncryptionConfiguration:
EncryptionType: AES256
RepositoryPolicyText:
Version: '2012-10-17'
Statement:
- Sid: AllowPush
Effect: Allow
Principal:
AWS: !Sub arn:aws:iam::${AWS::AccountId}:role/CodeBuildRole
Action:
- ecr:GetDownloadUrlForLayer
- ecr:BatchGetImage
- ecr:BatchCheckLayerAvailability
- ecr:PutImage
- ecr:InitiateLayerUpload
- ecr:UploadLayerPart
- ecr:CompleteLayerUpload
LifecyclePolicy:
LifecyclePolicyText: |
{
"rules": [
{
"rulePriority": 1,
"description": "Keep last 10 images",
"selection": {
"tagStatus": "any",
"countType": "imageCountMoreThan",
"countNumber": 10
},
"action": {
"type": "expire"
}
}
]
}
Tags:
- Key: Environment
Value: Production

Outputs:
RepositoryUri:
Value: !GetAtt ECRRepository.RepositoryUri

3 - Push et Pull d'images

3.1 Authentification

# Login Docker vers ECR
aws ecr get-login-password --region eu-west-1 | \
docker login --username AWS --password-stdin 123456789.dkr.ecr.eu-west-1.amazonaws.com

# Pour les scripts CI/CD
export ECR_REGISTRY=123456789.dkr.ecr.eu-west-1.amazonaws.com
aws ecr get-login-password --region eu-west-1 | docker login --username AWS --password-stdin $ECR_REGISTRY

3.2 Push d'une image

# Build l'image
docker build -t mon-app:latest .

# Tag pour ECR
docker tag mon-app:latest 123456789.dkr.ecr.eu-west-1.amazonaws.com/mon-app:latest
docker tag mon-app:latest 123456789.dkr.ecr.eu-west-1.amazonaws.com/mon-app:v1.0.0

# Push
docker push 123456789.dkr.ecr.eu-west-1.amazonaws.com/mon-app:latest
docker push 123456789.dkr.ecr.eu-west-1.amazonaws.com/mon-app:v1.0.0

3.3 Pull d'une image

# Pull une image
docker pull 123456789.dkr.ecr.eu-west-1.amazonaws.com/mon-app:v1.0.0

# Lister les images
aws ecr describe-images \
--repository-name mon-app \
--query 'imageDetails[*].[imageTags,imagePushedAt,imageSizeInBytes]'

4 - Scan de vulnérabilités

4.1 Types de scan

TypeDescription
BasicScan basique (CVE)
EnhancedScan avec Amazon Inspector

4.2 Configuration du scan

# Activer le scan au push
aws ecr put-image-scanning-configuration \
--repository-name mon-app \
--image-scanning-configuration scanOnPush=true

# Scanner manuellement une image
aws ecr start-image-scan \
--repository-name mon-app \
--image-id imageTag=latest

# Voir les résultats du scan
aws ecr describe-image-scan-findings \
--repository-name mon-app \
--image-id imageTag=latest

4.3 Intégration CI/CD

# buildspec.yml
phases:
post_build:
commands:
- docker push $ECR_REPO:$IMAGE_TAG

# Attendre le scan
- |
aws ecr wait image-scan-complete \
--repository-name mon-app \
--image-id imageTag=$IMAGE_TAG

# Vérifier les vulnérabilités critiques
- |
CRITICAL=$(aws ecr describe-image-scan-findings \
--repository-name mon-app \
--image-id imageTag=$IMAGE_TAG \
--query 'imageScanFindings.findingSeverityCounts.CRITICAL' \
--output text)
if [ "$CRITICAL" != "None" ] && [ "$CRITICAL" -gt 0 ]; then
echo "Critical vulnerabilities found!"
exit 1
fi

5 - Lifecycle Policies

5.1 Exemples de policies

{
"rules": [
{
"rulePriority": 1,
"description": "Expire untagged images older than 14 days",
"selection": {
"tagStatus": "untagged",
"countType": "sinceImagePushed",
"countUnit": "days",
"countNumber": 14
},
"action": {
"type": "expire"
}
},
{
"rulePriority": 2,
"description": "Keep only 5 dev images",
"selection": {
"tagStatus": "tagged",
"tagPrefixList": ["dev-"],
"countType": "imageCountMoreThan",
"countNumber": 5
},
"action": {
"type": "expire"
}
},
{
"rulePriority": 3,
"description": "Keep last 20 release images",
"selection": {
"tagStatus": "tagged",
"tagPrefixList": ["v", "release-"],
"countType": "imageCountMoreThan",
"countNumber": 20
},
"action": {
"type": "expire"
}
}
]
}

5.2 Appliquer une policy

aws ecr put-lifecycle-policy \
--repository-name mon-app \
--lifecycle-policy-text file://lifecycle-policy.json

# Tester une policy (dry-run)
aws ecr get-lifecycle-policy-preview \
--repository-name mon-app \
--lifecycle-policy-text file://lifecycle-policy.json

6 - Cross-account et Cross-region

6.1 Repository policy pour cross-account

{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowCrossAccountPull",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::AUTRE_COMPTE_ID:root"
},
"Action": [
"ecr:GetDownloadUrlForLayer",
"ecr:BatchGetImage",
"ecr:BatchCheckLayerAvailability"
]
}
]
}

6.2 Réplication cross-region

ReplicationConfiguration:
Type: AWS::ECR::ReplicationConfiguration
Properties:
ReplicationConfiguration:
Rules:
- Destinations:
- Region: us-east-1
RegistryId: !Ref AWS::AccountId
RepositoryFilters:
- Filter: prod-
FilterType: PREFIX_MATCH

7 - ECR Public

# Créer un repository public
aws ecr-public create-repository \
--repository-name mon-app-public \
--region us-east-1

# Login au registre public
aws ecr-public get-login-password --region us-east-1 | \
docker login --username AWS --password-stdin public.ecr.aws

# Push vers public
docker tag mon-app:latest public.ecr.aws/x1y2z3/mon-app:latest
docker push public.ecr.aws/x1y2z3/mon-app:latest

8 - Pull Through Cache

Cache des images depuis registres publics (Docker Hub, etc.).

# Créer une règle de cache
aws ecr create-pull-through-cache-rule \
--ecr-repository-prefix docker-hub \
--upstream-registry-url registry-1.docker.io

# Utiliser l'image cachée
docker pull 123456789.dkr.ecr.eu-west-1.amazonaws.com/docker-hub/library/nginx:latest

Résumé

Dans ce chapitre, nous avons appris :

  • La création de repositories ECR
  • Le push et pull d'images
  • Le scan de vulnérabilités
  • Les lifecycle policies pour le nettoyage
  • La réplication cross-region et cross-account
  • ECR Public et Pull Through Cache

Prochaine étape

Dans le prochain chapitre, nous verrons CloudWatch et X-Ray pour le monitoring.

→ Chapitre suivant : CloudWatch et X-Ray


← Retour à la table des matières