繁体   English   中英

Python AWS Lambda 执行新更新

[英]Python AWS Lambda Execution New Update

更新

我更改了参数以直接从 JSON 转储接收数据,以查看是否解决了 JSON 加载问题。 收到新错误:

(b'{\n "errorType": "ValidationMetadataException",\n "errorMessage": "The a' b'rgument is null or empty.提供一个不是null或空的参数,然后'b'尝试命令再次。",\n "stackTrace": [\n "at Amazon.Lambda.P' b'owerShellHost.PowerShellFunctionHost.ExecuteFunction(Stream inputStream, ILa' b'mbdaContext context)",\n "at lambda_method1(Closure, Stream , ILambda' b'上下文, Stream )",\n
“在 Amazon.Lambda.RuntimeSupport.Bootstrap.User' b'CodeLoader.Invoke(Stream lambdaData, ILambdaContext lambdaContext, Stream ou' b'tStream) 在 /src/Repo/Libraries/src/Amazon.Lambda.RuntimeSupport/ ' b'serCodeLoader.cs:line 145",\n "at Amazon.Lambda.RuntimeSupport.Handler' b'Wrapper.<>c__DisplayClass8_0.b__0(InvocationRequest invoc' b'ation) 在 /src/Repo/Libraries/src/ Amazon.Lambda.RuntimeSupport/Bootstrap/Han' b'dlerWrapper.cs:line 56",\n "at Amazon.Lambda.RuntimeSupport.LambdaBoot' b'strap.InvokeOnceAsync(CancellationToken cancellationToken) 在 /src/Repo/Libr' b 'aries/src/Amazon.Lambda.RuntimeSupport/Bootstrap/LambdaBootstrap.cs:line 176' b'"\n ]\n}\n')

仍然没有成功传递 lambda 名称。 代码已从上一篇文章更新。

================================================ ============ 原帖

我正在尝试执行 lambda function 到 python。当我对变量进行硬编码时,我可以成功地做到这一点,但是当我替换变量时,我无法处理 lambda。

这是具有硬编码值的工作示例:

params = {"value1": "value1-value", "value2": "value2-value", "value3": "value3-value"}
client = boto3.client('lambda')
response = client.invoke(
    FunctionName='MyLambdaFunctionName',
    InvocationType='RequestResponse',
    Payload=json.dumps(params).encode(),
)
pprint.pp(response['Payload'].read())

失败的部分是当我用变量替换参数时。 计划是将它们传入,正如我所说的值,但现在,我正在测试它并在 function 中设置值。下面列出了变量:

json_data | lambda 名称|

lambdaName = os.getenv('TF_VAR_lambdaName')
value1="value1-value"
value2="value2-value"
value3="value3-value"

data = {"value1": "value1-value", "value2": "value2-value", "value3": "value3-value"}

params = json.dumps(data)
client = boto3.client('lambda')
response = client.invoke(
    FunctionName=lambdaName,
    InvocationType='RequestResponse',
    Payload=json.dumps(params).encode(),
)
pprint.pp(response['Payload'].read())

当我硬编码 JSON 或 Lambda Function 名称时,我得到的错误消失了。

下面列出了我收到的错误日志:

> Traceback (most recent call last):   File
> "/Users/go/src/github.com/repo/./cleanup/cleanup.py", line 25, in
> <module>
>     response = client.invoke(   File "/Users/Library/Python/3.9/lib/python/site-packages/botocore/client.py",
> line 515, in _api_call
>     return self._make_api_call(operation_name, kwargs)   File "/Users/Library/Python/3.9/lib/python/site-packages/botocore/client.py",
> line 893, in _make_api_call
>     request_dict = self._convert_to_request_dict(   File "/Users/Library/Python/3.9/lib/python/site-packages/botocore/client.py",
> line 964, in _convert_to_request_dict
>     request_dict = self._serializer.serialize_to_request(   File "/Users/Library/Python/3.9/lib/python/site-packages/botocore/validate.py",
> line 381, in serialize_to_request
>     raise ParamValidationError(report=report.generate_report()) botocore.exceptions.ParamValidationError: Parameter validation failed:
> Invalid type for parameter FunctionName, value: None, type: <class
> 'NoneType'>, valid types: <class 'str'>

我认为您遇到的问题出在 lambda 的定义中:

lambdaName = os.getenv('TF_VAR_lambdaName')

尝试以下:

LAMBDA_NAME = os.environ.get('YOUR_LAMBDA_NAME') // make sure you put the exact name of your lambda in ''

比在您的代码中使用它:

response = client.invoke(
  FunctionName=LAMBDA_NAME,
  InvocationType='RequestResponse',
  Payload=json.dumps(params).encode()
)

社区,感谢您在这里的支持。 在同事的帮助下,我终于弄明白了。

那么第一个问题:

lambdaName = os.getenv('TF_VAR_lambdaName')

奇怪的是它不起作用,因为我已经使用导出了环境变量

export TF_VAR_lambdaName="我的函数名"

我最终使用 print 语句来检查值,但没有结果。 在谷歌上搜索了一下,找到了一篇帖子,其中有人建议重新运行导出以再次设置值,这就成功了。 我确实从 Olgas 的建议中吸取了一些,并按如下方式修改了导出:

LAMBDA_NAME = os.getenv('TF_VAR_lambdaName')

只是让变量全部大写以避免任何问题。

第二期:

事实证明这是一个简单的修复。 最重要的是我不需要

json.dumps(数据)

数据声明已经以params需要的格式传递。 起作用的只是将参数设置为等于数据,而 lambda 能够处理它。 最终工作代码如下:

#!/usr/bin/env python
import boto3
import json
import pprint
import os    

LAMBDA_NAME = os.getenv('TF_VAR_lambdaName')
    value1="value1-value"
    value2="value2-value"
    value3="value3-value"
    
    data = {"value1": value1, "value2": value2 "value3": value3}
    
    params = data
    client = boto3.client('lambda')
    response = client.invoke(
        FunctionName=LAMBDA_NAME,
        InvocationType='RequestResponse',
        Payload=json.dumps(params).encode(),
    )
    pprint.pp(response['Payload'].read())

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM