【问题标题】:Serverless wsgi unable to import werkzeug无服务器 wsgi 无法导入 werkzeug
【发布时间】:2020-06-04 19:37:07
【问题描述】:

我在将无服务器应用程序部署到 AWS 时遇到问题。在 AWS 中,日志显示:

Unable to import module 'wsgi_handler': No module named 'werkzeug'

我已在我的 requirements.txt 中明确指定 werkzeug,但似乎当我运行 sls deploy 时,指定的包没有放入上传到我的 S3 存储桶的 zip 文件中。

下面是我的 serverless.yml 文件的副本:

service: serverless-flask
plugins:
  - serverless-python-requirements
  - serverless-wsgi
  - serverless-dynamodb-local
custom:
  tableName: 'transactions-table-${self:provider.stage}'
  wsgi:
    app: app.app # entrypoint is app.app, which means the app object in the app.py module.
    packRequirements: false
  pythonRequirements:
    dockerizePip: true
  dynamodb:
    stages:
      - test
      - dev
    start:
      migrate: true

provider:
  name: aws
  runtime: python3.6
  stage: dev
  region: us-east-1
  iamRoleStatements:
    - Effect: Allow
      Action:
        - dynamodb:Query
        - dynamodb:Scan
        - dynamodb:GetItem
        - dynamodb:PutItem
      Resource:
        - { "Fn::GetAtt": ["TransactionsDynamoDBTable", "Arn" ] }
  environment:
    TRANSACTIONS_TABLE: ${self:custom.tableName}

functions:
  app:
    handler: wsgi_handler.handler
    events:
      - http: ANY /
      - http: 'ANY {proxy+}'
resources:
  Resources:
    TransactionsDynamoDBTable:
      Type: 'AWS::DynamoDB::Table'
      Properties:
        AttributeDefinitions:
          -
            AttributeName: transactionId
            AttributeType: S
          -
            AttributeName: timestamp
            AttributeType: S
        KeySchema:
          -
            AttributeName: transactionId
            KeyType: HASH
          -
            AttributeName: timestamp
            KeyType: RANGE
        ProvisionedThroughput:
          ReadCapacityUnits: 1
          WriteCapacityUnits: 1
        TableName: ${self:custom.tableName}

这是我的 requirements.tx:

boto3==1.11.17
botocore==1.14.17
Click==7.0
docutils==0.15.2
Flask==1.1.1
itsdangerous==1.1.0
Jinja2==2.11.1
jmespath==0.9.4
MarkupSafe==1.1.1
python-dateutil==2.8.1
s3transfer==0.3.3
six==1.14.0
urllib3==1.25.8
Werkzeug==1.0.0

据我所知,使用 serverless-wsgi 插件应该会自动处理此软件包的安装,但我没有看到 .serverless 文件夹或 serverless 创建的 zipfile 中没有创建 .requirements 文件夹。

压缩包内包含的 requirements.txt 文件仅包含以下内容:

-i https://pypi.org/simple

我不确定自己做错了什么,但到目前为止唯一的解决方案是拆除基础设施并使用不理想的新 URL 重新部署。

【问题讨论】:

    标签: aws-lambda wsgi serverless requirements.txt


    【解决方案1】:

    您需要手动将文件添加到包中。 在你的 serverless.yml 中,添加这个

    package:
      individually: true
      exclude:
        - ./**
      include:
        - requirements.txt
        - <other files>
    

    部署后,您可以从 AWS 下载打包的 zip 并验证您的文件是否存在。

    【讨论】:

      【解决方案2】:

      添加对 lambda 层的引用对我有用(请参阅层部分):

        api:
          timeout: 30
          handler: wsgi_handler.handler
          layers:
            - {Ref: PythonRequirementsLambdaLayer}
          events:
            - http: ANY /
      

      【讨论】:

        猜你喜欢
        • 2021-04-27
        • 2017-03-06
        • 2020-07-08
        • 2020-05-28
        • 2013-10-28
        • 1970-01-01
        • 1970-01-01
        • 2012-12-10
        • 1970-01-01
        相关资源
        最近更新 更多