如何在无服务器框架中使用定制的Docker容器

eh57zj3b  于 2023-06-05  发布在  Docker
关注(0)|答案(2)|浏览(166)

我使用无服务器框架将Python函数部署到AWS lambda上
我的配置文件serverless.yml如下

frameworkVersion: "=1.27.3"

service: recipes

provider:
  name: aws
  endpointType: REGIONAL
  runtime: python3.6
  stage: dev
  region: eu-central-1
  memorySize: 512
  deploymentBucket:
    name: dfki-meta
  versionFunctions: false
  stackTags:
    Project: DFKIAPP
  # Allows updates to all resources except deleting/replacing EC2 instances
  stackPolicy:
    - Effect: Allow
      Principal: "*"
      Action: "Update:*"
      Resource: "*"
    - Effect: Deny
      Principal: "*"
      Action:
        - Update: Replace
        - Update: Delete
      Resource: "*"
      Condition:
        StringEquals:
          ResourceType:
            - AWS::EC2::Instance
  # Access to RDS and S3 Bucket
  iamRoleStatements:
    -  Effect: "Allow"
       Action: "s3:ListBucket"
       Resource: "*"

package:
  individually: true


functions:
  get_recipes:
    handler: handler.get_recipes
    module: recipes_crud
    package:
      include:
        - db/*
    timeout: 10
    events:
      - http:
          path: recipes
          method: get
          request:
            parameters:
              querystring:
                persona: true


plugins:
  # deploy conda package on lambda
  - serverless-python-requirements

custom:
  pythonRequirements:
    dockerizePip: non-linux
    dockerFile: prod_env_dockerfile/Dockerfile

我的docker文件

lambci/lambda:python3.6
FROM lambci/lambda-base:build

ENV PATH=/var/lang/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin \
    LD_LIBRARY_PATH=/var/lang/lib:/lib64:/usr/lib64:/var/runtime:/var/runtime/lib:/var/task:/var/task/lib \
    AWS_EXECUTION_ENV=AWS_Lambda_python3.6 \
    PYTHONPATH=/var/runtime \
    PKG_CONFIG_PATH=/var/lang/lib/pkgconfig:/usr/lib64/pkgconfig:/usr/share/pkgconfig

RUN rm -rf /var/runtime /var/lang && \
  curl https://lambci.s3.amazonaws.com/fs/python3.6.tgz | tar -xz -C / && \
  sed -i '/^prefix=/c\prefix=/var/lang' /var/lang/lib/pkgconfig/python-3.6.pc && \
  curl https://www.python.org/ftp/python/3.6.1/Python-3.6.1.tar.xz | tar -xJ && \
  cd Python-3.6.1 && \
  LIBS="$LIBS -lutil -lrt" ./configure --prefix=/var/lang && \
  make -j$(getconf _NPROCESSORS_ONLN) libinstall inclinstall && \
  cd .. && \
  rm -rf Python-3.6.1 && \
  pip3 install -U pip awscli virtualenv --no-cache-dir

RUN yum install -y wget
RUN wget https://repo.continuum.io/miniconda/Miniconda3-latest-Linux-x86_64.sh
RUN bash Miniconda3-latest-Linux-x86_64.sh -b -p $HOME/miniconda
RUN export PATH="$HOME/miniconda/bin:$PATH" && conda install -c prometeia -y pymssql

但似乎sls并没有使用我的dockerfile,它仍然创建了一个名为sls-py-reqs-custom的图像

(node:43146) ExperimentalWarning: The fs.promises API is experimental
Serverless: Installing requirements of recipes_crud/requirements.txt in .serverless/recipes_crud...
Serverless: Building custom docker image from prod_env_dockerfile/Dockerfile...
Serverless: Docker Image: sls-py-reqs-custom
Serverless: Packaging function: get_recipes...
Serverless: Excluding development dependencies...
Serverless: Injecting required Python packages to package...
Serverless: Uploading function: get_recipes (29.08 MB)...
Serverless: Successfully deployed function: get_recipes
Serverless: Successfully updated function: get_recipes

如何强制serverless使用我定制的docker?

dz6r00yl

dz6r00yl1#

你似乎有些困惑。我想主要回答你最初问题中的这两个评论:

  • 但似乎sls不使用我的dockerfile
  • 如何强制serverless使用我定制的docker?

TL;DR:**Serverless Framework不会使用你的Dockerfile,你不能强迫它使用。**这两种技术就像苹果和橘子。要解决这个问题,您的serverless.yaml必须简单地配置为查找函数处理程序的路径。
您正在使用一个名为docker-lambda的流行Docker映像。此映像仅用于本地测试。我能想到的最佳用例是,它可以在没有互联网连接的情况下使用(露营时编码,在没有WiFi的飞机上等)。
引用项目的README,此图像的唯一用途是:
使用它在同样严格的Lambda环境中运行你的函数,知道它们在实时部署时会表现出相同的行为。您还可以使用它来编译本机依赖项,知道您正在链接到AWS Lambda上存在的相同库版本,然后使用AWS CLI进行部署。
当你准备好打包/部署/等等。到AWS云,docker-lambda对您毫无用处。

e37o9pze

e37o9pze2#

AWS Lambda支持使用Docker映像作为函数的部署格式。这允许您创建更复杂的运行时环境,以更好地满足您的需求。
以下是如何配置serverless.yml文件以使用Docker的示例:

service: your-service-name

provider:
  name: aws
  runtime: provided
  lambdaHashingVersion: 20201221

functions:
  hello:
    image: 
      name: your-docker-image:tag
      command:
        - your.handler

在这个例子中,your-docker-image:tag是你想要用于Lambda函数的Docker镜像的名称。您应该将其替换为您自己的Docker镜像的名称。
你的.handler是你的函数的handler的路径。这应该是您的处理程序所在的文件的名称,以及处理程序本身的名称,用点分隔。
需要注意的是,Docker镜像需要上传到AWS的弹性容器注册表(ECR)。Serverless Framework会自动处理此过程,但请确保您具有使用ECR所需的权限。
还要注意,运行时设置为provided。这会指示AWS Lambda使用您随Docker映像提供的自定义运行时。
另一个重要的细节是lambdaHashingVersion:20201221。此选项是在AWS Lambda中使用容器映像所必需的,并表示正在使用新的哈希方案。

相关问题