我刚接触docker和AWS ECR &;ECS服务
我有一个小的web scraper图像在本地运行,我现在正试图将其移动到AWS。
web scraper结果将保存在a.txt中,该a.txt已移动到s3,因此web scraper应用程序需要在开始时读取a.txt,最后修改并更新它。更具体地说:dockerfile中的以下脚本将数据从s3移动到容器中:
from python:3.7-slim
run aws s3 cp s3://bucket_name/path_to_a.txt local_path_to_a.txt
然后,app.py将读取数据并进行处理。在代码末尾,下面的脚本将更新s3中的a.t txt:
boto3.resource('s3').Bucket(bucket_name).upload_file(local_path_to_a.txt, s3://bucket_name/path_to_a.txt)
这是我目前的工作流程,所以简而言之,dockerfile需要将文件从s3复制到容器中,脚本app.py会写回来。
现在我陷入了这个问题:要在本地构建映像以推送到ECR,我需要给aws访问dockerfile:
# syntax = docker/dockerfile:experimental
run --mount=type=secret,id=aws,target=/root/.aws/credentials
aws s3 cp s3://bucket_name/path_to_a.txt local_path_to_a.txt
因此,我的问题是这是在ECR + ECS中工作的正确方式吗?我知道我可能需要通过设置IAM角色来访问容器,但是,我仍然需要在本地构建映像而没有任何错误,这需要从本地机器访问aws。
在我看来,一个更好的工作流程是创建一个容器映像,其中只包含一个Python应用程序,该应用程序执行以下操作:
- 从S3复制数据到容器
- 处理容器中的数据以生成新的数据版本
- 将(新)数据从容器放回S3
为了做到这一点,你需要两个宏工作流:
- 用于构建映像并将其推送到ECR。你可以在本地(你的笔记本电脑需要有信用才能推送到ECR)或通过
CodeBuild
这样的服务(构建项目需要有一个IAM角色关联到它可以推送到ECR)。 - 第二个工作流将包括部署一个ECS任务,该任务提取容器映像并运行它。ECS任务需要有一个IAM角色,允许它从ECR中提取数据(除了读取/放入S3之外)。
要使AWS命令工作,您需要在docker映像中设置AWS访问密钥和秘密密钥,这些密钥可以通过env变量摄取。但这不是推荐的最佳实践。
如果你的自动化过程,那么你可以有一个EC2实例或代码构建与适当的IAM角色从S3下载文件之前docker构建