带有类的AWS Lambda Python处理程序
您好,我设计了一个本地工作的python脚本,但是我想将其推送到AWS Lambda,我在类中创建处理程序时遇到了一些问题。我已经找到了如何通过在类之外创建处理程序函数来消除lambda中的“处理程序错误”,但不幸的是,该函数没有运行我的其余代码。我的目标是将“lambda_handler”函数放在我的类中,或者让该函数调用该类。非常感谢您的建议带有类的AWS Lambda Python处理程序,python,aws-lambda,Python,Aws Lambda,您好,我设计了一个本地工作的python脚本,但是我想将其推送到AWS Lambda,我在类中创建处理程序时遇到了一些问题。我已经找到了如何通过在类之外创建处理程序函数来消除lambda中的“处理程序错误”,但不幸的是,该函数没有运行我的其余代码。我的目标是将“lambda_handler”函数放在我的类中,或者让该函数调用该类。非常感谢您的建议 #!/usr/bin/python import sys import os import json import time from dateti
#!/usr/bin/python
import sys
import os
import json
import time
from datetime import datetime, timedelta
key = 'OKTA_AUTH'
### key = os.environ['OKTA_AUTH'] #####
outcome = 'outcome.result eq "FAILURE"'
event_type = 'eventType eq "application.provision.user.deactivate"'
app_id = 'target.id eq "SOME OKTA APP ID"'
all_params = f'{event_type} and {app_id} and {outcome}'
api_url = 'https://domain.okta.com/api/v1/logs'
slack_url = "SLACK URL"
last_hour_date_time = datetime.utcnow() - timedelta(days=10)
since = str(last_hour_date_time.strftime('%Y-%m-%dT%H:%M:%S.000Z'))
actor_list=[]
unique_list=[]
class Events:
def lambda_handler(event, context):
okta_auth()
def okta_auth(self):
event_list=[]
url = api_url.format()
params = {
'filter': all_params,
'since': since
}
response = requests.get(url, params=params,
headers={'Accept': 'application/json',
'authorization': key})
response_json = response.json()
for event_data in response_json:
events = event_data['outcome']['reason']
event_list.append(events)
actors = event_data['actor']['alternateId']
actor_list.append(actors)
unique_set = set(actor_list)
unique_list.append(unique_set)
if event_list != []:
self.post_slack()
else:
sys.exit(0)
def post_slack(self):
url = slack_url.format()
payload = "{\"text\": \" Twillio Flex provisioing failure. Please check the following users %s \"}" % (unique_list)
requests.post(url, headers={'Accept': 'application/json'}, data=payload)
### newly added code
if __name__ == "__main__":
Events().lambda_handler()
### end
####ORIGINAL CODE USED TO BE
#if __name__ == "__main__":
# Events().okta_auth()
你的职能
def lambda_handler(event, context):
print(event)
仅打印事件,不执行任何其他操作。我想这就是为什么lambda什么都没做。lambda_处理程序是lambda的入口点。经过深入研究,我发现我的代码和AWS lambda的工作方式遇到了两个问题。第一个问题是我如何在Lambda中调用该类,我认为必须在类中包含函数,但我创建了一个函数来运行该类
def lambda_handler(event, context):
Events().okta_auth() #### the function (okta_auth) within the class (Events)
我的第二个问题是通过内联代码部署Lambda默认情况下没有安装requests模块。因此,我创建了一个本地目录,然后安装了pip3请求,并将python脚本移动到其中。然后可以压缩文件夹内容并上传到aws lambda
mkdir lambda_deploy
pip3 install --target ./lambda_deploy/ requests
cd lambda_deploy/
zip -r9 ${OLDPWD}/function.zip .
下面是最后的代码供参考
#!/usr/bin/python
import requests
import sys
import os
import json
import time
from datetime import datetime, timedelta
key = os.environ['OKTA_AUTH']
outcome = 'outcome.result eq "FAILURE"'
event_type = 'eventType eq "application.provision.user.deactivate"'
target_type = 'target.type eq "User"'
app_id = 'target.id eq "SOME APP ID"'
all_params = f'{event_type} and {target_type} and {app_id} and {outcome}'
api_url = f'https://domain.okta.com/api/v1/logs'
slack_url = "some slack WEBHOOK URL"
last_hour_date_time = datetime.utcnow() - timedelta(days=1)
since = str(last_hour_date_time.strftime('%Y-%m-%dT%H:%M:%S.000Z'))
unique_set=[]
def lambda_handler(event, context):
Events().okta_auth()
class Events:
def okta_auth(self):
event_list=[]
url = api_url.format()
params = {
'filter': all_params,
'since': since
}
response = requests.get(url, params=params,
headers={'Accept': 'application/json',
'authorization': key})
response_json = response.json()
for event_data in response_json:
events = event_data['outcome']['reason']
targets = event_data['target']
parse = list(map(lambda x: x['alternateId'], targets))
target_list=[]
event_list.append(events)
target_list.append(parse[1])
for item in target_list:
if item not in unique_set:
unique_set.append(item)
if event_list != []:
self.post_slack()
else:
print("no errors today")
def post_slack(self):
url = slack_url.format()
payload = "{\"text\": \" Twilio Flex provisioing failure. Please check the following users: \n %s \"}" % '\n'.join(unique_set)
requests.post(url, headers={'Accept': 'application/json'}, data=payload)
是否可以在我的类中添加lambda_处理程序函数,并在lambda仍能识别lambda_处理程序的情况下调用其他函数?