跨Region复制镜像之前是AWS ECR缺失的功能,不过可以通过Cloudformation实现(https://github.com/aws-samples/amazon-ecr-cross-region-replication)。

在reInvent2020中,终于发布了ECR的Cross Region Replication (CRR)新功能 😄

CRR有以下优点:

  • 可以将镜像复制到其他帐号/区域, 减少了拉取镜像时带来的网络延迟,部署上线更快。
  • 高可用,毕竟同一份镜像分布在几个区域。

使用场景

假设有两个团队,开发团队位于欧洲(eu-west-1),运维团队位于美国(us-west-2)。

开发团队打包完镜像后,需要同步到运维团队所在的region。

有了CRR后,开发团队只需要通过CodePipeline将镜像上传到eu-west-1区域的仓库,此镜像就会自动同步到us-west-2区域,于是运维团队可以将此镜像部署到EKS/ECS上。

ECR cross region replication use case


CRR实践

我们将实现上面的场景,将上传到eu-west-1的镜像自动同步到us-west-2

默认情况下,CRR功能是关闭的,要在eu-west-1的ECR开启CRR

image-20201209214816984


复制的目标区域是us-west-2:

image-20201209214842321


eu-west-1创建一个仓库(下面全是通过cli创建,也可以通过console创建):

aws ecr create-repository --repository-name crr-test --region eu-west-1

创建完成后,在控制台显示如下:

image-20201209215533851

eu-west-1进行仓库登录授权:

aws ecr get-login-password --region eu-west-1 | \
    docker login --username AWS --password-stdin \
    123456789012.dkr.ecr.eu-west-1.amazonaws.com

将上面的123456789012替换成真实的AWS帐户ID


将镜像上传到源区域 (eu-west-1):

docker pull nginx 

docker tag nginx:latest 123456789012.dkr.ecr.eu-west-1.amazonaws.com/crr-test 
docker push 123456789012.dkr.ecr.us-west-2.amazonaws.com/mservice:42                     

将上面的123456789012替换成真实的AWS帐户ID



经过上面的步骤,镜像成功上传到了eu-west-1区域,现在切换到us-west-2区域进行验证:

aws ecr get-login-password --region us-west-2 | \
    docker login --username AWS --password-stdin \
    123456789012.dkr.ecr.us-west-2.amazonaws.com
    
docker pull 123456789012.dkr.ecr.us-west-2.amazonaws.com/crr-test   

可以查看下载成功的镜像:

image-20201209221128712

在AWS控制台的us-west-2区域,也可以查看:

image-20201209220848248


总结

需要注意以下两个细节:

  • 即使目标区域没有建立仓库,在CRR过程中会自动创建相同名称的仓库。
  • 如果进行跨帐户复制,目标帐户需要对源帐户进行授权。

CRR会带来以下额外的费用:

  • 目标区域(例如上面的us-west-2)的镜像存储费用。
  • 复制镜像时带来的跨region流量费用。在复制过程中,流量走的是公网

可以在https://aws.amazon.com/ecr/pricing/上查看对应的价格。


目前的CRR功能还是不完善的,将来会发布以下特性:

  • 查看实时复制进度的API。
  • 目前开启CRR后会复制所有仓库的镜像,太粗暴了。后面可以让用户选择特定的仓库进行CRR。
  • CRR完成后,发送通知事件。