AWS ECR Cross Region Replication
跨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上。
CRR实践
我们将实现上面的场景,将上传到eu-west-1
的镜像自动同步到us-west-2
。
默认情况下,CRR功能是关闭的,要在eu-west-1
的ECR开启CRR
:
复制的目标区域是us-west-2
:
在eu-west-1
创建一个仓库(下面全是通过cli创建,也可以通过console创建):
aws ecr create-repository --repository-name crr-test --region eu-west-1
创建完成后,在控制台显示如下:
在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
可以查看下载成功的镜像:
在AWS控制台的us-west-2
区域,也可以查看:
总结
需要注意以下两个细节:
- 即使目标区域没有建立仓库,在CRR过程中会自动创建相同名称的仓库。
- 如果进行跨帐户复制,目标帐户需要对源帐户进行授权。
CRR会带来以下额外的费用:
- 目标区域(例如上面的us-west-2)的镜像存储费用。
- 复制镜像时带来的跨region流量费用。在复制过程中,流量走的是公网
可以在https://aws.amazon.com/ecr/pricing/上查看对应的价格。
目前的CRR功能还是不完善的,将来会发布以下特性:
- 查看实时复制进度的API。
- 目前开启CRR后会复制所有仓库的镜像,太粗暴了。后面可以让用户选择特定的仓库进行CRR。
- CRR完成后,发送通知事件。