当前位置: 首页 > 知识库问答 >
问题:

使用Lambda在AWS Codestar中安装Python依赖项

吕飞翼
2023-03-14

我正在试用AWS Codestar。我的目标是部署一个非平凡的lambdaendpoint,即处理程序具有依赖关系的地方。理想情况下,我希望能够在需求中指定它们。txt文件,但这似乎不是那么简单。具体地说,我想部署一个依赖于nltk的lambda处理程序,其中nltk标记器“punkt”的文件作为代码构建过程的一部分下载,并为lambda打包。

如何通过buildspec实现这一点。yml模板。yml?下面,我试图将pip依赖项安装到子目录lib,并将其包含在zip工件中。

运行时,Codebuild能够安装依赖项、导入nltk并运行测试,部署到Lambda成功,并且正确的文件被打包到lib子文件夹中(我下载了ZIP文件以进行检查),但我在Lambda日志中看到错误:无法导入模块“索引”:没有名为“nltk”的模块。

这里是我的buildspec.yml

    version: 0.2

    phases:
      install:
        commands:
          - pip install -r requirements.txt -t lib
          # Upgrade AWS CLI to the latest version
          - pip install --upgrade awscli

      pre_build:
        commands:
          - python -V
          - export PYTHONPATH=$PYTHONPATH:./lib
          - export HOME_DIR=`pwd`
          - mkdir $HOME_DIR/nltk_data/
          - export NLTK_DATA=$HOME_DIR/nltk_data
          - python -m nltk.downloader -d $NLTK_DATA punkt
          - python -m unittest discover tests

      build:
        commands:
          - aws cloudformation package --template template.yml --s3-bucket 
$S3_BUCKET --output-template template-export.yml

    artifacts:
      type: zip
      files:
        - template-export.yml
        - '**/*'

我的template.yml:

    Resources:
      HelloWorld:
        Type: AWS::Serverless::Function
        Properties:
          Handler: index.handler
          Runtime: python3.6
          Environment:
            Variables:
              PYTHONPATH: ./lib
          Role:
            Fn::ImportValue:
              !Join ['-', [!Ref 'ProjectId', !Ref 'AWS::Region', 'LambdaTrustRole']]
          Events:
            GetEvent:
              Type: Api
              Properties:
                Path: /
                Method: get
            PostEvent:
              Type: Api
              Properties:
                Path: /
                Method: post

共有1个答案

董弘新
2023-03-14

上述方法不起作用的原因是,无论出于何种原因,PYTHONPATH在AWS Lambda上不起作用(即使它似乎与Codebuild一起工作)。下面的配置工作正常。

buildspec.yml:

    version: 0.2

    phases:
      install:
        commands:
          - pip install -r requirements.txt -t .
          # Upgrade AWS CLI to the latest version
          - pip install --upgrade awscli

      pre_build:
        commands:
          - python -V
          - export HOME_DIR=`pwd`
          - mkdir $HOME_DIR/nltk_data/
          - export NLTK_DATA=$HOME_DIR/nltk_data
          - python -m nltk.downloader -d $NLTK_DATA punkt
          - python -m unittest discover tests

      build:
        commands:
          - aws cloudformation package --template template.yml --s3-bucket 
$S3_BUCKET --output-template template-export.yml

    artifacts:
      type: zip
      files:
        - template-export.yml
        - '**/*'

我的template.yml:

    Resources:
      HelloWorld:
        Type: AWS::Serverless::Function
        Properties:
          Handler: index.handler
          Runtime: python3.6
          Environment:
            Variables:
              NLTK_DATA: ./nltk_data
          Role:
            Fn::ImportValue:
              !Join ['-', [!Ref 'ProjectId', !Ref 'AWS::Region', 'LambdaTrustRole']]
          Events:
            GetEvent:
              Type: Api
              Properties:
                Path: /
                Method: get
            PostEvent:
              Type: Api
              Properties:
                Path: /
                Method: post
 类似资料:
  • If you have just checked out a package from version control, you will need to install those dependencies. If you are adding dependencies for your project, then those dependencies are automatically ins

  • 问题内容: 我是python的新手。最近,我有一个用python编写的项目,需要进行一些安装。我运行以下命令进行安装,但出现错误。 我在Google上搜索并找到了此链接,但我不太了解该帖子中的解决方案。 以下是我的requirements.txt文件: 有没有简单的方法来在此python项目中安装所有必需的依赖项? 编辑1 以下是的输出。 我已经安装了,但是pip命令仍然报告缺少此依赖项。 问题答

  • 安装包时(通过使用python setup.py install),依赖项从python包索引(pypi.python.org)获取。但我的目标主机无法访问internet。我已将依赖项放在本地目录下,如下所示。 通过运行?

  • 我试图使用playwright在我的java应用程序中生成pdfs。这是一个很好的区域设置,但是当使用Beanstalk在ec2上部署它时,我会遇到以下错误:

  • 使用AWS SAM时,我曾运行命令,该命令将遍历我的所有Lambda函数包并安装它们的依赖项(在它们上运行)。 如何使用AWS CDK实现相同的行为?它似乎不是自动完成的,还是我遗漏了什么?