我需要一个用户请求从一个网络应用程序调用一个AWS Chalice端点,触发一个长期运行的作业。我不能让用户的浏览器等待响应。
Chalice在API中自动创建REST,所以这应该是可能的,因为它不是HTTP。
如何在AWS Chalice中实现端点,它在执行附加的Lambda函数之前立即响应用户?
我知道InvocationType: Event头它应该允许这样,但这并没有影响,端点不会异步调用Lambda (客户机在作业完成20-30秒后得到响应)。
以下是Chalice应用程序中端点的大致样子:
@app.route('/api-v1/runLongJob', methods=['PUT'])
def run_long_job():
# do some stuff that takes a long time here
return {'status_code': 200}我还将InvocationType设置为API网关控制台中的Method request部分中的标题:
关于如何使用InvocationType头调用这个端点的示例:
url = "https://----------.execute-api.xx-xxxx-x.amazonaws.com/api/v1-api/runLongJob"
data = {
'some parameter': 'some data'
}
headers = {
'Content-Type': 'application/json',
'InvocationType': 'Event'
}
r = requests.put(
url,
data=json.dumps(data),
headers=headers
)如何在Chalice应用程序中创建异步端点?
发布于 2022-11-28 10:48:22
解决方案是在Chalice中使用.lambda_function特性以及调用调用中的invocationType='Event'参数,如下所示:
import boto3
from chalice import Chalice
lambda_client = boto3.client('lambda')
app = Chalice(app_name='api')
LOG.setLevel(logging.INFO)
@app.route('/v1/lambdaTest')
def test_endpoint():
LOG.info(datetime.now().strftime('%Y-%m-%d %H:%M:%S'))
_ = lambda_client.invoke(
FunctionName="api-dev-testFunction",
InvocationType='Event',
Payload="{}"
)
LOG.info(datetime.now().strftime('%Y-%m-%d %H:%M:%S'))
return {'status_code': 200}
@app.lambda_function(name='testFunction')
def test_lambda_function(event, context):
LOG.info(datetime.now().strftime('%Y-%m-%d %H:%M:%S'))
time.sleep(20)
LOG.info(datetime.now().strftime('%Y-%m-%d %H:%M:%S'))这将生成两个lambda函数,一个用于API,一个用于异步任务。调用API时,响应是即时的,但任务需要20秒才能完成。
注意,我必须手动允许API在AWS控制台中调用另一个。
https://stackoverflow.com/questions/74589325
复制相似问题