Migrate AWS ECR From One AWS Region to Another AWS Region

Today we will see how to migrate all ECR images from one AWS region to another AWS region.

First, we will learn come basic.

To list the repositories in your AWS Elastic Container Registry (ECR) using the AWS CLI, you can use the following command:

1
2aws ecr describe-repositories
3

This command returns a list of repositories, along with their associated details such as the repository name, repository URI, and the registry ID.

You can also filter the list of repositories by using the --repository-names option, followed by a comma-separated list of repository names. For example:

1
2aws ecr describe-repositories --repository-names my-repo-1,my-repo-2
3

This command will return only the repositories with the names "my-repo-1" and "my-repo-2".

If you want to list only the names of the repositories, you can use the --query option to specify the field that you want to display. For example:

1
2aws ecr describe-repositories --query 'repositories[*].repositoryName'
3

This command will display only the names of the repositories in the output.

Now, Combine and make a bash script that you can use to copy all of the repositories in an AWS Elastic Container Registry (ECR) to another AWS region:

 1#!/bin/bash
 2
 3# Set the source and destination regions
 4src_region=us-west-2
 5dst_region=us-east-1
 6
 7# Get a list of all the repositories in the source region
 8repositories=$(aws ecr describe-repositories --region $src_region --query 'repositories[*].repositoryName' --output text)
 9
10# Loop through the list of repositories
11for repo in $repositories; do
12  # Get the URI of the repository in the source region
13  src_uri=$(aws ecr describe-repositories --region $src_region --repository-names $repo --query 'repositories[*].repositoryUri' --output text)
14  # Create a new repository with the same name in the destination region
15  aws ecr create-repository --region $dst_region --repository-name $repo
16  # Get the URI of the repository in the destination region
17  dst_uri=$(aws ecr describe-repositories --region $dst_region --repository-names $repo --query 'repositories[*].repositoryUri' --output text)
18  # Loop through all of the images in the repository
19  for image in $(aws ecr list-images --region $src_region --repository-name $repo --query 'imageIds[*]' --output text); do
20    # Get the image tag
21    tag=$(echo $image | awk -F: '{print $2}')
22    # Pull the image from the source region
23    docker pull $src_uri:$tag
24    # Tag the image with the destination URI
25    docker tag $src_uri:$tag $dst_uri:$tag
26    # Push the image to the destination region
27    docker push $dst_uri:$tag
28  done
29done
30

This script does the following:

1: Set the source and destination regions where the ECR repositories will be copied. 2: Get a list of all the repositories in the source region. 3: Loop through the list of repositories, and for each repository: 1: Get the URI of the repository in the source region. 2: Create a new repository with the same name in the destination region. 3: Get the URI of the repository in the destination region. 4: Loop through all of the images in the repository. 5: For each image: 1: Get the image tag. 2: Pull the image from the source region. 3: Tag the image with the destination URI. 4: Push the image to the destination region.

You can then run this script by saving it to a file (e.g. copy-repositories.sh) and running it with the bash command:

1
2bash copy-repositories.sh
3

Note that this script requires the aws and docker command-line utilities to be installed on the machine where the script is being run.

I :heart: AWS! :smile: Enjoy