Elastic Beanstalk Docker容器,用于访问S3存储桶中的数据



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

唯一公开的终点是S3检索csv文件并以原始格式发布数据,这种配置运行良好,所以我知道弹性豆茎上的角色和权限可以正确地到达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桶的访问权限?

调试时,我发现我没有在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" ]

最新更新