<?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: Ishara Niwarthana</title>
    <description>The latest articles on Forem by Ishara Niwarthana (@ishara_niwarthana).</description>
    <link>https://forem.com/ishara_niwarthana</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%2F3602362%2F99db23cd-21d6-4d2c-91e6-3d627d132fbc.png</url>
      <title>Forem: Ishara Niwarthana</title>
      <link>https://forem.com/ishara_niwarthana</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/ishara_niwarthana"/>
    <language>en</language>
    <item>
      <title>Why Amazon S3 Makes More Technical Sense Today (Especially After MinIO’s Shift)</title>
      <dc:creator>Ishara Niwarthana</dc:creator>
      <pubDate>Wed, 10 Dec 2025 09:01:22 +0000</pubDate>
      <link>https://forem.com/ishara_niwarthana/why-amazon-s3-makes-more-technical-sense-today-especially-after-minios-shift-2ghm</link>
      <guid>https://forem.com/ishara_niwarthana/why-amazon-s3-makes-more-technical-sense-today-especially-after-minios-shift-2ghm</guid>
      <description>&lt;p&gt;For years, MinIO was the easiest way to run S3-compatible storage on your own infrastructure. It provided developers with a familiar API without forcing them to commit to a specific cloud provider. However, with MinIO now in maintenance mode and several features pulled behind commercial licensing, using it for long-term workloads has become increasingly difficult to justify.&lt;/p&gt;

&lt;p&gt;From a technical and operational perspective, Amazon S3 simply provides more reliability, better integrations, and a cleaner operational model. Here's a breakdown of what actually matters when choosing between the two.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Operational Load: S3 vs MinIO&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Running MinIO means managing everything underneath it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;server capacity&lt;/li&gt;
&lt;li&gt;disks and I/O performance&lt;/li&gt;
&lt;li&gt;replication between nodes&lt;/li&gt;
&lt;li&gt;upgrades and patches&lt;/li&gt;
&lt;li&gt;HA configuration&lt;/li&gt;
&lt;li&gt;certificates&lt;/li&gt;
&lt;li&gt;monitoring and alerting&lt;/li&gt;
&lt;li&gt;backup and restoration procedures&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;S3 removes the entire operational surface.&lt;br&gt;
No cluster design, no storage expansion planning, no tracking disk failures, no manual failover.&lt;/p&gt;

&lt;p&gt;This instantly reduces your operational risk and eliminates the "hidden cost" of managing object storage.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Durability and Consistency Guarantees&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;S3 is designed with &lt;em&gt;&lt;strong&gt;multi-AZ replication&lt;/strong&gt;&lt;/em&gt; built into the service. You get:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;11 nines durability&lt;/li&gt;
&lt;li&gt;strong read-after-write consistency&lt;/li&gt;
&lt;li&gt;automatic redundancy&lt;/li&gt;
&lt;li&gt;built-in protection against AZ-level failures&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Reproducing this with MinIO requires:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;multiple nodes&lt;/li&gt;
&lt;li&gt;distributed mode&lt;/li&gt;
&lt;li&gt;a reliable network layer&lt;/li&gt;
&lt;li&gt;external load balancing&lt;/li&gt;
&lt;li&gt;proper quorum management&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And even then, you won't match AWS's durability guarantees.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Security and Access Control&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;S3 integrates with AWS security features out of the box:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;IAM with fine-grained permissions&lt;/li&gt;
&lt;li&gt;Bucket policies and condition keys&lt;/li&gt;
&lt;li&gt;KMS-managed encryption&lt;/li&gt;
&lt;li&gt;Access logging and CloudTrail auditing&lt;/li&gt;
&lt;li&gt;VPC endpoints for private traffic&lt;/li&gt;
&lt;li&gt;Object Lock for immutability&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;With MinIO, these capabilities require manual configuration or external tools. Some features, like Object Lock with legal hold, are not equivalent to the AWS implementation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Event-Driven and Analytics Integrations&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This is where S3 is simply in a different category.&lt;/p&gt;

&lt;p&gt;S3 events can trigger:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Lambda functions&lt;/li&gt;
&lt;li&gt;SQS queues&lt;/li&gt;
&lt;li&gt;SNS topics&lt;/li&gt;
&lt;li&gt;EventBridge event patterns&lt;/li&gt;
&lt;li&gt;Step Functions workflows&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And S3 integrates directly with analytics services such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Athena&lt;/li&gt;
&lt;li&gt;Glue&lt;/li&gt;
&lt;li&gt;EMR&lt;/li&gt;
&lt;li&gt;Redshift Spectrum&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;MinIO can emit notifications, but the overall ecosystem integration is nowhere near as seamless or deeply supported.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cost Efficiency Through Lifecycle Management&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;S3 storage classes give you fine-grained control over cost:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;S3 Standard&lt;/li&gt;
&lt;li&gt;Standard-IA&lt;/li&gt;
&lt;li&gt;One Zone-IA&lt;/li&gt;
&lt;li&gt;Glacier Instant Retrieval&lt;/li&gt;
&lt;li&gt;Glacier Flexible Retrieval&lt;/li&gt;
&lt;li&gt;Glacier Deep Archive&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Lifecycle policies can automatically transition objects or expire them.&lt;/p&gt;

&lt;p&gt;While MinIO can tier data to external storage, it's far more manual, requires additional configuration, and doesn’t come with clear cost modelling.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How I Structure Buckets for Production&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Here's a pattern that works well across most systems:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;├── app-logs/
│   ├── versioning: enabled
│   ├── lifecycle: move to IA in 30 days, delete in 180
│   └── encryption: SSE-S3
│
├── media/
│   ├── versioning: enabled
│   ├── lifecycle: IA after 90 days
│   └── encryption: SSE-KMS
│
└── static-assets/
    ├── public access: blocked
    ├── cloudfront origin: yes
    └── caching: configured via headers
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This setup keeps costs controlled while maintaining both security and durability.&lt;/p&gt;

&lt;p&gt;Most large companies follow four core principles when designing their S3 structure:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Separation by data purpose (logs ≠ media ≠ analytics)&lt;/li&gt;
&lt;li&gt;Isolation by environment (dev, staging, prod)&lt;/li&gt;
&lt;li&gt;Least privilege access (per-bucket IAM policies)&lt;/li&gt;
&lt;li&gt;Strong lifecycle controls (move cold data automatically)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Using these principles, here is a battle-tested structure you can adopt directly:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;abc-company-s3/
├── global/
│   ├── shared-artifacts/
│   ├── security-logs/
│   └── compliance/
│
├── prod/
│   ├── app-data/
│   ├── media/
│   ├── analytics/
│   ├── backups/
│   └── logs/
│
├── staging/
│   ├── app-data/
│   ├── media/
│   ├── analytics/
│   ├── backups/
│   └── logs/
│
└── dev/
    ├── sandbox-&amp;lt;team&amp;gt;/
    ├── sandbox-&amp;lt;engineer&amp;gt;/
    └── temp/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Conclusion&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;With MinIO no longer actively evolving and key features moving behind paid editions, the operational and long-term risks have increased. For production workloads, especially ones that need durability, compliance, and strong integration with other services, S3 remains the more stable and future-proof choice.&lt;/p&gt;

&lt;p&gt;It's not just "using a cloud service instead of self-hosting."&lt;br&gt;
It's choosing a storage layer that removes operational overhead, scales automatically, and integrates cleanly with the rest of the AWS ecosystem.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;Final Thoughts&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;This structure comes from my own experience working with S3 in production setups, combined with research into how larger engineering teams organise their storage at scale. There's no "one perfect layout", but the patterns above tend to hold up well as applications grow and infrastructure becomes more complex.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;If you manage S3 differently or follow another pattern that works well for your team, I'd love to learn from it. Feel free to share your approach, improvements, or any suggestions that could make this layout even stronger in a real production environment.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>aws</category>
      <category>s3</category>
      <category>devops</category>
      <category>discuss</category>
    </item>
    <item>
      <title>💸 How I Cut AWS EC2 S3 Data Transfer Costs to $0</title>
      <dc:creator>Ishara Niwarthana</dc:creator>
      <pubDate>Sun, 09 Nov 2025 19:37:58 +0000</pubDate>
      <link>https://forem.com/ishara_niwarthana/how-i-cut-aws-ec2-s3-data-transfer-costs-to-0-4e55</link>
      <guid>https://forem.com/ishara_niwarthana/how-i-cut-aws-ec2-s3-data-transfer-costs-to-0-4e55</guid>
      <description>&lt;p&gt;&lt;strong&gt;😅 The Problem&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;At my previous company, in one of our AWS accounts, our AWS bill showed ~$300/month in “Data Transfer” even though all workloads were in the same region.&lt;/p&gt;

&lt;p&gt;Our setup:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;EC2 batch jobs&lt;/li&gt;
&lt;li&gt;Uploading results/logs to Amazon S3&lt;/li&gt;
&lt;li&gt;Same region, no cross-region calls&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I assumed:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;“Same region = no cost.”&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Wrong. 😬&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🔍 The Root Cause&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;After checking Cost Explorer and VPC Flow Logs, I found the issue.&lt;br&gt;
EC2 instances were talking to S3 using the public endpoint.&lt;/p&gt;

&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;aws s3 sync /data s3://abccompany-logs/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That meant:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Traffic left the VPC via &lt;strong&gt;NAT Gateway&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Crossed AWS’s &lt;strong&gt;public network&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Re-entered AWS to reach S3&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So even though both were in the same region, we paid:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;NAT Gateway data processing&lt;/strong&gt;: $0.045 per GB&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Regional data transfer charges&lt;/strong&gt; for EC2 → S3 path&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;💰 At ~6 TB/month = $270+ in pure data movement.&lt;/p&gt;

&lt;p&gt;Per AWS Docs:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“If data leaves a VPC through an Internet Gateway or NAT Gateway, standard data-processing charges apply.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;🧠 &lt;strong&gt;The Fix - VPC Gateway Endpoint for S3&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The solution: keep the traffic inside AWS’s private network.&lt;/p&gt;

&lt;p&gt;Here’s the Terraform snippet we used:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;resource "aws_vpc_endpoint" "s3" {
  vpc_id          = aws_vpc.main.id
  service_name    = "com.amazonaws.eu-central-1.s3"
  route_table_ids = [aws_route_table.main.id]
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once created:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;EC2 → S3 traffic stays internal&lt;/li&gt;
&lt;li&gt;NAT Gateway no longer handles uploads&lt;/li&gt;
&lt;li&gt;Zero data-processing or transfer charges&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Confirmed by AWS docs&lt;br&gt;
:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Gateway endpoints for Amazon S3 have no additional cost.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;💰 Results&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;After one billing cycle:

Metric                  Before  After
EC2 → S3 Transfer Cost    ~$300   $0
NAT Gateway Data    High    Minimal
Performance         Same    Same
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;🧩 Common Mistakes to Avoid&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;❌ Mistake                        ✅ Fix
Assuming “same region = free”       Verify network path
Using public S3 endpoint            Use Gateway Endpoint
Ignoring NAT data charges           Track via Cost Explorer
No flow visibility                  Enable VPC Flow Logs
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;🧠 Lessons Learned&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This experience taught me that AWS cost optimization isn’t just reserved instances or savings plans, it’s about network awareness.&lt;/p&gt;

&lt;p&gt;A single endpoint change saved us hundreds per month, with zero downtime or refactor.&lt;br&gt;
It’s one of the simplest, most underrated optimizations you can make.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🪶 TL;DR&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;✅ EC2 → S3 via NAT = $$&lt;br&gt;
✅ EC2 → S3 via VPC Endpoint = Free&lt;br&gt;
✅ Check your data paths, even in the same region&lt;/p&gt;

</description>
      <category>cloud</category>
      <category>devops</category>
      <category>costoptimization</category>
      <category>aws</category>
    </item>
  </channel>
</rss>
