AWSLambdaClient#invokeでTooManyRequestsException: Rate Exceeded.
環境
やろうとしたこと
以下のようなコードで長めのAWS LambdaをJavaから実行しようとした。
val invokeRequest = InvokeRequest() .withFunctionName(FUNCTION_NAME) .withPayload("適当なpayload") .withInvocationType(InvocationType.RequestResponse) val lambdaClient = AWSLambdaClientBuilder.standard() .withRegion(REGION) .withCredentials(AWSStaticCredentialsProvider(credentials)).build() val invokeResult = lambdaClient.invoke(invokeRequest) // ここでTooManyRequestsException
エラー
Exception in thread "main" com.amazonaws.services.lambda.model.TooManyRequestsException: Rate Exceeded. (Service: AWSLambda; Status Code: 429; Error Code: TooManyRequestsException; Request ID: XXXXXXXXXXXX) at com.amazonaws.http.AmazonHttpClient$RequestExecutor.handleErrorResponse(AmazonHttpClient.java:1701) at com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeOneRequest(AmazonHttpClient.java:1356) at com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeHelper(AmazonHttpClient.java:1102) at com.amazonaws.http.AmazonHttpClient$RequestExecutor.doExecute(AmazonHttpClient.java:759) at com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeWithTimer(AmazonHttpClient.java:733) at com.amazonaws.http.AmazonHttpClient$RequestExecutor.execute(AmazonHttpClient.java:715) at com.amazonaws.http.AmazonHttpClient$RequestExecutor.access$500(AmazonHttpClient.java:675) at com.amazonaws.http.AmazonHttpClient$RequestExecutionBuilderImpl.execute(AmazonHttpClient.java:657) at com.amazonaws.http.AmazonHttpClient.execute(AmazonHttpClient.java:521) at com.amazonaws.services.lambda.AWSLambdaClient.doInvoke(AWSLambdaClient.java:3137) at com.amazonaws.services.lambda.AWSLambdaClient.invoke(AWSLambdaClient.java:3104) at com.amazonaws.services.lambda.AWSLambdaClient.invoke(AWSLambdaClient.java:3093) at com.amazonaws.services.lambda.AWSLambdaClient.executeInvoke(AWSLambdaClient.java:1744) at com.amazonaws.services.lambda.AWSLambdaClient.invoke(AWSLambdaClient.java:1716)
解決
AWSLambdaClientBuilder#withClientConfiguration()でタイムアウトを設定
val invokeRequest = InvokeRequest() .withFunctionName(FUNCTION_NAME) .withPayload("適当なpayload") .withInvocationType(InvocationType.RequestResponse) val lambdaClient = AWSLambdaClientBuilder.standard() .withRegion(REGION) // ↓これを追加 .withClientConfiguration(ClientConfigurationFactory().config.withSocketTimeout(TIMEOUT)) .withCredentials(AWSStaticCredentialsProvider(credentials)).build() val invokeResult = lambdaClient.invoke(invokeRequest)
InvokeRequest#withSdkClientExecutionTimeout() とかInvokeRequest#withSdkRequestTimeout()とかそれっぽいのもあったけどそれらは反映されなかった。。
実践AWS Lambda ~「サーバレス」を実現する新しいアプリケーションのプラットフォーム~
- 作者: 西谷圭介
- 出版社/メーカー: マイナビ出版
- 発売日: 2017/06/09
- メディア: 単行本(ソフトカバー)
- この商品を含むブログを見る