<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Cloudpedia]]></title><description><![CDATA[Hi, I share tips on Cloud, AWS and platform engineering.]]></description><link>https://cloudpedia.dev</link><generator>RSS for Node</generator><lastBuildDate>Fri, 10 Apr 2026 16:18:01 GMT</lastBuildDate><atom:link href="https://cloudpedia.dev/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[AWS SDK for Javascript v2 Reaches End of Life: Important Facts]]></title><description><![CDATA[The AWS SDK for JavaScript v2 is reaching its End of Life, yet it is still downloaded nearly 9 million times every week. This is despite AWS advising customers for over a year to start using v3 of the SDK. In fact, to discourage the use of v2, newer ...]]></description><link>https://cloudpedia.dev/aws-sdk-for-javascript-v2-reaches-end-of-life-important-facts</link><guid isPermaLink="true">https://cloudpedia.dev/aws-sdk-for-javascript-v2-reaches-end-of-life-important-facts</guid><category><![CDATA[AWS]]></category><category><![CDATA[JavaScript]]></category><category><![CDATA[Lambda function]]></category><category><![CDATA[EOL]]></category><category><![CDATA[Cloud]]></category><dc:creator><![CDATA[benx]]></dc:creator><pubDate>Mon, 09 Sep 2024 02:25:21 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1725847054036/46c2be86-87b4-4d02-9dad-2697122d3b21.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>The AWS SDK for JavaScript v2 is <a target="_blank" href="https://aws.amazon.com/blogs/developer/announcing-end-of-support-for-aws-sdk-for-javascript-v2/">reaching its End of Life</a>, yet it is still downloaded nearly 9 million times every week. This is despite AWS advising customers for over a year to start using v3 of the SDK. In fact, to discourage the use of v2, newer versions of the Lambda runtime on Node.js no longer come with <code>aws-sdk</code> pre-installed. Instead, all Node.js runtimes starting from v18 now come with <code>@aws-sdk</code>, which is v3 of the SDK.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1725853713531/f0b56b0d-4417-4f1d-b825-48ba25819e85.png" alt class="image--center mx-auto" /></p>
<p>The obvious solution is to migrate your applications to v3. However, migrating to another component isn't always as straightforward as we'd like, especially when there's a deep dependence on that component. This dependence can leave developers unable to upgrade to the latest version.<br />One reason developers avoid upgrading such components is the risk of introducing unintended bugs. I mean, if it's not broken, why fix it? Another reason could be that the team doesn't have the capacity to take on such a complex change due to other pressing priorities.</p>
<p>In this article, we'll discuss how you can safely and gradually migrate to AWS SDK for javascript v3.</p>
<p>Before we go further, let's gets some terms clarified.</p>
<ul>
<li><p><code>aws-sdk</code>: this is v2 of the sdk.</p>
</li>
<li><p><code>@aws-sdk</code>: this is v3 of the sdk.</p>
</li>
</ul>
<p>One way to make aws-sdk available on Lambda running on Node.js 18+ is by bundling the SDK with your application. However, this is not recommended as it increases bundle size and leads to longer cold start times.</p>
<p>To safely migrate to <code>@aws-sdk</code>, we'll split the process into two phases:</p>
<ul>
<li><p>Lift &amp; Shift</p>
</li>
<li><p>Refactor application code</p>
</li>
</ul>
<h2 id="heading-phase-1-lift-amp-shift">Phase 1: Lift &amp; Shift</h2>
<p>This phase involves creating a Lambda layer that includes the aws-sdk package. The layer is then attached to your Lambda function, similar to how AWS makes the SDK available in earlier Node.js runtimes. This can be implemented by:</p>
<h3 id="heading-creating-a-zipped-file-with-the-sdk">Creating a zipped file with the SDK</h3>
<pre><code class="lang-bash"><span class="hljs-meta">#!/bin/bash</span>

<span class="hljs-built_in">echo</span> \
<span class="hljs-string">'{
  "name": "aws-sdk-v2",
  "version": "1.0.0",
  "description": "A module containing aws-sdk v2",
  "dependencies": {
    "aws-sdk": "^2.1691.0"
  }
}'</span> &gt;&gt; package.json

npm install
mkdir nodejs
mv node_modules nodejs
zip -rqm aws-sdk-v2.zip nodejs
rm package.json package-lock.json
</code></pre>
<h3 id="heading-bundling-the-zipped-as-a-lambda-layer">Bundling the zipped as a Lambda layer</h3>
<pre><code class="lang-plaintext"># Terraform

resource "aws_lambda_layer_version" "aws_sdk_v2" {
  compatible_runtimes  = ["nodejs18.x", "nodejs20.x"]
  description          = "Layer container aws-sdk v2"
  filename             = "./aws-sdk-v2.zip"
  layer_name           = "aws-sdk-v2"
  source_code_hash     = filebase64sha256("./aws-sdk-v2.zip")
}
</code></pre>
<h3 id="heading-using-the-layer-in-a-lambda-function">Using the layer in a Lambda function</h3>
<pre><code class="lang-plaintext"># Terraform

resource "aws_lambda_function" "function_with_aws_sdk_v2" {
  ...
  layers = [aws_lambda_layer_version.aws_sdk_v2.arn]
}
</code></pre>
<p>The full project is on my <a target="_blank" href="https://github.com/ben-x/cloudpedia/tree/master/content/lambda-layer-with-aws-sdk-v2">github repositor</a>y.</p>
<p>If, like me, you get annoyed by the EOL message the package emits, you can disable it by setting the following environment variable: <code>AWS_SDK_JS_SUPPRESS_MAINTENANCE_MODE_MESSAGE=1</code>.</p>
<p>This solution offers several benefits. One of them is that no changes are needed in the application code; everything continues to work as it is. Another benefit is that it gives developers enough time to move on to the next phase while running on newer versions of Nodejs runtime.</p>
<h2 id="heading-phase-2-refactor-application-code">Phase 2: Refactor Application Code</h2>
<p>With enough time and Lambda running on the latest Node.js runtime, we can gradually update our application code to v3 of the SDK.</p>
<p><code>@aws-sdk</code> offers many benefits, including a smaller bundle size, S3 multipart upload, and TypeScript support, among other things. For example, to download a file from S3 using v2, you'd need to import the entire SDK, resulting in a large file size.</p>
<pre><code class="lang-javascript"><span class="hljs-keyword">const</span> AWS = <span class="hljs-built_in">require</span>(<span class="hljs-string">'aws-sdk'</span>);
<span class="hljs-keyword">const</span> s3Client = <span class="hljs-keyword">new</span> AWS.S3({ <span class="hljs-attr">region</span>: <span class="hljs-string">"REGION"</span> });

<span class="hljs-keyword">let</span> objectData;

s3Client.getObject({
  <span class="hljs-attr">Bucket</span>: <span class="hljs-string">'website-bucket'</span>,
  <span class="hljs-attr">Key</span>: <span class="hljs-string">'static-file.pdf'</span>
}, <span class="hljs-function">(<span class="hljs-params">err, data</span>) =&gt;</span> {
  objectData = data.Body.toString(<span class="hljs-string">'utf-8'</span>);
});
</code></pre>
<p>With v3, the client for each AWS service is released as its own npm package. For instance, the S3 client is <code>@aws-sdk/s3-client</code>.</p>
<pre><code class="lang-javascript"><span class="hljs-keyword">const</span> { S3Client, CopyObjectCommand } = <span class="hljs-built_in">require</span>(<span class="hljs-string">'@aws-sdk/client-s3'</span>);
<span class="hljs-keyword">const</span> s3Client = <span class="hljs-keyword">new</span> S3Client({ <span class="hljs-attr">region</span>: <span class="hljs-string">"REGION"</span> });

<span class="hljs-keyword">const</span> command = <span class="hljs-keyword">new</span> CopyObjectCommand({
  <span class="hljs-attr">Bucket</span>: <span class="hljs-string">'website-bucket'</span>,
  <span class="hljs-attr">Key</span>: <span class="hljs-string">'static-file.pdf'</span>
});

<span class="hljs-keyword">const</span> response = <span class="hljs-keyword">await</span> s3Client.send(command);
</code></pre>
<p>This strategy of making each client its own package not only results in a smaller bundle size but also faster load times since we're importing only the service we need.</p>
<p>Updating your code base can be a daunting task, but it doesn't have to be. AWS provides a utility that developers can use to automatically convert code written in v2 to v3. This tool is an npm package named <code>aws-sdk-js-codemod</code>, and you can read all about it <a target="_blank" href="https://github.com/aws/aws-sdk-js-codemod">here</a>.<br />It's important to understand that this is just a tool to speed up the process. As developers, it's our responsibility to ensure the code generated by this tool is correct, bug-free, and well tested.</p>
<h2 id="heading-conclusion">Conclusion</h2>
<p>As AWS draws the curtain on version 2 of the SDK, we need to be ready to transition to the new version, especially if we want to use the latest features or runtimes released by AWS.</p>
<hr />
<h3 id="heading-references">References</h3>
<ul>
<li><p><a target="_blank" href="https://aws.amazon.com/blogs/developer/announcing-end-of-support-for-aws-sdk-for-javascript-v2/">https://aws.amazon.com/blogs/developer/announcing-end-of-support-for-aws-sdk-for-javascript-v2/</a></p>
</li>
<li><p><a target="_blank" href="https://github.com/aws/aws-sdk-js-codemod">https://github.com/aws/aws-sdk-js-codemod</a></p>
</li>
<li><p><a target="_blank" href="https://github.com/ben-x/cloudpedia/tree/master/content/lambda-layer-with-aws-sdk-v2">https://github.com/ben-x/cloudpedia/tree/master/content/lambda-layer-with-aws-sdk-v2</a></p>
</li>
</ul>
<p>PS: If you like content like this, please hit the like button.</p>
]]></content:encoded></item><item><title><![CDATA[How to Serve Multiple Regions Using a Single Workload]]></title><description><![CDATA[Some time ago, I worked on a project where we used Rockset for real-time data analytics. We needed to send data through private connections, not over the internet. Rockset, like most SaaS providers, offered private connections in only three regions, ...]]></description><link>https://cloudpedia.dev/how-to-serve-multiple-regions-using-a-single-workload</link><guid isPermaLink="true">https://cloudpedia.dev/how-to-serve-multiple-regions-using-a-single-workload</guid><category><![CDATA[AWS]]></category><category><![CDATA[networking]]></category><category><![CDATA[Platform Engineering ]]></category><category><![CDATA[Cloud]]></category><category><![CDATA[vpc peering]]></category><dc:creator><![CDATA[benx]]></dc:creator><pubDate>Sun, 01 Sep 2024 03:24:10 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/stock/unsplash/OKOOGO578eo/upload/7ba8846925d7ff5b20a69068b98b15ed.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Some time ago, I worked on a project where we used <a target="_blank" href="https://rockset.com/"><strong>Rockset</strong></a> for real-time data analytics. We needed to send data through private connections, not over the internet. Rockset, like most SaaS providers, offered private connections in only three regions, none of which matched ours. On another occasion, I faced the same challenge when I tried to implement an integration with <a target="_blank" href="https://materialize.com/">Materialize</a>.</p>
<p>This is a challenge faced by many enterprise that need private connection to SaaS vendors. Often, they have no choice but to transfer sensitive data over the internet. When I spoke to some vendors, they explained that supporting every region is expensive because there aren't enough customers in those region to justify the cost.</p>
<p>To address this challenge, I want to share a solution where SaaS providers can offer their services to customers in multiple regions using a single workload.<br />For example, say you have customers in Europe but your applications and workloads are deployed in Canada, or if you want to expand to multiple regions without dealing with the complexity and cost of managing servers and databases across different regions, you can solve this using simple networking and load balancers.</p>
<h2 id="heading-how-does-the-solution-work">How Does The Solution Work?</h2>
<p>Suppose your applications are deployed in the Canada region, which is your main base of operations. We'll call this the <code>ca-west-1</code> region. Now, let's assume you have enterprise partners and end users in the Europe region, which we'll call <code>eu-central-1</code>. Here's how you can serve your European customers:</p>
<ul>
<li><p>Establish a link between <code>ca-west-1</code> and <code>eu-central-1</code> regions through a VPC peering connection or transit gateway peering.</p>
</li>
<li><p>Setup application and network load balancers in <code>eu-central-1</code> that target your workloads in <code>ca-west-1</code>.</p>
</li>
<li><p>Provision a VPC endpoint service connected to the network load balancer. This will provide PrivateLink connection to enterprise customers.</p>
</li>
<li><p>Provision a domain for the application load balancer. This will provide service to general customers.</p>
</li>
</ul>
<p>Take a look at the architecture below to see how it all comes together.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1724598194077/dfc9fcf0-e4b5-4ddb-a9e1-8159861043ea.png" alt class="image--center mx-auto" /></p>
<p>In the diagram above, there are two VPCs connected by a VPC peering connection between the Europe and Canada regions. Target groups are created to help load balancers find applications easily. These load balancers are exposed to customers through Route 53 and securely to partners via AWS PrivateLink.</p>
<p>When an instance is added or removed from the autoscaling fleet in the Canada region, an event is published. This event is enriched with the instance's IP and port by a Lambda function before being sent to other regions through EventBridge. Once the event reaches the destination region, a Lambda function picks it up and updates the target groups with the new target.</p>
<h2 id="heading-implementation">Implementation</h2>
<p>To implement this setup, we'll use Terraform, a popular vendor-agnostic Infrastructure as Code (IaC) tool used by modern engineers.</p>
<p>The full project is available on my <a target="_blank" href="https://github.com/ben-x/cloudpedia/tree/master/content/multi-region-with-single-workload">GitHub repo</a>.</p>
<h3 id="heading-requirements">Requirements</h3>
<ul>
<li><p>An AWS account</p>
</li>
<li><p>AWS CLI installed and configured with credentials that have sufficient permissions</p>
</li>
<li><p>Terraform v1.7 or later</p>
</li>
</ul>
<h3 id="heading-step-1-setup-workload-in-base-region-canada">Step 1: Setup Workload in Base Region (Canada)</h3>
<div class="gist-block embed-wrapper" data-gist-show-loading="false" data-id="0999d8c126ec9f66d7b55f9887d03f2f"><div class="embed-loading"><div class="loadingRow"></div><div class="loadingRow"></div></div><a href="https://gist.github.com/ben-x/0999d8c126ec9f66d7b55f9887d03f2f" class="embed-card">https://gist.github.com/ben-x/0999d8c126ec9f66d7b55f9887d03f2f</a></div><p> </p>
<h3 id="heading-step-2-setup-vpc-in-secondary-region-europe">Step 2: Setup VPC in Secondary Region (Europe)</h3>
<div class="gist-block embed-wrapper" data-gist-show-loading="false" data-id="91eb7e3b4ebe4ed2ba2ac18664aa63be"><div class="embed-loading"><div class="loadingRow"></div><div class="loadingRow"></div></div><a href="https://gist.github.com/ben-x/91eb7e3b4ebe4ed2ba2ac18664aa63be" class="embed-card">https://gist.github.com/ben-x/91eb7e3b4ebe4ed2ba2ac18664aa63be</a></div><p> </p>
<h3 id="heading-step-3-peer-europe-amp-canada-regions">Step 3: Peer Europe &amp; Canada Regions</h3>
<div class="gist-block embed-wrapper" data-gist-show-loading="false" data-id="4c4873e631e108337040a790036e1730"><div class="embed-loading"><div class="loadingRow"></div><div class="loadingRow"></div></div><a href="https://gist.github.com/ben-x/4c4873e631e108337040a790036e1730" class="embed-card">https://gist.github.com/ben-x/4c4873e631e108337040a790036e1730</a></div><p> </p>
<h3 id="heading-step-4-setup-load-balancers-amp-target-groups-in-europe">Step 4: Setup Load Balancers &amp; Target Groups in Europe</h3>
<div class="gist-block embed-wrapper" data-gist-show-loading="false" data-id="23b23b74eb1d37e50450377b67b79f6a"><div class="embed-loading"><div class="loadingRow"></div><div class="loadingRow"></div></div><a href="https://gist.github.com/ben-x/23b23b74eb1d37e50450377b67b79f6a" class="embed-card">https://gist.github.com/ben-x/23b23b74eb1d37e50450377b67b79f6a</a></div><p> </p>
<h3 id="heading-step-5-lambda-publish-instance-launch-event">Step 5: Lambda Publish Instance Launch Event</h3>
<pre><code class="lang-javascript"><span class="hljs-keyword">import</span> { getInstanceIpAddress, publishEvent, completeLifecycleAction } <span class="hljs-keyword">from</span> <span class="hljs-string">'./utils.js'</span>;

<span class="hljs-keyword">async</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">handleInstanceLaunch</span>(<span class="hljs-params">event</span>) </span>{
  <span class="hljs-keyword">const</span> port = process.env.APP_PORT;
  <span class="hljs-keyword">const</span> availabilityZone = process.env.AVAILABILITY_ZONE || <span class="hljs-string">'all'</span>;
  <span class="hljs-keyword">const</span> { detail } = event;

  <span class="hljs-keyword">if</span>(!detail.EC2InstanceId) {
    <span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> <span class="hljs-built_in">Error</span>(<span class="hljs-string">'Details contains no instance ID'</span>);
  }

  <span class="hljs-keyword">const</span> ipAddress = <span class="hljs-keyword">await</span> getInstanceIpAddress(detail.EC2InstanceId);

  <span class="hljs-keyword">await</span> publishEvent(<span class="hljs-string">'INSTANCE_IS_LAUNCHING'</span>, {
    <span class="hljs-attr">instanceId</span>: detail.EC2InstanceId,
    ipAddress,
    port,
    availabilityZone
  });

  <span class="hljs-keyword">await</span> completeLifecycleAction({
    <span class="hljs-attr">asgName</span>: detail.AutoScalingGroupName,
    <span class="hljs-attr">instanceId</span>: detail.EC2InstanceId,
    <span class="hljs-attr">lifecycleHookName</span>: detail.LifecycleHookName,
    <span class="hljs-attr">lifecycleActionToken</span>: detail.LifecycleActionToken
  });
}

<span class="hljs-keyword">export</span> { handleInstanceLaunch };
</code></pre>
<h3 id="heading-step-6-lambda-capture-event-amp-update-target-groups">Step 6: Lambda Capture Event &amp; Update Target Groups</h3>
<pre><code class="lang-javascript"><span class="hljs-keyword">import</span> { ElasticLoadBalancingV2Client, RegisterTargetsCommand } <span class="hljs-keyword">from</span> <span class="hljs-string">'@aws-sdk/client-elastic-load-balancing-v2'</span>;

<span class="hljs-keyword">const</span> elasticLoadBalancingV2Client = <span class="hljs-keyword">new</span> ElasticLoadBalancingV2Client();

<span class="hljs-keyword">async</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">registerTarget</span> (<span class="hljs-params">event</span>) </span>{
  <span class="hljs-keyword">const</span> targetGroupArns = <span class="hljs-built_in">JSON</span>.parse(process.env.TARGET_GROUP_ARNS);
  <span class="hljs-keyword">const</span> { detail } = event;

  <span class="hljs-keyword">for</span> (<span class="hljs-keyword">const</span> targetGroupArn <span class="hljs-keyword">of</span> targetGroupArns) {
    <span class="hljs-keyword">const</span> registerTargetsCommand = <span class="hljs-keyword">new</span> RegisterTargetsCommand({
      <span class="hljs-attr">TargetGroupArn</span>: targetGroupArn,
      <span class="hljs-attr">Targets</span>: [{
        <span class="hljs-attr">Id</span>: detail.ipAddress,
        <span class="hljs-attr">Port</span>: detail.port,
        <span class="hljs-attr">AvailabilityZone</span>: detail.availabilityZone
      }]
    });

    <span class="hljs-keyword">await</span> elasticLoadBalancingV2Client.send(registerTargetsCommand);
  }
}

<span class="hljs-keyword">export</span> { registerTarget };
</code></pre>
<p>The full project is available on my <a target="_blank" href="https://github.com/ben-x/cloudpedia/tree/master/content/multi-region-with-single-workload">GitHub repo</a>.</p>
<h2 id="heading-speed-analysis">Speed Analysis</h2>
<p>We'll make requests to each region to see how fast the service responds. We'll monitor the speed using the network analyzer in Google Chrome.</p>
<h3 id="heading-calgary-to-calgary">Calgary to Calgary</h3>
<p>The image below shows a request made by a user in Canada to the service endpoint in Calgary. As expected, the latency is very low. It takes 21 milliseconds to receive a response for users in Calgary.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1724814414545/25e5b8af-01b2-44b9-a8f9-1ac3ca1d8b99.png" alt class="image--center mx-auto" /></p>
<h3 id="heading-berlin-germany-to-calgary-canada-7500km-apart">Berlin, Germany to Calgary, Canada (~7,500km apart)</h3>
<p>The image below shows a request made by a user in Berlin to the service endpoint in Germany. Excluding the time for Queueing and Stalled, the request took about 400 milliseconds. This is more than sufficient for most applications.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1724726730004/2daca216-3b6e-4788-b184-98893c6a8bf2.jpeg" alt="Time analysis for request between regions" class="image--center mx-auto" /></p>
<h2 id="heading-cost-analysis">Cost Analysis</h2>
<p>For cost analysis, since the cost of the primary region is fixed, we'll only consider the cost of running the secondary region.</p>
<div class="hn-table">
<table>
<thead>
<tr>
<td>Resource</td><td>Usage / Month</td><td>Cost (CAD) / Month</td></tr>
</thead>
<tbody>
<tr>
<td>Inter-Region data transfer</td><td>100Million reqs @ 10kb/req</td><td>$85.8</td></tr>
<tr>
<td>Lambda Function</td><td>500 invocations</td><td>$0.0001</td></tr>
<tr>
<td>Event Bridge</td><td>500 events</td><td>$0.0005</td></tr>
<tr>
<td>Load Balancer</td><td>ALB running + 1.08 LCUs</td><td>$27.25</td></tr>
<tr>
<td><strong>Total</strong></td><td></td><td><strong>$113.05</strong></td></tr>
</tbody>
</table>
</div><p>For an additional $113 each month, you can have another region running and serving requests. This is much cheaper than setting up compute and database resources in another region.</p>
<p>These costs were calculated using the pricing provided in the AWS documentation.</p>
<h2 id="heading-benefits">Benefits</h2>
<ul>
<li><p>Wider product reach: easily serve customers in multiple region</p>
</li>
<li><p>Reduced cost: as seen from the cost analysis</p>
</li>
<li><p>Reduced complexity: simplifies multi-region resource management</p>
</li>
</ul>
<h2 id="heading-limitations">Limitations</h2>
<ul>
<li><p>Reduced resiliency: failure of the primary region cripples all secondary region</p>
</li>
<li><p>Increased latency: not suitable for applications needing very fast response times</p>
</li>
<li><p>Data sovereignty: not suitable for customers who want their data to stay in their own country/region</p>
</li>
<li><p>vpc-peering connection <a target="_blank" href="https://docs.aws.amazon.com/vpc/latest/peering/vpc-peering-basics.html#vpc-peering-limitations">limitations</a> (Can be resolved by replacing with transit gateway)</p>
</li>
</ul>
<h2 id="heading-conclusion">Conclusion</h2>
<p>Sometimes, as service providers, we have customers in regions we don't currently support. This shouldn't be a reason to miss out on revenue or fail to offer them the best experience. With a bit of setup, you can provide them with something secure, private, and better than using the internet. Plus, when you eventually move workloads to those regions, your customers won't need to change anything on their end.</p>
<p>In this article, we explored a multi-region solution for serving customers using AWS services. By deploying a load balancer and leveraging AWS PrivateLink, you can securely and efficiently serve customers in different regions without managing servers across multiple locations. We covered the architecture, implementation using Terraform, speed analysis, cost analysis, and the benefits and limitations of this approach.</p>
<hr />
<h3 id="heading-references">References</h3>
<p><a target="_blank" href="https://aws.amazon.com/ec2/pricing/on-demand/#Data_Transfer">https://aws.amazon.com/ec2/pricing/on-demand/#Data_Transfer</a></p>
<p><a target="_blank" href="https://aws.amazon.com/elasticloadbalancing/pricing/">https://aws.amazon.com/elasticloadbalancing/pricing/</a></p>
<p><a target="_blank" href="https://aws.amazon.com/lambda/pricing/">https://aws.amazon.com/lambda/pricing/</a></p>
]]></content:encoded></item></channel></rss>