<p><strong>编辑:</strong>正如@Marcin所说,第一个答案提供了适用于262MB以下大容量软件包的作品</p>
<h2>A.Lambda层大小限制内的Python包</h2>
<p>您还可以使用AWS sam cli和Docker(请参见此<a href="https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-sam-cli-install.html" rel="nofollow noreferrer">link</a>安装sam cli)在容器中构建包。基本上,您使用<code>Python</code>作为运行时初始化默认模板,然后在<code>requirements.txt</code>文件下指定包。我发现这比你提到的那篇文章容易。如果你想考虑它们以供将来使用,我会让你采取步骤。<p>
<h2>一,。初始化默认SAM模板</h2>
<p>在要保留项目的任何文件夹下,可以键入</p>
<pre><code>sam init
</code></pre>
<p>这将引发一系列问题,对于快速设置,我们将选择以下快速启动模板</p>
<pre><code>1 - AWS Quick Start Templates
2 - Python 3.8
Project name [sam-app]: your_project_name
1 - Hello World Example
</code></pre>
<p>通过选择<code>Hello World Example</code>,它会生成一个带有<code>requirements.txt</code>文件的默认<code>lambda function</code>。现在,我们将使用您想要的包的名称进行编辑,在本例中为<code>xgboost</code></p>
<h2>二,。指定要安装的软件包</h2>
<pre><code>cd your_project_name
code hello_world/requirements.txt
</code></pre>
<p>由于我使用visualstudio代码作为编辑器,这将打开其中的文件。现在,我可以指定<code>xgboost</code>包</p>
<pre><code>your_python_package
</code></pre>
<p>下面是安装Docker的原因。一些包依赖于<code>C++</code>。因此,建议在容器内构建(Windows上的案例)。现在,移动到<code>template.yaml</code>文件所在的文件夹。然后,输入</p>
<pre><code>sam build -u
</code></pre>
<h2>三,。拉链包装</h2>
<p>有些文件不希望包含在lambda层中,因为我们只希望保留python库。因此,您可以删除以下文件</p>
<pre><code>rm .aws-sam/build/HelloWorldFunction/app.py
rm .aws-sam/build/HelloWorldFunction/__init__.py
rm .aws-sam/build/HelloWorldFunction/requirements.txt
</code></pre>
<p>然后压缩文件夹的剩余内容</p>
<pre><code>cp -r .aws-sam/build/HelloWorldFunction/ python/
zip -r my_layer.zip python/
</code></pre>
<p>我们根据<a href="https://docs.aws.amazon.com/lambda/latest/dg/configuration-layers.html#configuration-layers-create" rel="nofollow noreferrer">docs</a>将层放置在<code>python/</code>文件夹中
在Windows系统上<code>zip</code>命令应替换为
<code>Compress-Archive my_layer/ my_layer.zip.</code></p>
<h2>四,。将图层上载到AWS</h2>
<p>在AWS上转到<code>Lambda</code>,然后选择<code>Layers</code>和<code>Create Layer</code>。现在,您可以上传<code>.zip</code>文件,如下图所示</p>
<p><a href="https://i.stack.imgur.com/W1nw4.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/W1nw4.png" alt="enter image description here"/></a></p>
<p>注意,对于超过50MB的zip文件,您应该将<code>.zip</code>文件上载到s3存储桶,并提供路径,例如<code>https://s3:amazonaws.com//mybucket/my_layer.zip</code></p>
<h2>B.超过Lambda层限制的Python包</h2>
<p><code>xgboost</code>包本身超过300MB,将抛出以下错误</p>
<p><a href="https://i.stack.imgur.com/9np2A.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/9np2A.png" alt="enter image description here"/></a></p>
<p>正如@Marcin善意地指出的,SAM cli的先前方法不会直接适用于超出限制的Python层。运行<code>sam build -u</code>时<a href="https://github.com/awslabs/aws-sam-cli/issues/1231" rel="nofollow noreferrer">github</a>上存在一个未解决的问题,即指定自定义docker映像,以及可能的解决方案重新标记默认<code>lambda/lambci</code>映像</p>
<p>那么,我们怎样才能度过这一关呢?。我只想指出一些有用的资源</p>
<ul>
<li>首先,@Alex采用的<a href="https://medium.com/@lucashenriquessilva/how-to-create-a-aws-lambda-python-layer-db2830e08b12" rel="nofollow noreferrer">Medium</a>文章作为这个<a href="https://github.com/makalaia/aws-lambda-layer-setup/blob/master/lambda_data_layer.sh" rel="nofollow noreferrer">repo code</a>之后的解决方案</李>
<li>第二种是<a href="https://github.com/alexeybutyrev" rel="nofollow noreferrer">alexeybutyrev</a>方法,它通过应用<a href="https://en.wikipedia.org/wiki/Strip_(Unix)" rel="nofollow noreferrer">strip</a>命令来减小库的大小。可以在github <a href="https://github.com/alexeybutyrev/aws_lambda_xgboost" rel="nofollow noreferrer">repo</a>下找到这种方法,提供了说明</李>
</ul>
<h2>编辑(2020年12月)</h2>
<p>本月AWS发布了对AWS Lambda的<a href="https://aws.amazon.com/es/blogs/aws/new-for-aws-lambda-container-image-support/" rel="nofollow noreferrer">container Image</a>支持。遵循项目的下一个树结构</p>
<pre><code>Project/
| app/
| | app.py
| | requirements.txt
| | xgb_trained.bin
| Dockerfile
</code></pre>
<p>您可以使用以下Docker映像部署XGBoost模型。按照本<a href="https://github.com/gokavak/lambda-docker-image-pytorch-xgboost" rel="nofollow noreferrer">repo</a>说明进行详细说明</p>
<pre><code># Dockerfile based on https://docs.aws.amazon.com/lambda/latest/dg/images-create.html
# Define global args
ARG FUNCTION_DIR="/function"
ARG RUNTIME_VERSION="3.6"
# Choose buster image
FROM python:${RUNTIME_VERSION}-buster as base-image
# Install aws-lambda-cpp build dependencies
RUN apt-get update && \
apt-get install -y \
g++ \
make \
cmake \
unzip \
libcurl4-openssl-dev \
git
# Include global arg in this stage of the build
ARG FUNCTION_DIR
# Create function directory
RUN mkdir -p ${FUNCTION_DIR}
# Copy function code
COPY app/* ${FUNCTION_DIR}/
# Install python dependencies and runtime interface client
RUN python${RUNTIME_VERSION} -m pip install \
target ${FUNCTION_DIR} \
no-cache-dir \
awslambdaric \
-r ${FUNCTION_DIR}/requirements.txt
# Install xgboost from source
RUN git clone recursive https://github.com/dmlc/xgboost
RUN cd xgboost; make -j4; cd python-package; python${RUNTIME_VERSION} setup.py install; cd;
# Multi-stage build: grab a fresh copy of the base image
FROM base-image
# Include global arg in this stage of the build
ARG FUNCTION_DIR
# Set working directory to function root directory
WORKDIR ${FUNCTION_DIR}
# Copy in the build image dependencies
COPY from=base-image ${FUNCTION_DIR} ${FUNCTION_DIR}
ENTRYPOINT [ "/usr/local/bin/python", "-m", "awslambdaric" ]
CMD [ "app.handler" ]
</code></pre>