我已经成功创建了一个读取和写入RDS的Lambda函数(app1)。
我的Lambda函数是用python2.7编写的,并以压缩包的形式上传。
我在与RDS和Lambda函数相同的VPC上的EC2实例上创建并测试了压缩包。
接下来,我在Lambda函数中添加了该功能,以使用subprocess.popen弹出一个独立的子进程(app2),并在app2子进程自行继续的同时使app1返回。我测试了app1将成功返回其处理程序的输出,而app2继续通过将60秒钟的睡眠置于app2中并跟踪app2的输出文件来继续。
我在EC2实例中成功测试了app1和app2功能。
上载新程序包后,我的app1看起来完全符合预期,并立即返回其处理程序的输出,但是app2功能没有“显示”为实例化,但是没有日志,错误或输出可从app2捕获。
在app1中,我通过在独立subproccess.popen之前和之后执行subprocess.check_output(['ls','-la'])来测试该子流程是否正常工作,并且本地文件夹与我的文件一起显示。除非没有按预期创建一个app2output文件。
两个问题
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)+"'}";
app1.py中“ logger.info('PID:'+ str(pid))”的输出
就像:“ PID:<位于0x7f51aba2a550的subprocess.Popen对象>”
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()
处理函数返回后,AWS Lambda环境将终止。处理程序功能完成后,您将无法在AWS Lambda环境中在后台运行子流程。您需要对Lambda函数进行编码,以等待子流程完成。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句