如何设置一个需要访问s3的dockerfile,并将其推送到ECS中运行的ECR



我刚接触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

为了做到这一点,你需要两个宏工作流:

  1. 用于构建映像并将其推送到ECR。你可以在本地(你的笔记本电脑需要有信用才能推送到ECR)或通过CodeBuild这样的服务(构建项目需要有一个IAM角色关联到它可以推送到ECR)。
  2. 第二个工作流将包括部署一个ECS任务,该任务提取容器映像并运行它。ECS任务需要有一个IAM角色,允许它从ECR中提取数据(除了读取/放入S3之外)。

要使AWS命令工作,您需要在docker映像中设置AWS访问密钥和秘密密钥,这些密钥可以通过env变量摄取。但这不是推荐的最佳实践。

如果你的自动化过程,那么你可以有一个EC2实例或代码构建与适当的IAM角色从S3下载文件之前docker构建

最新更新