AWS Lambda中缺少处理程序错误

时间:2018-01-15 15:36:01

标签: python amazon-web-services aws-lambda

对基本问题道歉。我对AWS和Python都是全新的。我正在尝试在https://boto3.readthedocs.io/en/latest/guide/migrations3.html#accessing-a-bucket中提供示例代码但面临错误。

import botocore
import boto3
s3 = boto3.resource('s3')
bucket = s3.Bucket('bucketname')
exists = True


try:
    s3.meta.client.head_bucket(Bucket='bucketname')
except botocore.exceptions.ClientError as e:
    # If a client error is thrown, then check that it was a 404 error.
    # If it was a 404 error, then the bucket does not exist.
    error_code = int(e.response['Error']['Code'])
    if error_code == 404:
        exists = False 

日志错误

  

“errorMessage”:“模块上缺少处理程序'lambda_handler'   'lambda_function'“

3 个答案:

答案 0 :(得分:6)

您需要在代码中定义一个函数。代码缺少名为lambda_handler的函数。您的代码应如下所示:

    import botocore
    import boto3

    def lambda_handler(event, context):
        s3 = boto3.resource('s3')
        bucket = s3.Bucket('bucketname')
        exists = True

        try:
            s3.meta.client.head_bucket(Bucket='bucketname')
        except botocore.exceptions.ClientError as e:
            # If a client error is thrown, then check that it was a 404 error.
            # If it was a 404 error, then the bucket does not exist.
            error_code = int(e.response['Error']['Code'])
            if error_code == 404:
                exists = False

答案 1 :(得分:0)

将代码移动到python函数中。您可以给它起任何名字,但是它将成为您的处理程序。转到lambda函数基本设置,然后将默认处理程序更改为 Dim r As Long Worksheets("Output").Activate r = 1 'What we are doing here with "loopcell" is to check if the destination cells in the "output" sheet are empty or free. 'If not, we go down 1 row. loopcell: If IsEmpty(Range("A" & r).Value) = True Then Range("A" & r).Value = "_" & theId & "_" & theKey Else r = r + 1 GoTo loopcell End If 'The key is wrote to the the cell but we need to split every element of the key in multiple cells. splitOutput = Range("A" & r).Value splitArray = Split(splitOutput, "_") For i = 1 To UBound(splitArray) Cells(r, i).Value = splitArray(i) Next i Debug.Print theId & " " & theKey End Sub ``` ** New GetDictionary and Deserialize methods used to store more info ** Sub DeserializeKey(ByVal theKey As String, theId As Variant) 'This is where you'd do some stuff to 'turn the key into individual cells, and store it. 'I'm only writing to the debug widnow to demonstrate Dim output As String 'Keep in mind that we have a 2d array, and we are reading 'one row at a time. So get the number of columns in the 'array, and then do whatever you need with them. For i = LBound(theId, 2) To UBound(theId, 2) output = output & " " & theId(1, i) Next i Debug.Print theKey & " -->" & output End Sub Function GetDictionary(inputRange As Range) As Object Dim oDict As Object Dim sht As Worksheet Dim cel As Range Dim theKey As String Dim oQueue As Object Dim columnCount As Long Dim rngAsArray As Variant Set sht = inputRange.Parent 'Get the column count of the input range. Since we don't 'hardcode it in, this function is more flexible to 'future changes columnCount = inputRange.Columns.Count Set oDict = CreateObject("Scripting.Dictionary") For Each cel In Intersect(inputRange, sht.Columns(1)) theKey = GenerateKey(cel.Resize(, 5)) 'Put the full row into an array, which we will then 'store as the content of the queue rngAsArray = cel.Resize(, columnCount).Value If oDict.Exists(theKey) Then oDict(theKey).enqueue rngAsArray Else Set oQueue = CreateObject("System.Collections.Queue") oQueue.enqueue rngAsArray oDict.Add theKey, oQueue End If Next cel Set GetDictionary = oDict End Function 。默认情况下,当创建lambda函数时,文件名将为<yourfilename>_<yourfunctionname>(可以更改),而处理程序方法将为lambda_fcunction_name.py(可以更改),因此入口点为{{ 1}}。

答案 2 :(得分:-1)

Kishna_mee2004是正确的,您需要定义lambda_handler,否则它将永远无法工作,但是如果出现以下错误:

  

模块'jobdata_rdcmedia_s3_Etl_job_scheduler_lambda'中缺少处理程序'py':'module'对象没有属性'py'

然后,您需要检查处理程序信息,是否提及lambda_function_name.lambda_handler