我正在创建一个 cli 应用程序,我想用它来调用我的 AWS lambda 函数:
@click.group(context_settings={"help_option_names": ["-h", "--help"]}, invoke_without_command=True)
@click.version_option(version=__version__, prog_name="experiment")
def experiment():
pass
@experiment.command()
def lambda():
my_lambda_func(event, context) # Need to get event and context and store result
此 CLI 应用程序将安装在 docker 容器内。
因此,当我使用时:
experiment lambda
我的 lambda 代码将被执行。问题是我不知道如何获取事件和上下文对象
my_lambda_func
以及如何存储函数的结果。
这可能吗?互联网上唯一的资源只是使用直接函数名称
你不能直接从在 Docker 容器中运行的 Python 脚本传递
event
和
context
对象到 AWS Lambda 函数。这些对象是 Lambda 执行环境提供的,并且仅在函数在 Lambda 中运行时可用。
但是,你可以模拟
event
和
context
对象并将数据作为参数传递给你的 Lambda 函数。以下是如何执行此操作:
1. 修改你的 Lambda 函数以接收数据作为参数:
def my_lambda_func(event, context):
# 从 'event' 对象中获取数据
data = event.get('data')
# ...你的代码逻辑...
return {
'statusCode': 200,
'body': 'Lambda 函数执行成功!'
}
2. 从你的 CLI 应用程序中调用 Lambda 函数:
import json
import boto3
@experiment.command()
def lambda():
# 创建一个模拟的 'event' 对象
event = {
'data': '一些数据'
}
# 创建一个 Lambda 客户端
lambda_client = boto3.client('lambda')
# 调用 Lambda 函数并传递 'event' 数据
response = lambda_client.invoke(
FunctionName='你的Lambda函数名称',
InvocationType='RequestResponse',
Payload=json.dumps(event)
)
# 处理 Lambda 函数的响应
result = json.loads(response['Payload'].read().decode())
print(result)
在这个更新后的代码中:
-
我们创建一个模拟的
event
对象来存储要传递给 Lambda 函数的数据。 -
我们使用
boto3
库来调用 Lambda 函数,传递序列化后的event
对象作为Payload
。 - 我们从 Lambda 函数的响应中提取结果。
请记住:
-
将
'你的Lambda函数名称'
替换为你的实际 Lambda 函数名称。 - 确保你的 Docker 容器具有执行 Lambda 函数所需的必要 AWS 凭证。
-
你可以根据需要自定义
event
对象的结构来传递不同的数据。
通过这种方式,你可以在将数据发送到 Lambda 函数之前模拟
event
对象,并且仍然在 Lambda 函数内接收和使用该数据,即使它不是从 Lambda 环境中直接调用的。