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()とかそれっぽいのもあったけどそれらは反映されなかった。。