[{"data":1,"prerenderedAt":81},["ShallowReactive",2],{"content-guides-refactoring-serverless-extract_function_invocation":3},{"markdown":4,"frontMatterAttributes":5,"bodyRaw":7,"contributorPaths":8,"menuType":12,"contentName":13,"slug":14,"readingTime":15,"menu":16,"nextDocItem":53,"previousDocItem":45},"\u003Cimg src=\"\u002Fassets\u002Fexternal\u002Fguides\u002Frefactoring-serverless\u002Fassets\u002Fimages\u002FDestinationToLambda.png\"\u002F>\n\n\n\u003Ch2>Description\u003C\u002Fh2>\n\u003Cp>Invoking Lambda functions asynchronously from within the function code hides the application topology inside the code. An example might look as follows: \u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-js\">const aws = require(&#39;aws-sdk&#39;);\nconst lambda = new aws.Lambda();\n\nexports.handler = async function(event, context) {\n    ...\n    \u002F\u002F Prepare invokation params \n    var params = {\n        FunctionName: process.env.FUNCTION_NAME,\n        InvocationType: Event,\n        Payload: JSON.stringify(event),\n    };\n    \u002F\u002F Invoke the destination function \n    await lambda.invoke(params).promise();\n    ...\n};\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch2>Solution\u003C\u002Fh2>\n\u003Cp>Use \u003Ca href=\"https:\u002F\u002Faws.amazon.com\u002Fblogs\u002Fcompute\u002Fintroducing-aws-lambda-destinations\u002F\">Lambda Destination \u003C\u002Fa> to send the message asynchronously and configure the Lambda destination in CloudFormation or CDK to make the application topology explicit.\u003C\u002Fp>\n\u003Cp>See the CDK implementation of this pattern in Typescript on \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Faws-samples\u002Faws-refactoring-to-serverless\u002Fblob\u002Fmain\u002Fimplementation\u002Fextract-function-invocation\u002FREADME.md\">GitHub\u003C\u002Fa>.\u003C\u002Fp>\n\u003Ch2>Considerations\u003C\u002Fh2>\n\u003Ch4>Advantages\u003C\u002Fh4>\n\u003Cul>\n\u003Cli>Extracting the function invocation into a destination makes the application topology explicit and separates compsition from application logic\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch4>Applicability\u003C\u002Fh4>\n\u003Cul>\n\u003Cli>\u003Cp>Lambda Destinations are triggered only for \u003Cem>asynchronous\u003C\u002Fem> invocations. Therefore, this refactoring cannot be applied to synchronous invocations, e.g. from the console (Test). If your functions returns a synchronous result, this is now replaced by the message to be sent\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\u003Cp>Lambda Destinations are triggered at the end of the function execution whereas the code could send the message at any place\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\u003Cp>Invoking a functinon from \u003Ca href=\"https:\u002F\u002Fdocs.aws.amazon.com\u002FAWSJavaScriptSDK\u002Fv3\u002Flatest\u002Fclients\u002Fclient-lambda\u002Finterfaces\u002Finvokecommandinput.html\">AWS SDK\u003C\u002Fa> allows you to set additional attributes like \u003Ccode>ClientContext\u003C\u002Fcode>, \u003Ccode>InvocationType\u003C\u002Fcode>, \u003Ccode>LogType\u003C\u002Fcode>, \u003Ccode>Qualifier\u003C\u002Fcode>. You cannot set these attributes from a Lambda destination. Setting \u003Ccode>InvocationType\u003C\u002Fcode> for example allows for synchronous invocations\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\u003Cp>Lambda Destinations have the option to send the response payload only via \u003Ccode>responeOnly\u003C\u002Fcode>, not the full record. This allows to easily chain asynchronous Lambda functions without having to deal with data extraction in the runtime code. (\u003Ca href=\"https:\u002F\u002Fdocs.aws.amazon.com\u002Fcdk\u002Fapi\u002Fv2\u002Fdocs\u002Faws-cdk-lib.aws_lambda_destinations.LambdaDestinationOptions.html\">\u003Ccode>LambdaDestinationOptions\u003C\u002Fcode>\u003C\u002Fa>)\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\u003Cp>Consider building event driven architectures using the other Destination types (SNS, SQS, EventBridge)\u003C\u002Fp>\n\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch2>Related Refactorings\u003C\u002Fh2>\n\u003Cul>\n\u003Cli>\u003Ca href=\".\u002Fextract_send_message\">Extract Send Message\u003C\u002Fa>\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch2>Related Resources\u003C\u002Fh2>\n\u003Cul>\n\u003Cli>\u003Ca href=\"https:\u002F\u002Faws.amazon.com\u002Fblogs\u002Fcompute\u002Fintroducing-aws-lambda-destinations\u002F\">https:\u002F\u002Faws.amazon.com\u002Fblogs\u002Fcompute\u002Fintroducing-aws-lambda-destinations\u002F\u003C\u002Fa>\u003C\u002Fli>\n\u003Cli>\u003Ca href=\"https:\u002F\u002Fdocs.aws.amazon.com\u002Flambda\u002Flatest\u002Fdg\u002Flambda-invocation.html\">https:\u002F\u002Fdocs.aws.amazon.com\u002Flambda\u002Flatest\u002Fdg\u002Flambda-invocation.html\u003C\u002Fa>\u003C\u002Fli>\n\u003C\u002Ful>\n",{"title":6},"Extract function invocation","\u003Cimg src=\"\u002Fassets\u002Fexternal\u002Fguides\u002Frefactoring-serverless\u002Fassets\u002Fimages\u002FDestinationToLambda.png\"\u002F>\n\n\n## Description \n\nInvoking Lambda functions asynchronously from within the function code hides the application topology inside the code. An example might look as follows: \n\n``` js\nconst aws = require('aws-sdk');\nconst lambda = new aws.Lambda();\n\nexports.handler = async function(event, context) {\n    ...\n    \u002F\u002F Prepare invokation params \n    var params = {\n        FunctionName: process.env.FUNCTION_NAME,\n        InvocationType: Event,\n        Payload: JSON.stringify(event),\n    };\n    \u002F\u002F Invoke the destination function \n    await lambda.invoke(params).promise();\n    ...\n};\n```\n\n## Solution\n\nUse [Lambda Destination ](https:\u002F\u002Faws.amazon.com\u002Fblogs\u002Fcompute\u002Fintroducing-aws-lambda-destinations\u002F) to send the message asynchronously and configure the Lambda destination in CloudFormation or CDK to make the application topology explicit.\n\nSee the CDK implementation of this pattern in Typescript on [GitHub](https:\u002F\u002Fgithub.com\u002Faws-samples\u002Faws-refactoring-to-serverless\u002Fblob\u002Fmain\u002Fimplementation\u002Fextract-function-invocation\u002FREADME.md).\n\n## Considerations\n\n#### Advantages \n* Extracting the function invocation into a destination makes the application topology explicit and separates compsition from application logic\n\n#### Applicability\n\n* Lambda Destinations are triggered only for *asynchronous* invocations. Therefore, this refactoring cannot be applied to synchronous invocations, e.g. from the console (Test). If your functions returns a synchronous result, this is now replaced by the message to be sent\n\n* Lambda Destinations are triggered at the end of the function execution whereas the code could send the message at any place\n\n* Invoking a functinon from [AWS SDK](https:\u002F\u002Fdocs.aws.amazon.com\u002FAWSJavaScriptSDK\u002Fv3\u002Flatest\u002Fclients\u002Fclient-lambda\u002Finterfaces\u002Finvokecommandinput.html) allows you to set additional attributes like `ClientContext`, `InvocationType`, `LogType`, `Qualifier`. You cannot set these attributes from a Lambda destination. Setting `InvocationType` for example allows for synchronous invocations\n\n* Lambda Destinations have the option to send the response payload only via `responeOnly`, not the full record. This allows to easily chain asynchronous Lambda functions without having to deal with data extraction in the runtime code. ([`LambdaDestinationOptions`](https:\u002F\u002Fdocs.aws.amazon.com\u002Fcdk\u002Fapi\u002Fv2\u002Fdocs\u002Faws-cdk-lib.aws_lambda_destinations.LambdaDestinationOptions.html))\n\n* Consider building event driven architectures using the other Destination types (SNS, SQS, EventBridge)\n\n\n## Related Refactorings \n- [Extract Send Message](.\u002Fextract_send_message)\n\n## Related Resources\n- https:\u002F\u002Faws.amazon.com\u002Fblogs\u002Fcompute\u002Fintroducing-aws-lambda-destinations\u002F\n- https:\u002F\u002Fdocs.aws.amazon.com\u002Flambda\u002Flatest\u002Fdg\u002Flambda-invocation.html\n",[9,10,11],"content\u002Fcontributors\u002Fgregor-hohpe.json","content\u002Fcontributors\u002Fsindhu-pillai.json","content\u002Fcontributors\u002Fbhuvan-annamreddi.json","LIST","Refactoring to Serverless","\u002Fcontent\u002Fguides\u002Frefactoring-serverless\u002Fextract_function_invocation","2 min",[17,42],{"title":18,"content":19},"Introduction",[20],{"title":13,"order":21,"callout":22,"resources":26,"time":38,"path":39,"id":40,"link":41},1,{"title":23,"description":24,"link":25},"Watch the video","This session shows how you can refactor an existing serverless application to fully utilize AWS managed services and make service dependencies explicit, resulting in cleaner and more robust code.","https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=F7wxgWaccHs",[27,31,34],{"link":28,"text":29,"type":30},"https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=ttJAIQf7cTw","Building modern cloud applications? Think integration!","video",{"link":32,"text":33,"type":30},"https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=Ud9h1hJgoKk","Modern cloud applications - do they lock you in?",{"link":35,"text":36,"type":37},"https:\u002F\u002Fcdkpatterns.com\u002Fpatterns\u002F","CDK Patterns Collection","website","3 min","introduction","introduction.md","\u002Fcontent\u002Fguides\u002Frefactoring-serverless\u002Fintroduction",{"title":43,"content":44},"Refactorings",[45,50,53,58,64,69,74],{"title":46,"time":15,"path":47,"id":48,"link":49},"Extract Send Message","extract_send_message","extract_send_message.md","\u002Fcontent\u002Fguides\u002Frefactoring-serverless\u002Fextract_send_message",{"title":6,"time":15,"path":51,"id":52,"link":14},"extract_function_invocation","extract_function_invocation.md",{"title":54,"time":15,"path":55,"id":56,"link":57},"Replace Lambda with Service Integration","service_integration","service_integration.md","\u002Fcontent\u002Fguides\u002Frefactoring-serverless\u002Fservice_integration",{"title":59,"time":60,"path":61,"id":62,"link":63},"Direct database access","1 min","direct_database_access","direct_database_access.md","\u002Fcontent\u002Fguides\u002Frefactoring-serverless\u002Fdirect_database_access",{"title":65,"time":60,"path":66,"id":67,"link":68},"Replace Polling with Callback","replace_polling_with_callback","replace_polling_with_callback.md","\u002Fcontent\u002Fguides\u002Frefactoring-serverless\u002Freplace_polling_with_callback",{"title":70,"time":15,"path":71,"id":72,"link":73},"Send Message via Pipes","send_message_via_pipes","send_message_via_pipes.md","\u002Fcontent\u002Fguides\u002Frefactoring-serverless\u002Fsend_message_via_pipes",{"title":75,"authors":76,"time":38,"path":78,"id":79,"link":80},"Convert Choreography to Orchestration",[77],"Bhuvan Annamreddi","choreography-to-orchestration","choreography-to-orchestration.md","\u002Fcontent\u002Fguides\u002Frefactoring-serverless\u002Fchoreography-to-orchestration",1792665265019]