<?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>Forem: Miguel Angel Muñoz Sanchez</title>
    <description>The latest articles on Forem by Miguel Angel Muñoz Sanchez (@michel8585).</description>
    <link>https://forem.com/michel8585</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%2F1161133%2F97b3e16c-9216-4e3d-9185-901e132e766b.jpg</url>
      <title>Forem: Miguel Angel Muñoz Sanchez</title>
      <link>https://forem.com/michel8585</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/michel8585"/>
    <language>en</language>
    <item>
      <title>Aurora DSQL: How to Control Time</title>
      <dc:creator>Miguel Angel Muñoz Sanchez</dc:creator>
      <pubDate>Thu, 07 Aug 2025 06:00:00 +0000</pubDate>
      <link>https://forem.com/aws-builders/aurora-dsql-how-to-control-time-1kh5</link>
      <guid>https://forem.com/aws-builders/aurora-dsql-how-to-control-time-1kh5</guid>
      <description>&lt;p&gt;In the &lt;a href="https://dev.to/aws-builders/the-path-to-amazon-aurora-dsql-59og"&gt;previous article&lt;/a&gt;, we explored how we arrived at Amazon Aurora DSQL and why we need a database that allows consistent writes across multiple regions. At the end of that article, we posed the key question: &lt;strong&gt;How did AWS achieve a database with multi-regional writes without breaking ACID?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The answer lies in something that seems impossible: &lt;strong&gt;controlling time&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;In this article, we will explore how AWS has enabled Aurora DSQL to achieve something that seemed impossible or at least very complex: allowing a Postgres database to support writes across multiple regions with consistency.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;In this article, we will cover:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The fundamental problem of time in distributed databases&lt;/li&gt;
&lt;li&gt;AWS's solution: Global-scale time synchronization&lt;/li&gt;
&lt;li&gt;Aurora DSQL: Real distributed synchronization architecture&lt;/li&gt;
&lt;li&gt;Comparison with Aurora PostgreSQL&lt;/li&gt;
&lt;li&gt;Limitations and considerations&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  The Fundamental Problem: Time in Distributed Databases
&lt;/h1&gt;

&lt;p&gt;Before understanding how Aurora DSQL solves the problem, we need to comprehend why time presents such complexity in distributed systems.&lt;/p&gt;

&lt;h2&gt;
  
  
  The CAP Theorem or Brewer's Theorem
&lt;/h2&gt;

&lt;p&gt;In 2000, Eric Brewer formulated the CAP Theorem, which establishes that in a distributed system, you can only guarantee two of these three properties:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Consistency&lt;/strong&gt;: All nodes see the same data at the same time&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Availability&lt;/strong&gt;: The system continues functioning even when some nodes fail&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Partition tolerance&lt;/strong&gt;: The system continues operating even when communication between nodes breaks&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Any database, such as Aurora PostgreSQL or Aurora MySQL, prioritizes Consistency and Availability over partition tolerance. That's why for writes in Aurora PostgreSQL, we have a primary node and the rest serve as secondary replicas, both within the same region and across multiple regions.&lt;br&gt;
But &lt;strong&gt;Aurora DSQL requires all three properties to work together&lt;/strong&gt;, which demands an entirely different approach.&lt;/p&gt;
&lt;h2&gt;
  
  
  The Temporal Ordering Problem
&lt;/h2&gt;

&lt;p&gt;Imagine this sequence of events:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Region us-east-1  (10:00:00.020123): UPDATE users SET balance = 900 WHERE id = 123
Region us-west-2  (10:00:00.019548): UPDATE users SET balance = 200 WHERE id = 123
Region eu-west-1  (10:00:00.022020): UPDATE users SET balance = 500 WHERE id = 123
Region eu-south-2 (10:00:00.019386): UPDATE users SET balance = 300 WHERE id = 123
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Which of these transactions should execute first?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;These executions occur in 4 different regions within the exact second, using the same data, but with different values.&lt;/p&gt;

&lt;p&gt;If we use a system like Aurora PostgreSQL with a primary node in the us-east-1 region, the correct data would come from this region, since we would need to add latency to the other executions, which would produce inconsistencies.&lt;/p&gt;

&lt;p&gt;Beyond this problem, we assume that systems synchronize completely to the millisecond, but this doesn't always happen. Time synchronization presents significant challenges.&lt;/p&gt;

&lt;p&gt;Finally, we see an example of a single action, while a transaction involves several nested actions, which can create even bigger problems.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;This represents the problem Aurora DSQL must solve&lt;/strong&gt;: Create a global and consistent temporal order for all transactions, regardless of where they originate, and maintain real, synchronized time across regions.&lt;/p&gt;

&lt;h1&gt;
  
  
  AWS's Solution: Global-Scale Time Synchronization
&lt;/h1&gt;

&lt;p&gt;Traditionally, any data center has used &lt;strong&gt;NTP (Network Time Protocol)&lt;/strong&gt; to synchronize with atomic clocks that achieve nanosecond-level precision. However, NTP presents critical limitations for systems requiring extreme precision, as it depends on connected networks and therefore suffers from network latency, potentially achieving only millisecond precision.&lt;/p&gt;

&lt;p&gt;AWS needed much greater synchronization between regions if it wanted to build a system like Aurora DSQL.&lt;/p&gt;

&lt;h2&gt;
  
  
  Amazon Time Sync Service
&lt;/h2&gt;

&lt;p&gt;AWS has invested heavily in synchronizing its infrastructures, creating the Amazon Time Sync Service for this purpose.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Amazon Time Sync Service&lt;/strong&gt; uses a fleet of satellites with atomic clocks that connect with all AWS regions, providing the same time to all of them.&lt;br&gt;
Atomic clocks are expensive, but satellite positioning systems like GPS require them.&lt;br&gt;
They offer an additional advantage: when they send time data, we know precisely how far away the satellite is and therefore the signal latency with very high precision.&lt;br&gt;
Unlike NTP services against ground-based atomic clocks, satellite-based latency remains stable and therefore provides much greater precision.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcnjaqaafw55nzmsmebeg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcnjaqaafw55nzmsmebeg.png" alt="Time Sync" width="800" height="372"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The precision achieved reaches &lt;a href="https://aws.amazon.com/about-aws/whats-new/2025/06/amazon-time-sync-nanosecond-hardware-packet-timestamps/" rel="noopener noreferrer"&gt;nanosecond&lt;/a&gt; levels between regions, something unthinkable just a few years ago.&lt;/p&gt;
&lt;h3&gt;
  
  
  ClockBound: Measuring Time Precision
&lt;/h3&gt;

&lt;p&gt;Complementing Time Sync Service, AWS has developed &lt;a href="https://github.com/aws/clock-bound" rel="noopener noreferrer"&gt;ClockBound&lt;/a&gt;, an open-source daemon and library that measures EC2 instance clock precision and enables determination of the real temporal order of events.&lt;/p&gt;

&lt;p&gt;Although &lt;strong&gt;Amazon Time Sync Service&lt;/strong&gt; provides exact time, minor synchronization deviations always exist. &lt;strong&gt;ClockBound&lt;/strong&gt; quantifies these synchronization deviations and adds fundamental functionalities for &lt;strong&gt;Amazon DSQL&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Main functionalities:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Time intervals with uncertainty&lt;/strong&gt;: Instead of an exact timestamp like &lt;code&gt;10:00:00.123456789&lt;/code&gt;, ClockBound provides a range &lt;code&gt;[10:00:00.123456785, 10:00:00.123456793]&lt;/code&gt; that guarantees the real time falls within that interval.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Definitive temporal comparison&lt;/strong&gt;: It can determine if event A definitely occurs before event B, or if they potentially happen concurrently.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Concurrency detection&lt;/strong&gt;: It identifies when two events may have co-occurred, which proves crucial for resolving transaction conflicts in DSQL.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Wait optimization&lt;/strong&gt;: It calculates the minimum time an application must wait to guarantee a globally unique timestamp.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;With ClockBound, we can compare our time sequence more precisely:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Event us-east-1: [10:00:00.020120, 10:00:00.020126] 
Event us-west-2: [10:00:00.019545, 10:00:00.019551]
Result: us-west-2 definitely occurred before us-east-1

Event eu-west-1: [10:00:00.022018, 10:00:00.022022]
Event eu-south-2: [10:00:00.019384, 10:00:00.019388] 
Result: eu-south-2 definitely occurred before eu-west-1

Event us-east-1: [10:00:00.020120, 10:00:00.020126]
Event us-west-2: [10:00:00.019545, 10:00:00.019551]
Conflicting event: [10:00:00.019550, 10:00:00.020125]
Result: The conflicting event overlaps with both
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;As you can imagine, without &lt;strong&gt;ClockBound&lt;/strong&gt;, Aurora DSQL probably wouldn't exist.&lt;/p&gt;

&lt;p&gt;By the way, although AWS developed &lt;strong&gt;ClockBound&lt;/strong&gt;, it's an &lt;strong&gt;open-source&lt;/strong&gt; project that &lt;strong&gt;anyone can use&lt;/strong&gt;.&lt;/p&gt;

&lt;h1&gt;
  
  
  Aurora DSQL: Real Distributed Synchronization Architecture
&lt;/h1&gt;

&lt;p&gt;Now it's time to start discussing how &lt;strong&gt;Aurora DSQL&lt;/strong&gt; works and what components make it up.&lt;/p&gt;

&lt;p&gt;Now that we understand how AWS has solved the time problem, we can explore how Aurora DSQL uses this technology to create a truly distributed database that maintains ACID properties at a global scale.&lt;/p&gt;

&lt;h2&gt;
  
  
  How Does DSQL Work?
&lt;/h2&gt;

&lt;p&gt;Aurora DSQL isn't simply an improved Aurora PostgreSQL. It represents an entirely new architecture that reimagines how a database should function to enable multi-region consistency.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Main components:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkc9y72z9onalpwama49n.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkc9y72z9onalpwama49n.png" alt="DSQL Arch" width="800" height="1011"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It's important to understand that each layer scales horizontally, independently of other layers, and dynamically, all depending on the load we demand from our Aurora DSQL.&lt;/p&gt;

&lt;p&gt;The horizontal scaling capability makes Aurora DSQL a completely serverless service.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Adjudicators:&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Although &lt;strong&gt;Query Processor&lt;/strong&gt; represents the first layer, let's discuss the &lt;strong&gt;Adjudicator&lt;/strong&gt; layer first.&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;Adjudicator&lt;/strong&gt; layer probably represents Aurora DSQL's most innovative component.&lt;br&gt;
These distributed processes implement consensus algorithms to ensure all regions agree on transaction order.&lt;/p&gt;

&lt;p&gt;When a transaction needs to execute, the adjudicator layer checks if conflicts exist with any other recent transactions. For conflict detection, adjudicators use an optimized and distributed consensus algorithm that enables conflict detection.&lt;/p&gt;

&lt;p&gt;Additionally, this layer scales horizontally, allowing multiple adjudicators for different database partitions, with each adjudicator handling a distinct space within our database.&lt;/p&gt;

&lt;p&gt;In Aurora DSQL, all layers operate independently, allowing us to define different partition systems for each layer. Independent layer operation means adjudicators partition based on how we analyze conflicts between transactions, rather than how we store our data, which improves the task's performance.&lt;/p&gt;

&lt;p&gt;Aurora DSQL does not replicate adjudicators in each region; instead, the system distributes them across database spaces, allowing any adjudicator to change regions at any time.&lt;/p&gt;
&lt;h3&gt;
  
  
  &lt;strong&gt;Journal Layer:&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;The &lt;strong&gt;Journal&lt;/strong&gt; records all transactions that Adjudicators approve.&lt;br&gt;
The &lt;strong&gt;Journal&lt;/strong&gt; resembles Aurora PostgreSQL's WAL (Write-Ahead Log), but Aurora DSQL distributes it across multiple regions.&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;Journal Layer&lt;/strong&gt; allows each transaction approved by an adjudicator to write directly to the &lt;strong&gt;Journal&lt;/strong&gt;.&lt;br&gt;
The &lt;strong&gt;Journal Layer&lt;/strong&gt; handles data durability, as &lt;strong&gt;Journal&lt;/strong&gt; records remain immutable, distributed, and replicated in the regions we choose so that we can maintain reliable traceability of all transactions in the log with backup.&lt;/p&gt;
&lt;h3&gt;
  
  
  &lt;strong&gt;Storage:&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Aurora DSQL's storage layer extends the Aurora Storage concept but adds global distribution capabilities and temporal consistency.&lt;/p&gt;

&lt;p&gt;One of Aurora DSQL Storage's main advantages is that it doesn't need to handle conflicts (adjudicator) or durability (journal), giving this layer more flexibility and enabling greater optimization.&lt;/p&gt;

&lt;p&gt;Instead of basing the storage layer on synchronous data replication, &lt;strong&gt;Aurora DSQL&lt;/strong&gt; bases storage distribution on data partitions, but adds sharding capabilities based not only on key partitions, but also on access time and regions, so the system distributes data more optimally while also replicating across different regions.&lt;/p&gt;

&lt;p&gt;Traditional databases cannot achieve this.&lt;/p&gt;
&lt;h3&gt;
  
  
  &lt;strong&gt;Query Processor:&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Now that we understand how the other layers work, we can discuss Query Processor.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Query Processor&lt;/strong&gt; represents the layer that receives any Query and where Aurora DSQL receives SQL requests and converts them into distributed operations. Unlike Aurora PostgreSQL, no single "primary" node exists here.&lt;/p&gt;

&lt;p&gt;As we saw before, our storage doesn't partition in a standard way; data doesn't replicate in the same storage, but is distributed across different storage partitions to improve performance.&lt;/p&gt;

&lt;p&gt;The distributed storage approach makes read operations less efficient because we must determine the data's location. The same happens with write operations since the adjudicator layer analyzes write operations before writing to the &lt;strong&gt;Journal&lt;/strong&gt; and subsequently to the &lt;strong&gt;Storage&lt;/strong&gt; layer.&lt;/p&gt;

&lt;p&gt;Additionally, we've seen that all these layers distribute across different partitions that don't need to match, meaning the adjudicator layer doesn't partition the same way as the storage layer.&lt;/p&gt;

&lt;p&gt;For this reason, &lt;strong&gt;Query Processor&lt;/strong&gt; represents a fundamental layer, as it orchestrates all our queries, enabling it to know which partition contains data in storage for consultation or which adjudicator should handle any data write task.&lt;/p&gt;

&lt;p&gt;Through query orchestration, the &lt;strong&gt;Query Processor&lt;/strong&gt; layer minimizes latency by reducing tasks and loops that any transaction can generate.&lt;/p&gt;

&lt;p&gt;Another advantage for maintaining consistency is that the &lt;strong&gt;Query Processor&lt;/strong&gt; performs temporal ordering of reads and chooses the most optimal versioned data, so if we perform a read query on data that someone has modified after our read, but due to latency our write was faster, instead of returning the modified data, the system will give us the data version at the time of query execution.&lt;/p&gt;
&lt;h3&gt;
  
  
  &lt;strong&gt;Complete Diagram Example:&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg59l1tbt1f0qqrr5rvvj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg59l1tbt1f0qqrr5rvvj.png" alt="DSQL Arch" width="800" height="304"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  But how does this architecture improve on traditional architecture?
&lt;/h2&gt;

&lt;p&gt;The architecture looks good, but does it work?&lt;/p&gt;
&lt;h3&gt;
  
  
  &lt;strong&gt;Strong Snapshot Isolation&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Aurora DSQL&lt;/strong&gt; uses a variation of the &lt;strong&gt;Optimistic Concurrency Control&lt;/strong&gt; protocol instead of a traditional model. &lt;strong&gt;Optimistic Concurrency Control&lt;/strong&gt; proves crucial for performance in a distributed environment.&lt;/p&gt;

&lt;p&gt;The Optimistic Concurrency Control protocol essentially states that when executing a transaction that can compete with another, its commit can only proceed if it adheres to the defined isolation rules.&lt;/p&gt;

&lt;p&gt;That's why DSQL uses Strong Snapshot Isolation; this working mode allows multiple transactions to execute in parallel, following a series of rules:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;All transaction reads use the transaction start timestamp (&lt;strong&gt;T&lt;small&gt;start&lt;/small&gt;&lt;/strong&gt;).&lt;/li&gt;
&lt;li&gt;When committing data, the commit timestamp gets established (&lt;strong&gt;T&lt;small&gt;commit&lt;/small&gt;&lt;/strong&gt;).&lt;/li&gt;
&lt;li&gt;The transaction can execute the commit only if no other transaction has committed to the same key during the transaction start time (&lt;strong&gt;T&lt;small&gt;start&lt;/small&gt;&lt;/strong&gt;) and commit time (&lt;strong&gt;T&lt;small&gt;commit&lt;/small&gt;&lt;/strong&gt;).&lt;/li&gt;
&lt;li&gt;Writes execute using the Commit timestamp (&lt;strong&gt;T&lt;small&gt;commit&lt;/small&gt;&lt;/strong&gt;).&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Strong Snapshot Isolation&lt;/strong&gt; offers several advantages:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;We will never see data that doesn't come after a commit.&lt;/li&gt;
&lt;li&gt;Reads remain repeatable and therefore cacheable.&lt;/li&gt;
&lt;li&gt;Reads come from a single point in time (logical).&lt;/li&gt;
&lt;li&gt;Conflicting writes get rejected; no writes get lost.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;For this reason, the &lt;strong&gt;Query Processor&lt;/strong&gt; and &lt;strong&gt;Adjudicator&lt;/strong&gt; layers prove so important, as they handle the magic that makes this work.&lt;/p&gt;
&lt;h3&gt;
  
  
  &lt;strong&gt;Multi-Region Optimization&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;So far, what we've seen doesn't seem very multi-regional, and we would still have latency problems. Still, we've seen a vital point: DSQL separates reads from writes and also has a fundamental component like &lt;strong&gt;Query Processor&lt;/strong&gt; where writes queue before Commit execution.&lt;/p&gt;

&lt;p&gt;Through write queuing, the entire transaction can execute locally, even with distributed data, since we only need the &lt;strong&gt;Adjudicator&lt;/strong&gt; layer for the Commit execution, which we can perform even if the adjudicator operates in another region.&lt;/p&gt;

&lt;p&gt;Local transaction execution significantly improves performance by avoiding unnecessary jumps between regions, resulting in a much lower absolute latency than expected.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgmt70sxk2dmunmjwcjro.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgmt70sxk2dmunmjwcjro.png" alt="DSQL Optimized" width="800" height="408"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  &lt;strong&gt;FailOver Optimization&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Another advantage is that the Adjudicator layer only stores recent transactions, making it easy to replicate in case of regional failure.&lt;/p&gt;

&lt;p&gt;On the other hand, the Journal layer distributes and replicates data, ensuring that in case of failure, it replicates across multiple regions.&lt;/p&gt;

&lt;p&gt;Finally, the storage layer, which always takes longer to replicate, has the capacity to redo all pending writes using the Journal layer.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpmhhzny0yjldr5asytk8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpmhhzny0yjldr5asytk8.png" alt="DSQL FailOver" width="800" height="636"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Comparison with Aurora PostgreSQL or Traditional Databases
&lt;/h2&gt;
&lt;h3&gt;
  
  
  &lt;strong&gt;Elimination of the "Primary" Concept&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;In Aurora PostgreSQL, a primary node handles all writes.&lt;/p&gt;

&lt;p&gt;In Aurora DSQL, &lt;strong&gt;we can initiate writes from any region&lt;/strong&gt;, minimizing multi-region latencies.&lt;/p&gt;
&lt;h3&gt;
  
  
  &lt;strong&gt;Real Horizontal Scalability&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Aurora DSQL can scale by adding more regions without performance degradation.&lt;/p&gt;
&lt;h3&gt;
  
  
  &lt;strong&gt;Faster FailOver&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;In Aurora PostgreSQL, if the primary region fails, one of the replicas in another region must become primary (1-2 minute process).&lt;/p&gt;

&lt;p&gt;In &lt;strong&gt;Aurora DSQL&lt;/strong&gt;, the failover process happens much faster because no primary exists, and the system distributes the load.&lt;/p&gt;
&lt;h3&gt;
  
  
  &lt;strong&gt;Horizontal Scaling&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Aurora DSQL represents a database with completely decoupled layers, making horizontal scaling and descaling possible, which isn't possible in Aurora PostgreSQL or traditional databases.&lt;/p&gt;

&lt;p&gt;Additionally, it's an entirely serverless database.&lt;/p&gt;
&lt;h1&gt;
  
  
  Limitations and Considerations
&lt;/h1&gt;

&lt;p&gt;Aurora DSQL is a marvel, but it's not suitable for everyone, so I don't recommend it for everyone.&lt;/p&gt;

&lt;p&gt;It's an incredible database if your use case fits, but if you have a traditional use case, it's probably not your database; it might even perform much worse than Aurora PostgreSQL.&lt;/p&gt;

&lt;p&gt;It's important to note that Aurora DSQL prioritizes consistency over extreme latency:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Simple transactions: 10-50ms additional vs Aurora PostgreSQL.&lt;/li&gt;
&lt;li&gt;Complex transactions: Can be 2-5x slower than Aurora PostgreSQL.&lt;/li&gt;
&lt;li&gt;Reads: Not much variation since it uses local replicas.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Same-region Latency Comparison&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;If our workloads exist in a single region, Aurora DSQL will have much higher latency.&lt;/p&gt;
&lt;h3&gt;
  
  
  Aurora DSQL Pricing Model
&lt;/h3&gt;

&lt;p&gt;Aurora DSQL uses a &lt;strong&gt;serverless pricing model&lt;/strong&gt; that charges for:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Compute (Processing):&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Billing by Aurora Compute Units (ACUs) consumed.&lt;/li&gt;
&lt;li&gt;Automatic scaling based on workload.&lt;/li&gt;
&lt;li&gt;No provisioning required.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Storage:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Charge per GB stored per month&lt;/li&gt;
&lt;li&gt;Automatic replication included in price&lt;/li&gt;
&lt;li&gt;Automatic backup included&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;I/O (Input/Output):&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Charge per million I/O requests&lt;/li&gt;
&lt;li&gt;Includes both reads and writes&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Cost Comparison: Aurora DSQL vs Aurora PostgreSQL
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Example scenario - Medium application:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Aurora PostgreSQL (Provisioned):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;- Instance db.r6g.large: ~$200/month
- Storage (100GB): ~$10/month
- I/O (10M requests): ~$2/month
- Approximate total: ~$212/month (single region)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Aurora DSQL (Serverless):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;- Compute (equivalent): ~$300-400/month
- Storage (100GB): ~$15-20/month
- I/O (10M requests): ~$3-5/month
- Multi-region included: No additional cost
- Approximate total: ~$320-425/month (multi-region)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Factors affecting cost:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Traffic pattern&lt;/strong&gt;: Aurora DSQL proves more efficient for variable loads&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Multi-region requirements&lt;/strong&gt;: Aurora DSQL includes replication across multiple regions at no additional cost.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Transaction complexity&lt;/strong&gt;: Complex distributed transactions can increase cost&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Automatic scaling&lt;/strong&gt;: Can be more economical for applications with traffic spikes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;When is Aurora DSQL more cost-effective?&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Applications with highly variable traffic (serverless adapts automatically) &lt;em&gt;As long as Latency allows&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;Multi-region necessity.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Non-Recommended Use Cases
&lt;/h2&gt;

&lt;p&gt;Aurora DSQL isn't ideal for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Applications requiring ultra-low latency (&amp;lt;1ms)&lt;/li&gt;
&lt;li&gt;Primarily read workloads&lt;/li&gt;
&lt;li&gt;Systems with minimal budgets&lt;/li&gt;
&lt;li&gt;Applications that can tolerate eventual consistency&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Aurora DSQL represents a new category of database that revolutionizes distributed and multi-region databases.&lt;br&gt;
With this new database, AWS has opened the door to global applications that were previously technically impossible.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Aurora DSQL: Cómo controlar el tiempo</title>
      <dc:creator>Miguel Angel Muñoz Sanchez</dc:creator>
      <pubDate>Tue, 05 Aug 2025 06:00:00 +0000</pubDate>
      <link>https://forem.com/aws-espanol/aurora-dsql-como-controlar-el-tiempo-cbb</link>
      <guid>https://forem.com/aws-espanol/aurora-dsql-como-controlar-el-tiempo-cbb</guid>
      <description>&lt;p&gt;En el &lt;a href="https://dev.to/aws-espanol/el-camino-hacia-amazon-aurora-dsql-48al"&gt;artículo anterior&lt;/a&gt; vimos cómo hemos llegado hasta Amazon Aurora DSQL y por qué necesitamos una base de datos que permita escrituras consistentes en múltiples regiones. Al final del artículo planteamos la pregunta clave: &lt;strong&gt;¿Cómo ha conseguido AWS una BBDD con escritura multiregional sin romper ACID?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;La respuesta está en algo que parece imposible: &lt;strong&gt;controlar el tiempo&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;En este artículo vamos a explorar cómo AWS ha conseguido que Aurora DSQL consiga algo que parecía imposible o al menos muy complejo y es que una BBDD Postgres admita la escritura en múltiples regiones con consistencia.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;En este artículo vamos a ver:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;El problema fundamental del tiempo en bases de datos distribuidas&lt;/li&gt;
&lt;li&gt;La solución de AWS: Sincronización de tiempo a escala global&lt;/li&gt;
&lt;li&gt;Aurora DSQL: Arquitectura real de sincronización distribuida&lt;/li&gt;
&lt;li&gt;Comparativa con Aurora PostgreSQL&lt;/li&gt;
&lt;li&gt;Limitaciones y consideraciones&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  El Problema Fundamental: El Tiempo en Bases de Datos Distribuidas
&lt;/h1&gt;

&lt;p&gt;Antes de entender cómo Aurora DSQL resuelve el problema, necesitamos comprender por qué el tiempo es tan complejo en sistemas distribuidos.&lt;/p&gt;

&lt;h2&gt;
  
  
  El Teorema CAP o Teorema Brewer
&lt;/h2&gt;

&lt;p&gt;En 2000, Eric Brewer formuló el Teorema CAP que establece que en un sistema distribuido solo puedes garantizar dos de estas tres propiedades:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Consistency (Consistencia)&lt;/strong&gt;: Todos los nodos ven los mismos datos al mismo tiempo&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Availability (Disponibilidad)&lt;/strong&gt;: El sistema sigue funcionando aunque fallen algunos nodos&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Partition tolerance (Tolerancia a particiones)&lt;/strong&gt;: El sistema continúa operando aunque se pierda comunicación entre nodos&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Cualquier base de datos como Aurora PostgreSQL o Aurora MySQL elige Consistencia y Disponibilidad, sacrificando la tolerancia a particiones. Por eso para escritura en Aurora PostgreSQL tenemos un nodo primario y el resto de nodos son réplicas secundarias, tanto en la misma región como en múltiples regiones. &lt;br&gt;
Pero &lt;strong&gt;Aurora DSQL requiere que las tres propiedades estén garantizadas&lt;/strong&gt;, lo que requiere un enfoque completamente diferente.&lt;/p&gt;
&lt;h2&gt;
  
  
  El Problema de la Ordenación Temporal
&lt;/h2&gt;

&lt;p&gt;Imagina esta secuencia de eventos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Región us-east-1  (10:00:00.020123): UPDATE users SET balance = 900 WHERE id = 123
Región us-west-2  (10:00:00.019548): UPDATE users SET balance = 200 WHERE id = 123
Región eu-west-1  (10:00:00.022020): UPDATE users SET balance = 500 WHERE id = 123
Región eu-south-2 (10:00:00.019386): UPDATE users SET balance = 300 WHERE id = 123

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;¿Cuál de estas transacciones debería ejecutarse primero?&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;Son ejecuciones en 4 regiones diferentes en el mismo segundo, sobre el mismo dato y con valores diferentes.&lt;/p&gt;

&lt;p&gt;Si utilizamos un sistema como Aurora PostgreSQL con un nodo en la región us-east-1 primario, el dato correcto sería el dato de esta región, ya que el resto de ejecuciones tendríamos que sumar la latencia, lo que produciría inconsistencias.&lt;/p&gt;

&lt;p&gt;Además de este problema estamos suponiendo que los sistemas están completamente sincronizados al milisegundo, pero esto no es siempre así. Una sincronización de tiempo no es sencilla.&lt;/p&gt;

&lt;p&gt;Por último estamos viendo un ejemplo de una acción, mientras que una transacción conlleva varias acciones anidadas, lo que puede suponer un problema mayor.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Este es el problema que Aurora DSQL debe resolver&lt;/strong&gt;Crear un orden temporal global y consistente para todas las transacciones, independientemente de dónde se originen y tener un tiempo real y sincronizado entre regiones.&lt;/p&gt;

&lt;h1&gt;
  
  
  La Solución de AWS: Sincronización de Tiempo a Escala Global
&lt;/h1&gt;

&lt;p&gt;Tradicionalmente, cualquier centro de datos ha utilizado &lt;strong&gt;NTP (Network Time Protocol)&lt;/strong&gt; para sincronizar con relojes atómicos que tienen una precisión a nivel del nanosegundo. Sin embargo, NTP presenta limitaciones críticas para sistemas que requieren precisión extrema, ya que tiene dependencias con una red conectada y por tanto sufre de latencia de red y por tanto puede llegar a una precisión de milisegundos.&lt;/p&gt;

&lt;p&gt;AWS necesitaba una sincronización entre regiones mucho mayor, si quería tener un sistema como Aurora DSQL.&lt;/p&gt;

&lt;h2&gt;
  
  
  Amazon Time Sync Service
&lt;/h2&gt;

&lt;p&gt;AWS ha invertido mucho en que sus infraestructuras estén sincronizadas, para ello creó Amazon Time Sync Service.&lt;/p&gt;

&lt;p&gt;Este servicio utiliza una flota de satélites con relojes atómicos que se conectan con todas las regiones de AWS proporcionando el mismo tiempo a todas ellas. &lt;br&gt;
Los relojes atómicos son muy caros, pero son necesarios en cualquier sistema de posicionamiento satélite como GPS. &lt;br&gt;
Además tienen una ventaja adicional, cuando envían los datos de tiempo sabemos con exactitud a qué distancia está el satélite y por tanto la latencia de la señal con un nivel de precisión muy alto.&lt;br&gt;
A diferencia de un servicio tipo de NTP contra relojes atómicos en tierra esta latencia es estable y por tanto nos da una precisión mucho mayor.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwih27pkcmbe1woy29lvv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwih27pkcmbe1woy29lvv.png" alt="Time Sync" width="800" height="372"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;La precisión alcanzada es del orden de &lt;a href="https://aws.amazon.com/about-aws/whats-new/2025/06/amazon-time-sync-nanosecond-hardware-packet-timestamps/" rel="noopener noreferrer"&gt;nanosegundos&lt;/a&gt; entre regiones, algo impensable hace pocos años.&lt;/p&gt;
&lt;h3&gt;
  
  
  ClockBound: Midiendo la Precisión del Tiempo
&lt;/h3&gt;

&lt;p&gt;Complementando Time Sync Service, AWS ha desarrollado &lt;a href="https://github.com/aws/clock-bound" rel="noopener noreferrer"&gt;ClockBound&lt;/a&gt;, un demonio y librería open source que mide la precisión del reloj de las instancias EC2 y permite determinar el orden temporal real de los eventos.&lt;/p&gt;

&lt;p&gt;Aunque el Amazon Time Sync Service proporciona tiempo muy preciso, siempre existe una pequeña desviación en la sincronización. ClockBound cuantifica esta desviación, y añade ciertas funcionalidades fundamentales para Amazon DSQL:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Funcionalidades principales:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Intervalos de tiempo con incertidumbre&lt;/strong&gt;: En lugar de un timestamp exacto como &lt;code&gt;10:00:00.123456789&lt;/code&gt;, ClockBound proporciona un rango &lt;code&gt;[10:00:00.123456785, 10:00:00.123456793]&lt;/code&gt; qué garantiza que el tiempo real está dentro de ese intervalo.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Comparación temporal definitiva&lt;/strong&gt;: Puede determinar si un evento A ocurre definitivamente antes que un evento B, o si son potencialmente concurrentes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Detección de concurrencia&lt;/strong&gt;: Identifica cuándo dos eventos pueden haber ocurrido al mismo tiempo, lo que es crucial para resolver conflictos de transacciones en DSQL&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Optimización de esperas&lt;/strong&gt;: Calcula el tiempo mínimo que debe esperar una aplicación para garantizar que un timestamp sea globalmente único.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Con ClockBound podemos comparar nuestra secuencia de tiempos de forma más exacta:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Evento us-east-1: [10:00:00.020120, 10:00:00.020126] 
Evento us-west-2: [10:00:00.019545, 10:00:00.019551]
Resultado: us-west-2 ocurrió definitivamente antes que us-east-1

Evento eu-west-1: [10:00:00.022018, 10:00:00.022022]
Evento eu-south-2: [10:00:00.019384, 10:00:00.019388] 
Resultado: eu-south-2 ocurrió definitivamente antes que eu-west-1

Evento us-east-1: [10:00:00.020120, 10:00:00.020126]
Evento us-west-2: [10:00:00.019545, 10:00:00.019551]
Evento con conflicto: [10:00:00.019550, 10:00:00.020125]
Resultado: El evento conflictivo se solapa con ambos
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Como podéis suponer sin &lt;strong&gt;ClockBound&lt;/strong&gt; Aurora DSQL probablemente no existiría.&lt;/p&gt;

&lt;p&gt;Por cierto aunque &lt;strong&gt;ClockBound&lt;/strong&gt; ha sido desarrollado por AWS es un proyecto de &lt;strong&gt;código abierto&lt;/strong&gt; que &lt;strong&gt;cualquiera puede usar&lt;/strong&gt;.&lt;/p&gt;

&lt;h1&gt;
  
  
  Aurora DSQL: Arquitectura Real de Sincronización Distribuida
&lt;/h1&gt;

&lt;p&gt;Bueno ya va siendo hora de empezar a hablar de cómo funciona &lt;strong&gt;Aurora DSQL&lt;/strong&gt; y qué componentes lo conforman.&lt;/p&gt;

&lt;p&gt;Ahora que entendemos cómo AWS ha resuelto el problema del tiempo, podemos explorar cómo Aurora DSQL utiliza esta tecnología para crear una base de datos verdaderamente distribuida que mantiene las propiedades ACID a escala global.&lt;/p&gt;

&lt;h2&gt;
  
  
  ¿Cómo Funciona DSQL?
&lt;/h2&gt;

&lt;p&gt;Aurora DSQL no es simplemente un Aurora PostgreSQL mejorado. Es una arquitectura completamente nueva que reimagina cómo debe funcionar una base de datos para permitir la consistencia en multi-región.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Componentes principales:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8gh05xwa57k9y0mw6tkt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8gh05xwa57k9y0mw6tkt.png" alt="DSQL Arch" width="800" height="1011"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Es importante entender que cada capa escala de forma horizontal, independientemente del resto de capas y dinámicamente, todo ello dependiendo de la carga que demandemos a nuestro Aurora DSQL.&lt;/p&gt;

&lt;p&gt;Esto hace que sea un servicio totalmente serverless.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Adjudicators:&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Aunque la primera capa es &lt;strong&gt;Query Processor&lt;/strong&gt;, vamos a hablar primero de la capa de &lt;strong&gt;Adjudicator&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;La capa de &lt;strong&gt;Adjudicator&lt;/strong&gt; es probablemente el componente más innovador de Aurora DSQL. &lt;br&gt;
Son procesos distribuidos que implementan algoritmos de consenso para garantizar que todas las regiones estén de acuerdo sobre el orden de las transacciones.&lt;/p&gt;

&lt;p&gt;Cuando una transacción necesita ejecutarse, la capa de adjudicator revisa si existe conflicto con alguna otra transacción reciente. Para esto utilizan un algoritmo de consenso optimizado y distribuido, que permite detectar posibles conflictos.&lt;/p&gt;

&lt;p&gt;Además esta capa escala horizontalmente pudiendo tener múltiples adjudicators para diferentes particiones de nuestra BBDD, cada adjudicator se ocupa de un espacio diferente de nuestra BBDD.&lt;/p&gt;

&lt;p&gt;En Aurora DSQL todas las capas están desacopladas, esto implica que podemos definir sistemas de particiones diferentes para cada capa, de forma que los adjudicator no se particionan en función de cómo vamos a almacenar nuestros datos, sino de cómo vamos a analizar los conflictos entre transacciones, mejorando el rendimiento de esta tarea.&lt;/p&gt;

&lt;p&gt;Los adjudicators no están replicados en cada región, sino que están distribuidos por espacios de la BBDD, en cualquier momento un adjudicator puede cambiar de región.&lt;/p&gt;
&lt;h3&gt;
  
  
  &lt;strong&gt;Journal Layer:&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;El &lt;strong&gt;Journal&lt;/strong&gt; es donde se registran todas las transacciones aprobadas por los Adjudicators. &lt;br&gt;
Es similar al WAL (Write-Ahead Log) de Aurora PostgreSQL, pero distribuido en varias regiones.&lt;/p&gt;

&lt;p&gt;Esto permite que cada transacción aprobada por un adjudicator se escriba directamente en los Journal. &lt;br&gt;
Esta capa es la responsable de la durabilidad de los datos, ya que los registros del Journal son inmutables, están distribuidos y replicados en las regiones que elijamos, de forma que podemos tener una trazabilidad de todas las transacciones en este log de forma confiable y con respaldo.&lt;/p&gt;
&lt;h3&gt;
  
  
  &lt;strong&gt;Storage:&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;La capa de almacenamiento de Aurora DSQL extiende el concepto de Aurora Storage pero añadiendo capacidades de distribución global y consistencia temporal.&lt;/p&gt;

&lt;p&gt;Una de las ventajas principales del Storage de Aurora DSQL, es que no es necesario que se ocupe de los conflictos (adjudicator) ni de la durabilidad (journal), esto da más flexibilidad a esta capa permitiendo una optimización mayor.&lt;/p&gt;

&lt;p&gt;En vez de basar esta capa en una replicación de datos síncrona, lo que hace esta capa es basar la distribución del storage en particiones de datos, pero añadiendo capacidades de sharding no solo basados en particiones por claves, sino también por tiempo de acceso y regiones, de esta forma los datos están distribuidos de una forma más óptima aunque también estén replicados en las diferentes regiones.&lt;/p&gt;

&lt;p&gt;Esto no es posible en una base de datos tradicional.&lt;/p&gt;
&lt;h3&gt;
  
  
  &lt;strong&gt;Query Processor:&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Ya que hemos entendido cómo funcionan el resto de capas podemos hablar de Query Processor.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Query Processor&lt;/strong&gt; es la capa donde se recibe cualquier Query y es donde Aurora DSQL recibe las peticiones SQL y las convierte en operaciones distribuidas. A diferencia de Aurora PostgreSQL, aquí no hay un nodo "primario" único.&lt;/p&gt;

&lt;p&gt;Como hemos visto antes nuestro storage no está particionado de una forma estándar, los datos no están replicados en el mismo storage, sino que están distribuidos en diferentes particiones de storage para mejorar el rendimiento. &lt;/p&gt;

&lt;p&gt;Esto provoca que cualquier operación de lectura sea menos eficiente porque tenemos que saber dónde está el dato. También pasa con las operaciones de escritura ya que estas van a ser analizadas por la capa de adjudicator antes de escribirse en el Journal y posteriormente a la capa de Storage.&lt;/p&gt;

&lt;p&gt;Además hemos visto que todas estas capas están distribuidas en diferentes particiones y que no tienen por qué ser iguales, es decir la capa de adjudicator no está particionada igual que la capa de storage.&lt;/p&gt;

&lt;p&gt;Por este motivo &lt;strong&gt;Query Processor&lt;/strong&gt; es una capa fundamental, ya que es la capa que orquesta todas nuestras querys, de forma que es capaz de saber en qué partición está un dato en storage para consultarlo o a qué adjudicator tiene que asignar la tarea de escritura de cualquier dato.&lt;/p&gt;

&lt;p&gt;De esta forma esta capa minimiza la latencia reduciendo las tareas y loops que se pueden generar en cualquier transacción.&lt;/p&gt;

&lt;p&gt;Otra ventaja para mantener la consistencia es que hace una ordenación temporal de las lecturas y elige el dato versionado más óptimo, por eso si realizamos una consulta de lectura de un dato que ha sido modificado después de nuestra lectura, pero por latencia nuestra escritura ha sido más rápida, en vez de devolvernos el dato modificado nos va a dar la versión del dato en el momento de la ejecución de la query.&lt;/p&gt;
&lt;h3&gt;
  
  
  &lt;strong&gt;Ejemplo de Diagrama Completo:&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;a href="/post002/DSQL_2.png" class="article-body-image-wrapper"&gt;&lt;img src="/post002/DSQL_2.png" alt="DSQL Arch"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  ¿Pero en qué mejora esta arquitectura a una arquitectura tradicional?
&lt;/h2&gt;

&lt;p&gt;La verdad es que la arquitectura está bien, pero realmente funciona ¿?&lt;/p&gt;
&lt;h3&gt;
  
  
  &lt;strong&gt;Strong Snapshot Isolation&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Aurora DSQL utiliza una variación del protocolo &lt;strong&gt;Optimistic Concurrency Control&lt;/strong&gt; en lugar de un modelo tradicional. Esto es crucial para el rendimiento en un entorno distribuido.&lt;/p&gt;

&lt;p&gt;Básicamente el protocolo de Optimistic Concurrency Control define que si estamos ejecutando una transacción que pueden concurrir con otra, el commit de esta transacción solamente puede ejecutarse en el caso que cumpla con las reglas de aislamiento definidas.&lt;/p&gt;

&lt;p&gt;Por eso DSQL usa Strong Snapshot Isolation, este modo de trabajo permite que varias transacciones puedan ejecutarse en paralelo cumpliendo una serie de reglas:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Todas las lecturas de la transacción se hacen utilizando el timestamp del inicio de la transacción (&lt;strong&gt;T&lt;small&gt;start&lt;/small&gt;&lt;/strong&gt;).&lt;/li&gt;
&lt;li&gt;En el momento de realizar el commit de los datos se establece el timestamp de commit (&lt;strong&gt;T&lt;small&gt;commit&lt;/small&gt;&lt;/strong&gt;).&lt;/li&gt;
&lt;li&gt;La transacción puede ejecutar el commit única y exclusivamente si ninguna otra transacción ha realizado un commit en la misma clave durante el tiempo de inicio de la transacción (&lt;strong&gt;T&lt;small&gt;start&lt;/small&gt;&lt;/strong&gt;) y el tiempo de commit (&lt;strong&gt;T&lt;small&gt;commit&lt;/small&gt;&lt;/strong&gt;)&lt;/li&gt;
&lt;li&gt;Se ejecutan las escrituras utilizando el timestamp de Commit (&lt;strong&gt;T&lt;small&gt;commit&lt;/small&gt;&lt;/strong&gt;)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Esto tiene varias ventajas:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Nunca vamos a ver datos que no vengan después de un commit.&lt;/li&gt;
&lt;li&gt;Las lecturas son repetibles y por tanto cacheables.&lt;/li&gt;
&lt;li&gt;Las lecturas vienen desde un solo punto de tiempo (lógico).&lt;/li&gt;
&lt;li&gt;Las escrituras conflictivas son rechazadas, no se pierden escrituras.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Por este motivo es tan importante la capa de &lt;strong&gt;Query Processor&lt;/strong&gt; y &lt;strong&gt;Adjudicator&lt;/strong&gt;, ya que es la encargada de hacer magia y que esto funcione.&lt;/p&gt;
&lt;h3&gt;
  
  
  &lt;strong&gt;Optimización Multi-Región&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Hasta ahora lo que hemos visto parece que no es muy multi-región, además que seguiríamos teniendo un problema con las latencias, pero hemos visto un punto importante DSQL separa las lecturas de las escrituras y además tiene un componente fundamental como &lt;strong&gt;Query Processor&lt;/strong&gt; que es donde se encolan las escrituras antes de realizarse el Commit.&lt;/p&gt;

&lt;p&gt;De esta forma toda la transacción se puede llegar a ejecutar localmente aunque los datos estén distribuidos ya que únicamente a la hora de realizar el Commit es cuando necesitamos que la capa de &lt;strong&gt;Adjudicator&lt;/strong&gt; valide y es posible que este adjudicator esté en otra región, pero solamente lo necesitamos para ejecutar el commit, no para escribir el dato.&lt;/p&gt;

&lt;p&gt;Esto mejora increíblemente el rendimiento, evitando saltos entre regiones innecesarios, por lo que la latencia real de DSQL es mucho más baja de lo que esperaríamos.&lt;/p&gt;

&lt;p&gt;&lt;a href="/post002/DSQL_3.png" class="article-body-image-wrapper"&gt;&lt;img src="/post002/DSQL_3.png" alt="DSQL Optimized"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  &lt;strong&gt;Optimización de FailOver&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Otra ventaja es que la capa de Adjudicator es una capa que no guarda todos los datos, solamente las transacciones recientes, para estudiar si hay conflicto por lo que es fácilmente replicable en caso de caída de una región.&lt;/p&gt;

&lt;p&gt;Por otro lado la capa de Journal sí está distribuida y replicada, por lo que en caso de caída los datos están replicados en multi-región.&lt;/p&gt;

&lt;p&gt;Por último la capa de storage, que siempre es algo más lenta a la hora de replicar, tiene la capacidad de rehacer todas las escrituras pendientes utilizando la capa de Journal.&lt;br&gt;
&lt;a href="/post002/DSQL_4.png" class="article-body-image-wrapper"&gt;&lt;img src="/post002/DSQL_4.png" alt="DSQL FailOver"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Comparativa con Aurora PostgreSQL o bases de datos tradicionales
&lt;/h2&gt;
&lt;h3&gt;
  
  
  &lt;strong&gt;Eliminación del Concepto de "Primario"&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;En Aurora PostgreSQL, hay un nodo primario que maneja todas las escrituras. &lt;/p&gt;

&lt;p&gt;En Aurora DSQL, &lt;strong&gt;podemos iniciar una escritura desde cualquier región&lt;/strong&gt;, minimizando las latencias en multi-región.&lt;/p&gt;
&lt;h3&gt;
  
  
  &lt;strong&gt;Escalabilidad Horizontal Real&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Aurora DSQL puede escalar añadiendo más regiones sin que tengamos una degradación de rendimiento.&lt;/p&gt;
&lt;h3&gt;
  
  
  &lt;strong&gt;FailOver más rápido&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;En Aurora PostgreSQL, si la región primaria falla, es necesario que una de las réplicas en otra región pase a ser primario (proceso de 1-2 minutos). &lt;/p&gt;

&lt;p&gt;En Aurora DSQL el proceso es mucho más rápido porque no existe un primario y la carga está &lt;strong&gt;distribuida&lt;/strong&gt;.&lt;/p&gt;
&lt;h3&gt;
  
  
  &lt;strong&gt;Escalado Horizontal&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Aurora DSQL es una BBDD con capas totalmente desacopladas, lo que hace que sea posible realizar un escalado horizontal y desescalado horizontal, cosa que en Aurora PostgreSQL o en una BBDD tradicional no es posible&lt;/p&gt;

&lt;p&gt;Además es una BBDD totalmente serverless.&lt;/p&gt;
&lt;h1&gt;
  
  
  Limitaciones y Consideraciones
&lt;/h1&gt;

&lt;p&gt;Aurora DSQL es una maravilla, pero no es una base de datos para todos los públicos, por lo que personalmente no la recomiendo para todo el mundo. &lt;/p&gt;

&lt;p&gt;Es una base de datos increíble si tu caso de uso es el adecuado, pero si tienes un caso de uso tradicional, probablemente no sea tu base de datos, incluso puede llegar a ser muchísimo peor que Aurora PostgreSQL.&lt;/p&gt;

&lt;p&gt;Es importante remarcar que Aurora DSQL prioriza consistencia sobre latencia extrema:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Transacciones simples: 10-50ms adicionales vs Aurora PostgreSQL.&lt;/li&gt;
&lt;li&gt;Transacciones complejas: Puede ser 2-5x más lento que Aurora PostgreSQL.&lt;/li&gt;
&lt;li&gt;Lecturas: No hay mucha variación ya que se utilizan réplicas locales.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Comparativa de Latencia en la misma región&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Si nuestras cargas están en una única región, Aurora DSQL va a tener una latencia mucho mayor.&lt;/p&gt;
&lt;h3&gt;
  
  
  Modelo de Precios de Aurora DSQL
&lt;/h3&gt;

&lt;p&gt;Aurora DSQL utiliza un &lt;strong&gt;modelo de precios serverless&lt;/strong&gt; que cobra por:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Compute (Procesamiento):&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Se factura por Aurora Compute Units (ACUs) consumidas.&lt;/li&gt;
&lt;li&gt;Escalado automático basado en la carga de trabajo.&lt;/li&gt;
&lt;li&gt;No es necesario provisionar &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Storage (Almacenamiento):&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cobro por GB almacenado por mes&lt;/li&gt;
&lt;li&gt;Replicación automática incluida en el precio&lt;/li&gt;
&lt;li&gt;Backup automático incluido&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;I/O (Entrada/Salida):&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cobro por millones de requests de I/O&lt;/li&gt;
&lt;li&gt;Incluye tanto lecturas como escrituras&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Comparación de Costes: Aurora DSQL vs Aurora PostgreSQL
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Escenario ejemplo - Aplicación mediana:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Aurora PostgreSQL (Provisioned):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;- Instancia db.r6g.large: ~$200/mes
- Almacenamiento (100GB): ~$10/mes
- I/O (10M requests): ~$2/mes
- Total aproximado: ~$212/mes (región única)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Aurora DSQL (Serverless):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;- Compute (equivalente): ~$300-400/mes
- Almacenamiento (100GB): ~$15-20/mes
- I/O (10M requests): ~$3-5/mes
- Multi-región incluida: Sin costo adicional
- Total aproximado: ~$320-425/mes (multi-región)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Factores que afectan el costo:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Patrón de tráfico&lt;/strong&gt;: Aurora DSQL es más eficiente para cargas variables&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Requisitos multi-región&lt;/strong&gt;: Aurora DSQL incluye replicación en múltiples regiones sin costo adicional.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Complejidad de transacciones&lt;/strong&gt;: Transacciones distribuidas complejas pueden incrementar el costo&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Escalado automático&lt;/strong&gt;: Puede resultar más económico para aplicaciones con picos de tráfico&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;¿Cuándo Aurora DSQL es más rentable?&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Aplicaciones con tráfico muy variable (serverless se adapta automáticamente) &lt;em&gt;Siempre que la Latencia lo permita&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;Necesidad de multi-región.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Casos de Uso No Recomendados
&lt;/h2&gt;

&lt;p&gt;Aurora DSQL no es ideal para:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Aplicaciones que requieren latencia ultra-baja (&amp;lt;1ms)&lt;/li&gt;
&lt;li&gt;Cargas de trabajo principalmente de lectura&lt;/li&gt;
&lt;li&gt;Sistemas con presupuesto muy limitado&lt;/li&gt;
&lt;li&gt;Aplicaciones que pueden tolerar eventual consistency&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Aurora DSQL es una nueva categoría de base de datos que da una vuelta a las bases de datos distribuidas y multi-región. &lt;br&gt;
Con esta nueva base de datos, AWS ha abierto la puerta a aplicaciones globales que antes eran técnicamente imposibles.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>El camino hacia Amazon Aurora DSQL</title>
      <dc:creator>Miguel Angel Muñoz Sanchez</dc:creator>
      <pubDate>Wed, 23 Jul 2025 06:00:00 +0000</pubDate>
      <link>https://forem.com/aws-espanol/el-camino-hacia-amazon-aurora-dsql-48al</link>
      <guid>https://forem.com/aws-espanol/el-camino-hacia-amazon-aurora-dsql-48al</guid>
      <description>&lt;p&gt;Amazon Aurora DSQL ha sido probablemente el anuncio más impactante en los últimos años en AWS, es un avance brutal que añade una nueva capa a un servicio como Amazon Aurora que ya era impresionante.&lt;/p&gt;

&lt;p&gt;Eso sí, no es una BBDD para todos los públicos y vamos a hablar de ella en esta serie de artículos, en este primer artículo vamos a hablar de cómo hemos llegado hasta aquí y qué alternativas tenemos a Amazon Aurora DSQL, porque Amazon Aurora DSQL puede no ser lo más adecuado para nuestro caso de uso.&lt;/p&gt;

&lt;p&gt;Por resumir que es Amazon Aurora DSQL, es una BBDD distribuida que permite la consistencia en escritura y por tanto permite transacciones ACID en multi-región.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;En este artículo vamos a ver:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Que es ACID y su importancia&lt;/li&gt;
&lt;li&gt;Cómo han ido evolucionando las BBDD para ser más eficientes.&lt;/li&gt;
&lt;li&gt;Cómo Aurora revolucionó las BBDD.&lt;/li&gt;
&lt;li&gt;Que nos aporta Aurora Global Database y qué limitaciones tiene.&lt;/li&gt;
&lt;li&gt;Por qué necesitamos Aurora DSQL&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  ¿ACID qué es eso?
&lt;/h1&gt;

&lt;p&gt;Lo primero es aclarar que es ACID (&lt;strong&gt;A&lt;/strong&gt;tomicity, &lt;strong&gt;C&lt;/strong&gt;onsistency, &lt;strong&gt;I&lt;/strong&gt;solation and &lt;strong&gt;D&lt;/strong&gt;urability).&lt;/p&gt;

&lt;p&gt;ACID es un término que se acuñó en 1983 y en el que se basa todo el desarrollo de las BBDD actuales y aunque se acuñó en 1983, desde 1973 ya existían este tipos de Bases de Datos.&lt;/p&gt;

&lt;p&gt;Para ser ACID compliant una BBDD debe permitir que sus transacciones cumplan estos requisitos:&lt;/p&gt;

&lt;h2&gt;
  
  
  Atomicity (Atomicidad)
&lt;/h2&gt;

&lt;p&gt;Una transacción suele tener múltiples pasos, pero tiene que tratarse como una única entidad o la transacción se ejecuta correctamente o falla en su totalidad, no puede dejar datos modificados parcialmente.&lt;/p&gt;

&lt;h2&gt;
  
  
  Consistency (Consistencia)
&lt;/h2&gt;

&lt;p&gt;La consistencia de una transacción es que los datos son consistentes, de forma que no puedan corromperse al ejecutar una transacción.&lt;/p&gt;

&lt;h2&gt;
  
  
  Isolation
&lt;/h2&gt;

&lt;p&gt;El aislamiento garantiza que las operaciones se ejecutan de forma aislada y sin afectarse entre sí, de forma que al existir múltiples operaciones modificando el mismo registro una no se ejecute hasta que termine la anterior.&lt;/p&gt;

&lt;h2&gt;
  
  
  Durability
&lt;/h2&gt;

&lt;p&gt;Garantiza que una transacción una vez completada no pueda perderse incluso en caso de desastre y que los datos sigan estando disponibles una vez recuperado el desastre.&lt;/p&gt;

&lt;h2&gt;
  
  
  ¿Todas las BBDD soportan transacciones ACID?
&lt;/h2&gt;

&lt;p&gt;No todas las BBDD soportan ACID, por ejemplo Amazon MemoryDB no es ACID e incluso otras BBDD en AWS como Athena o DynamoDB originalmente no soportaban transacciones ACID (Actualmente las 2 las soportan).&lt;/p&gt;

&lt;p&gt;Ahora vamos a ver cómo se ha ido solucionando este problema históricamente y cómo hemos llegado a Amazon Aurora DSQL.&lt;/p&gt;

&lt;h1&gt;
  
  
  ¿Es fácil conseguir que nuestra BBDD sea ACID?
&lt;/h1&gt;

&lt;p&gt;No, no lo es, de hecho es una de las principales limitaciones de una BBDD, si alguna vez os habéis preguntado por qué las BBDD tienen tantos problemas con los sistemas de ficheros en Unix en general, es por esto.&lt;/p&gt;

&lt;p&gt;Una transacción en BBDD suele conllevar muchas operaciones de lectura/escritura, además requiere cierto nivel de bloqueo (Mientras se realiza una transacción no se puede ejecutar otra que modifique los mismos datos).&lt;/p&gt;

&lt;p&gt;Esto genera muchos problemas a nivel de latencia, pero no solo de latencia de red, incluso de latencia entre los propios componentes de un servidor. Para las BBDD históricamente la latencia de escritura a disco era un problema muy grande.&lt;/p&gt;

&lt;p&gt;Los discos han mejorado mucho en velocidad, pero aun así no era suficiente, por eso hace unos años se optó por escribir en memoria en vez de disco. La memoria RAM es mucho más rápida en escritura y lectura por lo que todo son ventajas, pero también tiene una serie de problemas. Por un lado es volátil, con lo que podemos perder los datos y por otro lado tampoco podemos cargar el contenido entero, porque la memoria habitualmente tiene menos tamaño que nuestros discos.&lt;/p&gt;

&lt;p&gt;Así que se optó por utilizar algo bastante habitual que es la memoria paginada que es crear “Páginas” de memoria que no dejan de ser bloques físicos de memoria. De esta forma podemos tener parte de nuestros datos en una página de memoria (Los datos frecuentes o nuevos) y volcamos de forma asíncrona los datos a disco para persistirlos. Esto además mejora tanto el performance al usar memoria, como el performance de disco ya que podemos optimizar las escrituras y las lecturas.&lt;/p&gt;

&lt;p&gt;Pero tendríamos un problema en caso de un fallo antes de volcar los datos a disco o si necesitamos recuperarlos, pero esto se soluciona con un sistema de logging transaccional conocido como Write-Ahead Logging (WAL) que sigue el principio DO-UNDO-REDO.&lt;/p&gt;

&lt;p&gt;Adicionalmente a escribir en memoria el resultado la transacción, se escribe un log con la transacción en sí:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fiw1dg620fnkecrxko0oy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fiw1dg620fnkecrxko0oy.png" alt="BBDD old" width="800" height="530"&gt;&lt;/a&gt;&lt;br&gt;
De esta forma si tenemos un fallo podemos cargar una página antigua que esté persistida y aplicar todos las transacciones que no se han persistido (REDO). O en caso contrario si queremos rectificar una transacción podemos saber que ha modificado y volver al estado anterior (UNDO):&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs5j2upotgh8lt22249zu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs5j2upotgh8lt22249zu.png" alt="Write-Ahead Logging" width="800" height="246"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Este sistema mejora infinitamente el rendimiento de las BBDD y es algo que lleva utilizándose muchos años en cualquier motor de BBDD.&lt;/p&gt;

&lt;h1&gt;
  
  
  ¿Y cómo una BBDD puede ser ACID en múltiples Zonas de Disponibilidad?
&lt;/h1&gt;

&lt;p&gt;Hasta aquí hemos visto cómo conseguimos esto en un solo servidor, pero si queremos tener alta disponibilidad, tenemos que montar 2 servidores (Un primario y un Stand-By) y aquí aparece el principal problema de todos la latencia de red.&lt;/p&gt;

&lt;p&gt;Una transacción no es solo una lectura o escritura en una BBDD, sino que es una secuencia de operaciones y por tanto el tiempo de ejecución de una transacción depende de la latencia.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9v25mp5pimy6qjino7dc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9v25mp5pimy6qjino7dc.png" alt="DSQL_3.png" width="800" height="261"&gt;&lt;/a&gt;&lt;br&gt;
Esto es un problema con una replicación síncrona, porque tenemos que esperar a que cada operación se replique. Esto incrementa mucho la duración de la transacción, porque tenemos que mandar la operación por red, que se ejecute en la réplica y esperar a que nos devuelva el ACK. Como la latencia de red es mucho más elevada, el tiempo de ejecución de una transacción se multiplica exponencialmente.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6dtht0mprirxj6qn22zi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6dtht0mprirxj6qn22zi.png" alt="DSQL_4.png" width="800" height="261"&gt;&lt;/a&gt;&lt;br&gt;
Podemos optar por una solución un poco más eficiente, que son las Read Réplicas, que en vez de utilizar una replicación síncrona utilizan una replicación asíncrona, de forma similar a como hacíamos con el disco, pero que van a tener un lag de replicación que es el tiempo en el que la réplica no tendrá el dato actualizado.&lt;/p&gt;

&lt;p&gt;Seguramente os preguntaréis cómo podemos garantizar que una transacción es ACID con una replicación, si vamos a tener un lag de replicación, la respuesta es sencilla, limitando las escrituras a una sola instancia. De esta forma garantizamos la consistencia y el aislamiento.&lt;/p&gt;

&lt;h1&gt;
  
  
  ¿Es mejorable?
&lt;/h1&gt;

&lt;p&gt;Este método era mejorable, ya que el lag de replicación nos puede afectar bastante y aquí es donde entra la magia de Amazon Aurora.&lt;/p&gt;

&lt;p&gt;Amazon Aurora hizo algo muy interesante que fue separar la capa de Almacenamiento y la de Computo. Dejando el motor de la BBDD en una instancia y gestionando la capa de almacenamiento de forma independiente.&lt;/p&gt;

&lt;p&gt;El motor de BBDD es exactamente igual, pero a la hora de realizar una escritura en vez de llamar directamente a disco, llama a los Storage Node de Aurora.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd5wzduwl3jwlbo955tlj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd5wzduwl3jwlbo955tlj.png" alt="DSQL_5.png" width="800" height="509"&gt;&lt;/a&gt;&lt;br&gt;
Cada nueva escritura lanza este esquema:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; Los registros se reciben en el Incoming Queue y se almacenan en el Hot Log en memoria&lt;/li&gt;
&lt;li&gt;Se devuelve el ACK al motor de la BBDD sin esperar la persistencia&lt;/li&gt;
&lt;li&gt;Los datos se registran en el Update Queue y se agrupan para optimizar las escrituras&lt;/li&gt;
&lt;li&gt;Se genera un nuevo Data Page distribuyéndolo en 6 copias sincronizadas (2 por cada AZ)&lt;/li&gt;
&lt;li&gt;Se realizan backups periódicos de Hot Logs y Data Pages a S3&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;De esta forma se consigue una latencia de replicación muy baja, menor a 100 ms (La cual es bajísima para un entorno multi AZ) en varias zonas de disponibilidad repartidas en 6 Copias, además se consiguen backups continuos y la posibilidad de hacer restauraciones a puntos determinados de tiempo.&lt;/p&gt;

&lt;p&gt;Lo mejor es que esto no impacta en el rendimiento de la BBDD ya que las operaciones de Storage no se ejecutan en la misma instancia donde está nuestro motor de BBDD, permitiendo un mayor rendimiento en general.&lt;/p&gt;

&lt;p&gt;Y además se replica vía Log todas las transacciones en todos los nodos.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbrboqjawjpcvgci4bohw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbrboqjawjpcvgci4bohw.png" alt="DSQL_6.png" width="800" height="412"&gt;&lt;/a&gt;&lt;br&gt;
Aurora soporta hasta 15 read réplicas y 64 TB de almacenamiento automático y puede manejar hasta 500,000 lecturas y 100,000 escrituras por segundo.&lt;/p&gt;

&lt;p&gt;Nota: Existen más pasos que he simplificado para un correcto entendimiento, ya que es un almacenamiento distribuido, no solo existe un nodo de Storage, etc.&lt;/p&gt;

&lt;p&gt;Nota 2: A nivel de motor de BBDD también se guardan los registros en memoria de forma que la escritura es más rápida.&lt;/p&gt;

&lt;h1&gt;
  
  
  ¿Y en múltiples Regiones?
&lt;/h1&gt;

&lt;p&gt;Si necesitamos replicar nuestra BBDD en otra región, nos vamos a encontrar que la latencia de replicación es mucho mayor, básicamente porque la latencia de red entre regiones es muy alta.&lt;/p&gt;

&lt;p&gt;Pero aquí es donde entra Amazon Aurora Global Database a ayudarnos.&lt;/p&gt;

&lt;p&gt;Amazon Aurora Global Database extiende su modelo de replicación a otras regiones, en este caso además de separar la capa de Almacenamiento, separa la capa de replicación.&lt;/p&gt;

&lt;p&gt;De esta forma vamos a tener una capa independiente para gestionar la replicación entre regiones y una capa de storage independiente para gestionar la replicación entre zonas. Esto permite que Amazon Aurora Global Database tenga mejor rendimiento a nivel de BBDD y una replicación entre regiones muy optimizada.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzy98ikr2h09ia2u6k6dg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzy98ikr2h09ia2u6k6dg.png" alt="DSQL_7.png" width="800" height="1216"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Cada nueva escritura lanza este esquema:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Se escriben los nuevos registros en los Storage nodes y réplicas de la  BBDD zonales y adicionalmente se escribe en un servidor de replicación.&lt;/li&gt;
&lt;li&gt;El servidor de replicación replica los registros de escritura en el servidor con el agente de replicación perteneciente al grupo de servidores de replicación en otras regiones.&lt;/li&gt;
&lt;li&gt;Este servidor de replicación actúa como si fuese una BBDD primaria y  ejecuta los registros de escritura tanto en la réplica global de la BBDD como en los Storage nodes de esta región.&lt;/li&gt;
&lt;li&gt;Por último, si el servidor de replicación detecta que no ha recibido algún registro de escritura, los recogerá de los storage nodes de la región primaria.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;De esta forma también se consigue una latencia de replicación muy baja, menor a 1 segundo en hasta 5 regiones secundarias. Cada región secundario tendrá adicionalmente replicación en zonas de disponibilidad y 6 Copias repartidas entre ellas, además tenemos backup multiregionales y continuos ya que el backup se almacenará también en cada región secundaria.&lt;/p&gt;

&lt;h1&gt;
  
  
  ¿Y la escritura en múltiples regiones?
&lt;/h1&gt;

&lt;p&gt;Es el mayor problema que hay en este modelo, ya que las escrituras solo pueden ejecutarse en la región primaria y por tanto la latencia de escritura en multiregión es altísima.&lt;/p&gt;

&lt;p&gt;Existe una solución intermedia que es utilizar write forwarding en Amazon Aurora, esto nos permite configurar una réplica global para escribir en ella, aunque realmente lo que estamos haciendo es enviar estas peticiones con un forward a la BBDD principal.&lt;br&gt;
Es una forma un poco más eficiente de escribir en multiregion, que nos permite utilizar endpoints por región, pero no es muy eficiente en escritura.&lt;/p&gt;

&lt;h1&gt;
  
  
  El Desafío de las escrituras multiregión consistentes
&lt;/h1&gt;

&lt;p&gt;Como hemos visto, tanto Amazon Aurora como Aurora Global Database han resuelto los problemas de rendimiento y replicación, siguen teniendo una limitación fundamental: las escrituras deben centralizarse en una región primaria para garantizar la consistencia ACID.&lt;/p&gt;

&lt;p&gt;Esta arquitectura funciona perfectamente para aplicaciones que pueden funcionar con escrituras centralizadas, pero ¿qué pasa cuando necesitamos que usuarios en diferentes regiones puedan escribir con baja latencia manteniendo la consistencia de escritura? Aquí es donde Amazon Aurora DSQL entra a escena.&lt;/p&gt;

&lt;p&gt;Uno de los problemas de las escrituras, es controlar la secuencia de tiempos, porque si lanzamos una escritura desde una región y lanzamos otra escritura sobre el mismo registro 100ms después en otra región, para cada una de estas regiones el dato correcto no es el mismo, porque no podemos controlar el tiempo y tendremos un problema de consistencia bastante grande.&lt;br&gt;
(Bueno realmente sí podemos controlar el tiempo, pero lo veremos en el próximo artículo).&lt;/p&gt;

&lt;h1&gt;
  
  
  Conclusiones.
&lt;/h1&gt;

&lt;p&gt;A lo largo de este artículo hemos recorrido la evolución en AWS que ha llevado al desarrollo de Amazon Aurora DSQL, desde los fundamentos de ACID hasta las limitaciones de los sistemas multiregión actuales.&lt;/p&gt;

&lt;p&gt;El sistema de replicación que utiliza Amazon Aurora y Amazon Aurora Global Database es una auténtica maravilla, porque mejora el performance increíblemente y además reduce los tiempos de replicación drásticamente.&lt;/p&gt;

&lt;p&gt;Si no necesitamos escrituras multiregion Amazon Aurora o Amazon Global Database es la mejor opción para la mayoría de casos, pero en caso de requerir una BBDD global, distribuida y con escritura consistente en multiregion tenemos que optar por Amazon Aurora DSQL.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Característica&lt;/th&gt;
&lt;th&gt;Aurora&lt;/th&gt;
&lt;th&gt;Aurora Global&lt;/th&gt;
&lt;th&gt;Aurora DSQL&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Latencia escritura&lt;/td&gt;
&lt;td&gt;Baja en la zona primaria&lt;/td&gt;
&lt;td&gt;Baja en la zona primaria y alta en multiregion&lt;/td&gt;
&lt;td&gt;Baja en multiregion&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Regiones escritura&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;1 primaria y hasta 5 adicionales con write forwarding&lt;/td&gt;
&lt;td&gt;Múltiples&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Read réplicas&lt;/td&gt;
&lt;td&gt;Hasta 15&lt;/td&gt;
&lt;td&gt;Hasta 16 por región&lt;/td&gt;
&lt;td&gt;Distribuidas globalmente&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Casos de uso&lt;/td&gt;
&lt;td&gt;Apps regionales&lt;/td&gt;
&lt;td&gt;Apps globales con lectura intensiva, dashboards&lt;/td&gt;
&lt;td&gt;Apps globales con escritura intensiva en múltiples regiones, gaming, IoT&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  ¿Cuánto cuesta Aurora DSQL?
&lt;/h3&gt;

&lt;p&gt;Aunque AWS todavía no ha publicado precios oficiales, Aurora DSQL será considerablemente más caro que Aurora debido a su complejidad distribuida.&lt;/p&gt;

&lt;p&gt;Tomando como referencia &lt;strong&gt;Aurora MySQL/PostgreSQL&lt;/strong&gt;\&lt;br&gt;
&lt;strong&gt;Aurora Global Database&lt;/strong&gt;: es un 65% más caro \&lt;br&gt;
&lt;strong&gt;Aurora DSQL&lt;/strong&gt;: Se estima entre 3 y 5 veces más que Aurora Global&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Cuál elegir?
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;NO uses Aurora DSQL si:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Tus escrituras pueden centralizarse en una región (&amp;gt;80% de casos)&lt;/li&gt;
&lt;li&gt;Necesitas usar MySQL como motor de BBDD&lt;/li&gt;
&lt;li&gt;Tus transacciones no requieren baja latencia en escritura multiregión&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Puedes utilizar Aurora Global Database cuando :&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Puedes tolerar write forwarding o escrituras en una sola región&lt;/li&gt;
&lt;li&gt;Requieres lecturas intensivas multiregion con escrituras ocasionales&lt;/li&gt;
&lt;li&gt;Necesitas un DR multiregión pero no escrituras activo-activo&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Puedes utilizar Aurora Cuando:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Tienes Aplicaciones regionales&lt;/li&gt;
&lt;li&gt;El presupuesto limitado&lt;/li&gt;
&lt;li&gt;Requieres una simplicidad operacional&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ahora que tenemos claro el problema, nos tenemos que hacer una pregunta: &lt;strong&gt;¿Cómo ha conseguido AWS una BBDD con escritura multiregional sin romper ACID?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;En el próximo artículo desvelaremos los secretos de Aurora DSQL y como AWS ha conseguido domar el tiempo en una BBDD.&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;Próximo: "Aurora DSQL: Como controlar el tiempo"&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>aws</category>
      <category>database</category>
      <category>rds</category>
      <category>postgres</category>
    </item>
    <item>
      <title>The Path to Amazon Aurora DSQL</title>
      <dc:creator>Miguel Angel Muñoz Sanchez</dc:creator>
      <pubDate>Wed, 23 Jul 2025 06:00:00 +0000</pubDate>
      <link>https://forem.com/aws-builders/the-path-to-amazon-aurora-dsql-59og</link>
      <guid>https://forem.com/aws-builders/the-path-to-amazon-aurora-dsql-59og</guid>
      <description>&lt;p&gt;Amazon Aurora DSQL has probably been the most impactful announcement in recent years at AWS. It's a significant advancement that adds a new layer to a service like Amazon Aurora, which was already impressive.&lt;/p&gt;

&lt;p&gt;However, it's not a database for everyone, and we will discuss it in this series of articles. In this first article, we'll discuss how we arrived at this point and what alternatives we have to Amazon Aurora DSQL, as Amazon Aurora DSQL may not be the most suitable option for our use case.&lt;/p&gt;

&lt;p&gt;To summarize, Amazon Aurora DSQL is a distributed database that provides write consistency, enabling ACID transactions in multi-region scenarios.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;In this article, we'll cover:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What ACID is and its importance&lt;/li&gt;
&lt;li&gt;How databases have evolved to be more efficient&lt;/li&gt;
&lt;li&gt;How Aurora revolutionized databases&lt;/li&gt;
&lt;li&gt;What Aurora Global Database brings us and its limitations&lt;/li&gt;
&lt;li&gt;Why do we need Aurora DSQL&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  What is ACID?
&lt;/h1&gt;

&lt;p&gt;First, let's clarify what ACID is (&lt;strong&gt;A&lt;/strong&gt;tomicity, &lt;strong&gt;C&lt;/strong&gt;onsistency, &lt;strong&gt;I&lt;/strong&gt;solation, and &lt;strong&gt;D&lt;/strong&gt;urability).&lt;/p&gt;

&lt;p&gt;Researchers coined the term ACID in 1983, and it forms the foundation of all current database development. Although researchers coined the term in 1983, these types of databases have existed since 1973.&lt;/p&gt;

&lt;p&gt;For a database to be ACID compliant, its transactions must meet these requirements:&lt;/p&gt;

&lt;h2&gt;
  
  
  Atomicity
&lt;/h2&gt;

&lt;p&gt;A transaction typically involves multiple steps, but the system must treat it as a single entity; either the transaction executes correctly or fails. It cannot leave data partially modified.&lt;/p&gt;

&lt;h2&gt;
  
  
  Consistency
&lt;/h2&gt;

&lt;p&gt;Transaction consistency ensures that data remains unchanged, preventing corruption when executing a transaction.&lt;/p&gt;

&lt;h2&gt;
  
  
  Isolation
&lt;/h2&gt;

&lt;p&gt;Isolation ensures that operations execute in isolation without affecting each other, so when multiple operations are modifying the same record, one doesn't execute until the previous one finishes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Durability
&lt;/h2&gt;

&lt;p&gt;The system guarantees that once it completes a transaction, it cannot lose the transaction, even in the event of a disaster, and the data remains available once the system recovers from the disaster.&lt;/p&gt;

&lt;h2&gt;
  
  
  Do all databases support ACID transactions?
&lt;/h2&gt;

&lt;p&gt;Not all databases support ACID. For example, Amazon MemoryDB is not ACID, and even other AWS databases, such as Athena or DynamoDB, initially didn't support ACID transactions (both currently support them).&lt;/p&gt;

&lt;p&gt;Now, let's examine how developers have historically solved this problem and how we arrived at Amazon Aurora DSQL.&lt;/p&gt;

&lt;h1&gt;
  
  
  Is it easy to make our database ACID?
&lt;/h1&gt;

&lt;p&gt;No, it's not. It's one of the main limitations of a database. If you've ever wondered why databases have so many problems with Unix file systems in general, this is why.&lt;/p&gt;

&lt;p&gt;A database transaction typically involves multiple read/write operations, and it requires a certain level of locking (i.e., while the system performs a transaction, another transaction that modifies the same data cannot execute).&lt;br&gt;
This creates many latency problems, not just network latency, but even latency between server components. For databases, historically, disk write latency has been a significant problem.&lt;/p&gt;

&lt;p&gt;Manufacturers have significantly improved disk speeds, but it still wasn't enough. Therefore, years ago, developers decided to write to memory instead of disk. RAM provides significantly faster writing and reading, offering several advantages, but it also presents some challenges. On the one hand, it's volatile, we can lose data; on the other hand, we can't load the entire content because memory usually has less capacity than our disks.&lt;/p&gt;

&lt;p&gt;Therefore, developers decided to utilize a common approach: paged memory, which creates memory "pages" that are physical memory blocks. This way we can have part of our data in a memory page (frequent or new data) and asynchronously dump data to disk to persist it. This improves both performance and disk utilization by optimizing write and read operations.&lt;/p&gt;

&lt;p&gt;However, we would encounter a problem in the event of failure before dumping data to disk or if we need to recover it. A transactional logging system known as Write-Ahead Logging (WAL) addresses this issue, which follows the DO-UNDO-REDO principle.&lt;/p&gt;

&lt;p&gt;In addition to writing the transaction result to memory, the system writes a log with the transaction itself:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx9ewhnj90vgs2j9q6wrb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx9ewhnj90vgs2j9q6wrb.png" alt="BBDD old" width="800" height="530"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This way, if we have a failure, we can load an old persisted page and apply all transactions that haven't been persisted (REDO). Or conversely, if we want to rectify a transaction, we can know what it modified and return to the previous state (UNDO):&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6jeb3o0gaval6euuw3o8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6jeb3o0gaval6euuw3o8.png" alt="Write-Ahead Logging" width="800" height="246"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This system continuously improves database performance and has been utilized for many years in various database engines.&lt;/p&gt;

&lt;h1&gt;
  
  
  How can a database be ACID across multiple Availability Zones?
&lt;/h1&gt;

&lt;p&gt;So far, we've seen how to achieve this on a single server, but if we want high availability, we need to set up two servers (a primary and a standby), and here appears the main problem of all: network latency.&lt;/p&gt;

&lt;p&gt;A transaction is not just a read or write in a database, but a sequence of operations, so the execution time of a transaction depends on latency.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsi4337vu54cttoxfxcu0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsi4337vu54cttoxfxcu0.png" alt="DSQL_3.png" width="800" height="261"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is a problem with synchronous replication because we have to wait for each operation to replicate. This dramatically increases transaction duration because we have to send the operation over the network, have it execute on the replica, and wait for it to return the ACK. Since network latency is much higher, transaction execution time multiplies exponentially.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr81puyp0h0qg6bztvr0o.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr81puyp0h0qg6bztvr0o.png" alt="DSQL_4.png" width="800" height="261"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We can opt for a slightly more efficient solution: Read Replicas, which, instead of using synchronous replication, use asynchronous replication, similar to how we did with disk. However, they will experience replication lag, which is the time when the replica does not have the most up-to-date data.&lt;/p&gt;

&lt;p&gt;You might wonder how we can guarantee that a transaction is ACID with replication if we have replication lag. The answer is simple: by limiting writes to a single instance. This way, we guarantee consistency and isolation.&lt;/p&gt;

&lt;h1&gt;
  
  
  Can it be improved?
&lt;/h1&gt;

&lt;p&gt;This method is improvable since replication lag can significantly affect us, and this is where Amazon Aurora's magic comes in.&lt;/p&gt;

&lt;p&gt;Amazon Aurora did something exciting: it separated the Storage and Compute layers, leaving the database engine in one instance and managing the storage layer independently.&lt;/p&gt;

&lt;p&gt;The database engine is precisely the same, but when performing a write, instead of calling the disk directly, it calls Aurora's Storage Nodes.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fid1894run46fue4votdg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fid1894run46fue4votdg.png" alt="DSQL_5.png" width="800" height="509"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Each new write launches this scheme:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Records are received in the Incoming Queue and stored in the Hot Log in memory&lt;/li&gt;
&lt;li&gt;ACK is returned to the database engine without waiting for persistence&lt;/li&gt;
&lt;li&gt;Data is registered in the Update Queue and grouped to optimize writes&lt;/li&gt;
&lt;li&gt;A new Data Page is generated, distributing it in 6 synchronized copies (2 per AZ)&lt;/li&gt;
&lt;li&gt;Periodic backups of Hot Logs and Data Pages are made to S3&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This approach enables the achievement of very low replication latency, less than 100 ms (which is exceptionally low for a multi-AZ environment), across multiple availability zones, with six copies, along with continuous backups and the ability to perform point-in-time restores.&lt;/p&gt;

&lt;p&gt;The best part is that this doesn't impact database performance, as storage operations are executed on a separate instance from where our database engine resides, allowing for better overall performance.&lt;/p&gt;

&lt;p&gt;Additionally, the system replicates all transactions via the Log to all nodes.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fexljvus0z53ewqpc1tcr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fexljvus0z53ewqpc1tcr.png" alt="DSQL_6.png" width="800" height="412"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Aurora supports up to 15 read replicas and 64 TB of automatic storage and can handle up to 500,000 reads and 100,000 writes per second.&lt;/p&gt;

&lt;p&gt;Note: There are additional steps that I've simplified for proper understanding. Since it's a distributed storage system, there isn't just one Storage node, etc.&lt;/p&gt;

&lt;p&gt;Note 2: At the database engine level, records are also stored in memory, so writing is faster.&lt;/p&gt;

&lt;h1&gt;
  
  
  What about multiple regions?
&lt;/h1&gt;

&lt;p&gt;If we need to replicate our database to another region, we'll find that replication latency is significantly higher, primarily because network latency between regions is very high.&lt;/p&gt;

&lt;p&gt;However, this is where Amazon Aurora Global Database comes to our aid.&lt;/p&gt;

&lt;p&gt;Amazon Aurora Global Database extends its replication model to other regions. In this case, in addition to separating the Storage layer, it separates the replication layer.&lt;/p&gt;

&lt;p&gt;This way, we'll have an independent layer to manage replication between regions and an independent storage layer to manage replication between zones. This enables Amazon Aurora Global Database to achieve better database-level performance and highly optimized inter-region replication.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fl6h82apbmi31qaalagau.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fl6h82apbmi31qaalagau.png" alt="DSQL_7.png" width="800" height="1216"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Each new write launches this scheme:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;New records are written to Storage nodes and zonal database replicas, and additionally written to a replication server.&lt;/li&gt;
&lt;li&gt;The replication server replicates write records to the server with the replication agent belonging to the replication server group in other regions.&lt;/li&gt;
&lt;li&gt;This replication server acts as if it were a primary database and executes write records both in the global database replica and in this region's Storage nodes.&lt;/li&gt;
&lt;li&gt;Finally, if the replication server detects it hasn't received any write records, it will collect them from the primary region's storage nodes.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This approach also achieves very low replication latency, with values of less than 1 second in up to 5 secondary regions. Each secondary region will also have availability zone replication and six copies distributed among them, in addition to multi-regional and continuous backups, as the system stores backups in each secondary region.&lt;/p&gt;

&lt;h1&gt;
  
  
  What about multi-region writes?
&lt;/h1&gt;

&lt;p&gt;This is the biggest problem with this model, as writes can only be executed in the primary region, resulting in extremely high multi-region write latency.&lt;/p&gt;

&lt;p&gt;There's an intermediate solution: using write forwarding in Amazon Aurora. This allows us to configure a global replica to write to it, although what we're doing is sending these requests with a forward to the central database.&lt;/p&gt;

&lt;p&gt;It's a slightly more efficient way to write in multi-region, allowing us to use endpoints per region, but it's not very efficient for writing.&lt;/p&gt;

&lt;h1&gt;
  
  
  The Challenge of Consistent Multi-Region Writes
&lt;/h1&gt;

&lt;p&gt;As we've seen, both Amazon Aurora and Aurora Global Database have addressed performance and replication issues. However, they still have a fundamental limitation: writes must be centralized in a primary region to ensure ACID consistency.&lt;/p&gt;

&lt;p&gt;This architecture works perfectly for applications that can function with centralized writes, but what happens when we need users in different regions to be able to write with low latency while maintaining write consistency? This is where Amazon Aurora DSQL comes into play.&lt;/p&gt;

&lt;p&gt;One of the write problems is controlling the time sequence, because if we launch a write from one region and launch another write on the same record 100ms later in another region, the correct data for each of these regions is not the same. After all, we can't control time, and we'll have a reasonably significant consistency problem.&lt;/p&gt;

&lt;p&gt;(Well, we actually can control time, but we'll see that in the following article.)&lt;/p&gt;

&lt;h1&gt;
  
  
  Conclusions
&lt;/h1&gt;

&lt;p&gt;Throughout this article, we've covered the evolution in AWS that led to the development of Amazon Aurora DSQL, from ACID fundamentals to the limitations of current multi-region systems.&lt;/p&gt;

&lt;p&gt;The replication system used by Amazon Aurora and Amazon Aurora Global Database is truly remarkable, as it significantly improves performance and drastically reduces replication times.&lt;/p&gt;

&lt;p&gt;If we don't need multi-region writes, Amazon Aurora or Amazon Global Database is the best option in most cases. However, if we require a global, distributed database with consistent multi-region writes, we need to opt for Amazon Aurora DSQL.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;Aurora&lt;/th&gt;
&lt;th&gt;Aurora Global&lt;/th&gt;
&lt;th&gt;Aurora DSQL&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Write latency&lt;/td&gt;
&lt;td&gt;Low in primary zone&lt;/td&gt;
&lt;td&gt;Low in primary zone and high in multi-region&lt;/td&gt;
&lt;td&gt;Low in multi-region&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Write regions&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;1 primary and up to 5 additional with write forwarding&lt;/td&gt;
&lt;td&gt;Multiple&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Read replicas&lt;/td&gt;
&lt;td&gt;Up to 15&lt;/td&gt;
&lt;td&gt;Up to 16 per region&lt;/td&gt;
&lt;td&gt;Globally distributed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Use cases&lt;/td&gt;
&lt;td&gt;Regional apps&lt;/td&gt;
&lt;td&gt;Global apps with intensive reading, dashboards&lt;/td&gt;
&lt;td&gt;Global apps with intensive writing in multiple regions, gaming, IoT&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  How much does Aurora DSQL cost?
&lt;/h3&gt;

&lt;p&gt;Although AWS hasn't published official prices yet, Aurora DSQL will be considerably more expensive than Aurora due to its distributed complexity.&lt;/p&gt;

&lt;p&gt;Taking &lt;strong&gt;Aurora MySQL/PostgreSQL&lt;/strong&gt; as reference:&lt;br&gt;
&lt;strong&gt;Aurora Global Database&lt;/strong&gt;: is 65% more expensive&lt;br&gt;
&lt;strong&gt;Aurora DSQL&lt;/strong&gt;: Estimated between 3 and 5 times more than Aurora Global&lt;/p&gt;

&lt;h3&gt;
  
  
  Which to choose?
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;DON'T use Aurora DSQL if:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Your writes can be centralized in one region (&amp;gt;80% of cases)&lt;/li&gt;
&lt;li&gt;You need to use MySQL as a database engine&lt;/li&gt;
&lt;li&gt;Your transactions don't require low-latency multi-region writes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;You can use Aurora Global Database when:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You can tolerate write forwarding or writes in a single region&lt;/li&gt;
&lt;li&gt;You require intensive multi-region reads with occasional writes&lt;/li&gt;
&lt;li&gt;You need multi-region DR but not active-active writes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;You can use Aurora when:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You have regional applications&lt;/li&gt;
&lt;li&gt;Limited budget&lt;/li&gt;
&lt;li&gt;You require operational simplicity&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Now that we have the problem clear, we need to ask ourselves a question: &lt;strong&gt;How has AWS achieved a database with multi-regional writes without breaking ACID?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In the following article, we'll unveil the secrets of Aurora DSQL and how AWS has managed to tame time in a database.&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;Next: "Aurora DSQL: How to Control Time"&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>aws</category>
      <category>postgres</category>
      <category>cloud</category>
      <category>database</category>
    </item>
    <item>
      <title>Como optimizar las cargas IPv4 en AWS y ademas generar ahorro de costes.</title>
      <dc:creator>Miguel Angel Muñoz Sanchez</dc:creator>
      <pubDate>Tue, 20 Feb 2024 22:40:37 +0000</pubDate>
      <link>https://forem.com/aws-espanol/como-optimizar-las-cargas-ipv4-en-aws-y-ademas-generar-ahorro-de-costes-45e1</link>
      <guid>https://forem.com/aws-espanol/como-optimizar-las-cargas-ipv4-en-aws-y-ademas-generar-ahorro-de-costes-45e1</guid>
      <description>&lt;center&gt; 

Cover image by &lt;a href="https://unsplash.com/@sanderweeteling?utm_content=creditCopyText&amp;amp;utm_medium=referral&amp;amp;utm_source=unsplash" rel="noopener noreferrer"&gt;Sander Weeteling&lt;/a&gt; on &lt;a href="https://unsplash.com/photos/teal-bookeh-lights-KABfjuSOx74?utm_content=creditCopyText&amp;amp;utm_medium=referral&amp;amp;utm_source=unsplash" rel="noopener noreferrer"&gt;Unsplash&lt;/a&gt;
&lt;/center&gt; 




&lt;h2&gt;
  
  
  Introducción.
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7kxzz6korx3xxg0xgfs5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7kxzz6korx3xxg0xgfs5.png" alt="aws logo"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://aws.amazon.com/es/blogs/aws/new-aws-public-ipv4-address-charge-public-ip-insights/" rel="noopener noreferrer"&gt;AWS anunció en julio de 2023&lt;/a&gt; que todas las direcciones IPv4 públicas a partir del 1 de febrero de 2024 tendrían coste.&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;Hasta ahora, en AWS solo se pagaba por direcciones IPv4 públicas cuando no estaban asignadas a ningún recurso, y algunas personas piensan que es terrible que AWS esté tratando de ganar más dinero ... &lt;/p&gt;

&lt;p&gt;Pero otras personas como nosotros pensamos que eso no es gran cosa y que es una excelente oportunidad para guardar direcciones IPv4. &lt;br&gt;
&lt;em&gt;(AWS sigue perdiendo dinero por cada dirección IPv4 aún facturándolas)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tenemos un gran problema con las direcciones IPv4&lt;/strong&gt;; Cuando DARPA (Defense Advanced Research Projects Agency) escribió el protocolo en 1981, nadie pensó que se agotarían 4.294.967.296 IP en el futuro. &lt;/p&gt;

&lt;p&gt;En aquella época, los ordenadores personales eran raros, la Web no existía y nadie podía imaginar la idea de los smartphones, o de los dispositivos IOT.   &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;En 2011, IANA&lt;/strong&gt; (Internet Assigned Numbers Authority) &lt;strong&gt;asignó los últimos bloques de direcciones IPv4&lt;/strong&gt;. Si ahora necesitamos una dirección IPv4 hay que comprarla a cualquier persona que tenga una dirección IPv4 sin usar, lo que crea muchos problemas para cualquier empresa que necesite una dirección IPv4.  &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A finales de 1995&lt;/strong&gt;, &lt;strong&gt;el IETF&lt;/strong&gt; (Internet Engineering Task Force) &lt;strong&gt;comenzó a escribir un nuevo protocolo (IPv6)&lt;/strong&gt; porque sabían en ese momento que las direcciones IPv4 se agotarían en unos pocos años. En ese momento Internet estaba en una etapa temprana de adopción (pocas personas lo usaban).   &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;La adopción de IPv6 es demasiado lenta&lt;/strong&gt;. Muchas empresas de telecomunicaciones utilizan IPv6, y nosotros, como usuarios de ellas, utilizamos IPv6. Aun así, &lt;strong&gt;muchas empresas que publican servicios en Internet no lo utilizan porque es un cambio difícil de implementar rápidamente&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;Esa es la razón de este cambio. &lt;strong&gt;Es necesario utilizar menos direcciones IPv4; Si AWS no traspasa ese coste, se seguirán usando muchas direcciones IPv4&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;Y desspues de esta introduccion la grandes preguntas que aparecen son: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;¿Cuántas direcciones IPv4 se estan usando en AWS? &lt;/li&gt;
&lt;li&gt;¿Cuánto cobrará AWS por estas IPs? &lt;/li&gt;
&lt;li&gt;¿Y cómo se puede reducir el número de IPv4 fácilmente sin usar IPv6?&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Cómo conocer las direcciones IPv4 que estan en uso.
&lt;/h2&gt;

&lt;p&gt;Con este anuncio, &lt;strong&gt;AWS lanzó una herramienta&lt;/strong&gt; para &lt;strong&gt;descubrir&lt;/strong&gt;, &lt;strong&gt;analizar&lt;/strong&gt; y &lt;strong&gt;auditar&lt;/strong&gt; las &lt;strong&gt;direcciones IPv4 públicas que se utilizan&lt;/strong&gt;. Esta herramienta se llama &lt;a href="https://docs.aws.amazon.com/vpc/latest/ipam/what-it-is-ipam.html" rel="noopener noreferrer"&gt;Amazon VPC IP Address Management&lt;/a&gt; (IPAM). &lt;/p&gt;

&lt;p&gt;Antes de profundizar en este tema, &lt;strong&gt;debemos diferenciar cuatro tipos de direcciones IPv4 públicas en AWS&lt;/strong&gt;: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;&lt;strong&gt;&lt;a href="https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-instance-addressing.html#concepts-public-addresses" rel="noopener noreferrer"&gt;EC2 public IP addresses&lt;/a&gt;&lt;/strong&gt;&lt;/em&gt;:
Las direcciones IPv4 públicas se toman de un grupo de Amazon y solo se asocian con las instancias EC2. Al detener, hibernar o finalizar la instancia, la IP se devuelve al grupo y no se puede reutilizar. &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;em&gt;&lt;a href="https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-instance-addressing.html#ip-addressing-eips" rel="noopener noreferrer"&gt;Elastic IP addresses&lt;/a&gt;&lt;/em&gt;&lt;/strong&gt;:
Direcciones IPv4 públicas que se pueden asignar a las cuentas. 
Se pueden asociar y desasociar de instancias según sea necesario. 
Se asignan hasta que se decide liberarlas (de la cuenta y no del servicio) &lt;/li&gt;
&lt;li&gt;
&lt;em&gt;&lt;strong&gt;&lt;a href="https://docs.aws.amazon.com/vpc/latest/userguide/what-is-amazon-vpc.html#pricing" rel="noopener noreferrer"&gt;Service-managed public IPv4 addresses&lt;/a&gt;&lt;/strong&gt;&lt;/em&gt;
IPs de servicios administrados desde Internet de AWS implementados en su cuenta.:
Elastic Load Balancers, NAT Gateways, AWS Global Accelerator, AWS Site-to-Site VPN... &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;BYOIP addresses&lt;/strong&gt; (IP públicas que te pertenecen y que puedes traer hacia AWS) 
AWS no te cobrará por traer tu propio espacio de IPs públicas
Estás IP se pueden usar en grupos para asignarlas a las instancias EC2 o puertas de enlace NAT. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Teniendo esto eso en cuenta, ahora es el momento de utilizar el &lt;a href="https://docs.aws.amazon.com/vpc/latest/ipam/view-public-ip-insights.html" rel="noopener noreferrer"&gt;IPAM de Amazon VPC para comprobar el espacio público IPv4&lt;/a&gt; que está en uso y tus recursos. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Inicie sesión en tu cuenta de AWS. &lt;/li&gt;
&lt;li&gt;Busque Amazon VPC IP Address Manager en la barra de búsqueda. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsb1yuwfbca7pbbfo4th1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsb1yuwfbca7pbbfo4th1.png" alt="Picture 1"&gt;&lt;/a&gt; &lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8wkvr17y906j3odokm9p.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8wkvr17y906j3odokm9p.png" alt="Picture 2"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Haga clic en “Create IPAM.” &lt;/li&gt;
&lt;li&gt;Seleccione las opciones marcadas: &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Feyj0bzdnlkz4s2exee63.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Feyj0bzdnlkz4s2exee63.png" alt="Picture 3"&gt;&lt;/a&gt; &lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Notas:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;En el nivel gratuito se realizarán las comprobaciones de tu cuenta para las direcciones IPv4 públicas. &lt;/li&gt;
&lt;li&gt;En el nivel avanzado verificará en toda la organización las direcciones IP públicas y privadas. &lt;/li&gt;
&lt;/ol&gt;




&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyz1mftdxpc359yn81kvs.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyz1mftdxpc359yn81kvs.png" alt="Picture 4"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Puedes agregarle un tag de nombre o una descripción (opcional) &lt;/li&gt;
&lt;li&gt;Haga clic en “Add All Regions” para realizar un informe sobre nuestra infraestructura global &lt;/li&gt;
&lt;li&gt;Luego, haga clic en “Create IPAM.” &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Después de unos minutos, podrá ver un informe con todas las IPv4 públicas en el menú Public IP Insights: &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhtpa9wd5tasn1yi3hbci.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhtpa9wd5tasn1yi3hbci.png" alt="Picture 5"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Por cada IPv4 en uso, AWS facturará &lt;strong&gt;$0,005&lt;/strong&gt; por hora; esto significa 0,005 x 8760 horas en un año = *&lt;em&gt;$43,8 por año por cada IPv4 *&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Si se tienen 10 IP en uso, se pagarán &lt;strong&gt;$438&lt;/strong&gt; por estas direcciones IP. &lt;/p&gt;

&lt;p&gt;Si se tienen 100... se sumarán $4380.&lt;/p&gt;

&lt;p&gt;Si se tienen 1000... bueno... se agregara otro 0.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjp189gkooobfa3mf1nzr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjp189gkooobfa3mf1nzr.png" alt="meme"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;center&gt;Tu cara, antes y después de usar la herramienta IPAM.&lt;/center&gt; 




&lt;h2&gt;
  
  
  ¿Cómo puedo optimizar mi arquitectura para reducir el uso de IPv4?
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Usar un Load Balancer.
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5g0ol72ig99r9wxr0w4q.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5g0ol72ig99r9wxr0w4q.jpg" alt="meme2"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Usar un Load Balancer para exponer nuestra aplicación es una de las buenas prácticas de AWS y reduce la cantidad de IP públicas; en lugar de usar una IP para cada EC2, usaremos una IP por subred donde esté implementado el ALB. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9lbtnz8op4uktw4f4934.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9lbtnz8op4uktw4f4934.png" alt="picture 6"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ventajas:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Mejora tu disponibilidad porque los ALBs trabajan en una configuración de alta disponibilidad. &lt;/li&gt;
&lt;li&gt;Permite la escalabilidad utilizando Auto Scaling Groups como Targets del Load Balancer. &lt;/li&gt;
&lt;li&gt;Permite desacoplar la encriptación SSL utilizando certificados en el propio Load Balancer. &lt;/li&gt;
&lt;li&gt;Tu seguridad puede mejorar utilizando las reglas del WAF. &lt;/li&gt;
&lt;li&gt;Se puede usar puertos HTTP o HTTPS usando ALB o cualquier puerto TCP usando NLB. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Desventajas:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Costo (no demasiado, pero agrega coste a la solución) &lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Usar un Load Balancer haciendo de proxy inverso
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo2zx5424d56wfyebtviv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo2zx5424d56wfyebtviv.png" alt="picture 7"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;¿Qué pasa si implementamos muchos Load Balancers con pocas instancias EC2? Eso es un problema porque estamos desperdiciando muchas IP (y balanceadores de carga) &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Desde 2017, AWS admite&lt;/strong&gt; el uso de un &lt;a href="https://aws.amazon.com/es/blogs/aws/new-host-based-routing-support-for-aws-application-load-balancers/" rel="noopener noreferrer"&gt;Application Load Balancer como un proxy inverso&lt;/a&gt;. Esta es una mejora notable porque podemos usar un Load Balancer para múltiples grupos objetivo dependiendo de la cabecera host con la URL solicitada. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftoz1q5e5jd6zxzbk8trg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftoz1q5e5jd6zxzbk8trg.png" alt="picture 8"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Con esta funcionalidad, se puede utilizar un solo Load Balancer para todas las aplicaciones. &lt;/p&gt;

&lt;p&gt;¿Pero qué pasa con el cifrado? Necesitamos utilizar varios certificados, uno por URL. &lt;/p&gt;

&lt;p&gt;Podrías usar la misma zona DNS y un certificado wildcard. Aun así, no es una muy buena idea y a los equipos de seguridad no les gustan los certificados wildcard (existen algunos problemas de seguridad con los certificados wildcard...) &lt;/p&gt;

&lt;p&gt;Pero podemos usar otra &lt;a href="https://aws.amazon.com/es/blogs/aws/new-application-load-balancer-sni/" rel="noopener noreferrer"&gt;característica interesante de ALB como SNI&lt;/a&gt; (Server Name Indicator) que permite usar múltiples certificados para diferentes nombres DNS en el mismo ALB.  &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ventajas:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Reducir el número de IP Públicas utilizadas por las aplicaciones &lt;/li&gt;
&lt;li&gt;Reducir el número de ALB utilizados por las aplicaciones. &lt;/li&gt;
&lt;li&gt;Se ahorran costes porque menos ALB e IP públicas significan menos costes. &lt;/li&gt;
&lt;li&gt;Centralizar la gestión de ALBs. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Desventajas:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Crea una dependencia de otros equipos. Si hay varios stacks para gestionar cada aplicación, se crea una dependencia con el stack que contiene el ALB centralizado. &lt;/li&gt;
&lt;li&gt;Puede ser un problema al usar WAF porque las reglas de WAF son las mismas para todas las aplicaciones y algunas reglas deben ser más específicas. &lt;/li&gt;
&lt;li&gt;La solución sólo funciona en una implementación de múltiples cuentas. Los ALB pueden enviar solicitudes a Target Groups  en la misma cuenta, pero no a Target Groups en otras cuentas. Los ALB permiten enviar solicitudes a las IP de otras cuentas (si existe conectividad privada), pero eso no permite elasticidad. 
Se podría usar un servidor proxy inverso en una EC2, pero no es una solución administrada y genera más sobrecarga operativa.
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Usar un Bastion
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0gojnkxrpf8pveajka0i.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0gojnkxrpf8pveajka0i.png" alt="picture 9"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Usar un Bastion host es una solución típica para acceder a servidores en la nube; en lugar de agregar una dirección IP pública a cualquier servidor que se administra, se crea un Bastion Host con una IP pública y se inicia sesión en este Bastion Host usando SSH o RDP (dependiendo del sistema operativo de nuestro Bastion Hosts). Desde este bastión podremos saltar a las EC2 o RDS. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3cdl2vtcig55onalan53.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3cdl2vtcig55onalan53.png" alt="picture 10"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Esa es una forma segura de acceder los recursos porque se puede limitar el alcance del security group agregando solo las IP públicas que se usan desde la red corporativa o las IP públicas individuales de los Admins. &lt;/p&gt;

&lt;p&gt;Desde el Bastion Host se puede acceder a cualquier EC2, RDS, ECS, EKS, etc. &lt;/p&gt;

&lt;p&gt;Solo es necesario agregar el security group o IP del Bastion Host a los security group para las instancias a las que necesitamos acceso. &lt;/p&gt;

&lt;p&gt;Podemos acceder a la VPC donde está el Bastion Host, pero también podemos acceder a otras VPC si implementamos el peering de VPC o implementamos una topología de Transit Gateway. &lt;/p&gt;

&lt;p&gt;Estas interconexiones entre VPC permiten centralizar nuestro Bastion host de forma que se reduce y simplifica la infraestructura de gestión. &lt;/p&gt;

&lt;p&gt;Este método es fácil de usar; un Bastion Host es algo habitual; se puede usar diferentes claves de acceso, diferentes usuarios del sistema operativo, es auditable, etc. &lt;/p&gt;

&lt;p&gt;Además, si es necesario una forma más segura de acceder, se puede usar un Cliente VPN en lugar de una conexión directa a los Bastion Hosts usando SSH o RDP. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ventajas:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Se reduce la cantidad de IP públicas utilizadas para administrar instancias. &lt;/li&gt;
&lt;li&gt;Se mejora la seguridad porque hay menos puntos de entrada a los servidores. &lt;/li&gt;
&lt;li&gt;Se necesita mantener menos instancias para la administración. &lt;/li&gt;
&lt;li&gt;Un Bastion Host es una topología familiar en infraestructura de TI. &lt;/li&gt;
&lt;li&gt;Se pueden guardar los logs de acceso al Bastion host y auditar la actividad. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Desventajas:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Se necesita una EC2 para la gestión. &lt;/li&gt;
&lt;li&gt;Se debe gestionar y auditar security group para limitar el acceso a nuestro Bastion Host. &lt;/li&gt;
&lt;li&gt;Existe riesgo de exponer la infraestructura si alguien obtiene acceso a Bastion Host. &lt;/li&gt;
&lt;li&gt;Se pueden recibir ataques de fuerza bruta SSH y se debe implementar métodos de protección. &lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Usar Session Manager
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fh9vs5eg22qbyvep639pg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fh9vs5eg22qbyvep639pg.png" alt="picture 12"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;AWS  Systems Manager Session Manager (SSM)](&lt;a href="https://docs.aws.amazon.com/systems-manager/latest/userguide/session-manager.html" rel="noopener noreferrer"&gt;https://docs.aws.amazon.com/systems-manager/latest/userguide/session-manager.html&lt;/a&gt;) es una manera de acceder a instancias EC2 como si estuviéramos usando SSH pero sin utilizarlo, con beneficios adicionales de seguridad de AWS. &lt;/p&gt;

&lt;p&gt;Para usar SSM, se tienen que cumplir unos requisitos: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Es necesario tener los agentes SSM instalados en las instancias (Si se usa una AMI de AWS, el agente viene instalado por defecto). &lt;/li&gt;
&lt;li&gt;La Instancia necesita acceso al endpoint de SSM usando un NAT Gateway o desplegando un endpoint privado de AWS. &lt;/li&gt;
&lt;li&gt;Es necesario añadir un perfil de Instancia con permisos a SSM para permitir al EC2 ejecutar algunas llamadas API a servicios SSM. &lt;/li&gt;
&lt;li&gt;Es necesario permisos para usar SSM en el usuario o rol de IAM. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Se pude realizar la configuración usando la &lt;a href="https://docs.aws.amazon.com/systems-manager/latest/userguide/session-manager-getting-started.html" rel="noopener noreferrer"&gt;Documentación de AWS&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1oof8dgg3moc72qb4xsr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1oof8dgg3moc72qb4xsr.png" alt="picture 13"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Este método de acceso permite iniciar sesión en una instancia sin utilizar SSH, utilizando las credenciales de IAM. Esto es muy útil porque se puede utilizar IAM identity Center y centralizar el acceso a los sistemas utilizando las credenciales de un IdP en lugar de las credenciales locales de Linux.&lt;br&gt;&lt;br&gt;
Además, si se utiliza IAM Identity Center o IAM Roles, se estan utilizando &lt;a href="https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp.html" rel="noopener noreferrer"&gt;credenciales de seguridad temporales&lt;/a&gt; que mejoran significativamente la seguridad. Esas credenciales rotan muy a menudo (sólo están activas durante unas horas o menos si así se decide). Si alguien roba estas credenciales, se revocarán automáticamente cuando caducara el token, y también se pueden revocar las credenciales inmediatamente. &lt;/p&gt;

&lt;p&gt;Si se utilizan servidores Windows, se puede utilizar &lt;a href="https://docs.aws.amazon.com/systems-manager/latest/userguide/fleet.html" rel="noopener noreferrer"&gt;AWS Systems Manager Fleet Manager&lt;/a&gt;, que utiliza un sistema similar pero para conexiones RDP. &lt;/p&gt;

&lt;p&gt;También, es posible utilizar una mezcla de SSM con un Bastion Host privado. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhlp0qgyeigccagkluh7t.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhlp0qgyeigccagkluh7t.png" alt="picture 14"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Es el mismo método que si se utilizara un Bastion Host pero sin exponerlo a Internet.  &lt;/p&gt;

&lt;p&gt;Sin embargo, SSM es inutilizable para algunas personas porque necesitan usar X11 en servidores remotos o subir archivos usando SCP o la terminal en lugar de la consola de AWS o AWS CLI. &lt;/p&gt;

&lt;p&gt;Pero no hay problema; SSM tiene una característica llamada &lt;a href="https://aws.amazon.com/es/blogs/aws/new-port-forwarding-using-aws-system-manager-sessions-manager/" rel="noopener noreferrer"&gt;Port Forwarding&lt;/a&gt;  que nos permite crear un túnel desde un ordenador a los Bastion Hosts y conectarse a otros servidores directamente. Es como un túnel SSH y es muy potente.  &lt;/p&gt;

&lt;p&gt;Se puede acceder a los servidores RDS o sitios web privados sin publicarlos. También se puede reenviar X11 y utilizar consolas gráficas remotas.  &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ventajas:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No es necesario usar IPs Públicas
&lt;/li&gt;
&lt;li&gt;Se utilizan credenciales IAM con credenciales temporales en lugar de credenciales Linux o claves SSH. &lt;/li&gt;
&lt;li&gt;Es posible usar credenciales IdP para iniciar sesión en instancias EC2. &lt;/li&gt;
&lt;li&gt;Se puede tener una conexión cifrada HTTPs cifrada por AWS. &lt;/li&gt;
&lt;li&gt;No se exponen los servidores en internet. &lt;/li&gt;
&lt;li&gt;Es posible auditar logs y acciones. &lt;/li&gt;
&lt;li&gt;Se pueden explorar logs en Cloudwatch y crear métricas y alarmas. &lt;/li&gt;
&lt;li&gt;Es posible revocar credenciales automáticamente. &lt;/li&gt;
&lt;li&gt;Se puede utilizar la función de reenvío de puertos para crear túneles seguros. &lt;/li&gt;
&lt;li&gt;La solución no tiene ningún coste; SSM es gratuito. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Desventajas:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Es necesario utilizar AWS CLI o la consola de AWS para conectarse a los servidores. &lt;/li&gt;
&lt;li&gt;El método es más complejo y es necesario que los usuarios estén familiarizados con este tipo de túneles.&lt;/li&gt;
&lt;li&gt;Es necesario instalar agentes y crear perfiles de Instancia.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Usar EC2 Instance connect de manera privada.
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9cg0mdwyda6x64jyab9t.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9cg0mdwyda6x64jyab9t.jpg" alt="picture 15"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;El servicio EC2 Instance Connect (EIC)  permite conectar con las instancias EC2 públicas/privadas estableciendo una sesión SSH a través del navegador.  La API de instance connect publicará una clave pública SSH de un solo uso en los metadatos de la instancia EC2, que permanecerá ahí durante 60 segundos. &lt;/p&gt;

&lt;p&gt;Si la instancia tiene &lt;a href="https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-connect-set-up.html" rel="noopener noreferrer"&gt;instalado EC2 Instance Connect&lt;/a&gt;, un daemon SSH extraerá la información de la clave pública de los metadatos de la instancia para la autenticación en este periodo de tiempo. &lt;br&gt;
La conexión SSH se establecerá utilizando la clave privada de un solo uso que la API de Instance Connect generó en el momento de la solicitud. &lt;/p&gt;

&lt;p&gt;IAM respalda el servicio; ningún usuario que no tenga acceso a este servicio podrá conectarse. Para obtener más información sobre el funcionamiento del servicio, se puede consultar &lt;a href="https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/connect-linux-inst-eic.html" rel="noopener noreferrer"&gt;la guía del usuario&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;Inicialmente, EC2 instance connect estaba pensado para conectarse a instancias EC2 con una dirección IP pública. En &lt;a href="https://aws.amazon.com/blogs/compute/secure-connectivity-from-public-to-private-introducing-ec2-instance-connect-endpoint-june-13-2023/" rel="noopener noreferrer"&gt;Junio de 2023&lt;/a&gt;, AWS lanzó una actualización de este servicio, permitiendo a los usuarios conectarse a las instancias EC2 con IP Privada a través de internet. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx3081nxfsz69wscmlmki.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx3081nxfsz69wscmlmki.png" alt="picture 16"&gt;&lt;/a&gt;               &lt;/p&gt;

&lt;p&gt;Para realizar esta tarea, se crea un EC2 Instance Connect Endpoint en la subnet privada de tu VPC. Este endpoint actúa como un túnel privado que te conecta desde Internet con las instancias privadas.&lt;br&gt;&lt;br&gt;
Es posible conectarse a diferentes subredes dentro de la VPC utilizando el mismo endpoint.&lt;br&gt;&lt;br&gt;
(Si la conexión es a una instancia en una AZ diferente del Endpoint, &lt;a href="https://aws.amazon.com/ec2/pricing/on-demand/#Data_Transfer_within_the_same_AWS_Region" rel="noopener noreferrer"&gt;pueden aplicarse algunos cargos por transferencia de datos&lt;/a&gt;) &lt;/p&gt;

&lt;p&gt;Aquí se puede encontrar &lt;a href="https://medium.com/@prateek.malhotra004/connect-using-ec2-instance-connect-endpoint-1f6fc9243f02" rel="noopener noreferrer"&gt;una guía&lt;/a&gt; sobre cómo conectarse utilizando el EIC Endpoint a una instancia privada que usa IPv4. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ventajas:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Es posible conectarte a las instancias desde Internet sin un gateway. &lt;/li&gt;
&lt;li&gt;El acceso para crear y utilizar los endpoints para realizar la conexión puede restringirse/permitirse a través de políticas y permisos de IAM. &lt;/li&gt;
&lt;li&gt;Mejora la seguridad ya que se tiene un control de acceso centralizado a las instancias EC2 y se elimina la necesidad de gestionar las claves SSH. &lt;/li&gt;
&lt;li&gt;Se elimina la necesidad de un Bastion host. &lt;/li&gt;
&lt;li&gt;CloudTrail rastrea todos los eventos. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Desventajas:&lt;/strong&gt; &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No soporta direcciones IPv6. &lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Migrar a IPv6
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fimv17nygc8gaga6sqtgs.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fimv17nygc8gaga6sqtgs.jpg" alt="picture17"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Desde 2011, AWS ha estado promoviendo &lt;a href="https://aws.amazon.com/vpc/ipv6/" rel="noopener noreferrer"&gt;IPv6&lt;/a&gt;; cada año, Amazon ha ido añadiendo y adaptando más servicios para utilizar esta tecnología.  &lt;/p&gt;

&lt;p&gt;Modos de compatibilidad de red soportados por AWS: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Solo IPv4: Los recursos pueden comunicarse a través de IPv4; si se comunican con IPv6, requerirá una capa de interoperabilidad. &lt;/li&gt;
&lt;li&gt;Solo IPv6: Los recursos pueden comunicarse a través de IPv6; si se comunican con IPv6, se requerirá una capa de interoperabilidad. &lt;/li&gt;
&lt;li&gt;Dual- stack: Los recursos pueden comunicarse a través de IPv4 e IPv6. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;En este &lt;a href="https://docs.aws.amazon.com/vpc/latest/userguide/aws-ipv6-support.html" rel="noopener noreferrer"&gt;artículo&lt;/a&gt; se puede encontrar la lista de servicios que pueden utilizar IPv6. &lt;/p&gt;

&lt;p&gt;Para más información sobre cómo diseñar una red IPv6, se puede seguir &lt;a href="https://docs.aws.amazon.com/whitepapers/latest/ipv6-on-aws/designing-an-ipv6-aws-cloud-network.html" rel="noopener noreferrer"&gt;el manual de mejores prácticas&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ventajas:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Reduce costes al dejar de utilizar IPv4 &lt;/li&gt;
&lt;li&gt;Elimina la necesidad de mecanismos de traducción (NAT), eliminando la sobrecarga de rendimiento de las traducciones, simplificando el enrutamiento de paquetes &lt;/li&gt;
&lt;li&gt;IPv6 añade más seguridad, utilizando IPsec como estándar &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Desventajas:&lt;/strong&gt; &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No todos los servicios soportan IPv6 
_ Debe realizarse un análisis de la arquitectura antes de implementar/adaptar nada. &lt;/li&gt;
&lt;/ul&gt;

&lt;h6&gt;
  
  
  Artículo creado para la comunidad "AWS Español" por:
&lt;/h6&gt;

&lt;h6&gt;
  
  
  &lt;a href="https://www.linkedin.com/in/luismariahorvathmayor/" rel="noopener noreferrer"&gt;Luis Maria Horvath Mayor&lt;/a&gt;
&lt;/h6&gt;

&lt;h6&gt;
  
  
  &lt;a href="https://linktr.ee/michel8585" rel="noopener noreferrer"&gt;Miguel Angel Muñoz Sanchez&lt;/a&gt;
&lt;/h6&gt;

</description>
    </item>
    <item>
      <title>¿Es AWS seguro?</title>
      <dc:creator>Miguel Angel Muñoz Sanchez</dc:creator>
      <pubDate>Thu, 01 Feb 2024 09:57:16 +0000</pubDate>
      <link>https://forem.com/aws-espanol/es-aws-seguro-4gfp</link>
      <guid>https://forem.com/aws-espanol/es-aws-seguro-4gfp</guid>
      <description>&lt;p&gt;Seguramente, esta pregunta o nos la hemos hecho en alguna ocasión o, bien, nos la ha preguntado alguien. Desde que empecé en este mundo de AWS, me he dado cuenta de que mucha gente asume que la seguridad en Cloud o no existe o es muy baja.&lt;/p&gt;

&lt;p&gt;Y, he de reconocer que, antes de empezar en este mundo, yo también tenía esta visión, pero era una visión basada en mi desconocimiento y en ciertas afirmaciones que había leído o escuchado que eran erróneas.&lt;/p&gt;

&lt;p&gt;Vamos a dedicar este post a intentar explicar ciertos conceptos de la seguridad en AWS, repasar &lt;strong&gt;cómo funciona AWS y cómo podemos securizar nuestras cargas al máximo&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Haciendo peticiones a AWS
&lt;/h2&gt;

&lt;p&gt;Lo primero es saber &lt;strong&gt;cómo funciona una petición en AWS&lt;/strong&gt;. Vamos a explicar una llamada para crear un bucket S3 y desde ahí vamos a ver cómo de seguro es AWS y cómo podemos gestionar la Seguridad.&lt;/p&gt;

&lt;p&gt;Vamos a usar un usuario federado desde un Identity Provider utilizando AWS Identity Center, que es el sucesor de AWS Single Sign-On.&lt;/p&gt;

&lt;p&gt;Esta llamada es exactamente igual si la realizamos vía consola, vía API o desde el cli de AWS.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmlm5fs3w3yay9zwj707e.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmlm5fs3w3yay9zwj707e.png" alt="Llamada para crear un bucket S3" width="629" height="479"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Primero es necesario realizar una llamada a AWS Identity Center para autentificar el usuario.&lt;/li&gt;
&lt;li&gt;AWS Identity Center se conectará con el Identity Provider que tengamos configurado para autentificar al usuario y este solicitará las credenciales al usuario para validarlas.&lt;/li&gt;
&lt;li&gt;El Identity Provider validará la credenciales y autentificará la petición contra AWS Identity Center que permite al usuario asumir un rol en AWS dependiendo de los permisos que tenga otorgados en Identity Center.&lt;/li&gt;
&lt;li&gt;AWS Identity Center realizará una llamada a STS (Security Token Service) para generar una credencial temporal que devolverá en la petición inicial del usuario y que podremos reutilizar durante un corto periodo de tiempo (de 1 hora a 12 horas máximo, dependiendo de configuración).&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Este primer flujo es el correspondiente a un login en la consola, un login vía cli o un AssumeRoleWithSAML vía API y solamente es necesario realizarlo una vez, es posible utilizar el token durante el periodo de validez de este.&lt;/p&gt;

&lt;p&gt;Con este token asumimos un rol dentro de una cuenta en AWS con los permisos que tenga ese rol asignado.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Con esta credencial temporal lanzaremos la petición para crear un bucket S3 al endpoint de S3 en nuestra región.&lt;/li&gt;
&lt;li&gt;El servicio de S3 llamará a IAM para autorizar la petición dependiendo de los permisos que tenga el rol IAM que se ha asumido con las credenciales.&lt;/li&gt;
&lt;li&gt;IAM autorizará la petición devolviéndole esta firmada a S3.&lt;/li&gt;
&lt;li&gt;Finalmente, S3 creará el Bucket.&lt;/li&gt;
&lt;li&gt;S3 responderá a la petición indicando que se ha generado el bucket.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Este flujo está simplificado al máximo para explicarlo de la forma más sencilla posible (es algo más complejo).&lt;/p&gt;

&lt;p&gt;Todas las peticiones a AWS van firmadas de forma individual con AWS Signature Version 4 (AWS SigV4) que es el proceso por el que AWS firma todas sus peticiones y que lleva en uso desde hace más de 10 años sin ningún problema conocido.&lt;/p&gt;

&lt;p&gt;Cada petición aunque sean iguales y reiterativas tienen una firma diferente y no es posible ni siquiera realizar un ataque por fuerza bruta aunque se tuviese la potencia de computación suficiente.&lt;/p&gt;

&lt;p&gt;Si queréis más info sobre este tema, os recomiendo la sesión de Eric Brandwine sobre este tema.&lt;/p&gt;

&lt;p&gt;Este tipo de flujo es extremadamente seguro y vamos a tratar de explicar todas sus ventajas.&lt;/p&gt;

&lt;h2&gt;
  
  
  Securizando las acciones via IAM y SCPs
&lt;/h2&gt;

&lt;p&gt;En primer lugar, al utilizar AWS Identity Center además de poder autentificar con un IdP propio, &lt;strong&gt;utilizamos AWS STS para generar tokens seguros y temporales&lt;/strong&gt;, de forma que estos Token tienen una duración limitada y aunque alguien consiguiera robar uno (en caso de que un usuario los publicara de forma explícita por error), este token expirará automáticamente pasadas unas horas, además es posible revocar un token temporal en caso necesario.&lt;/p&gt;

&lt;p&gt;Como otra ventaja de este modelo es que cada petición es autorizada vía IAM y requiere que la acción esté permitida de forma explícita en alguna política asociada al rol o usuario IAM y que además no esté denegada en ninguna otra política asociada.&lt;/p&gt;

&lt;p&gt;IAM es extremadamente flexible y podemos llegar a limitar acciones muy determinadas o permitir diferentes grados de acceso con una granularidad inmensa.&lt;/p&gt;

&lt;p&gt;Todo esto sin entrar en la potencia de las Permission Boundaries que es un feature muy potente para delegar la Administración IAM a otros usuarios, pero limitando los permisos que pueden gestionar.&lt;/p&gt;

&lt;p&gt;Además, es posible denegar ciertas acciones de forma organizativa usando una funcionalidad de AWS Organizations llamada Service Control Policies (SCPs), que permiten bloquear acciones a nivel de cuenta de AWS, OUs (que son agrupaciones de cuentas similares a una carpeta) o toda la organización.&lt;/p&gt;

&lt;p&gt;De esta forma, podemos limitar ciertas acciones, como por ejemplo que los usuarios creen infraestructura para que su VPC tenga acceso a Internet de forma directa. O el uso de ciertos servicios sin una configuración determinada.&lt;/p&gt;

&lt;p&gt;Hay mil casos de uso en los cuales se pueden utilizar SCP y permiten una potencia infinita a la hora de limitar ciertas acciones, tanto en la &lt;a href="https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_policies_scps_examples.html" rel="noopener noreferrer"&gt;documentacion de AWS&lt;/a&gt;, en &lt;a href="https://aws-samples.github.io/aws-iam-permissions-guardrails/guardrails/scp-guardrails.html" rel="noopener noreferrer"&gt;aws-samples&lt;/a&gt;, o en la &lt;a href="https://docs.aws.amazon.com/controltower/latest/userguide/controls-reference.html" rel="noopener noreferrer"&gt;documentación de Control Tower&lt;/a&gt; hay multitud de ejemplos muy utilies, además de poder construir tus propias SCPs.&lt;/p&gt;

&lt;h2&gt;
  
  
  Auditando recursos con CloudTrail y Config
&lt;/h2&gt;

&lt;p&gt;Ya hemos visto que debido al flujo de peticiones de AWS podemos bloquear ciertas acciones, pero ¿qué pasa si no podemos bloquearlas todas o queremos más control sobre ella? El &lt;strong&gt;siguiente paso es CloudTrail&lt;/strong&gt;, que si no está activado en vuestras cuentas, estáis tardando en activarlo: es gratis (el primer trail en cada cuenta) y &lt;strong&gt;sin él no tenéis auditoría de vuestros eventos&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;CloudTrail registra automáticamente todos los eventos generados en nuestra cuenta de AWS, es posible centralizarlo utilizando AWS Organization y tiene diferentes niveles de configuración, pero basicamente nos da la posibilidad de auditar todas las peticiones que se realicen en nuestra cuenta a servicios de AWS.&lt;/p&gt;

&lt;p&gt;Aquí se suele decir que CloudTrail está muy bien, aunque no bloquea acciones indebidas, solo nos avisa. Para esto, tenemos otros servicios de AWS que se pueden combinar con CloudTrail.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Amazon EventBridge es una maravilla&lt;/strong&gt; (anteriormente conocido como CloudWatch Events), que simplificando mucho es un bus de eventos que nos permite enlazar servicios de AWS.&lt;/p&gt;

&lt;p&gt;Con Amazon EventBridge podemos capturar los eventos registrados en CloudTrail y generar llamadas a otros servicios como Lambda.&lt;/p&gt;

&lt;p&gt;De esta manera, podemos generar una acción de evaluación sobre diferentes acciones en la consola e incluso derivar en acciones de remediación.&lt;/p&gt;

&lt;p&gt;Por ejemplo, con respecto a seguridad, un gran miedo suele ser que alguien genere un Security group abriendo puertos indebidos a todo el mundo (por ejemplo, SSH y RDP). De esta forma, podemos generar un automatismo que revise cada vez que se genera o modifica una regla dentro de un Security group; si esta cumple ciertos requisitos, eliminarla y, a su vez, mandar un aviso al responsable de la cuenta indicando que se ha ejecutado esta remediación.&lt;/p&gt;

&lt;p&gt;Para mí, esta es una de las grandes ventajas del cloud podemos evaluar un montón de acciones con este método y generar automáticamente remediaciones. Y con la ventaja de que usamos 2 servicios con un coste muy bajo, como son EventBridge y Lambda.&lt;/p&gt;

&lt;p&gt;Si nos parece muy complejo generar estas reglas de evaluación con Lambda, ya que no disponemos de un equipo que desarrolle estas reglas, tenemos AWS Config. &lt;strong&gt;AWS Config es un servicio que evalúa todos nuestros recursos&lt;/strong&gt; y los cambios de configuración de estos basándose en unas reglas que podemos configurar.&lt;/p&gt;

&lt;p&gt;Existen multitud de reglas a implementar AWS tiene muchas reglas gestionadas para diferentes casos de uso que podéis &lt;a href="https://docs.aws.amazon.com/config/latest/developerguide/managed-rules-by-aws-config.html" rel="noopener noreferrer"&gt;consultar aquí&lt;/a&gt; y también existe un recurso muy interesante que las &lt;a href="https://github.com/awslabs/aws-config-rules/tree/master/aws-config-conformance-packs" rel="noopener noreferrer"&gt;recopila por Conformace Packs&lt;/a&gt; para diferentes casos de uso.&lt;/p&gt;

&lt;p&gt;Con base en esto, podemos evaluar si nuestros recursos cumplen nuestros estándares y es posible ejecutar acciones de remediación, para estas acciones podemos utilizar o bien Lambda o también &lt;a href="https://docs.aws.amazon.com/systems-manager/latest/userguide/systems-manager-automation.html" rel="noopener noreferrer"&gt;System Manager Automation&lt;/a&gt; que permite la ejecución de &lt;a href="https://docs.aws.amazon.com/systems-manager-automation-runbooks/latest/userguide/automation-runbook-reference.html" rel="noopener noreferrer"&gt;ciertos runbook&lt;/a&gt; desarrollados por AWS para multitud de acciones de remediación.&lt;/p&gt;

&lt;p&gt;Como nota importante de AWS Config, es &lt;strong&gt;usado por todos los CSPM&lt;/strong&gt; (Cloud Security Posture Management) para evaluar recurso. Y, también, destacar que es un servicio que en ocasiones puede tener unos costes bastante elevados.&lt;/p&gt;

&lt;h2&gt;
  
  
  Inspeccionando nuestros recursos con Amazon Inspector y System Manager
&lt;/h2&gt;

&lt;p&gt;Vale ya hemos visto que las acciones dentro de AWS están cubiertas, pero ¿y las instancias de EC2 y el código que ejecutan? Aquí entran otros servicios maravillosos de AWS.&lt;/p&gt;

&lt;p&gt;El primero es &lt;strong&gt;Amazon Inspector que permite analizar las cargas de trabajo en AWS&lt;/strong&gt; en busca de vulnerabilidades. Este servicio es capaz de encontrar vulnerabilidades en instancias EC2, en imágenes de contenedores almacenadas en ECR (Elastic Container Registry que es el servicio de Registry para contenedores de AWS) y, desde hace relativamente poco tiempo, en el propio código desplegado en Lambda.&lt;/p&gt;

&lt;p&gt;Es un servicio muy útil y que como todos los servicios de AWS permite la integración con otros como Lambda y System Manager para automatizar remediaciones.&lt;/p&gt;

&lt;p&gt;Pero además, hemos hablado un poco de System Manager que es un servicio alucinante con un montón de módulos (varios de ellos muy interesantes para seguridad).&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;El primero de ellos sería &lt;strong&gt;Patch Manager&lt;/strong&gt;, que permite gestionar nuestro parque de instancias EC2 para mantenerlas actualizadas y aplicar los parches de forma automática. Es un servicio sencillo de usar y con una potencia infinita que permite mantener nuestras máquinas actualizadas, permitiéndonos generar ventanas para su aplicación, diferentes ventanas por tipo de entorno, SO, e incluso llegar a tener diferentes niveles de parcheo para poder probar en un pequeño número de instancias actualizaciones que puedan ser más disruptivas.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Otro servicio que se utiliza poco, pero me parece fundamental es &lt;strong&gt;Session Manager&lt;/strong&gt;, que nos permite acceder a nuestras instancias utilizando nuestras credenciales IAM y sin utilizar el protocolo SSH. Esta funcionalidad es increíble, ya que permite un acceso mucho más securizado a nuestra instancias sin necesidad de exponerlas de ninguna manera. Únicamente requieren acceso al servicio de SSM (que se puede realizar de forma totalmente privada utilizando VPC Endpoints).&lt;br&gt;
&lt;strong&gt;También existe este mismo servicio para instancias Windows sin utilizar el protocolo RDP y en este caso se llama **Fleet Manager&lt;/strong&gt;.&lt;br&gt;
&lt;strong&gt;Lo más impresionante de System Manager es que los 3 módulos de los que hemos hablado son **gratuitos&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Automatizando el análisis de eventos de seguridad con AWS GuardDuty
&lt;/h2&gt;

&lt;p&gt;Tenemos un montón de servicios que nos dan apoyo de forma preventiva, pero ¿qué pasa si alguien consigue entrar en nuestras cuentas y empieza a hacer el mal?&lt;/p&gt;

&lt;p&gt;Aquí tenemos uno de los servicios más importantes de AWS en seguridad. &lt;strong&gt;AWS GuardDuty es un servicio que utiliza la inteligencia artificial&lt;/strong&gt; para detectar amenazas.&lt;/p&gt;

&lt;p&gt;Esto suena muy bien, pero ¿cómo funciona realmente? Este servicio es capaz de identificar patrones de uso inadecuados dentro de AWS. Esto es sencillo porque hay que tener en cuenta que se alimenta de los datos de seguridad de todas las cuentas existentes en AWS.&lt;/p&gt;

&lt;p&gt;AWS no es capaz de acceder a tus datos, pero sí que tiene visibilidad sobre las acciones que se realizan sobre sus servicios de forma que es bastante “sencillo” identificar patrones de uso inadecuados. Y es más, al utilizar Inteligencia Artificial y alimentarse de una cantidad ingente de datos, si en una cuenta se denuncia un uso inadecuado se puede identificar el patrón de uso y analizar si se repite en más cuentas de AWS generando avisos a los usuarios para que mitiguen el problema.&lt;/p&gt;

&lt;p&gt;Es un servicio brutal, que &lt;strong&gt;detecta instantáneamente si se están produciendo eventos inadecuados&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Mucha gente no utiliza el servicio pensando que es extremadamente caro, cuando no lo es. Es más, &lt;strong&gt;realmente a mí me parece un servicio muy económico&lt;/strong&gt;, &lt;strong&gt;teniendo en cuenta que nos puede ahorrar muchos problemas&lt;/strong&gt; detectando usos inadecuados incluso dentro de nuestra propia organización.&lt;/p&gt;

&lt;p&gt;Además de este servicio existe un equipo de seguridad dentro de AWS, llamado Ghostbusters, que es el último escalado para eventos de seguridad de AWS que es increíble. Os recomiendo revisar &lt;a href="https://www.youtube.com/watch?v=pkPkm7W6rGg" rel="noopener noreferrer"&gt;esta sesión&lt;/a&gt; en la que hablan sobre este equipo y cómo gestionaron un evento como Log4Shell.&lt;/p&gt;

&lt;h2&gt;
  
  
  Entonces ¿cómo de seguro es AWS?
&lt;/h2&gt;

&lt;p&gt;Solo hemos hablado de unos pocos servicios involucrados en la seguridad dentro de AWS, pero hay muchos más: Macie (servicio para detectar datos sensible), Secret Manager (gestión de secretos), Network Firewall (solución de Firewall Perimetral), WAF (Web Application Firewall con reglas gestionadas de AWS o de Third Parties), Firewall Manager (gestión centralizada de reglas de seguridad, WAF, etc.), AWS Shield Advanced (mejora sobre la protección para ataques DDoS) y muchos más.&lt;/p&gt;

&lt;p&gt;De esta forma, podemos tomar consciencia del nivel de seguridad que podemos alcanzar en AWS, que puede ser extremadamente alto si implementamos los servicios de seguridad que AWS provee.&lt;/p&gt;

&lt;p&gt;Además, una de las ventajas no es solo el nivel de seguridad y aviso que podamos tener, sino la posibilidad de auto remediar que a mi modo de ver es la gran ventaja que tenemos en el mundo AWS.&lt;/p&gt;

&lt;p&gt;La posibilidad de automatizar no solo el descubrimiento de incidentes, sino automatizar la remediación reduciendo el tiempo de respuesta al mínimo es una ventaja inmensa.&lt;br&gt;
También es común pensar que nosotros requerimos un nivel de seguridad que AWS no va a ser capaz de proveer, para estos casos recomiendo revisar quién usa las &lt;a href="https://aws.amazon.com/es/blogs/publicsector/announcing-second-aws-top-secret-region-extending-support-us-government-classified-missions/" rel="noopener noreferrer"&gt;Secret Regions&lt;/a&gt; de AWS.&lt;/p&gt;

&lt;p&gt;Un entorno seguro tiene que ser utilizable. Esta es quizás la parte más complicada, tener un entorno seguro sin sacrificar la usabilidad es muy complejo, pero con las herramientas de AWS es más sencillo llegar a un entorno seguro y utilizable. Existen muchos entornos hiperseguros, pero que son inutilizables y esto suele provocar que se busquen alternativas poco seguras y de las que probablemente los equipos de seguridad no tengan constancia.&lt;/p&gt;

&lt;p&gt;Con un entorno en AWS, podemos llegar a tener un entorno que sea utilizable y a la vez que podamos controlar y securizar el entorno.&lt;/p&gt;

&lt;p&gt;Como conclusión AWS no es solamente seguro, sino que probablemente nos puede ayudar a incrementar la seguridad de nuestro propio entorno y llegar a unos niveles muy altos de seguridad, incrementando la automatización&lt;/p&gt;

</description>
      <category>aws</category>
      <category>security</category>
      <category>devops</category>
      <category>spanish</category>
    </item>
    <item>
      <title>Y tú, ¿odias o amas Kubernetes?</title>
      <dc:creator>Miguel Angel Muñoz Sanchez</dc:creator>
      <pubDate>Fri, 12 Jan 2024 08:11:43 +0000</pubDate>
      <link>https://forem.com/aws-espanol/y-tu-odias-o-amas-kubernetes-ind</link>
      <guid>https://forem.com/aws-espanol/y-tu-odias-o-amas-kubernetes-ind</guid>
      <description>&lt;p&gt;En los últimos meses, me he encontrado con bastante gente con cierta tendencia a odiar Kubernetes e intentar evitarlo a toda costa. Precisamente, no ha sido gente que apueste por modelos legacy, sino todo lo contrario: gente con un bagaje grande en modernización de aplicaciones y uso de AWS. Esto es curioso porque el estado actual de implantación de Kubernetes es cada día más alto y tiene muchísimos defensores.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Kubernetes es un gran producto&lt;/strong&gt;, creo que nadie lo duda y tiene muchos casos de uso válidos. También existen muchas alternativas válidas a Kubernetes que pueden ser más adecuadas dependiendo del caso de uso.&lt;/p&gt;

&lt;p&gt;Pero &lt;strong&gt;¿cuáles son los problemas que veo a Kubernetes?&lt;/strong&gt;, ¿por qué otras alternativas me gustan más? Os invito a acompañarme en esta bonita historia de odio hacia un stack tecnológico.&lt;/p&gt;

&lt;p&gt;¿Qué es Kubernetes?&lt;br&gt;
&lt;strong&gt;Kubernetes es un orquestador de contenedores&lt;/strong&gt;. Sobre esta frase, que sigue estando en la página oficial de &lt;a href="https://kubernetes.io/" rel="noopener noreferrer"&gt;Kubernetes&lt;/a&gt;, he tenido un montón de discusiones y ha generado también bastantes bromas (hay quien tiene un kimono muy bonito con esa frase serigrafiada en la espalda). Por desgracia, y dando la razón al propietario del Kimono, &lt;strong&gt;no es un orquestador de contenedores&lt;/strong&gt;, es muchas más cosas. Y aquí es donde quizás viene el primer problema: Kubernetes no es sencillo, nunca lo ha sido y nunca lo será.&lt;/p&gt;

&lt;p&gt;Para explicar esto hay que irse al origen de Kubernetes. En 1979… vale, igual no hace falta irse tan atrás, pero los ancestros de contenerización de aplicaciones se remontan a esa fecha ;). En 2006, varios ingenieros de Google empezaron a desarrollar algo curioso dentro del kernel de Linux llamado “process containers”, aunque luego lo renombraron como “control groups” o como se le conoce más comúnmente “&lt;strong&gt;cgroups&lt;/strong&gt;”. Esta feature es la que permitió el nacimiento de los contenedores tal y como los conocemos ahora.&lt;/p&gt;

&lt;p&gt;De forma interna, Google empezó a usar esta funcionalidad para sus aplicaciones y, como necesitaba gestionarlas, creó &lt;strong&gt;Borg&lt;/strong&gt; (el ancestro de Kubernetes) para gestionar sus propios contenedores.&lt;/p&gt;

&lt;p&gt;Años después se liberó Docker (ya existían implementaciones de contenedores anteriores, pero ninguna tan buena y simple). Aquí surgió el primer problema, los contenedores eran una idea increíble, pero no existía una forma de gestionarlos y gobernarlos (es verdad que existían ciertas soluciones, pero no eran muy completas).&lt;/p&gt;

&lt;p&gt;A finales de 2014 todo cambió. Google reescribió Borg con todo el conocimiento que tenía y lo liberó como Kubernetes. Kubernetes vino a solucionar todos los problemas y rápidamente se convirtió en la tecnología preferente para gestionar y gobernar contenedores. Curiosamente, 2014 fue un año prolífico: a finales de ese año se lanzaron 2 servicios de AWS basados en contenedores de los que hablaremos más adelante, como son &lt;strong&gt;Lambda&lt;/strong&gt; y &lt;strong&gt;ECS&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Empiezan los problemas
&lt;/h2&gt;

&lt;p&gt;Kubernetes era la solución más completa y más madura, realmente Google llevaba casi 10 años utilizando y manteniendo Borg cuando lanzó Kubernetes.&lt;/p&gt;

&lt;p&gt;Como es una solución que está pensada para gestionar miles y miles de contenedores repartidos entre cientos de clusters físicos, se nota bastante a la hora de utilizarlo. No está pensado para pequeñas cargas, más bien está pensado para cargas muy grandes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Kubernetes solucionaba muchas cosas, pero también trajo nuevos problemas&lt;/strong&gt;, como gestionar el networking de Kubernetes, la insolación de cargas, escalado, securización, cifrado, modelo de despliegue, modelo de operación, parcheos, etc.&lt;/p&gt;

&lt;p&gt;Un claro ejemplo de estos problemas, es el escalado de Kubernetes. Escalar y desescalar un &lt;a href="https://kubernetes.io/es/docs/concepts/workloads/pods/pod/" rel="noopener noreferrer"&gt;pod&lt;/a&gt; (que es un grupo de uno o más contenedores) es sencillo. Pero escalar y desescalar la infraestructura donde se ejecutan los pod (&lt;a href="https://kubernetes.io/docs/concepts/architecture/nodes/" rel="noopener noreferrer"&gt;nodes&lt;/a&gt;) es muy complejo, porque hay que generar infraestructura, los pods no tienen tamaños homogéneos, hay que distribuir las réplicas de los pods en diferentes servidores, reunificar pods en un mismo server para liberar otros y poderlos apagar, etc.&lt;/p&gt;

&lt;p&gt;Aunque existen muchas soluciones que ayudan (como &lt;a href="https://karpenter.sh/" rel="noopener noreferrer"&gt;Karpenter&lt;/a&gt;), el esfuerzo y coste de gestionar y mantener un cluster de Kubernetes es muy alto.&lt;/p&gt;

&lt;p&gt;Kubernetes requiere bastante expertise en la tecnología y un equipo que mantenga el stack tecnológico.&lt;/p&gt;

&lt;p&gt;En 2014 la implantación Cloud todavía era pequeña. Por ejemplo, OpenStack estaba en su punto más alto, en ese momento el mundo IT era mucho más complejo y dependiente de la infraestructura pura. Gestionar capas y capas de complejidad era nuestro día a día.&lt;/p&gt;

&lt;p&gt;Pero no estamos en 2014 y el mundo Cloud nos ha facilitado la vida y ha cambiado el paradigma. Ahora estamos en un momento en el que se intenta simplificar al máximo estas tareas y se tiende a empoderar a los desarrolladores para agilizar los despliegues. Por este motivo, añadir estas capas de complejidad en infraestructura es ir a contracorriente.&lt;/p&gt;

&lt;p&gt;Aquí entran a jugar una serie de servicios Cloud más sencillos que un cluster puro de Kubernetes, pero en los que podemos ejecutar cargas contenerizadas como pueden ser &lt;a href="https://aws.amazon.com/es/lambda/" rel="noopener noreferrer"&gt;Lambda&lt;/a&gt;, &lt;a href="https://aws.amazon.com/es/fargate/" rel="noopener noreferrer"&gt;Fargate&lt;/a&gt;, &lt;a href="https://aws.amazon.com/es/ecs/" rel="noopener noreferrer"&gt;ECS (Elastic Container Service)&lt;/a&gt; y &lt;a href="https://aws.amazon.com/es/eks/" rel="noopener noreferrer"&gt;EKS (Elastic Kubernetes Service)&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Voy a ser sincero: ninguno, incluido EKS que es un servicio gestionado de Kubernetes, tienen la potencia de un Kubernetes puro, &lt;strong&gt;pero no necesitamos esa potencia&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  ¿Es necesario desplegar Kubernetes en todos los casos de uso?
&lt;/h2&gt;

&lt;p&gt;La respuesta es no. Muchos casos de uso, por no decir la mayoría, &lt;strong&gt;no requieren de algo tan complejo como Kubernetes&lt;/strong&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Lambda es un servicio serverless&lt;/strong&gt; que permite la ejecución de código directamente, sin necesidad de provisionar infraestructura.&lt;br&gt;
No podemos gestionar el contenedor propiamente, pero realmente nos genera un contenedor o contexto preconstruido que nos permite ejecutar código directamente.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Fargate (ECS o EKS)&lt;/strong&gt; es un servicio que permite la ejecución de contenedores en modo serverless sin necesidad de preocuparte por el cluster que ejecuta la carga.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Tanto Lambda como Fargate te abstraen de toda esa complejidad, ellos se encargan de gestionarla. Simplemente, despliegas tu código o tu imagen y ya está. Algo muy sencillo, pero a la vez muy potente. Los 2 hacen uso de una tecnología open source desarrollada por Amazon muy interesante llamada &lt;a href="https://firecracker-microvm.github.io/" rel="noopener noreferrer"&gt;Firecracker&lt;/a&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;ECS es el orquestador de contenedores gestionado de AWS&lt;/strong&gt;, es mucho más sencillo que Kubernetes. Es únicamente un orquestador de contenedores que está delegando el resto de tareas a otros servicios de AWS. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;EKS es servicio gestionado de Kubernetes&lt;/strong&gt; que nos abstrae del despliegue de infraestructura y se encarga de gestionar parte de nuestros clusters de Kubernetes (los master de Kubernetes), eliminando parte de la complejidad de Kubernetes pero dejándonos cierta flexibilidad&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Todos estos servicios permiten desplegar aplicaciones basadas en un modelo de contenedores de forma más sencilla, abstrayéndose de la complejidad de Kubernetes. Son servicios que están más acotados y pensados para una gran variedad de casos de uso.&lt;/p&gt;

&lt;p&gt;¿Por qué desplegar algo tan complejo como Kubernetes, si podemos utilizar herramientas más sencillas? Bueno es algo bastante complicado de explicar, pero vamos a intentar responderlo y analizarlo en el post.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Kubernetes no tiene Lock-In&lt;br&gt;
**Es bastante común pensar que Kubernetes no tiene Lock-In y es una de las justificaciones más utilizadas para priorizar el uso de Kubernetes frente a otras alternativas. Pero desgraciadamente **Kubernetes tiene Vendor Lock-In&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Por un lado, un desarrollo hecho en Kubernetes, requiere ejecutarse en Kubernetes, no vas a poder ejecutarlo en otro tipo de contenerización y menos fuera del mundo de contenedores. Y eso es un Lock-In, no muy grande, porque el modelo de contenedores es bastante flexible y permite movernos de forma “sencilla”.&lt;/p&gt;

&lt;p&gt;Pero seamos sinceros, nadie despliega Kubernetes Vainilla. Kubernetes Vainilla tiene poco Lock-In (aunque lo tiene), pero es difícil de desplegar y además requiere de más software para poder gestionar toda la complejidad asociada a Kubernetes.&lt;/p&gt;

&lt;p&gt;Aquí entran los Vendors que nos proponen diferentes Stacks que añaden herramientas que solucionan o facilitan muchos de los problemas que hemos comentado. El problema aquí es que cada Vendor añade sus propias funcionalidades para dar valor a su Stack provocando que existan Lock-In entre diferentes Stacks. Es curioso hablar de evitar el Lock-In con Stacks que utilizan sus propias herramientas cerradas e incluso que modifican el modelo de Kubernetes.&lt;/p&gt;

&lt;p&gt;Mucha gente piensa que migrar de un sabor a otro de Kubernetes es transparente, mientras que si vamos a un servicio Cloud va a ser muy costoso. Una vez que estamos en contenedores el esfuerzo va a ser muy similar.&lt;/p&gt;

&lt;p&gt;Existe un &lt;a href="https://medium.com/digital-mckinsey/does-kubernetes-really-give-you-multicloud-portability-476270a0acc7" rel="noopener noreferrer"&gt;artículo reciente&lt;/a&gt; que compara migrar un proyecto estándar a diferentes sabores de Kubernetes gestionados y adicionalmente a ECS, curiosamente el tiempo de migración y el esfuerzo de migración es exactamente el mismo.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.paradigmadigital.com/dev/podcast-cloud-lock-in-caracteristicas/" rel="noopener noreferrer"&gt;De Lock-In hemos hablado otras veces en el blog&lt;/a&gt;. Es un mal necesario, y debemos gestionarlo como tal. Existe mucha tendencia a evitarlo. En parte, es culpa de un abuso de Lock-In por ciertos Vendors y, por otro lado, que en el pasado no se gestionó adecuadamente. Hay que valorar si un Lock-In como el que pueda tener Lambda, Fargate, ECS o EKS nos conviene y nos facilita la vida y además tener en cuenta &lt;strong&gt;cuánto nos costaría salir a otra tecnología&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Lo importante no es no tener Lock-In (porque básicamente es imposible evitarlo), sino gestionarlo correctamente.&lt;/p&gt;

&lt;h2&gt;
  
  
  Kubernetes es Multi-Cloud
&lt;/h2&gt;

&lt;p&gt;Esta es la mayor mentira jamás contada en Cloud y la respuesta es que no. &lt;strong&gt;Kubernetes no es Multi-Cloud&lt;/strong&gt;, puedes ejecutar Kubernetes en Múltiples Cloud, pero no por ello significa que en cada Cloud funcione igual.&lt;/p&gt;

&lt;p&gt;Un ejemplo que me gusta utilizar es Terraform, ya que permite desplegar infraestructura en todas las Cloud, pero un código de Terraform que has generado para AWS, solo funcionará en AWS, no funcionará en otro Cloud.&lt;/p&gt;

&lt;p&gt;Lo que nos da Terraform es la posibilidad de usar la misma estructura y lenguaje, pero no el mismo contenido. Lo mismo pasa con Kubernetes (aunque realmente esta &lt;strong&gt;potencia nos la dan los contenedores&lt;/strong&gt; y no Kubernetes).&lt;/p&gt;

&lt;p&gt;Un cluster de Kubernetes en AWS no funcionará igual en Azure o en Google Cloud y esto es debido a que las diferentes Cloud se parecen, pero su implementación es totalmente diferente. Solamente con ver las diferencias en el modelo de networking y el modelo de IAM (Identity and Access Management) nos podemos dar cuenta de las diferencias.&lt;/p&gt;

&lt;p&gt;Desde hace un tiempo y gracias al genial &lt;a href="https://www.lastweekinaws.com/" rel="noopener noreferrer"&gt;Corey Quinn&lt;/a&gt; siempre recomiendo lo mismo al hablar de Multi-Cloud, antes de nada &lt;strong&gt;prueba a montarlo en Multi-Region dentro del mismo Cloud Provider&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Gestionar algo tan sencillo como la persistencia se empieza a complicar mucho en el momento que pasamos de una región a varias regiones. Y cada capa que vayamos añadiendo se complica cada vez más y estamos hablando de un mismo Cloud donde el modelo es igual y las APIs son compatibles, si nos vamos a otro Cloud el problema se multiplica exponencialmente.&lt;/p&gt;

&lt;h2&gt;
  
  
  Kubernetes = Cloud
&lt;/h2&gt;

&lt;p&gt;Hay una concepción bastante grande de que si utilizamos Kubernetes, estamos utilizando Cloud. Si bien todos los Cloud Providers tienen servicios gestionados de Kubernetes, Kubernetes como tecnología no nació en el cloud y su evolución fue de forma paralela.&lt;/p&gt;

&lt;p&gt;Es cierto que las &lt;strong&gt;buenas prácticas de Kubernetes se alinean mucho con las buenas prácticas tanto de Cloud, como de modernización de aplicaciones&lt;/strong&gt;. El uso de contenedores tiene sentido en arquitecturas de microservicios.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Los contenedores no son algo nuevo&lt;/strong&gt;, realmente el uso de contenedores o más bien de ancestros de los contenedores viene de lejos y muchos administradores de sistemas Unix hemos utilizado esos ancestros, por lo que evolucionar a Kubernetes no era algo difícil e incluso se puede ver como algo natural.&lt;/p&gt;

&lt;p&gt;Esto en sí no es un problema, tener una estrategia en On-Prem de contenedores no es malo. &lt;strong&gt;El problema es que a veces se utiliza Kubernetes como parte de una evolución cloud inexistente&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Hablamos de una estrategia Cloud que se basa en el uso de Kubernetes en Cloud como si de una infraestructura OnPrem se tratase. Esto es una muy mala idea, porque realmente estamos utilizando el Cloud como un CPD anexo y el Cloud no funciona igual que un CPD.&lt;/p&gt;

&lt;p&gt;**En Kubernetes no entra todo&lt;br&gt;
**Entramos en la parte final y para mí el gran problema de Kubernetes. Al final se ha dado tanta flexibilidad a Kubernetes que se puede ejecutar cualquier carga.&lt;/p&gt;

&lt;p&gt;Esto en principio parece bueno, pero el que se pueda ejecutar, no significa que sea lo más optimo, y menos si queremos evolucionar. Un claro ejemplo serían las BBDD en Kubernetes. Es posible ejecutar una BBDD en Kubernetes, pero no tiene sentido. Al final no estás contenerizado un microservicio, sino que estás contenerizado un servidor entero de BBDD.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;¿De qué sirve un pod, que consume un servidor entero?&lt;br&gt;
**&lt;br&gt;
Otro ejemplo horrible son los famosos “Lift and Shift to Kubernetes”, **¿qué sentido tiene pasar de un servidor virtualizado a un pod en Kubernetes?&lt;/strong&gt; Es posible hacerlo, pero solamente estamos generando problemas y utilizando la tecnología de contenedores para algo que no es su propósito.&lt;/p&gt;

&lt;p&gt;El problema no es que Kubernetes pueda ejecutar estas cargas, &lt;strong&gt;el problema es que es un mal caso de uso&lt;/strong&gt;, que se está generalizando demasiado. Un gran poder conlleva una gran responsabilidad y en el caso de Kubernetes este poder se está utilizando para contenerizar cargas que no debieran de ejecutarse en Kubernetes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusiones
&lt;/h2&gt;

&lt;p&gt;No os voy a mentir, &lt;strong&gt;Kubernetes no es una mala solución&lt;/strong&gt;, hay casos de uso en que es la solución más óptima. En Paradigma hay compañeros que están trabajando en proyectos de Kubernetes en los cuales no hay otra opción al uso de Kubernetes y se está haciendo un gran trabajo. He visto bastantes clusters de Kubernetes que están muy bien montados, muy bien operados y que son necesarios.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Realmente no odio Kubernetes, odio las malas implementaciones de Kubernetes&lt;/strong&gt;, que por desgracia últimamente son las más habituales. Una buena tecnología que tendría que usarse para un tipo de casos de uso, se está utilizando para casos de uso erróneos. Esto es un problema, porque muchas veces estamos generando una complejidad innecesaria. Al final estas malas implementaciones están abocadas al fracaso.&lt;/p&gt;

&lt;p&gt;Es muy habitual que empecemos por montar un cluster de Kubernetes para ejecutar nuestras futuras cargas de trabajo, sin tener en cuenta las cargas de trabajo en sí. Primero montamos el cluster y luego ya definimos las cargas. También existe la variante de directamente desarrollar en Kubernetes sin tener en cuenta si va a ser lo más optimo.&lt;/p&gt;

&lt;p&gt;Estamos en 2023, la división entre infraestructura y desarrollo es algo del pasado, debemos de pensar en la carga que vamos a desarrollar y elegir el lugar más optimo para ejecutarla.&lt;/p&gt;

&lt;p&gt;*&lt;em&gt;Mi recomendación es ir de menos a más complejidad, carga a carga y evaluando cada salto.&lt;br&gt;
*&lt;/em&gt;&lt;br&gt;
El orden que yo propongo sería el siguiente:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Lambda&lt;/li&gt;
&lt;li&gt;Fargate&lt;/li&gt;
&lt;li&gt;ECS&lt;/li&gt;
&lt;li&gt;EKS&lt;/li&gt;
&lt;li&gt;Kubernetes EC2&lt;/li&gt;
&lt;li&gt;Kubernetes OnPrem&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Es importante en cada salto evaluar el “&lt;strong&gt;por qué&lt;/strong&gt;”.&lt;/p&gt;

&lt;p&gt;Si no puedo utilizar Lambda debo de &lt;strong&gt;preguntarme el motivo y si realmente está razonado&lt;/strong&gt;. En muchos casos no se utiliza Lambda porque se requiere que el contenedor siempre esté ejecutándose.&lt;/p&gt;

&lt;p&gt;Pero realmente ese requerimiento está razonado o simplemente es porque me resulta más cómodo o habitual un desarrollo en el que el servicio no depende de eventos y esté siempre ejecutándose. Lo mismo pasa con Fargate, que en muchas ocasiones se descarta por no permitir discos persistentes.&lt;/p&gt;

&lt;p&gt;Aunque ECS, EKS y Kubernetes permiten montar discos persistentes en los pods no es algo recomendado, es más se debería de evitar al máximo.&lt;/p&gt;

&lt;p&gt;Este ejercicio lo debemos hacer con todas las cargas y en todos los pasos, en muchas ocasiones se abusa de Kubernetes, porque nos permite malos usos del pasado. Pero esto no es una ventaja, es un problema.&lt;/p&gt;

&lt;p&gt;También es importante analizar cada carga sin tener en cuenta el global. Si por ejemplo el 80% de nuestras cargas pueden funcionar en Fargate y el resto requiere de un EKS, no pasa nada, montemos un cluster pequeño para ese 20% restante y ejecutemos el 80% en lambda.&lt;/p&gt;

&lt;p&gt;Por último, &lt;strong&gt;no debemos de olvidarnos de EC2&lt;/strong&gt;, existen cargas que no tiene sentido contenerizar ahora mismo. Un monolito contenerizado, no deja de ser un monolito. Para estos casos quedarnos en EC2 e ir evolucionando nuestra aplicación a otros modelos en el futuro no es malo.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Hasta aquí este análisis de mi odio hacia Kubernetes o, más bien, de mi odio hacia su mal uso&lt;/strong&gt;. PD: Durante el artículo hay varios vínculos a tecnologías muy interesantes como Karpenter y Firecracker, os recomiendo que le echéis un vistazo.&lt;/p&gt;

</description>
      <category>kubernetes</category>
      <category>aws</category>
      <category>containers</category>
      <category>discuss</category>
    </item>
    <item>
      <title>And you? Do you hate or Love Kubernetes?</title>
      <dc:creator>Miguel Angel Muñoz Sanchez</dc:creator>
      <pubDate>Thu, 11 Jan 2024 16:36:51 +0000</pubDate>
      <link>https://forem.com/aws-builders/and-you-do-you-hate-or-love-kubernetes-428</link>
      <guid>https://forem.com/aws-builders/and-you-do-you-hate-or-love-kubernetes-428</guid>
      <description>&lt;p&gt;This month, we will deal with a very controversial topic within the AWS world.&lt;/p&gt;

&lt;p&gt;In the past few months, I have encountered many people who tend to hate Kubernetes and try to avoid it at all costs. It has not been precisely people who commit to legacy models but, quite the opposite, people with an extensive background in application modernization and the use of AWS.&lt;/p&gt;

&lt;p&gt;This is interesting because the current state of implementation of Kubernetes grows bigger every day, and it has many defenders.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Kubernetes is a great product&lt;/strong&gt;. I think no one questions this, and it has a lot of valid use cases.&lt;/p&gt;

&lt;p&gt;Many valid alternatives to Kubernetes may be more suitable depending on the use case.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;But what problems do I see with Kubernetes, and why do I like other alternatives better?&lt;/strong&gt; I invite you to follow me in this beautiful story of hatred of a technological stack.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Is Kubernetes?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;"Kubernetes is a container orchestrator"&lt;/strong&gt;. I have had a lot of discussions about this sentence, which is still on the official page of &lt;a href="https://kubernetes.io/" rel="noopener noreferrer"&gt;Kubernetes&lt;/a&gt;. It has even generated quite a few jokes (someone has a lovely kimono with that phrase screenprinted on the back). But in short (and agreeing with the owner of the Kimono), Kubernetes is not a container orchestrator; it is many more things, and this is where perhaps the first problem arises: &lt;strong&gt;Kubernetes is not easy&lt;/strong&gt;; it never was, and it never will be.&lt;/p&gt;

&lt;p&gt;To explain this, we must go back to the origin of Kubernetes. In 1979 …, it is unnecessary to go that far back, but the ancestors of containerizing applications go back to that date. ;) In 2006, several Google engineers began to develop something curious within the Linux kernel called "process containers"—although they later renamed it "control groups" or, as it is better known, "&lt;strong&gt;cgroups&lt;/strong&gt;." This feature allowed the birth of the containers as we now know them.&lt;/p&gt;

&lt;p&gt;Google began to use this functionality internally for its applications, and as it needed to manage them, it created &lt;strong&gt;Borg&lt;/strong&gt; (the ancestor of Kubernetes) to manage its containers.&lt;br&gt;
Years later, Docker was released (previous container implementations already existed, but none were as good and simple).&lt;/p&gt;

&lt;p&gt;The first problem arose here: Containers were an incredible idea, but there was no way to manage and govern them (there were indeed specific solutions, but they were not complete).&lt;/p&gt;

&lt;p&gt;Everything changed at the end of 2014. Google rewrote Borg with all the knowledge it had gained and released it as Kubernetes. Kubernetes was here to fix all problems and quickly became the preferred technology for managing and governing containers. This is a concise summary and in broad strokes; we could write row after row about the history of containers since 1979 or something like that… 2014. It was a prolific year. At the end of the year, two container-based AWS services were launched that we will talk about later: &lt;strong&gt;Lambda and ECS&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problems Begin
&lt;/h2&gt;

&lt;p&gt;Kubernetes was the most complete and mature solution. When it launched Kubernetes, Google used and maintained Borg for almost ten years.&lt;/p&gt;

&lt;p&gt;However, it is a solution designed to manage thousands and thousands of containers distributed among hundreds of physical clusters, which is quite noticeable when using it.&lt;br&gt;
It is not intended for small workloads but for massive workloads.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Kubernetes solved many things but also brought about new problems&lt;/strong&gt;, such as managing Kubernetes networking, load isolation, scaling, securitization, encryption, deployment model, operation model, patching, etc.&lt;/p&gt;

&lt;p&gt;A clear example of these problems is the scaling of Kubernetes. Escalating and de-escalating a &lt;a href="https://kubernetes.io/es/docs/concepts/workloads/pods/pod/" rel="noopener noreferrer"&gt;pod&lt;/a&gt; (Which is a group of one or more containers) is easy. But escalating and de-escalating the infrastructure where the pods are running (&lt;a href="https://kubernetes.io/docs/concepts/architecture/nodes/" rel="noopener noreferrer"&gt;nodes&lt;/a&gt;) is very complicated because you have to create the infrastructure. The pods do not have homogeneous sizes, and you have to distribute the replicas of the pods on different servers, reunify pods on the same server to empty others and be able to turn them off, etc.&lt;/p&gt;

&lt;p&gt;Although many solutions are of help (such as &lt;a href="https://karpenter.sh/" rel="noopener noreferrer"&gt;Karpenter&lt;/a&gt;), the effort and cost of managing and maintaining a Kubernetes cluster are very high.&lt;/p&gt;

&lt;p&gt;Kubernetes requires a lot of expertise in the technology and a team to maintain the technology stack.&lt;/p&gt;

&lt;p&gt;In 2014, cloud implementation was still small. For example, OpenStack was at its highest point. At that time, the I.T. world was much more complex and dependent on pure infrastructure.&lt;/p&gt;

&lt;p&gt;Managing layers and layers of complexity was our daily bread. But we are not in 2014 anymore, and the Cloud has made life easier for us and shifted the paradigm.&lt;/p&gt;

&lt;p&gt;We live in a time when attempts are made to simplify these tasks as much as possible, and developers tend to be empowered to speed up deployments. Thus, adding these layers of infrastructure complexity is going against the grain.&lt;/p&gt;

&lt;p&gt;Here, a series of cloud Services that are simpler than a pure Kubernetes Cluster but in which we can execute containerized loads come into play: &lt;a href="https://aws.amazon.com/es/lambda/" rel="noopener noreferrer"&gt;Lambda&lt;/a&gt;, &lt;a href="https://aws.amazon.com/es/fargate/" rel="noopener noreferrer"&gt;Fargate&lt;/a&gt;, &lt;a href="https://aws.amazon.com/es/ecs/" rel="noopener noreferrer"&gt;ECS (Elastic Container Service)&lt;/a&gt;, and &lt;a href="https://aws.amazon.com/es/eks/" rel="noopener noreferrer"&gt;EKS (Elastic Kubernetes Service)&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I'm going to be honest: None, including EKS, a Kubernetes-managed service, have the power of pure Kubernetes, &lt;strong&gt;but we don't need that power&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Is It Necessary to Deploy Kubernetes in All Use Cases?
&lt;/h2&gt;

&lt;p&gt;The answer is no. &lt;strong&gt;Many use cases do not require something as complex as Kubernetes&lt;/strong&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Lambda is a serverless service&lt;/strong&gt; that allows code to be run directly without providing infrastructure.&lt;br&gt;
It can't manage the container itself but generates a pre-built container or context that allows us to run code directly.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Fargate (ECS or EKS) is a service that allows you to run containers&lt;/strong&gt; in a serverless mode without worrying about the cluster running the load.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Both Lambda and Fargate remove you from all that complexity; they take care of managing it. You deploy your code or your image, and that's it—something straightforward but compelling at the same time.&lt;/p&gt;

&lt;p&gt;Both use an exciting open-source technology developed by Amazon called &lt;a href="https://firecracker-microvm.github.io/" rel="noopener noreferrer"&gt;Firecracker&lt;/a&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;ECS is an AWS-managed container orchestrator&lt;/strong&gt;. It's much simpler than Kubernetes. It is just a container orchestrator that delegates the rest of the tasks to other AWS services.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;EKS is a managed Kubernetes service&lt;/strong&gt; that abstracts us from infrastructure deployment. EKS is in charge of managing part of our Kubernetes clusters (Kubernetes Masters). It eliminates part of the complexity of Kubernetes but affords us some flexibility.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All these Services make it easier to deploy applications based on a container model by abstracting from the complexity of Kubernetes.&lt;br&gt;
These services are more limited and designed for various use cases.&lt;/p&gt;

&lt;p&gt;Why deploy something as complex as Kubernetes if we can use more straightforward tools?&lt;/p&gt;

&lt;p&gt;Well, it isn't straightforward to explain, but there are usually reasons for this, which we will see and discuss here.&lt;/p&gt;

&lt;h2&gt;
  
  
  Kubernetes Does Not Have Lock-In
&lt;/h2&gt;

&lt;p&gt;It is pretty standard to think that Kubernetes does not have a Lock-In, and it is one of the most used justifications for prioritizing Kubernetes over other alternatives. But, unfortunately, &lt;strong&gt;Kubernetes has Vendor Lock-In&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;First, a Kubernetes development must be executed in Kubernetes; you will not be able to run it in another type of containerization, and even less outside the world of containers.&lt;/p&gt;

&lt;p&gt;And that is a Lock-In. It is not very big because the container model is quite flexible and allows us to move in a "simple" way. But let's be honest: no one deploys vanilla Kubernetes.&lt;/p&gt;

&lt;p&gt;Vanilla Kubernetes has little Lock-In (although it does), but it is challenging to deploy and requires more software to deal with all the complexity associated with Kubernetes.&lt;/p&gt;

&lt;p&gt;The Vendors who propose different Stacks that add tools that solve or facilitate many of the problems we have mentioned come here.&lt;/p&gt;

&lt;p&gt;The problem is that each Vendor adds its features to add value to its Stack, thereby causing a Lock-In between different Stacks. It is ironic to talk about avoiding Lock-Ins with Stacks that use their tools and even modify the Kubernetes model.&lt;/p&gt;

&lt;p&gt;Many think migrating from one flavor of Kubernetes to another is transparent while going to a cloud service will be expensive.&lt;/p&gt;

&lt;p&gt;Once we are working in containers, the effort will be very similar.&lt;br&gt;
A &lt;a href="https://medium.com/digital-mckinsey/does-kubernetes-really-give-you-multicloud-portability-476270a0acc7" rel="noopener noreferrer"&gt;recent study&lt;/a&gt; compares migrating a standard project to different flavors of managed Kubernetes and ECS. Interestingly, the migration time and the migration effort are precisely the same.&lt;/p&gt;

&lt;p&gt;We have talked about Lock-In at other times on this blog.&lt;br&gt;
And it's a necessary evil, so we must manage it.&lt;/p&gt;

&lt;p&gt;There is a great tendency to avoid it, partly due to an abuse of Lock-In by certain Vendors and not having been appropriately managed in the past.&lt;/p&gt;

&lt;p&gt;It is necessary to assess whether a Lock-In like the one that Lambda, Fargate, ECS, or EKS may have suits us and makes life easier for us and whether it &lt;strong&gt;considers how much it would cost us to move to another technology&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The important thing isn't having a Lock-In (because it's impossible to avoid) but managing it correctly.&lt;/p&gt;

&lt;h2&gt;
  
  
  Kubernetes is Multi-Cloud
&lt;/h2&gt;

&lt;p&gt;This is the biggest lie ever told in Cloud computing, and the answer is no. &lt;strong&gt;Kubernetes is not Multi-Cloud&lt;/strong&gt;. You can run Kubernetes on multiple clouds, but it does not mean it works the same way in each Cloud.&lt;/p&gt;

&lt;p&gt;An example I would like to give is Terraform. Terraform allows infrastructure to be deployed in all Clouds, but a Terraform code you created for AWS will only work on AWS; it will not work on any other Cloud.&lt;/p&gt;

&lt;p&gt;Terraform allows us to use the same structure and language—but not the same content. The same goes for Kubernetes (although, in actuality, i*&lt;em&gt;t is the power given to us by the containers&lt;/em&gt;*, not Kubernetes).&lt;/p&gt;

&lt;p&gt;A Kubernetes Cluster on AWS won't work the same in Azure and Google Cloud, and this is so because the different Clouds are similar, but their implementation is different. Only by looking at the differences between the networking model and the IAM (Identity and Access Management) model can we realize the differences.&lt;/p&gt;

&lt;p&gt;For a while, and thanks to the great &lt;a href="https://www.lastweekinaws.com/" rel="noopener noreferrer"&gt;Corey Quinn&lt;/a&gt;, I have always recommended the same thing when talking about multi-cloud: &lt;strong&gt;First of all, try to mount it in multi-region with the same cloud provider&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Managing something as simple as persistence becomes very complicated when we move from a single region to multiple regions.&lt;/p&gt;

&lt;p&gt;And each layer we add gets increasingly complicated—and we are talking about the same Cloud where the model is the same, and the APIs are compatible. If we move to another Cloud, the problem multiplies exponentially.&lt;/p&gt;

&lt;h2&gt;
  
  
  Kubernetes == Cloud
&lt;/h2&gt;

&lt;p&gt;There's a pretty big assumption that if we're using Kubernetes, we're using the Cloud.&lt;/p&gt;

&lt;p&gt;Although all Cloud Providers have managed Kubernetes services, Kubernetes as a technology was not born in the Cloud and evolved in parallel.&lt;/p&gt;

&lt;p&gt;Indeed, &lt;strong&gt;Kubernetes' best practices align significantly with the excellent cloud and application modernization practices&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The use of containers makes sense in microservices architectures.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Containers are not a new thing&lt;/strong&gt;. The use of containers, or, instead, the ancestors of containers, comes from way back, and many Unix system administrators have used those ancestors, so evolving to Kubernetes was not difficult and can even be seen as something natural.&lt;/p&gt;

&lt;p&gt;This in itself is not a problem. Having a strategy in an On-Prem container is not bad per se. &lt;strong&gt;The problem is that Kubernetes is sometimes used as part of a non-existent cloud evolution&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;We are discussing a cloud strategy based on using Kubernetes in the Cloud as an On-Prem infrastructure.&lt;br&gt;
This is a terrible idea because we are using the Cloud as an attached CPD, which does not work the same as a CPD.&lt;/p&gt;

&lt;h2&gt;
  
  
  In Kubernetes, Not Everything Fits
&lt;/h2&gt;

&lt;p&gt;In the end, Kubernetes has been given so much flexibility &lt;strong&gt;that many workloads can be run&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;This seems reasonable at first, but the fact that it can be executed does not mean it is the most optimal solution, even less so if we want to evolve.&lt;/p&gt;

&lt;p&gt;A clear example would be databases in Kubernetes.&lt;/p&gt;

&lt;p&gt;It is possible to run a database on Kubernetes, but it just doesn't make sense. Ultimately, you are not containerizing a microservice but an entire database server.&lt;/p&gt;

&lt;p&gt;*&lt;em&gt;What good is a pod if it requires an entire server? *&lt;/em&gt;(You might be surprised at what you see out there.)&lt;/p&gt;

&lt;p&gt;Another horrible example is the famous "Lift and Shift to Kubernetes." &lt;strong&gt;What is the point of moving from a virtualized server to a pod in Kubernetes?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It's possible, but we're just asking for trouble and using container technology for something that's not its intended purpose.&lt;/p&gt;

&lt;p&gt;The problem is not whether Kubernetes can run these uploads. &lt;strong&gt;The problem is that it's a wrong use case and becoming too general&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;With great power comes great responsibility, and in the case of Kubernetes, this power is being used to containerize loads that should not be running on Kubernetes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;I won't lie: &lt;strong&gt;Kubernetes is not a wrong solution&lt;/strong&gt;. There are use cases where it is the most optimal solution.&lt;/p&gt;

&lt;p&gt;Here at Paradigma, some colleagues are working on Kubernetes projects where there is no other option than using Kubernetes, and they are doing a great job.&lt;br&gt;
I have seen quite a few Kubernetes Clusters that are very well set up, well operated, and necessary.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;I don't hate Kubernetes&lt;/strong&gt;; I wouldn't say I like bad Kubernetes implementations, which, unfortunately, are the most common of late.&lt;/p&gt;

&lt;p&gt;A good technology that should be used for one type of use case is being used for the wrong use cases.&lt;/p&gt;

&lt;p&gt;This is a problem because, a lot of times, we are creating unnecessary complexity. These bad implementations are doomed to failure.&lt;/p&gt;

&lt;p&gt;We commonly start things by setting up a Kubernetes cluster to run our future workloads without considering them.&lt;/p&gt;

&lt;p&gt;First, we assemble the cluster, and then we define the loads. There is also the possibility of directly developing in Kubernetes without considering if it will be the most optimal solution.&lt;/p&gt;

&lt;p&gt;We are in 2023. The division between infrastructure and development is something of the past. We must think about the load we will generate and choose the most optimal place to execute it.&lt;/p&gt;

&lt;p&gt;*&lt;em&gt;I recommend going from less to more complexity, load by load, and evaluating each jump.&lt;br&gt;
*&lt;/em&gt;&lt;br&gt;
The order that I propose would be the following:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Lambda&lt;/li&gt;
&lt;li&gt;Fargate&lt;/li&gt;
&lt;li&gt;ECS&lt;/li&gt;
&lt;li&gt;EKS&lt;/li&gt;
&lt;li&gt;Kubernetes EC2&lt;/li&gt;
&lt;li&gt;Kubernetes OnPrem&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;We are evaluating the "&lt;strong&gt;why&lt;/strong&gt;" in each jump, which is essential.&lt;/p&gt;

&lt;p&gt;If I can't use Lambda, I must ask myself &lt;strong&gt;why and if it is justified&lt;/strong&gt;. In many cases, Lambda is not used because the container must be running. But is this requirement justified, or is it just because a development where the service does not depend on events and is always running is more comfortable or usual for me? The same goes for Fargate, which is often discarded for not allowing persistent disks to be mounted.&lt;/p&gt;

&lt;p&gt;Although ECS, EKS, and Kubernetes allow persistent disks to be mounted in the pods, it is not recommended; it should be avoided as much as possible.&lt;/p&gt;

&lt;p&gt;We must do this exercise with all the loads and steps. Often, Kubernetes is abused because it allows us to misuse it from the past. But this is not an advantage; it is a problem.&lt;/p&gt;

&lt;p&gt;It is also essential to analyze each load without considering the global.&lt;br&gt;
If, for example, 80% of our loads can work in Fargate and the rest require EKS, nothing happens. Let's then set up a small cluster for that remaining 20% ​and execute the other 80% in Lambda.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Last but not least, we must not forget about EC2&lt;/strong&gt;. There are loads that it does not make sense to containerize right now. A containerized monolith is still a monolith. In these cases, staying in EC2 and evolving our application to other models in the future is not a bad idea.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;This is all to discuss my hatred for Kubernetes or its misuse&lt;/strong&gt;.&lt;br&gt;
P.S.: The post includes links to exciting technologies such as Karpenter and Firecracker. I recommend that you take a look at them.&lt;/p&gt;

</description>
      <category>kubernetes</category>
      <category>aws</category>
      <category>containers</category>
    </item>
  </channel>
</rss>
