首页 > 解决方案 > AWS Lambda Docker 容器问题(权限被拒绝)

问题描述

我正在使用执行机器学习模型的 AWS Lambda 部署 Docker 容器。但是,每当我尝试加载保存的检查点时,在尝试读取本地文件系统或根据我存储模型的位置找不到目录时都会收到权限被拒绝消息...?

这是相关的 Dockerfile:

FROM public.ecr.aws/lambda/python:3.8

# copy requirements.txt file to the container
COPY requirements.txt ./

# upgrade pip and install the python requirements from requirements.txt
RUN python3.8 -m pip install \
        --upgrade pip
RUN python3.8 -m pip install \
        -r requirements.txt

# Copy function code
COPY app.py ./

# Install the runtime interface client
RUN python3.8 -m pip install \
        awslambdaric

# clean up image for small container
RUN find . -type d -name "tests" -exec rm -rf {} +
RUN find . -type d -name "__pycache__" -exec rm -rf {} +
RUN find . -type d -name "include" -exec rm -rf {} +
RUN rm -rf ./{caffe2,wheel,wheel-*,pkg_resources,boto*,aws*,pip,pip-*,pipenv,setuptools}
RUN rm -rf ./{*.egg-info,*.dist-info}
RUN find . -name \*.pyc -delete
RUN find . -type d -name "test" -exec rm -rf {} +
RUN ls -R -al

# update linux libraries
RUN yum update -y

# install python3 and unzip
RUN yum install -y python3 unzip

# pull model files
RUN mkdir ./model
RUN curl https://somewhere.com/model.zip -o ./model/model.zip
RUN unzip ./model/model.zip -d ./model
RUN chmod 644 ./model
RUN chmod -R 644 ./model/*
RUN rm ./model/model.zip

WORKDIR ./
ENTRYPOINT [ "python3", "-m", "awslambdaric" ]
CMD [ "app.lambda_handler" ]

和 app.py:

from __future__ import print_function
import json, time
import urllib.request
from jose import jwk, jwt
from jose.utils import base64url_decode
from sentence_transformers import SentenceTransformer, util

model = ModelFunction('/model')


def lambda_handler(event, context):

    body = json.loads(event['body'])

    token = body['jwttoken']
    utterance = body['utterance']
    comparestring = body['comparestring']

    # generate embeddings for each phrase
    embeddings1 = model.encode(utterance, convert_to_tensor=True)
    embeddings2 = model.encode(comparestring, convert_to_tensor=True)

    # compute score
    score = util.embeddings(embeddings1, embeddings2)

    # output score
    print("Score:")
    print(score.item())

    return {
        "statusCode": 200,
        "score": json.dums(score.item())
    }

    # the following is useful to make this script executable in both
    # AWS Lambda and any other local environments
if __name__ == '__main__':
    event = {
        'token': '',
        'email': 'somewhere@somewhere.com'}
    lambda_handler(event, None)

一些相关的错误消息:

[ERROR] PermissionError: [Errno 13] Permission denied: './model/modules.json'
Traceback (most recent call last):
  File "/var/lang/lib/python3.8/imp.py", line 234, in load_module
    return load_source(name, filename, file)
  File "/var/lang/lib/python3.8/imp.py", line 171, in load_source
    module = _load(spec)
  File "<frozen importlib._bootstrap>", line 702, in _load
  File "<frozen importlib._bootstrap>", line 671, in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 848, in exec_module
  File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
  File "/var/task/app.py", line 8, in <module>
    model = model('./model')
  File "/var/lang/lib/python3.8/site-packages/model/model.py", line 115, in __init__
    with open(os.path.join(model_path, 'modules.json')) as fIn:

[ERROR] FileNotFoundError: [Errno 2] No such file or directory: '/home/sbx_user1051/.cache/model'
Traceback (most recent call last):
  File "/var/lang/lib/python3.8/imp.py", line 234, in load_module
    return load_source(name, filename, file)
  File "/var/lang/lib/python3.8/imp.py", line 171, in load_source
    module = _load(spec)
  File "<frozen importlib._bootstrap>", line 702, in _load
  File "<frozen importlib._bootstrap>", line 671, in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 848, in exec_module
  File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
  File "/var/task/app.py", line 8, in <module>
    model = model('/model')
  File "/var/lang/lib/python3.8/site-packages/model/model.py", line 101, in __init__
    shutil.rmtree(model_path)
  File "/var/lang/lib/python3.8/shutil.py", line 709, in rmtree
    onerror(os.lstat, path, sys.exc_info())
  File "/var/lang/lib/python3.8/shutil.py", line 707, in rmtree
    orig_st = os.lstat(path)

有任何想法吗?我想我没有将模型检查点存储在正确的目录中?由于 NDA 等原因,上述日志已被删除。

标签: python-3.xamazon-web-servicesdockeraws-lambda

解决方案


尝试运行:

chmod 644 $(find . -type f)
chmod 755 $(find . -type d)

在您尝试部署的文件上。

正如AWS Docs所说,如果文件未设置为可由任何用户执行,则可能存在权限问题。


推荐阅读