2017-12-19 16 views
0

私は、次のJSONとラムダテストイベントを経て正常に動作しているJavaベースのラムダ関数を持っている:ラムダ関数からREST APIを作成

{ 
    "married": "true", 
    "wages": "200000", 
    "homeInterest": "15000", 
    "propertyTaxes": "15000", 
    "stateTaxes": "13000", 
    "otherDeductions": "4000", 
    "postalCode": "11762" 
} 

私は、アマゾンAPIゲートウェイ経由でAPIを作成しました。生成されたURLの本体と同じJSONを貼り付けると、フィールドは正しくマップされません。

ラムダハンドラは、要求と応答のためのPOJOを使用している:

public class TaxHandler implements RequestHandler<TaxRequest, TaxResponse>{ 

    public TaxResponse handleRequest(TaxRequest request, Context context){ 

私はAPIゲートウェイのテストを経てテストするとき、私は、次の情報を参照してください。要求のテスト要求

ため

実行ログを

Tue Dec 19 02:01:16 UTC 2017 : Starting execution for request: test-invoke-request 
Tue Dec 19 02:01:16 UTC 2017 : HTTP Method: POST, Resource Path: /TaxCalculation 
Tue Dec 19 02:01:16 UTC 2017 : Method request path: {} 
Tue Dec 19 02:01:16 UTC 2017 : Method request query string: {} 
Tue Dec 19 02:01:16 UTC 2017 : Method request headers: {} 
Tue Dec 19 02:01:16 UTC 2017 : Method request body before transformations: { 
    "married": "true", 
    "wages": "200000", 
    "homeInterest": "15000", 
    "propertyTaxes": "15000", 
    "stateTaxes": "13000", 
    "otherDeductions": "4000", 
    "postalCode": "11762" 
} 
Tue Dec 19 02:01:16 UTC 2017 : Endpoint request URI: https://lambda.us-east-1.amazonaws.com/2015-03-31/functions/arn:aws:lambda:us-east-1:896795400074:function:TaxCalculation/invocations 
Tue Dec 19 02:01:16 UTC 2017 : Endpoint request headers: {x-amzn-lambda-integration-tag=test-request, Authorization=************************************************************************************************************************************************************************************************************************************************************************************************************************7fcbc9, X-Amz-Date=20171219T020116Z, x-amzn-apigateway-api-id=07yp3njqzk, X-Amz-Source-Arn=arn:aws:execute-api:us-east-1:896795400074:07yp3njqzk/null/POST/TaxCalculation, Accept=application/json, User-Agent=AmazonAPIGateway_07yp3njqzk, X-Amz-Security-Token= [TRUNCATED] 
Tue Dec 19 02:01:16 UTC 2017 : Endpoint request body after transformations: {"resource":"/TaxCalculation","path":"/TaxCalculation","httpMethod":"POST","headers":null,"queryStringParameters":null,"pathParameters":null,"stageVariables":null,"requestContext":{"path":"/TaxCalculation","accountId":"xxxxxxxx","resourceId":"v8358d","stage":"test-invoke-stage","requestId":"test-invoke-request","identity":{"cognitoIdentityPoolId":null,"cognitoIdentityId":null,"apiKey":"test-invoke-api-key","cognitoAuthenticationType":null,"userArn":"arn:aws:iam::xxxxx:user/tvfoodmaps_aws","apiKeyId":"test-invoke-api-key-id","userAgent":"Apache-HttpClient/4.5.x (Java/1.8.0_144)","accountId":"896795400074","caller":"AIDAINMSXKH5AWAQ7NX36","sourceIp":"test-invoke-source-ip","accessKey":"ASIAIHXWW4BOHGXESRNQ","cognitoAuthenticationProvider":null,"user":"AIDAINMSXKH5AWAQ7NX36"},"resourcePath":"/TaxCalculation","httpMethod":"POST","apiId":"07yp3njqzk"},"body":"{\n \"married\": \"true\",\n \"wages\": \"200000\",\n \"homeInterest\": \"15000\",\n \"propertyTa [TRUNCATED] 
Tue Dec 19 02:01:16 UTC 2017 : Sending request to https://lambda.us-east-1.amazonaws.com/2015-03-31/functions/arn:aws:lambda:us-east-1:896795400074:function:TaxCalculation/invocations 
Tue Dec 19 02:01:16 UTC 2017 : Received response. Integration latency: 30 ms 
Tue Dec 19 02:01:16 UTC 2017 : Endpoint response body before transformations: {"savings":565.0,"owedTaxes17":-635.0,"owedTaxes18":-1200.0,"effectiveRate17":0.0,"effectiveRate18":0.0} 
Tue Dec 19 02:01:16 UTC 2017 : Endpoint response headers: {X-Amz-Executed-Version=$LATEST, x-amzn-Remapped-Content-Length=0, Connection=keep-alive, x-amzn-RequestId=7f8a1b13-e460-11e7-84cf-d1c3e8d3eaf5, Content-Length=104, Date=Tue, 19 Dec 2017 02:01:16 GMT, X-Amzn-Trace-Id=root=1-5a3872ec-1b9d875d8cc2fded5c30da46;sampled=0, Content-Type=application/json} 
Tue Dec 19 02:01:16 UTC 2017 : Execution failed due to configuration error: Malformed Lambda proxy response 
Tue Dec 19 02:01:16 UTC 2017 : Method completed with status: 502 

ラムダテスターから直接ではなく、RESTから呼び出されたときに関数が同じものを実行しない理由をさらにデバッグするにはどうすればよいですか?注:私はレスポンスに関するエラーの話を知っていますが、pojoにマップされるフィールドを読み取るコードの最初の行は機能していません(APIを使用している場合のみ)。

+0

ご質問はありますか? –

+0

Java POJOの例(http://docs.aws.amazon.com/lambda/latest/dg/java-handler-io-type-pojo.html)に従っていますか? – jarmod

+0

さて、ラムダテストツールで直接呼び出されたときでも私のラムダはうまく動作しています。 JSONが同じ方法でマッピングされていないRESTサービスにしようとすると、何かが起きています。 – gunygoogoo

答えて

2

ANYとの統合があり、プロキシレスポンスを返さないようです。代わりに、JSONオブジェクトのレスポンスを返します。

https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-set-up-simple-proxy.html#api-gateway-simple-proxy-for-lambda-output-format

同様の問題は、ここで説明

https://forums.aws.amazon.com/thread.jspa?threadID=255561

そして、ここで説明されて構成するための解決策は、それがお役に立てば幸いです。

+0

私の問題は「ラムダプロキシ統合を使用する」のチェックを外すだけで修正されました。 – gunygoogoo

0

AWS CloudWatchで問題を調査するためにコードを記録することができます。以下のライブラリとアプローチは、Java用のdocumentationに従ってAWSによって推奨されています。

注:また、セットアップAPI Gatewayは、とてもログイン問題の終わりから終わりまでをトレースする方が簡単になることがあります。

+0

さて、私はログを記録していますが、私が実際に見ているのは、lambdaを介してテストすると、リクエストオブジェクトに自分の値があり、APIツールを使ってテストするとそうでないことです。 – gunygoogoo

+0

セットアップAPIゲートウェイは、何が起こっているかを追跡するためにもログを記録します。 – Ashan

関連する問題