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