Безсерверный питон получает unabe для импорта обработчика модуля и, вероятно, не корректно докеризируется с sls deploy - PullRequest
0 голосов
/ 23 января 2019

ошибка, которую я получаю:

{
    "errorMessage": "Unable to import module 'handler'"
}

  Error --------------------------------------------------

  Invoked function failed

     For debugging logs, run again after setting the "SLS_DEBUG=*" environment variable.

  Get Support --------------------------------------------
     Docs:          docs.serverless.com
     Bugs:          github.com/serverless/serverless/issues
     Issues:        forum.serverless.com

  Your Environment Information -----------------------------
     OS:                     darwin
     Node Version:           10.6.0
     Serverless Version:     1.28.0

, следуя инструкциям на https://serverless.com/blog/serverless-python-packaging/, не импортирует необходимую упаковку.

Активированная виртуальная среда для Python3 на Mac. установил файл require.txt. sls развернуть. Ничто не похоже на работу. каждый раз, когда я пытаюсь вызвать функцию, она говорит, что не может импортировать обработчик модуля.

Я также попытался выполнить https://docs.aws.amazon.com/elasticsearch-service/latest/developerguide/es-aws-integrations.html#es-aws-integrations-s3-lambda-es-deployment-package, создав нечто подобное в консоли aws, но безрезультатно. Это делает ту же ошибку. Искал несколько дней. любая помощь приветствуется.

работает macos high sierra, python 3.7.2;



provider:
  name: aws
  runtime: python3.6

custom:
  pythonRequirements:
    dockerizePip: non-linux
    slim: true
    usePipenv: false
    zip: true

package:
  exclude:
  - venv/**
  - .idea/**
  - .git/**

  iamRoleStatements:
    - Effect: "Allow"
      Action:
        - "es:ESHttpGet"
      Resource: "arn:aws:es:***"




functions:
  providerSearch:
    handler: handler.providerSearch

    events:
      - http:
          path: providers/search
          method: get
          cors: true
plugins:
  - serverless-python-requirements
  - serverless-plugin-include-dependencies
resources:
  Resources:
    GatewayResponseDefault4XX:
      Type: 'AWS::ApiGateway::GatewayResponse'
      Properties:
        ResponseParameters:
          gatewayresponse.header.Access-Control-Allow-Origin: "'*'"
          gatewayresponse.header.Access-Control-Allow-Headers: "'*'"
        ResponseType: DEFAULT_4XX
        RestApiId:
          Ref: 'ApiGatewayRestApi'

если посмотреть на размер загруженного файла, он слишком мал

Serverless: Adding Python requirements helper...
Serverless: Generated requirements from /Users/****/providerSearch2/requirements.txt in /Users/****/providerSearch2/.serverless/requirements.txt...
Serverless: Installing requirements from /Users/****/providerSearch2/.serverless/requirements/requirements.txt ...
Serverless: Docker Image: lambci/lambda:build-python3.6
Serverless: Zipping required Python packages...
Serverless: Packaging service...
Serverless: Excluding development dependencies...
Serverless: Removing Python requirements helper...
Serverless: Injecting required Python packages to package...
Serverless: Uploading CloudFormation file to S3...
Serverless: Uploading artifacts...
Serverless: Uploading service .zip file to S3 (525.17 KB)...
Serverless: Validating template...
Serverless: Updating Stack...
Serverless: Checking Stack update progress...
..............
Serverless: Stack update finished...

вот код handler.py

import boto3
import json
import requests
from requests_aws4auth import AWS4Auth

region = 'us-east-1'  # For example, us-west-1
service = 'es'
credentials = boto3.Session().get_credentials()
awsauth = AWS4Auth(
    credentials.access_key, credentials.secret_key, region,
    service, session_token=credentials.token
)

host = 'https://***s.amazonaws.com'
# For example, search-mydomain-id.us-west-1.es.amazonaws.com
index = 'providerprofile'
url = 'https://' + host + '/' + index + '/_search'


# Lambda execution starts here
def providerSearch(event, context):

    # Put the user query into the query DSL for more accurate search results.
    # Note that certain fields are boosted (^).
    query = {
        "size": 10,
        "query": {
            "multi_match": {
                "query": event['queryStringParameters']['q'],
                "fields": [
                    "Insurance^4",
                    "LicensedStates^2",
                    "ProviderName",
                    "ClientConcerns",
                    "CostOfService",
                    "Description",
                    "Specialty^2",
                    "TypesOfTherapy",
                    "Education",
                ]
            }
        }
    }

    # ES 6.x requires an explicit Content-Type header
    headers = {"Content-Type": "application/json"}

    # Make the signed HTTP request
    r = requests.get(
        url, auth=awsauth, headers=headers, data=json.dumps(query))

    # Create the response and add some extra content to support CORS
    response = {
        "statusCode": 200,
        "headers": {
            "Access-Control-Allow-Origin": '*'
        },
        "isBase64Encoded": False
    }

    # Add the search results to the response
    response['body'] = r.text
    return response

ожидаемые результаты должны состоять в том, чтобы правильно докеризовать контейнер и загрузить его в aws lambda для использования в качестве триггера поиска.

...