簡體   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