AWS Lambda函数的独立python子流程

我已经成功创建了一个读取和写入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文件。

两个问题

  1. AWS-Lambda概念中缺少某些导致app2“失败”的特殊信息吗?所谓“失败”,是指既不编写与创建新文件并对其进行写入,也不以与app1成功一样的方式在Cloudwatch中创建任何日志,也不像app1一样输出到Lambda控制台。
  2. 如何在AWS Lambda环境中捕获app2的任何输出(日志信息和错误)?

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()
马克B

处理函数返回后,AWS Lambda环境将终止。处理程序功能完成后,您将无法在AWS Lambda环境中在后台运行子流程。您需要对Lambda函数进行编码,以等待子流程完成。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

AWS Lambda 上的 Python 函数

来自分类Dev

在AWS Lambda python函数中捕获异常

来自分类Dev

如何使用 AWS CLI 创建 Python AWS Lambda 函数?

来自分类Dev

回调到AWS Lambda函数

来自分类Dev

从Lambda函数访问AWS Elasticsearch

来自分类Dev

使用pyaudio的AWS Lambda函数

来自分类Dev

如何重用AWS Lambda函数?

来自分类Dev

Java 中的 AWS Lambda 函数

来自分类Dev

AWS Lambda 函数无法连接?

来自分类Dev

从 aws lambda 函数与 mongodb 通信

来自分类Dev

SDK AWS 和 Lambda 函数

来自分类Dev

部署多个 AWS Lambda 函数

来自分类Dev

在python AWS Lambda函数中从python访问json请求

来自分类Dev

在AWS Lambda上将ImageMagick作为python子进程运行

来自分类Dev

在AWS Lambda函数中使用Python多处理队列

来自分类Dev

如何使用aws lambda函数在Python中调用bash脚本?

来自分类Dev

为什么我的AWS Lambda函数返回null?(Python代码)

来自分类Dev

AWS Lambda python函数对我的图片没有任何作用

来自分类Dev

在AWS Lambda脚本中使用多个Python函数

来自分类Dev

用于调用python函数的AWS Lambda给出了关键错误

来自分类Dev

在 Lambda Python 函数中循环访问 AWS 账户

来自分类Dev

AWS Lambda + Python-ldap

来自分类Dev

用于捕获 AWS MQ 的 AWS 云监视日志并发送到 kinesis 的 Python Lambda 函数

来自分类Dev

AWS Lambda copyObject“在完成请求之前退出流程”

来自分类Dev

如何使用AWS CLI创建AWS Lambda函数?

来自分类Dev

在AWS Lambda函数之间共享通用数据

来自分类Dev

通过http请求调用AWS Lambda函数

来自分类Dev

AWS Lambda函数生命周期

来自分类Dev

AWS Lambda函数的跨账户角色