質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
AWS Lambda

AWS Lambdaは、クラウド上でアプリを実行できるコンピューティングサービス。サーバーのプロビジョニングや管理を要せず複数のイベントに対してコードを実行します。カスタムロジック用いた他AWSサービスの拡張やAWSの規模やパフォーマンスを用いたバックエンドサービスを作成できます。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

12204閲覧

AWS Lambda のテストでParamValidationError

saito5940

総合スコア63

AWS Lambda

AWS Lambdaは、クラウド上でアプリを実行できるコンピューティングサービス。サーバーのプロビジョニングや管理を要せず複数のイベントに対してコードを実行します。カスタムロジック用いた他AWSサービスの拡張やAWSの規模やパフォーマンスを用いたバックエンドサービスを作成できます。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2022/01/20 09:32

lambdaとpythonの初学者です。
python3.9
以下のコードをlambdaでテストを実行しました。

pythonファイル名:main.py

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}')

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

{ "bucket_name": "lambda-test-keein", "bucket_key": "a.json" }

AWSのS3バケット内のa.jsonを読み込んで、修正を加えb.jsonとしてアップロードします。
ハンドラをmain.handler

このテストを実行したところ。以下のエラーが発生しました。

{ "errorMessage": "Parameter validation failed:\nMissing required parameter in input: \"Key\"\nUnknown parameter in input: \"key\", must be one of: Bucket, IfMatch, IfModifiedSince, IfNoneMatch, IfUnmodifiedSince, Key, Range, ResponseCacheControl, ResponseContentDisposition, ResponseContentEncoding, ResponseContentLanguage, ResponseContentType, ResponseExpires, 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" ] } main.pyの obj = s3.get_object(Bucket=BUCKET_NAME, key=BUCKET_KEY)が問題あるようですが、何が問題なのか分かりません。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

saito5940

2022/01/20 13:55

ログは以下になります。 START RequestId: 47156317-f357-4a08-8cf8-c3cf4bbf8d54 Version: $LATEST [ERROR] ParamValidationError: Parameter validation failed: Missing required parameter in input: "Key" Unknown parameter in input: "key", must be one of: Bucket, IfMatch, IfModifiedSince, IfNoneMatch, IfUnmodifiedSince, Key, Range, ResponseCacheControl, ResponseContentDisposition, ResponseContentEncoding, ResponseContentLanguage, ResponseContentType, ResponseExpires, VersionId, SSECustomerAlgorithm, SSECustomerKey, SSECustomerKeyMD5, RequestPayer, PartNumber, ExpectedBucketOwner Traceback (most recent call last): File "/var/task/main.py", line 13, in handler obj = s3.get_object(Bucket=BUCKET_NAME, key=BUCKET_KEY) File "/var/runtime/botocore/client.py", line 386, in _api_call return self._make_api_call(operation_name, kwargs) File "/var/runtime/botocore/client.py", line 677, in _make_api_call request_dict = self._convert_to_request_dict( File "/var/runtime/botocore/client.py", line 725, in _convert_to_request_dict request_dict = self._serializer.serialize_to_request( File "/var/runtime/botocore/validate.py", line 337, in serialize_to_request raise ParamValidationError(report=report.generate_report())END RequestId: 47156317-f357-4a08-8cf8-c3cf4bbf8d54 REPORT RequestId: 47156317-f357-4a08-8cf8-c3cf4bbf8d54 Duration: 76.56 ms Billed Duration: 77 ms Memory Size: 128 MB Max Memory Used: 67 MB
saito5940

2022/01/20 13:56

"Key"で怒られているような・・。
guest

回答1

0

ベストアンサー

get_objectの引数に"Key"がなくて"key"があるとエラーが出ているので、keyの頭文字を大文字にして試してみてください。

python

1obj = s3.get_object(Bucket=BUCKET_NAME, Key=BUCKET_KEY)

投稿2022/01/20 10:23

non_cal

総合スコア13

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

saito5940

2022/01/20 13:51

ありがとうございます。大文字にしたのですが、エラーに変化がないです。
non_cal

2022/01/21 01:24

エラー内容を見るに実行しているコードではまだkeyのままになっているようです。 テストする前にDeployはおこないましたか?
saito5940

2022/01/21 16:40 編集

一旦、削除してからKeyの部分を確認して再度、ファイルをアップロードして実行しました。解決しました。 しかしkey Errorが出力されました。 { "errorMessage": "'author'", "errorType": "KeyError", "stackTrace": [ " File \"/var/task/main.py\", line 20, in handler\n data = OrderedDict(file_name=UPLOAD_BUCKET_KEY, author=data['author'], age=(data['age']+1))\n" ] } というのが出て悩んでいます。
non_cal

2022/01/22 01:55

KeyErrorなのでおそらくdataという辞書にauthorというキーがないエラーです。 その前にdataの内容をprintしているので、authorが含まれているか確認してください。 これ以上は表題の質問と異なった内容になるので、分からないようでしたら別の質問として投稿してください。
saito5940

2022/01/23 08:16

解決しました。ありがとうございました。 S3のファイルにauthorがありませんでした。authorを記述したら。動作しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問