Elastic Beanstalk Docker 容器用于访问 S3 存储桶以获取数据

Posted

技术标签:

【中文标题】Elastic Beanstalk Docker 容器用于访问 S3 存储桶以获取数据【英文标题】:Elastic Beanstalk Docker container to access S3 bucket for data 【发布时间】:2021-07-24 01:15:15 【问题描述】:

我有一个非常简单的烧瓶项目,只有一个端点,我可以使用 Elastic Beanstalk 将其部署到 AWS 中

唯一暴露的端点是 S3 检索 csv 文件并以原始格式发布数据,此配置工作正常,所以我知道弹性 beanstalk 的角色和权限可以正常工作以到达 S3 存储桶。

from flask import Flask
from flask_restful import Resource, Api
import io
import boto3
import pandas as pd

application = Flask(__name__)
api = Api(application)

s3 = boto3.resource('s3')
bucket = 'my_bucket'
key = 'my_file.csv'

class Home(Resource):
  def get(self):
    
    try:
      s3 = boto3.resource('s3')
      obj = s3.Object(bucket, key).get()['Body']
      data = pd.read_csv(io.BytesIO(obj.read()))
      print("S3 Object loaded.")
    except:
      print("S3 Object could not be opened.")
      
    print(data)
    csv = data.to_csv(index=False)
    return csv

#End points definition and application raise up
api.add_resource(Home, '/')

if __name__ == '__main__':
    application.run(host='0.0.0.0')

现在我正在尝试将其移动到容器中,因此我创建了一个 Dockerfile 来封装最小的应用程序:

# syntax=docker/dockerfile:1

FROM python:3.8-slim-buster

WORKDIR /app

COPY requirements.txt requirements.txt
RUN pip3 install -r requirements.txt

COPY . .

CMD [ "python3", "-m" , "flask", "run", "--host=0.0.0.0"]

由于我没有额外的卷或任何额外的东西,我的 Dockerrun.aws.json 几乎是空的


  "AWSEBDockerrunVersion": "1"

我缺少一些东西来获取从容器内部访问 S3 存储桶的权限?

【问题讨论】:

不确定,有什么问题?有任何错误消息吗? 我认为我可能错过了将权限从 EC2 实例传递到容器的某种方式,但我刚刚意识到我没有在 docker 文件中公开端口,这就是为什么它无法正确部署 【参考方案1】:

在调试时,我发现我没有在 dockerfile 中公开端口,因此它无法正确部署容器。我还添加了 python 作为入口点,并将脚本名称添加为 cmd。

最后经过一番调查也意识到容器继承了宿主所有的角色权限,所以不需要做任何额外的任务

我的 docker 文件最终看起来像这样:

# syntax=docker/dockerfile:1

FROM python:3.8-slim-buster

WORKDIR /app

COPY requirements.txt requirements.txt
RUN pip3 install -r requirements.txt

EXPOSE 5000

COPY . .

ENTRYPOINT [ "python" ]

CMD [ "app.py" ]

【讨论】:

以上是关于Elastic Beanstalk Docker 容器用于访问 S3 存储桶以获取数据的主要内容,如果未能解决你的问题,请参考以下文章

AWS Elastic Beanstalk - 多容器 Docker

AWS Elastic Beanstalk Docker 环境变量

Elastic Beanstalk、Docker 和持续集成

Elastic Beanstalk 上的 WebSockets 与 Docker

Elastic Beanstalk Docker 映像无法拉取

Elastic Beanstalk 多容器 Docker 环境变量