Как мне исправить программу, которая правильно работает на локальном сервере, но не запускается после развертывания в AWS?

#amazon-web-services #api #aws-lambda #aws-api-gateway #chalice

#amazon-web-services #API #aws-lambda #aws-api-gateway #чаша

Вопрос:

Я относительно разбираюсь в программировании, особенно в том, что касается проблемы, с которой я сталкиваюсь в отношении выполнения post-запросов через amazon web services и использования запросов API.

В настоящее время у меня есть программа, написанная ниже.

 from chalice import Chalice
import requests, json
import alpaca_trade_api as tradeapi
app = Chalice(app_name='tradingview-webhook-alerts')
API_KEY = 'API'
SECRET_KEY = 'SECRET'
BASE_URL = "https://paper-api.alpaca.markets"
ORDERS_URL = "{}/v2/orders".format(BASE_URL)
HEADERS = {'APCA-API-KEY-ID': API_KEY, 'APCA-API-SECRET-KEY': SECRET_KEY}

@app.route('/GDX',methods=['POST'])
def GDX():
    request = app.current_request
    webhook_message = request.json_body
    
    p = 1-(webhook_message['close'] / webhook_message['high'])
    if p<.0175: #if the high price for the 15m candle is 3% higher than the close, thee excution will not occur
        data = {
        "symbol": webhook_message['ticker'], #want it to access whatever the payload message is, payload message I believe is what the alert from Trading_View will send
        "qty": 8,
        "side": "buy",
        "type": "limit",
        "limit_price": webhook_message['close'],
        "time_in_force": "gtc",
        "order_class": "bracket",
        #need to find out the average max profit per trade
        "take_profit": {
        "limit_price": webhook_message['close'] * 1.0085 #take 0.6%% profit
        },
        "stop_loss": {
            "stop_price": webhook_message['close'] * 0.95, #stop loss of 6%
            "limit_price": webhook_message['close'] * 0.93
        }
        }
        r = requests.post(ORDERS_URL, json=data, headers=HEADERS)   

        response = json.loads(r.content)
        print(response)
        print(p)

        return {
        'message': 'I bought the stock!',
        'webhook_message': webhook_message
        }
    else:
        return{
            'message': 'stock not purchased',
            'webhook_message': webhook_message
        }

@app.route('/buy_SLV',methods=['POST'])
def buy_stock():
    request = app.current_request
    webhook_message = request.json_body
    
    data = {
    "symbol": webhook_message['ticker'], #want it to access whatever the payload message is, payload message I believe is what the alert from Trading_View will send
    "qty": 4,
    "side": "buy",
    "type": "limit",
    "limit_price": webhook_message['close'],
    "time_in_force": "gtc",
    "order_class": "bracket",
    "take_profit": {
    "limit_price": webhook_message['close'] * 1.008 #take 1% profit
    },
    "stop_loss": {
        "stop_price": webhook_message['close'] * 0.95, #stop loss of 2%
        "limit_price": webhook_message['close'] * 0.94
    }
}

    r = requests.post(ORDERS_URL, json=data, headers=HEADERS)   

    response = json.loads(r.content)
    print(response)
    print(response.keys())

    return {
        'message': 'I bought the stock!',
        'webhook_message': webhook_message
    }

@app.route('/GDX_UpperBB',methods=['POST'])
def GDX_UpperBB():
    request = app.current_request
    webhook_message = request.json_body

    api = tradeapi.REST(API_KEY, SECRET_KEY, base_url=BASE_URL)
    ids = []

    orders = api.list_orders(
    limit=100,
    nested=True  # show nested multi-leg orders
    )
    
    GDX_orders = [o for o in orders if o.symbol == 'GDX']
    for i in GDX_orders:
        ids.append(i.id)
        if len(orders)>0:
            print(ids)
            for i in ids:
                api.cancel_order(i)
        else:
            print('there are no orders')

    return{
        'message': 'I bought the stock!',
        'webhook_message': webhook_message
    }
  

первые два метода работают нормально (как через AWS, так и на локальном сервере). Третий метод (GDX_UpperBB) — это то, из-за чего все перестает работать. Когда я запускаю программу на локальном сервере и вызываю метод GDX_UpperBB, он выполняется без проблем. но когда я развертываю программу через API веб-службы Amazon через chalice, я получаю ответ 502 BadGateway с "message": "Internal server error" возвратом.

Когда я захожу в AWS и тестирую метод, я получаю ответ консоли (я удалил примерно первую половину ответа, потому что он был длинным, и все говорило, что он был выполнен успешно)

 Mon Oct 26 00:46:51 UTC 2020 : Received response. Status: 200, Integration latency: 15 ms
Mon Oct 26 00:46:51 UTC 2020 : Endpoint response headers: {Date=Mon, 26 Oct 2020 00:46:51 GMT, Content-Type=application/json, Content-Length=127, Connection=keep-alive, x-amzn-RequestId=621b56f9-6bee-43af-8fe2-7f2cbeb7420e, X-Amz-Function-Error=Unhandled, x-amzn-Remapped-Content-Length=0, X-Amz-Executed-Version=$LATEST, X-Amzn-Trace-Id=root=1-5f961c7b-0a211c4e04be837554d0857f;sampled=0}
Mon Oct 26 00:46:51 UTC 2020 : Endpoint response body before transformations: {"errorMessage": "Unable to import module 'app': No module named 'alpaca_trade_api'", "errorType": "Runtime.ImportModuleError"}
Mon Oct 26 00:46:51 UTC 2020 : Lambda execution failed with status 200 due to customer function error: Unable to import module 'app': No module named 'alpaca_trade_api'. Lambda request id: 621b56f9-6bee-43af-8fe2-7f2cbeb7420e
Mon Oct 26 00:46:51 UTC 2020 : Method completed with status: 502
  

любая помощь приветствуется.

Комментарии:

1. Ошибка говорит о том, что вам не хватает некоторых зависимостей: нет модуля с именем ‘alpaca_trade_api’

2. итак, где это должно быть установлено / добавлено в программу выше? Он работает правильно на локальном хосте, поэтому я просто не понимаю, где мне следует устранять эту проблему

3. Вы должны связать все зависимости с вашим пакетом развертывания lambda или предоставить их через уровень lambda.

4. Обратите внимание, что этот код также не сработал бы на вашем локальном компьютере, если бы вы ранее явно не установили alpaca_trade_api.

5. @StephenMarkos Это сработало, когда вы добавили зависимость?

Ответ №1:

Вам нужно либо добавить зависимость в свой requirements.txt файлер или добавьте код в каталог поставщика из вашего основного каталога проекта