

lambdaとpythonの初学者です。  
以下のコードを実行しました。

[code]

    import boto3
    import json
    from collections import OrderedDict
    
    def handler(event, context):
        #必要な定数を定義
        BUCKET_NAME = event['bucket_name']
        BUCKET_KEY = event['bucket_key']
        UPLOAD_BUCKET_KEY = 'b.json'
        
        #a.json読込
        s3 = boto3.client('s3')
        obj = s3.get_object(Bucket=BUCKET_NAME, key=BUCKET_KEY)
        data = json.loads(obj['Body'].read().decode('utf-8'))
        print(f'{BUCKET_KEY}の内容: {data}')
        
        #b.sjonのアップロード
        s3 = boto3.resource('s3')
        obj = s3.Bucket(BUCKET_NAME).Object(UPLOAD_BUCKET_KEY)
        data = OrderedDict(file_name=UPLOAD_BUCKET_KEY, author=data['author'], age=(data['age']+1))
        
        res = obj.put(Body=json.dumps(data))
        if res['ResponseMetadata']['HTTPStatusCode'] == 200:
            print(f'[SUCCESS] upload {UPLOAD_BUCKET_KEY}')
        
        
    
[/code]

AWSのLambdaでテストを実行しました。  
その結果、以下のエラーが発生しました。

[code]

      "errorMessage": "'bucket_name'",
      "errorType": "KeyError",
      "requestId": "752f59f8-f95a-4903-8412-60334115be69",
      "stackTrace": [
        "  File \"/var/task/main.py\", line 7, in handler\n    BUCKET_NAME = event['bucket_name']\n"
      ]
    }
    
[/code]

lambdaのテストイベントは以下のように記述しました。

[code]

    {
      "BUCKET_NAME": "bucket_name",
      "BUCKET_KEY": "bucket_key"
    }
    
[/code]

ハンドラはmain.handlerと設定しこのコードの関数を呼ぶように指定しています。  
エラーの原因が分からずに困っています。

AWSのlambdaのテストイベントで修正をしました。

[code]

    {
      "bucket_name": "lambda-test-keein",
      "bucket_key": "a.json"
    }
    
[/code]

再度、テストを実行したところエラーが変わりました。

[code]

    VersionId, SSECustomerAlgorithm, SSECustomerKey, SSECustomerKeyMD5, RequestPayer, PartNumber, ExpectedBucketOwner",
      "errorType": "ParamValidationError",
      "requestId": "ed79a6d9-2510-42fe-8105-d43732124bb2",
      "stackTrace": [
        "  File \"/var/task/main.py\", line 13, in handler\n    obj = s3.get_object(Bucket=BUCKET_NAME, key=BUCKET_KEY)\n",
        "  File \"/var/runtime/botocore/client.py\", line 386, in _api_call\n    return self._make_api_call(operation_name, kwargs)\n",
        "  File \"/var/runtime/botocore/client.py\", line 677, in _make_api_call\n    request_dict = self._convert_to_request_dict(\n",
        "  File \"/var/runtime/botocore/client.py\", line 725, in _convert_to_request_dict\n    request_dict = self._serializer.serialize_to_request(\n",
        "  File \"/var/runtime/botocore/validate.py\", line 337, in serialize_to_request\n    raise ParamValidationError(report=report.generate_report())\n"
      ]
    
[/code]

}


CC BY-SA 4.0
2022-01-19T15:10:37.073
85803
2022-01-20T09:23:36.457
2022-01-20T09:23:36.457
43098
43098
question
python python3 aws-lambda
AWS Lambda のテストで KeyError (Python 3.9)


あまりPythonで書いたことはありませんが、

[code]

    {
      "BUCKET_NAME": "bucket_name",
      "BUCKET_KEY": "bucket_key"
    }
    
[/code]

辞書のkeyは、"BUCKET_NAME", "BUCKET_KEY"なので、valueを参照するなら、

[code]

        #必要な定数を定義
        BUCKET_NAME = event['BUCKET_NAME']
        BUCKET_KEY = event['BUCKET_KEY']
    
[/code]

ではないでしょうか？

[Python の Lambda 関数ハンドラー - AWS
Lambda](https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/python-
handler.html)


CC BY-SA 4.0
2022-01-19T19:07:14.213
85804
2022-01-19T19:07:14.213
4982
85803
answer