2016-08-24 3 views
1

Я успешно создал функцию Lambda (app1), которая читает и записывает в RDS.Независимый подпроцесс python от функции AWS Lambda

Моя функция Лямбда написана на python2.7 и загружена как пакет в молнии.

Я создал и протестировал пакет на молнии на экземпляре EC2 в том же VPC, что и моя функция RDS и Lambda.

Далее я добавил функциональность своей функции Lambda, чтобы открыть независимый подпроцесс (app2), используя subprocess.popen, и возвратил app1, в то время как подпроцесс app2 продолжался сам по себе. Я тестировал, что приложение 1 успешно вернет выход обработчика, пока приложение 2 продолжится, поставив 60 секундный спящий режим в app2 и завязывая выходной файл app2.

Я успешно протестировал функциональность app1 и app2 в экземпляре EC2.

После того, как вы загрузили новый пакет, я обнаружил, что приложение app1 работает точно так, как ожидалось, и сразу же возвращает результат обработчика, но функциональность приложения2 не появляется, чтобы создать экземпляр, но нет журналов, ошибок или вывода на захват из приложения2.

В приложении 1 я тестировал этот подпроцесс, выполнив подпроцесс.check_output (['ls', '- la']) до и после независимого subproccess.popen, и локальная папка отображается вместе с моими файлами. Кроме того, файл app2output не создается, как ожидалось.

Два вопроса

  1. Есть ли что-то особенное, что мне не хватает в AWS-Lambda понятий , что вызывает app2 на "провал"? Под «fail» я имею в виду не писать о создании нового файла и писать ему, ни создавать журналы в Cloudwatch так же, как это делает приложение 1, и не печатать на консоли Lambda, как это делает приложение1.
  2. Как я могу извлечь какой-либо вывод (информацию о регистрации и ошибки) для app2 в среде AWS-Lambda?

app1.py

import subprocess 
import sys 
import logging 
import rds_config 
import pymysql 
#rds settings 
rds_host = "rdshost" 
name = rds_config.db_username 
password = rds_config.db_password 
db_name = rds_config.db_name 
port = 3306 

logger = logging.getLogger() 
logger.setLevel(logging.INFO) 

server_address = (rds_host, port) 
try: 
    conn = pymysql.connect(rds_host, user=name, passwd=password, db=db_name, connect_timeout=5) 
except: 
    logger.error("ERROR: Unexpected error: Could not connect to MySql instance.") 
    sys.exit() 

def handler(event, context): 

    cur = conn.cursor() 
    isql = "INSERT ..." 
    cur.execute(isql) 
    conn.commit() 
    newid = cur.lastrowid 
    cur.close() 

    args = [str(newid),str(event['name'])] 

    logger.info('ARGS: '+str(args)) 
    print 'pwd: ' 
    output = subprocess.check_output(['pwd']) 
    print output 
    print 'ls -la' 
    output = subprocess.check_output(['ls','-l']) 
    print output 

    pid = subprocess.Popen([sys.executable, "app2.py"]+args, stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE) 

    logger.info('PID: '+str(pid)) 
    output = subprocess.check_output(['ls','-l']) 
    print output 

    return "{'status':'success','newid':'"+str(newid)+"'}"; 

Выходной сигнал от "logger.info ('ПИД:' + ул (PID))" в app1.py

, как: «ПИД : < subprocess.Popen объект на 0x7f51aba2a550 > "

app2

import sys 
import logging 
from datetime import datetime 
import time 

fo = open('app2output','a+') 
fo.write("starting with: "+str(sys.argv)+"\n") 

logger = logging.getLogger() 
logger.setLevel(logging.INFO) 
logger.info("Starting with: "+str(sys.argv)+"\n") 

#log accumulated processing time 
t1 = datetime.now(); 
sleep(60) 
t2 = datetime.now(); 
tstring = "{'t1':'"+str(t1)+"','t2':'"+str(t2)+"','args':'"+str(sys.argv[1])+"'}" 
logger.info(tstring+"\n") 
fo.write(tstring+"\n") 
fo.close() 
sys.exit() 

ответ

2

Окружающая среда AWS Lambda будет прекращена, как только функция обработчика вернется. Вы не можете запускать подпроцессы в фоновом режиме в среде AWS Lambda после завершения функции обработчика. Вам нужно будет закодировать свою функцию Lambda, чтобы дождаться завершения подпроцесса.

+0

Я думал, что это может быть проблемой. Я добавил 60 секундного спящего режима к app1 после вызова приложения2, но перед возвратом обработчика, и приложение 2 все еще не показало никакого прогресса. Я решил сделать app2 отдельной лямбда-функцией и попытаться запустить ее самостоятельно таким образом. Спасибо за ответ, и это правильно по моей заявленной цели. – Lance

Смежные вопросы