<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Renato Nabinger</title>
    <description>The latest articles on DEV Community by Renato Nabinger (@renatoxm).</description>
    <link>https://dev.to/renatoxm</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1088623%2F6ac50bdc-0d91-40a5-aae3-b1ec41a7bea9.jpeg</url>
      <title>DEV Community: Renato Nabinger</title>
      <link>https://dev.to/renatoxm</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/renatoxm"/>
    <language>en</language>
    <item>
      <title>The ideal VOD Platform build for high-volume Streaming Data</title>
      <dc:creator>Renato Nabinger</dc:creator>
      <pubDate>Wed, 24 May 2023 12:48:58 +0000</pubDate>
      <link>https://dev.to/renatoxm/the-ideal-vod-platform-build-for-high-volume-streaming-data-48do</link>
      <guid>https://dev.to/renatoxm/the-ideal-vod-platform-build-for-high-volume-streaming-data-48do</guid>
      <description>&lt;p&gt;One of the best ways to streamline your video streaming is by using a combination of Serverless architecture, S3 and CloudFront.&lt;/p&gt;

&lt;p&gt;This innovative solution uses a serverless architecture that enables you to run code, integrate applications, and manage data without needing to worry about managing servers. Thanks to its automatic scaling and built-in high availability features, this approach is both more agile and more cost-effective, with a pay-as-you-go billing model that ensures you only pay for what you use.&lt;/p&gt;

&lt;p&gt;By eliminating the need for infrastructure management tasks like patching and capacity provisioning, this serverless approach allows you to concentrate on creating code that best serves your customers.&lt;/p&gt;

&lt;p&gt;The AWS Lambda event-driven compute service is the starting point for all serverless applications, and it is natively integrated with over 200 AWS services and SaaS applications.&lt;br&gt;
The app can be built in Next.js with the help of serverless next component, can be deployed in AWS with near to zero configuration. All static routes in the application will be pre-rendered and distributed on CloudFront to maximize speed.&lt;/p&gt;

&lt;p&gt;This will result is a dynamic application that can run near the speed of a static site because the dynamic parts are being distributed by the CDN as well.&lt;/p&gt;

&lt;p&gt;To authenticate users for the web application, this particular solution uses AWS Cognito's User Pools, which control access to the GraphQL API, generating temporary AWS credentials with limited privileges for accessing S3 content.&lt;/p&gt;

&lt;p&gt;AWS AppSync, which is based on the GraphQL API, allows client applications to perform CRUD operations on videos and store them in an S3 bucket.&lt;/p&gt;

&lt;p&gt;To accomplish all of this, two separate S3 buckets are used: one for storing raw video and another for storing video with different output formats.&lt;/p&gt;

&lt;p&gt;Lambda functions are employed for a range of tasks, including triggering MediaConvert jobs, storing metadata in DynamoDB, creating signed URL tokens, and sending notifications when MediaConvert jobs are complete.&lt;/p&gt;

&lt;p&gt;MediaConvert, meanwhile, automatically transcodes the uploaded video to HLS format for multiple bitrates and device types, while Secrets Manager securely stores CloudFront's private keys for signing CloudFront URLs. CloudFront itself delivers content securely via CDN Edge locations to authorized users through the application at runtime.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--x9zLsSZ7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/jgi5mxgjide4p4bvemrf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--x9zLsSZ7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/jgi5mxgjide4p4bvemrf.png" alt="VOD AWS Architecture" width="800" height="419"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Architecture benefits
&lt;/h2&gt;

&lt;p&gt;The architecture of this solution has numerous benefits, including scalability through the CloudFront CDN, secure video content to prevent unauthorized access, automated transcoding of video content via MediaConvert, support for multiple devices using adaptive bitrate streaming, and secure storage and retrieval of secret keys using Secrets Manager. The solution can be quickly built and deployed using Amplify and CloudFormation, allowing you to get up and running with your video streaming service in no time.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Application testing, the good, the bad and the ugly: from a senior programmer's point of view</title>
      <dc:creator>Renato Nabinger</dc:creator>
      <pubDate>Wed, 24 May 2023 12:43:31 +0000</pubDate>
      <link>https://dev.to/renatoxm/application-testing-the-good-the-bad-and-the-ugly-from-a-senior-programmers-point-of-view-28ni</link>
      <guid>https://dev.to/renatoxm/application-testing-the-good-the-bad-and-the-ugly-from-a-senior-programmers-point-of-view-28ni</guid>
      <description>&lt;h2&gt;
  
  
  What framework do you use for testing?
&lt;/h2&gt;

&lt;p&gt;This is a commonly asked question, but for me, it's a superficial and potentially hazardous inquiry.&lt;/p&gt;

&lt;p&gt;Unit tests alone cannot guarantee that a particular feature will function correctly in production.&lt;/p&gt;

&lt;p&gt;How many times I saw code being committed to production, just to witness the system collapse moments after deployment. 🔥&lt;/p&gt;

&lt;p&gt;In fact, that is so common that I once prohibited any new releases from being made on Fridays or overnight.&lt;/p&gt;

&lt;p&gt;The truth is, a component may work flawlessly in a test environment, but there are other crucial factors to consider such as its performance, safety, target devices, and compatibility with production dependencies.&lt;/p&gt;

&lt;p&gt;To illustrate, let's say a junior developer (not you! 😅) creates a function that grows exponentially with the number of requests, an &lt;strong&gt;&lt;em&gt;O(2&lt;sup&gt;n&lt;/sup&gt;)&lt;/em&gt;&lt;/strong&gt; of the worst kind.&lt;/p&gt;

&lt;p&gt;This function could pass a unit test despite its suboptimal performance and could automatically make its way into production with an automated CI/CD pipeline.&lt;/p&gt;

&lt;p&gt;To prove my point, I'll provide an example below.&lt;/p&gt;

&lt;p&gt;If you prefer, you can skip the math and go straight to the result, or simply take my word for it.&lt;/p&gt;

&lt;h2&gt;
  
  
  You can Skip the math part and go straight to the conclusion
&lt;/h2&gt;

&lt;p&gt;++++++++++++++++++++++++++++++++++++++++++++++++++&lt;/p&gt;

&lt;h3&gt;
  
  
  Calculate the nth term of a Fibonacci sequence
&lt;/h3&gt;

&lt;p&gt;The Fibonacci sequence, has the numeral 1 as the first and second term of the order, and the following elements are originated by the sum of its two predecessors, so:&lt;/p&gt;

&lt;p&gt;1&lt;br&gt;
1 + 1 = 2&lt;br&gt;
1 + 2 = 3&lt;br&gt;
3 + 2 = 5&lt;/p&gt;

&lt;p&gt;And so on…&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181...&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In this solution, we use a function that already returns 1 if n is less than 2 (because we already know that the first two terms of a Fibonacci sequence are 1) then we go backwards calculating recursively&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;fib&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;n&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;n&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;fib&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;n&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;fib&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;n&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If we run this function in &lt;a href="https://jestjs.io/"&gt;Jest&lt;/a&gt;, it will return as correct.&lt;/p&gt;

&lt;p&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;fib(5) must be 5&lt;/p&gt;

&lt;p&gt;fib(39) should be 63245986&lt;/p&gt;

&lt;p&gt;fib(40) must be 102334155&lt;/p&gt;

&lt;p&gt;“There are no failing tests, congratulations!”&lt;/p&gt;



&lt;p&gt;&lt;a href="https://codesandbox.io/s/jest-testing-react-forked-3dxj9y?file=/src/components/App.js"&gt;Click here to preview in CodeSandbox&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The test may not reveal that, while the function produces the expected output, it also leads to an exponential increase in the required computations to solve the problem.&lt;/p&gt;

&lt;p&gt;Simplifying this in BIG-O notation, we get an &lt;strong&gt;&lt;em&gt;O(2&lt;sup&gt;n&lt;/sup&gt;)&lt;/em&gt;&lt;/strong&gt; complexity, which is terrible.&lt;/p&gt;

&lt;p&gt;If we run fib(n) we get the following:&lt;/p&gt;

&lt;p&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;in fib(5) the calculation time was 0 ms&lt;/p&gt;



&lt;p&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;in fib(39) the time passed to 489 ms&lt;/p&gt;

&lt;p&gt;in fib(40) the time passed to 779 ms&lt;/p&gt;



&lt;p&gt;Notice that it didn't take much for the running time to double (from 39 to 40).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--zA9QCWr6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ec6w0l8ti7fvxv935ady.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--zA9QCWr6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ec6w0l8ti7fvxv935ady.png" alt="O(2^n) complexity" width="800" height="565"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;end of the boring math part&lt;/em&gt;&lt;/strong&gt;&lt;br&gt;
++++++++++++++++++++++++++++++++++++++++++++++++++&lt;/p&gt;
&lt;h2&gt;
  
  
  And what to do then to minimize errors in production?
&lt;/h2&gt;

&lt;p&gt;It depends!&lt;/p&gt;

&lt;p&gt;What do you mean??? 🤯&lt;/p&gt;

&lt;p&gt;The testing approach to use depends on various factors, such as the availability of time/money, the complexity of the component, and the risks involved.&lt;/p&gt;

&lt;p&gt;Common sense and experience play a significant role in deciding the level of testing required.&lt;/p&gt;

&lt;p&gt;For instance, if the project is small and low-risk, there is no need to perform complex tests.&lt;/p&gt;

&lt;p&gt;However, if the project involves high-risk factors like money, security, or high volume of requests, it is advisable to use a comprehensive testing arsenal.&lt;/p&gt;
&lt;h3&gt;
  
  
  Some strategies to reduce risks in production include:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Run performance tests on every commit. By doing this, you decrease the risk of performance regressions early on. The earlier you detect it, the easier it will be to revert.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Do canary tests whenever the functionality has a high impact or risk for the user or the application. Testing the application within a smaller, controlled audience will eliminate a lot of risk without taking away external variables. Netflix, for example, uses its employees' personal accounts to test functionality changes before releasing them to the rest of the public.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Use external error tracking tools. I always recommend Sentry (&lt;a href="https://sentry.io/"&gt;https://sentry.io/&lt;/a&gt;) as it is excellent at detecting errors in real time. Whenever an error happens to a user, you receive a complete report of what happened, the type of browser used and many other insights that will help you to isolate and resolve the bug.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Evaluate not only the inputs and outputs of your components. Make an analysis of the algorithms (I'm a fan of Big O Notation 💘) and apply, whenever possible, software design patterns, the famous design patterns.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Before signing off, I want to share an O(n) solution that is more performant than the example presented initially.&lt;/p&gt;

&lt;p&gt;Cheers!&lt;/p&gt;

&lt;p&gt;Renato&lt;/p&gt;
&lt;h2&gt;
  
  
  Bonus:
&lt;/h2&gt;

&lt;p&gt;Correcting the example function through memoization&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;fib&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;n&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;memo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[])&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;memo&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;n&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;!==&lt;/span&gt; &lt;span class="kc"&gt;undefined&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;memo&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;n&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;n&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
  &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;fib&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;n&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;memo&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;fib&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;n&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;memo&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="nx"&gt;memo&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;n&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;in fib(5) the calculation time was 0 ms&lt;/p&gt;

&lt;p&gt;in fib(39) the calculation time was 0 ms&lt;/p&gt;

&lt;p&gt;in fib(40) the calculation time was 0 ms&lt;/p&gt;



&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--pB0Vyh2n--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xnbc159pagy6lob0x04p.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--pB0Vyh2n--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xnbc159pagy6lob0x04p.png" alt="O(n) complexity" width="800" height="565"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://codesandbox.io/s/jest-testing-react-forked-8z7obs?file=/src/components/App.test.js"&gt;Answer on CodeSandbox&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Fintech goes micro, an aws serverless microservices case study</title>
      <dc:creator>Renato Nabinger</dc:creator>
      <pubDate>Wed, 24 May 2023 12:29:23 +0000</pubDate>
      <link>https://dev.to/renatoxm/fintech-goes-micro-an-aws-serverless-microservices-case-study-lo5</link>
      <guid>https://dev.to/renatoxm/fintech-goes-micro-an-aws-serverless-microservices-case-study-lo5</guid>
      <description>&lt;p&gt;"Crie seu banco" is a Brazilian Fintech start-up that focuses on financial services. Their CEO, Julio Cesar, aims to develop the most comprehensive "bank as a service" solution in the market, with an intelligent white label platform that is modular, flexible, and scalable.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--YmwQEC0E--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/53o8ezlo4vfrbxxqlss2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--YmwQEC0E--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/53o8ezlo4vfrbxxqlss2.png" alt="Serverless Microservices Architecture" width="800" height="466"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Many Fintechs that operate with Banking as a Service use monolithic technologies based on Laravel, which can cause issues with flexibility, modularity, and scalability. This structure requires reproducing a series of steps for each new customer to launch the solution, which creates a nightmare in terms of infrastructure and updates. Implementing a new customer can take up to six months, and each customer requires their own team to perform DevOps tasks, customization, and maintenance, making the product quite expensive.&lt;/p&gt;

&lt;p&gt;We asked to create a solution that address those issues. So we create "Sbank," a serverless microservices architecture that minimizes the time and cost required for infrastructure management. we implemented multiple AWS services, including Amazon DynamoDB for data persistence and Amazon API Gateway for API endpoints, with AWS Lambda automating all processes from end to end.&lt;/p&gt;

&lt;p&gt;With "Sbank," a person can now submit an online form to request a new account, and an API triggers the account-creation process. By building it on the AWS serverless platform, we achieved the goals of saving time, reducing costs, and strengthening security.&lt;br&gt;
The process of acquiring new clients has gone from taking many months to just one day, reducing the cost of provisioning each account from $8000 to just shy of $500 per new client. The serverless architecture also keeps other costs down, with operational costs barely exceeding $100 a month for all the functions that support "Sbank" across all three AWS Regions. Security is now stronger, too, with "Sbank" ensuring uniform configurations and controls and providing visibility into account security profiles.&lt;/p&gt;

&lt;p&gt;Going serverless microservices has relieved the team from managing servers and lets them concentrate on building features, creating real value in terms of time, cost, agility, and innovation.&lt;/p&gt;

&lt;h2&gt;
  
  
  Using the Iac strategy
&lt;/h2&gt;

&lt;p&gt;Infrastructure as Code (IaC) is the managing and provisioning of infrastructure through code instead of through manual processes. With AWS CDK, we were able to manage infrastructure deployment, destruction, and configuration. Giving us consistent, automated dev, test, and staging environments.&lt;/p&gt;

&lt;h2&gt;
  
  
  Some Sbank features
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Authentication
&lt;/h3&gt;

&lt;p&gt;Sbank allows users to sign in using an email and require the user to upload a document containing his or her photo. We used the AWS Amplify Framework to integrate our Front-End application with Amazon S3 and store this image in a secure and encrypted bucket. Our solution trigger a Lambda function for each new image uploaded to this bucket so that we can index the images inside Amazon Rekognition and save the metadata in a DynamoDB table for later queries.&lt;/p&gt;

&lt;p&gt;For authentication, this solution uses Amazon Cognito User Pools combined with Lambda functions to customize the authentication flows together with the Amazon Rekognition CompareFaces API to identify the confidence level between user photos provided during Sign Up and Sign In. Here is the architecture of the solution:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--CRFa5adQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/kzu5dr0r4663yq8vq6dv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--CRFa5adQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/kzu5dr0r4663yq8vq6dv.png" alt="Authentication with face recognition" width="800" height="593"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Identity Verification
&lt;/h3&gt;

&lt;p&gt;In-person user identity verification is slow to scale, costly, and high friction for users. Machine learning powered facial biometrics can enable online user identity verification. We used Amazon Rekognition because it offers pre-trained facial recognition and analysis capabilities that we could quickly add to your user onboarding and authentication workflows to verify opted-in users' identity online.&lt;/p&gt;

&lt;p&gt;This feature allow Sbank to onboard and authenticate users in seconds while detecting fraudulent or duplicate accounts. As a result, you can grow users faster, reduce fraud, and lower user verification costs.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--rFNrNq0d--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/rku8p4aj7bdmi17s1v5b.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--rFNrNq0d--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/rku8p4aj7bdmi17s1v5b.png" alt="Authentication with face recognition" width="800" height="373"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
