Я успешно создал функцию 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 не создается, как ожидалось.
Два вопроса
- Есть ли что-то особенное, что мне не хватает в AWS-Lambda понятий , что вызывает app2 на "провал"? Под «fail» я имею в виду не писать о создании нового файла и писать ему, ни создавать журналы в Cloudwatch так же, как это делает приложение 1, и не печатать на консоли Lambda, как это делает приложение1.
- Как я могу извлечь какой-либо вывод (информацию о регистрации и ошибки) для 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()
Я думал, что это может быть проблемой. Я добавил 60 секундного спящего режима к app1 после вызова приложения2, но перед возвратом обработчика, и приложение 2 все еще не показало никакого прогресса. Я решил сделать app2 отдельной лямбда-функцией и попытаться запустить ее самостоятельно таким образом. Спасибо за ответ, и это правильно по моей заявленной цели. – Lance