当另一个 AWS Java Lambda 函数位于同一账户、同一区域时,如何从另一个 AWS Java Lambda 函数调用这两个函数

2022-09-04 02:22:11

我有一个java aws lambda函数或处理程序作为AHandler,它可以做一些事情,例如,它已经订阅了SNS事件,它解析该SNS事件并将相关数据记录到数据库中。

我有另一个java aws lambda BHandler,这个BHandler的目标是接收来自AHandler的请求并提供对AHandler的响应。因为BHandler的目标是提供一些json数据的响应。这将被AHandler使用。

我能看到任何明确的例子来说明我们如何做这些事情吗?

我看到这个例子从java类调用lambda函数从java调用lambda函数

我的问题谈到了这种情况,当一个aws java lambda函数(或处理程序)调用另一个aws java lambda函数时,两者都在同一个区域,相同的账户,相同的vpc执行内容,相同的权限。在这种情况下,aws java lambda函数可以直接调用(或调用)到另一个函数,或者它仍然必须提供aws键,区域等东西(如上面的链接所示)?一个明确的例子/解释将是非常有帮助的。

编辑

正在调用另一个 Lambda 函数 (BHandler) 的 AHandler 存在于同一账户上,已经提供了完整的 AWSLambdaFullAccess,其中包含所有内容,例如

“iam:PassRole”, “lambda:*”,

下面是要调用的代码:

注意:当我从普通的java主函数调用相同的函数时,下面的代码是有效的。但它不像从lambda函数调用那样工作(就像ALambdaHandler调用BLambdaHandler作为函数调用一样)。即使它没有返回任何例外。它只是显示超时,它卡在代码:lambdaClient.invoke

String awsAccessKeyId = PropertyManager.getSetting("awsAccessKeyId");
        String awsSecretAccessKey = PropertyManager.getSetting("awsSecretAccessKey");
        String regionName = PropertyManager.getSetting("regionName");
        String geoIPFunctionName = PropertyManager.getSetting("FunctionName");

        Region region;
        AWSCredentials credentials;
        AWSLambdaClient lambdaClient;

        credentials = new BasicAWSCredentials(awsAccessKeyId,
                awsSecretAccessKey);

        lambdaClient = (credentials == null) ? new AWSLambdaClient()
                : new AWSLambdaClient(credentials);
        region = Region.getRegion(Regions.fromName(regionName));
        lambdaClient.setRegion(region);


        String returnGeoIPDetails = null;

        try {


            InvokeRequest invokeRequest = new InvokeRequest();
            invokeRequest.setFunctionName(FunctionName);
            invokeRequest.setPayload(ipInput);


            returnDetails = byteBufferToString(
                    lambdaClient.invoke(invokeRequest).getPayload(),
                    Charset.forName("UTF-8"),logger);
        } catch (Exception e) {

            logger.log(e.getMessage());
        }

编辑我按照别人的建议做了一切,并遵循了一切。最后,我联系了AWS支持部门,问题与一些VPC配置有关,并且得到了解决。如果您遇到过类似的东西,那么可能会检查安全配置,VPC的东西。


答案 1

我们通过使用com.amazonaws.services.lambda.model.InvokeRequest实现了这一点。下面是代码示例。

public class LambdaInvokerFromCode {
     public void runWithoutPayload(String functionName) {
            runWithPayload(functionName, null);
        }

        public void runWithPayload(String functionName, String payload) {
            AWSLambdaAsyncClient client = new AWSLambdaAsyncClient();
            client.withRegion(Regions.US_EAST_1);

            InvokeRequest request = new InvokeRequest();
            request.withFunctionName(functionName).withPayload(payload);
            InvokeResult invoke = client.invoke(request);
            System.out.println("Result invoking " + functionName + ": " + invoke);
    }



    public static void main(String[] args) {
            String KeyName ="41159569322017486.json";
            String status = "success";
            String body = "{\"bucketName\":\""+DBUtils.S3BUCKET_BULKORDER+"\",\"keyName\":\""+KeyName+"\", \"status\":\""+status+"\"}";
            System.out.println(body);

            JSONObject inputjson = new JSONObject(body); 
            String bucketName = inputjson.getString("bucketName");
            String keyName = inputjson.getString("keyName");
            String Status = inputjson.getString("status");
            String destinationKeyName = keyName+"_"+status;
            LambdaInvokerFromCode obj = new LambdaInvokerFromCode();
            obj.runWithPayload(DBUtils.FILE_RENAME_HANDLER_NAME,body);
        }
}

答案 2

编辑:对于这种情况,请考虑使用步骤函数


推荐