<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Mwanza Simi</title>
    <description>The latest articles on DEV Community by Mwanza Simi (@simimwanza).</description>
    <link>https://dev.to/simimwanza</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%2F2749564%2F8bd4c01e-1b48-4a5d-b10e-fc14459e2b92.jpeg</url>
      <title>DEV Community: Mwanza Simi</title>
      <link>https://dev.to/simimwanza</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/simimwanza"/>
    <language>en</language>
    <item>
      <title>S3 Files Killed My Least Favorite Lambda Pattern</title>
      <dc:creator>Mwanza Simi</dc:creator>
      <pubDate>Thu, 21 May 2026 10:26:47 +0000</pubDate>
      <link>https://dev.to/aws-builders/s3-files-killed-my-least-favorite-lambda-pattern-25f9</link>
      <guid>https://dev.to/aws-builders/s3-files-killed-my-least-favorite-lambda-pattern-25f9</guid>
      <description>&lt;p&gt;Every Lambda function I have written that touches S3 has the same three lines of plumbing:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;s3&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;download_file&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bucket&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/tmp/input.csv&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;process&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/tmp/input.csv&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/tmp/output.csv&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;s3&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;upload_file&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/tmp/output.csv&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;bucket&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;output_key&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Download. Process. Upload. Clean up &lt;code&gt;/tmp&lt;/code&gt;. Handle the edge case where &lt;code&gt;/tmp&lt;/code&gt; is full from a previous invocation. Handle the edge case where the download fails halfway. Handle the edge case where you run out of the 10 GB ephemeral limit because someone uploaded a file larger than you expected.&lt;/p&gt;

&lt;p&gt;S3 Files makes all of that go away. You mount the bucket at &lt;code&gt;/mnt/workspace&lt;/code&gt; and use &lt;code&gt;open()&lt;/code&gt;. The file is right there. You write the output. It syncs to S3.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem It Solves
&lt;/h2&gt;

&lt;p&gt;Lambda functions that process files from S3 have always followed the same ritual:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Download the object from S3 to &lt;code&gt;/tmp&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Process it with whatever tool expects a file path&lt;/li&gt;
&lt;li&gt;Upload the result back to S3&lt;/li&gt;
&lt;li&gt;Clean up &lt;code&gt;/tmp&lt;/code&gt; so the next invocation doesn't run out of space&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This works. It also creates problems.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;/tmp&lt;/code&gt; is ephemeral. It's limited to 10 GB. It's not shared between invocations on different execution environments. If your function fails halfway through processing, you retry the entire download. If multiple functions need the same reference file, each one downloads its own copy.&lt;/p&gt;

&lt;p&gt;For a single CSV transform, the overhead is tolerable. For a pipeline that processes PDFs, images, video, or runs tools like &lt;code&gt;ffmpeg&lt;/code&gt;, &lt;code&gt;imagemagick&lt;/code&gt;, &lt;code&gt;trivy&lt;/code&gt;, or &lt;code&gt;semgrep&lt;/code&gt;, the download-process-upload loop becomes the majority of your code and the majority of your execution time.&lt;/p&gt;

&lt;p&gt;S3 Files eliminates the loop. Your function mounts the bucket and reads files directly.&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%2Fge0tjf640ija0wxn48f5.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%2Fge0tjf640ija0wxn48f5.png" alt="Old vs new flow" width="799" height="436"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  How It Works
&lt;/h2&gt;

&lt;p&gt;S3 Files is a managed NFS v4.1+ file system built on Amazon EFS that presents your S3 bucket as a directory tree. When you mount it on a Lambda function, the function sees files and directories at &lt;code&gt;/mnt/your-path&lt;/code&gt;. Under the hood, the data still lives in S3.&lt;/p&gt;

&lt;p&gt;The architecture uses what AWS calls "stage and commit":&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Your function reads and writes files through the NFS mount&lt;/li&gt;
&lt;li&gt;An EFS caching layer stores actively accessed data for low-latency access (~1ms)&lt;/li&gt;
&lt;li&gt;Changes written through the mount are exported back to S3 within minutes&lt;/li&gt;
&lt;li&gt;Changes made directly through the S3 API appear in the file system within seconds (sometimes longer)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The two layers are explicitly separate. The file system side gives you NFS close-to-open consistency. The S3 side gives you standard strong consistency. Each preserves its own semantics.&lt;/p&gt;

&lt;p&gt;For large sequential reads (1 MiB or larger), S3 Files bypasses the cache entirely and streams data directly from S3 using parallel GET requests. This means ML training data, large CSVs, media files, and Parquet datasets get full S3 throughput without paying the cache premium. Files smaller than 128 KB (configurable) are the ones that get stored on the high-performance layer for low-latency access.&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%2F3s413gsrfjjjdvedfdl3.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%2F3s413gsrfjjjdvedfdl3.png" alt="Stage-and-commit architecture" width="799" height="436"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What It Looks Like
&lt;/h2&gt;

&lt;p&gt;The old way:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;boto3&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;csv&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;

&lt;span class="n"&gt;s3&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;boto3&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;client&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;s3&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;handler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;bucket&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;bucket&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="n"&gt;key&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;key&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="n"&gt;output_key&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;incoming/&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;processed/&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;s3&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;download_file&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bucket&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/tmp/input.csv&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/tmp/input.csv&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;newline&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;""&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;src&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; \
         &lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/tmp/output.csv&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;w&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;newline&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;""&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;dst&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;reader&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;csv&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;DictReader&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;src&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;writer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;csv&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;DictWriter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dst&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fieldnames&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;email&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;account_id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
        &lt;span class="n"&gt;writer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;writeheader&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;reader&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;writer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;writerow&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;email&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;email&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;strip&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;lower&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;account_id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;account_id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;strip&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
            &lt;span class="p"&gt;})&lt;/span&gt;

    &lt;span class="n"&gt;s3&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;upload_file&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/tmp/output.csv&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;bucket&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;output_key&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;remove&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/tmp/input.csv&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;remove&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/tmp/output.csv&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;output&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;output_key&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The new way:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;csv&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;pathlib&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Path&lt;/span&gt;

&lt;span class="n"&gt;WORKSPACE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Path&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/mnt/workspace&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;handler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;source&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;WORKSPACE&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;relative_input_path&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="n"&gt;target&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;WORKSPACE&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;relative_output_path&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="n"&gt;target&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;parent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;mkdir&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;parents&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;exist_ok&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;source&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;newline&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;""&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;src&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;target&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;w&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;newline&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;""&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;dst&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;reader&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;csv&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;DictReader&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;src&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;writer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;csv&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;DictWriter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dst&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fieldnames&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;email&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;account_id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
        &lt;span class="n"&gt;writer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;writeheader&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;reader&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;writer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;writerow&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;email&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;email&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;strip&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;lower&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;account_id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;account_id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;strip&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
            &lt;span class="p"&gt;})&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;output_path&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;target&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No boto3. No temporary files. No cleanup. The output is written directly to the mounted S3 bucket and syncs back to S3 automatically.&lt;/p&gt;

&lt;p&gt;The real win shows up when the processing step isn't a simple CSV transform. If your function shells out to &lt;code&gt;git&lt;/code&gt;, &lt;code&gt;ripgrep&lt;/code&gt;, &lt;code&gt;ffmpeg&lt;/code&gt;, &lt;code&gt;trivy&lt;/code&gt;, or any tool that expects a filesystem path, a mounted workspace is simpler than teaching every tool to speak S3.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Setup
&lt;/h2&gt;

&lt;p&gt;S3 Files on Lambda requires more infrastructure than a plain S3 trigger. Here's what you need:&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;An S3 file system created on a general purpose bucket (S3 versioning must be enabled)&lt;/li&gt;
&lt;li&gt;Mount targets in the same VPC and Availability Zones as your Lambda function&lt;/li&gt;
&lt;li&gt;Security groups allowing NFS traffic on port 2049&lt;/li&gt;
&lt;li&gt;Lambda function connected to the VPC&lt;/li&gt;
&lt;li&gt;Execution role with &lt;code&gt;s3files:ClientMount&lt;/code&gt; (and &lt;code&gt;s3files:ClientWrite&lt;/code&gt; for write access)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;s3:GetObject&lt;/code&gt; and &lt;code&gt;s3:GetObjectVersion&lt;/code&gt; for direct read optimization&lt;/li&gt;
&lt;li&gt;Function memory set to 512 MB or higher (required for direct reads from S3)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The SAM template:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;Resources&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;ProcessingFunction&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;Type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;AWS::Serverless::Function&lt;/span&gt;
    &lt;span class="na"&gt;Properties&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;FunctionName&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;FileProcessorFunction&lt;/span&gt;
      &lt;span class="na"&gt;CodeUri&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;./src&lt;/span&gt;
      &lt;span class="na"&gt;Handler&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;index.handler&lt;/span&gt;
      &lt;span class="na"&gt;Runtime&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;python3.13&lt;/span&gt;
      &lt;span class="na"&gt;MemorySize&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;512&lt;/span&gt;
      &lt;span class="na"&gt;Timeout&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;300&lt;/span&gt;
      &lt;span class="na"&gt;VpcConfig&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;SecurityGroupIds&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="kt"&gt;!Ref&lt;/span&gt; &lt;span class="s"&gt;LambdaSecurityGroup&lt;/span&gt;
        &lt;span class="na"&gt;SubnetIds&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="kt"&gt;!Ref&lt;/span&gt; &lt;span class="s"&gt;PrivateSubnet1&lt;/span&gt;
          &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="kt"&gt;!Ref&lt;/span&gt; &lt;span class="s"&gt;PrivateSubnet2&lt;/span&gt;
      &lt;span class="na"&gt;FileSystemConfigs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;Arn&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;!GetAtt&lt;/span&gt; &lt;span class="s"&gt;S3FilesAccessPoint.Arn&lt;/span&gt;
          &lt;span class="na"&gt;LocalMountPath&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/mnt/workspace&lt;/span&gt;
      &lt;span class="na"&gt;Policies&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;Statement&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;Effect&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Allow&lt;/span&gt;
              &lt;span class="na"&gt;Action&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
                &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;s3files:ClientMount&lt;/span&gt;
                &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;s3files:ClientWrite&lt;/span&gt;
              &lt;span class="na"&gt;Resource&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;*"&lt;/span&gt;
            &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;Effect&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Allow&lt;/span&gt;
              &lt;span class="na"&gt;Action&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
                &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;s3:GetObject&lt;/span&gt;
                &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;s3:GetObjectVersion&lt;/span&gt;
              &lt;span class="na"&gt;Resource&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;!Sub&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;arn:aws:s3:::${BucketName}/*"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The VPC requirement is the biggest change from a standard Lambda + S3 setup. If your function isn't already in a VPC, you need to add subnets, security groups, and NAT gateways (if the function also needs internet access). That's not trivial for existing deployments.&lt;/p&gt;

&lt;h2&gt;
  
  
  When to Use S3 Files vs. the Old Pattern
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Use S3 Files when:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Your function processes files with tools that expect filesystem paths (ffmpeg, imagemagick, PDF libraries, git, security scanners)&lt;/li&gt;
&lt;li&gt;Multiple Lambda functions need shared access to the same working directory&lt;/li&gt;
&lt;li&gt;You are tired of managing &lt;code&gt;/tmp&lt;/code&gt; size limits and cleanup logic&lt;/li&gt;
&lt;li&gt;The function reads large reference datasets that don't change between invocations&lt;/li&gt;
&lt;li&gt;You want to eliminate the download-process-upload ceremony&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Keep using GetObject + /tmp when:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Your function reads one object, transforms it in memory, and writes one object back&lt;/li&gt;
&lt;li&gt;The function is a simple event handler that processes JSON payloads&lt;/li&gt;
&lt;li&gt;You need the lowest possible cold start latency (VPC adds ~100-200ms)&lt;/li&gt;
&lt;li&gt;Your function doesn't need filesystem semantics at all&lt;/li&gt;
&lt;li&gt;The workload is latency-sensitive and can't tolerate the VPC mount dependency&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The mental model is straightforward. If your code has &lt;code&gt;download_file&lt;/code&gt; followed by &lt;code&gt;upload_file&lt;/code&gt; and the processing step uses file paths, S3 Files removes that plumbing. If your code streams objects through memory without touching the filesystem, S3 Files adds complexity for no benefit.&lt;/p&gt;

&lt;h2&gt;
  
  
  What You Pay
&lt;/h2&gt;

&lt;p&gt;S3 Files pricing has three layers on top of your existing S3 storage costs:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Component&lt;/th&gt;
&lt;th&gt;Rate&lt;/th&gt;
&lt;th&gt;What triggers it&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;S3 Standard storage&lt;/td&gt;
&lt;td&gt;~$0.023/GB-month&lt;/td&gt;
&lt;td&gt;All data in the bucket (unchanged)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;High-performance cache&lt;/td&gt;
&lt;td&gt;~$0.30/GB-month&lt;/td&gt;
&lt;td&gt;Only actively cached data, not the whole bucket&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Data access (reads)&lt;/td&gt;
&lt;td&gt;~$0.03/GB&lt;/td&gt;
&lt;td&gt;Small file reads from cache&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Data access (writes)&lt;/td&gt;
&lt;td&gt;~$0.06/GB&lt;/td&gt;
&lt;td&gt;Writes through the mount&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The critical detail: &lt;strong&gt;large sequential reads (1 MiB+) bypass the cache entirely&lt;/strong&gt; and cost only standard S3 GET request pricing. No S3 Files surcharge.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Practical example:&lt;/strong&gt; You have a 1 TB bucket. Your Lambda functions actively work with 50 GB of files through the mount. Most reads are large Parquet files.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Component&lt;/th&gt;
&lt;th&gt;Cost&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;S3 storage (1 TB)&lt;/td&gt;
&lt;td&gt;$23.55&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cache storage (50 GB active)&lt;/td&gt;
&lt;td&gt;$15.00&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Data access (small file reads)&lt;/td&gt;
&lt;td&gt;~$0.50&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Data access (writes, 20 GB)&lt;/td&gt;
&lt;td&gt;~$1.20&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Total&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;~$40/month&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The same 1 TB on EFS would cost ~$300/month. S3 Files costs a fraction because you only pay the cache premium on the active working set, not the entire dataset.&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%2Fufadbs158lulelro1h98.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%2Fufadbs158lulelro1h98.png" alt="Cost comparison visual" width="799" height="436"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Small operations have metering minimums.&lt;/strong&gt; Data access operations are metered at a minimum size (reported as 32 KB in early testing). Reading a 1-byte config file gets metered for more than 1 byte. For workloads with millions of tiny metadata-heavy operations, those minimums add up.&lt;/p&gt;

&lt;h2&gt;
  
  
  Things to Know Before You Build
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;The sync window isn't instant.&lt;/strong&gt; Changes written through the mount are exported back to S3 within minutes. Changes made directly in S3 appear in the file system within seconds, but can take a minute or longer. If your downstream system polls S3 for new objects, account for this lag. There's no manual flush API.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Renames are expensive.&lt;/strong&gt; S3 has no native rename. Renaming a file through the mount means copy + delete at the S3 layer. For a single file, fine. For a directory with 50,000 files, that's 50,000 copy-and-delete operations. Write final output paths directly. Don't use directory renames as workflow commits.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;S3 versioning is required.&lt;/strong&gt; You can't create an S3 file system on a bucket without versioning enabled. This increases storage costs from additional versions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Glacier storage classes are incompatible.&lt;/strong&gt; S3 Standard, Intelligent-Tiering, and Infrequent Access all work. Glacier does not.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;No hard links.&lt;/strong&gt; Symbolic links work. If your tool relies on hard links (some build systems and package managers do), it will break.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1,024-byte key length limit.&lt;/strong&gt; Deeply nested directories with long filenames can hit this ceiling. Measure your path lengths before committing to a directory structure.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Conflicts: S3 wins.&lt;/strong&gt; If the same file is modified through both the mount and the S3 API simultaneously, the S3 version is treated as the source of truth. The file system version goes to a &lt;code&gt;lost+found&lt;/code&gt; directory. Pick one writer per path.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Custom S3 metadata isn't visible.&lt;/strong&gt; If your application sets &lt;code&gt;x-amz-meta&lt;/code&gt; headers through the S3 API, those values don't appear as extended attributes on mounted files. POSIX attributes only.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cache expiration defaults to 30 days.&lt;/strong&gt; Data stays in the high-performance layer for 30 days after last access. For batch workloads that touch files once, drop this to 1-2 days to reduce cache storage costs.&lt;/p&gt;

&lt;h2&gt;
  
  
  S3 Files vs. EFS vs. Mountpoint
&lt;/h2&gt;

&lt;p&gt;Lambda already supported EFS mounts. And S3 Mountpoint exists for read-heavy workloads. Here's when each makes sense:&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%2Fbkur2r7dwffclv7ddrgf.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%2Fbkur2r7dwffclv7ddrgf.png" alt=" Simple decision flowchart" width="799" height="436"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;If you need...&lt;/th&gt;
&lt;th&gt;Use this&lt;/th&gt;
&lt;th&gt;Why&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;File paths backed by S3 data&lt;/td&gt;
&lt;td&gt;S3 Files&lt;/td&gt;
&lt;td&gt;S3 stays the source of truth, cache only for active data&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;General shared POSIX storage independent of S3&lt;/td&gt;
&lt;td&gt;EFS&lt;/td&gt;
&lt;td&gt;Mature, no sync lag, all data is hot&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Read-only high-throughput access to S3&lt;/td&gt;
&lt;td&gt;Mountpoint for S3&lt;/td&gt;
&lt;td&gt;Simpler, no EFS layer, no write support needed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Enterprise NAS features (ONTAP, Windows)&lt;/td&gt;
&lt;td&gt;FSx&lt;/td&gt;
&lt;td&gt;Protocol-specific workloads&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The key difference between S3 Files and EFS: with EFS, you pay $0.30/GB for everything stored. With S3 Files, you pay $0.30/GB only for the active working set and $0.023/GB for everything else in S3. The cost advantage grows as total data increases relative to the active subset.&lt;/p&gt;

&lt;p&gt;The key difference between S3 Files and Mountpoint: Mountpoint is a FUSE client with limited write support and no caching layer. S3 Files gives you full read-write NFS semantics with a managed cache. If you only need to read large files from S3, Mountpoint is simpler and cheaper.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Practical Example: Image Processing Pipeline
&lt;/h2&gt;

&lt;p&gt;A common Lambda pattern: S3 trigger fires when an image is uploaded, function generates thumbnails and optimized versions.&lt;/p&gt;

&lt;p&gt;The old way requires downloading the source image, processing it with Pillow or ImageMagick, writing multiple outputs to &lt;code&gt;/tmp&lt;/code&gt;, then uploading each one back to S3:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;boto3&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;PIL&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Image&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;

&lt;span class="n"&gt;s3&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;boto3&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;client&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;s3&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;SIZES&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;thumb&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;150&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;150&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;medium&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;800&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;600&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;large&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1920&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1080&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;handler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;bucket&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Records&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;s3&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;bucket&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;name&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="n"&gt;key&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Records&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;s3&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;object&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;key&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

    &lt;span class="n"&gt;s3&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;download_file&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bucket&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/tmp/source.jpg&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;img&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Image&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/tmp/source.jpg&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;size&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;SIZES&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;items&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
        &lt;span class="n"&gt;resized&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;img&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;copy&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="n"&gt;resized&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;thumbnail&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;output_path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/tmp/&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;.jpg&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="n"&gt;resized&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;save&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;output_path&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;JPEG&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;quality&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;85&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;s3&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;upload_file&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;output_path&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;bucket&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;processed/&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;/&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;remove&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;output_path&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;remove&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/tmp/source.jpg&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;processed&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;SIZES&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;keys&lt;/span&gt;&lt;span class="p"&gt;())}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With S3 Files:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;PIL&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Image&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;pathlib&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Path&lt;/span&gt;

&lt;span class="n"&gt;WORKSPACE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Path&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/mnt/workspace&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;SIZES&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;thumb&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;150&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;150&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;medium&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;800&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;600&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;large&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1920&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1080&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;handler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;key&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Records&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;s3&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;object&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;key&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="n"&gt;source&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;WORKSPACE&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;

    &lt;span class="n"&gt;img&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Image&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;source&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;size&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;SIZES&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;items&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
        &lt;span class="n"&gt;output&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;WORKSPACE&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;processed&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;
        &lt;span class="n"&gt;output&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;parent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;mkdir&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;parents&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;exist_ok&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;resized&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;img&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;copy&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="n"&gt;resized&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;thumbnail&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;resized&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;save&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;output&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;JPEG&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;quality&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;85&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;processed&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;SIZES&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;keys&lt;/span&gt;&lt;span class="p"&gt;())}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Half the code. No boto3 import. No temporary file management. The source image is read directly from the mount. The outputs are written directly to the mount and sync to S3 within a minute.&lt;/p&gt;

&lt;h2&gt;
  
  
  Multi-Function Shared Workspace
&lt;/h2&gt;

&lt;p&gt;The pattern that makes S3 Files most interesting isn't single-function file processing. It's multiple functions sharing a workspace.&lt;/p&gt;

&lt;p&gt;Before S3 Files, if three Lambda functions needed to collaborate on the same set of files, each one had to download from S3, do its work, upload results, and the next function would download those results. With S3 Files, they all mount the same bucket and read each other's output directly.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Function A (security scan)
  reads  /mnt/workspace/repo/
  writes /mnt/workspace/reports/security.json

Function B (test analysis)
  reads  /mnt/workspace/repo/
  writes /mnt/workspace/reports/tests.json

Function C (merge reports)
  reads  /mnt/workspace/reports/*.json
  writes /mnt/workspace/final/summary.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No intermediate S3 uploads between steps. No coordination logic to pass object keys between functions. The workspace is the coordination mechanism.&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%2F8zet6c9phqcm7bajuxzo.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%2F8zet6c9phqcm7bajuxzo.png" alt="Shared workspace diagram" width="800" height="436"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The rule for shared workspaces: &lt;strong&gt;one writer per file path.&lt;/strong&gt; Don't have two functions writing to the same file. Use worker-specific output paths and let the orchestrator merge.&lt;/p&gt;

&lt;h2&gt;
  
  
  Who This Is For
&lt;/h2&gt;

&lt;p&gt;S3 Files is for Lambda functions that have been pretending S3 objects are files. If your code downloads an object, gives it a file path, processes it with a tool that expects a file, and uploads the result, S3 Files removes the pretending.&lt;/p&gt;

&lt;p&gt;The strongest use cases:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Media processing.&lt;/strong&gt; Image resizing, video transcoding, audio conversion. These tools all expect file paths.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Document processing.&lt;/strong&gt; PDF extraction, Office document conversion, OCR pipelines. Libraries like &lt;code&gt;pdfplumber&lt;/code&gt;, &lt;code&gt;python-docx&lt;/code&gt;, and Tesseract work with files.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Code analysis.&lt;/strong&gt; Security scanners, linters, dependency checkers. Tools like &lt;code&gt;trivy&lt;/code&gt;, &lt;code&gt;semgrep&lt;/code&gt;, &lt;code&gt;bandit&lt;/code&gt;, and &lt;code&gt;eslint&lt;/code&gt; expect a directory to scan.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ML inference with reference data.&lt;/strong&gt; Models that load large reference files (embeddings, lookup tables, feature stores) benefit from the shared mount. Load once, use across invocations.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AI agent workspaces.&lt;/strong&gt; Agents that use filesystem tools (&lt;code&gt;cat&lt;/code&gt;, &lt;code&gt;grep&lt;/code&gt;, &lt;code&gt;ls&lt;/code&gt;, &lt;code&gt;find&lt;/code&gt;) can work directly on S3 data without custom S3 API wrappers.&lt;/p&gt;

&lt;p&gt;The weakest use cases: simple JSON transforms, single-object streaming, anything that never touches the filesystem.&lt;/p&gt;

&lt;h2&gt;
  
  
  Getting Started
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Create the file system on your bucket (verify exact CLI syntax against docs)&lt;/span&gt;
aws s3api create-file-system &lt;span class="nt"&gt;--bucket&lt;/span&gt; my-bucket &lt;span class="nt"&gt;--file-system-name&lt;/span&gt; my-workspace

&lt;span class="c"&gt;# Create mount targets in your VPC subnets&lt;/span&gt;
aws s3api create-mount-target &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--file-system-id&lt;/span&gt; fs-abc123 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--subnet-id&lt;/span&gt; subnet-xyz &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--security-groups&lt;/span&gt; sg-nfs-access

&lt;span class="c"&gt;# Attach to your Lambda function via console or IaC&lt;/span&gt;
&lt;span class="c"&gt;# Configuration &amp;gt; File systems &amp;gt; Add file system &amp;gt; S3 Files&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;a href="https://docs.aws.amazon.com/lambda/latest/dg/configuration-filesystem-s3files.html" rel="noopener noreferrer"&gt;Lambda S3 Files documentation&lt;/a&gt; covers the full setup. The &lt;a href="https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-files.html" rel="noopener noreferrer"&gt;S3 Files user guide&lt;/a&gt; covers file system creation, access points, and synchronization configuration.&lt;/p&gt;

&lt;h2&gt;
  
  
  Should You Migrate?
&lt;/h2&gt;

&lt;p&gt;For 20 years, the answer to "can I mount S3?" was no. Now it's yes, and the implementation is good enough for production Lambda workloads.&lt;/p&gt;

&lt;p&gt;The download-process-upload pattern isn't gone from every codebase. It still makes sense for simple object transforms. But for file-heavy Lambda functions that spend more lines on S3 plumbing than on actual processing logic, S3 Files is a real simplification.&lt;/p&gt;

&lt;p&gt;Mount the bucket. Read the file. Write the output.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://aws.amazon.com/s3/features/files/" rel="noopener noreferrer"&gt;Amazon S3 Files&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;
&lt;a href="https://docs.aws.amazon.com/lambda/latest/dg/configuration-filesystem-s3files.html" rel="noopener noreferrer"&gt;Lambda Documentation&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a href="https://aws.amazon.com/s3/pricing/" rel="noopener noreferrer"&gt;Pricing&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>aws</category>
      <category>s3</category>
      <category>lambda</category>
      <category>cloud</category>
    </item>
    <item>
      <title>Your Pen Test Takes 6 Weeks. Attackers Take 4 Minutes</title>
      <dc:creator>Mwanza Simi</dc:creator>
      <pubDate>Wed, 06 May 2026 13:43:28 +0000</pubDate>
      <link>https://dev.to/aws-builders/your-pen-test-takes-6-weeks-attackers-take-4-minutes-1k0c</link>
      <guid>https://dev.to/aws-builders/your-pen-test-takes-6-weeks-attackers-take-4-minutes-1k0c</guid>
      <description>&lt;p&gt;The 2026 CrowdStrike Global Threat Report recorded the fastest lateral movement at 27 seconds after initial access. In one case, data exfiltration started four minutes after entry. Most organizations still schedule penetration tests quarterly, if they're lucky, and wait weeks for the report. By the time the PDF lands in your inbox, the findings are stale.&lt;/p&gt;

&lt;p&gt;You ship features weekly. Your security review happens annually. Somewhere in between, you're shipping code that hasn't been tested, because the pen test backlog is six applications deep and the next slot is in Q3.&lt;/p&gt;

&lt;p&gt;A 2025 Checkmarx report found that 81% of organizations knowingly deploy vulnerable code to meet delivery deadlines. Not because they don't care about security, but because the process can't keep up with the release cycle.&lt;/p&gt;

&lt;p&gt;AWS Security Agent was built to close that gap.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Pen Test Bottleneck
&lt;/h2&gt;

&lt;p&gt;The bottleneck isn't finding vulnerabilities. It's everything around it.&lt;/p&gt;

&lt;p&gt;Traditional pen testing is a project. You scope it. You negotiate a contract, somewhere between $15,000 and $50,000 per engagement, sometimes six figures for enterprise. You wait for the consultant's calendar to open up. They test for a week or two, constrained by time and budget, making trade-offs about what to test and how deeply. Three weeks later, you get a PDF.&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%2Fqm6pnwx9i7tmpnhgtl37.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%2Fqm6pnwx9i7tmpnhgtl37.png" alt="This is Fine" width="800" height="447"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Your team works to fix the findings. But you rarely have the budget to bring the testers back to validate the fixes. So you hope. The report starts aging the moment it's delivered. New code gets pushed. New endpoints go live.&lt;/p&gt;

&lt;p&gt;It's the difference between a single photograph and a live video feed of your security posture.&lt;/p&gt;

&lt;p&gt;Automated scanners have their own problem though: they don't understand your application. SAST looks at code without runtime context. DAST pokes at a running app without understanding what it's supposed to do. Neither knows your business logic or your security policies. They generate hundreds of findings, most of which are noise, and miss the ones that matter.&lt;/p&gt;




&lt;h2&gt;
  
  
  An Agent That Reads Your Code Before Breaking Your App
&lt;/h2&gt;

&lt;p&gt;AWS Security Agent is an autonomous agent. It reads your design docs, studies your source code, ingests your API specs, and then figures out how to break your application the way a skilled human pen tester would. On demand. Hours instead of weeks.&lt;/p&gt;

&lt;p&gt;What separates it from scanners is that it chains vulnerabilities together. Traditional tools find individual issues in isolation. AWS Security Agent connects them.&lt;/p&gt;

&lt;p&gt;The GA blog post tells a story worth retelling:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;A stored XSS in a comment field. CVSS 6.1, medium severity. Every tool flags it. Nobody prioritizes it.&lt;/li&gt;
&lt;li&gt;That XSS captures an admin's session cookie. No tool detects this step. SAST analyzes code, not sessions. DAST crawls as a standard user. EDR sees valid HTTPS traffic.&lt;/li&gt;
&lt;li&gt;The hijacked admin session accesses &lt;code&gt;/admin/config&lt;/code&gt;, which returns the production database connection string with credentials in plaintext. CVSS 9.8. No other tool discovered it because the code works exactly as designed.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Individually: a medium, an invisible, and a "functioning as intended." Chained together: a full customer data breach. The agent tested each step, proved the full attack works, and elevated the entire sequence to critical.&lt;/p&gt;




&lt;h2&gt;
  
  
  Setting It Up
&lt;/h2&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%2Fdgf6dreutmtt1sh9jehi.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%2Fdgf6dreutmtt1sh9jehi.png" alt="AWS Security Agent Set Up" width="800" height="449"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Setup takes about 30 minutes, one time.&lt;/p&gt;

&lt;p&gt;You start by creating an Agent Space in the AWS Security Agent console. An Agent Space is a container for one application. The first time you create one, AWS spins up the Security Agent Web Application, a separate interface where your team runs reviews and tests.&lt;/p&gt;

&lt;p&gt;For access, you pick between SSO via IAM Identity Center (good for teams) or IAM-only (simpler, no SSO config needed).&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%2Fp17653joywjwtksjd2mc.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%2Fp17653joywjwtksjd2mc.png" alt="User Access" width="800" height="222"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Then you define your security requirements. AWS provides managed ones based on industry standards, but the real value is in custom requirements. "All PII access must have session timeouts under 15 minutes." "Customer-managed KMS keys required for data at rest." You define them once, and they apply across every design review and code review in every Agent Space.&lt;/p&gt;

&lt;p&gt;Connect your GitHub repos by installing the AWS Security Agent GitHub App. That gives the agent source code context for pen testing, automated security review on pull requests, and the ability to open remediation PRs when it finds something.&lt;/p&gt;

&lt;p&gt;Last step: verify your domains. DNS TXT record or HTTP verification file, one time per domain, so the agent knows you own what it's about to test.&lt;/p&gt;




&lt;h2&gt;
  
  
  Running a Pen Test
&lt;/h2&gt;

&lt;p&gt;Open the web app. Select your Agent Space. Create a new penetration test.&lt;/p&gt;

&lt;p&gt;You give it a target URL, public or private via VPC. Authentication credentials for different roles, standard user, admin, service account. Sign-in instructions for complex auth flows like OAuth or SAML (the agent uses LLM-based navigation to handle them). And documentation: API specs, architecture docs, threat models. Context makes the findings better.&lt;/p&gt;

&lt;p&gt;The agent does reconnaissance, enumerates endpoints, builds a custom attack plan, and runs multi-step attack scenarios across 13 risk categories. It adapts based on what it discovers, status codes, error messages, new endpoints, unexpected behaviors.&lt;/p&gt;

&lt;p&gt;Hours later, you have validated findings. A CVSS score. The full attack path, what the agent tried, what payloads it used, how it verified exploitation. Reproduction steps. Impact analysis in business terms ("attackers can modify product prices during checkout"). Code fixes ready to implement.&lt;/p&gt;




&lt;h2&gt;
  
  
  From Finding to Fix
&lt;/h2&gt;

&lt;p&gt;You review a finding. Click "remediate." The agent opens a PR in your GitHub repo with the fix. Your developer reviews and merges. Re-run the pen test to verify. Ship.&lt;/p&gt;

&lt;p&gt;Compare that to the traditional loop: find a vulnerability, write a report, send it to the dev team, wait for a fix, try to get budget for a retest, hope it worked. Months between "found" and "verified."&lt;/p&gt;

&lt;p&gt;The agent compresses that to hours.&lt;/p&gt;




&lt;h2&gt;
  
  
  Cost
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Traditional Pen Test&lt;/th&gt;
&lt;th&gt;AWS Security Agent&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Time to results&lt;/td&gt;
&lt;td&gt;3 to 6 weeks&lt;/td&gt;
&lt;td&gt;Hours&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cost per test&lt;/td&gt;
&lt;td&gt;$15,000 to $50,000+&lt;/td&gt;
&lt;td&gt;~$400 to $2,400&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Frequency&lt;/td&gt;
&lt;td&gt;Annual or quarterly&lt;/td&gt;
&lt;td&gt;On demand&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Remediation validation&lt;/td&gt;
&lt;td&gt;Separate engagement&lt;/td&gt;
&lt;td&gt;Re-run immediately&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Coverage&lt;/td&gt;
&lt;td&gt;Top 3 to 5 critical apps&lt;/td&gt;
&lt;td&gt;Entire portfolio&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Multicloud&lt;/td&gt;
&lt;td&gt;Varies&lt;/td&gt;
&lt;td&gt;AWS, Azure, GCP, on-prem&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;$50 per task-hour, metered per second. An average test runs about 24 task-hours, roughly $1,200. There's a 2-month free trial.&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%2Fndhnpyn9zolewenahpm4.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%2Fndhnpyn9zolewenahpm4.png" alt="Cost Comparison" width="800" height="1433"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Design reviews (up to 200/month) and code reviews (up to 1,000/month) are free.&lt;/p&gt;




&lt;h2&gt;
  
  
  It's Also a Design and Code Review Tool
&lt;/h2&gt;

&lt;p&gt;Pen testing gets the attention, but the other two capabilities change the day-to-day workflow more.&lt;/p&gt;

&lt;p&gt;Design review catches security issues before code is written. Upload your architecture doc, and the agent checks it against your organizational requirements. "Your design doesn't specify network segmentation between the payment processing layer and the user-facing tier." Flagged before sprint planning, not after the incident.&lt;/p&gt;

&lt;p&gt;Code review runs on every pull request. If your org requires 90-day log retention and a developer configures 365 days, the agent comments on the PR. Traditional tools miss this because the code is technically correct. The agent catches it because it knows your rules. It also checks for OWASP Top 10 vulnerabilities alongside your custom policies.&lt;/p&gt;




&lt;h2&gt;
  
  
  What It Won't Do
&lt;/h2&gt;

&lt;p&gt;GitHub only for code review integration. No GitLab, Bitbucket, or CodeCommit.&lt;/p&gt;

&lt;p&gt;Web apps and APIs only. Not your mobile app binary or IoT firmware.&lt;/p&gt;

&lt;p&gt;It's an agent, not a security program. You still need threat modeling, incident response, and the rest.&lt;/p&gt;

&lt;p&gt;Available in 6 AWS regions: us-east-1, us-west-2, eu-west-1, eu-central-1, ap-southeast-2, ap-northeast-1.&lt;/p&gt;




&lt;h2&gt;
  
  
  Where This Leaves Us
&lt;/h2&gt;

&lt;p&gt;The security industry has spent a decade telling developers to "shift left." The problem was never willingness. It was tooling. You can't shift left with a 6-week engagement, a $30K budget, and a PDF that's outdated before the ink dries.&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%2Fnpmcnqi0ix9y8rnb20rl.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%2Fnpmcnqi0ix9y8rnb20rl.png" alt="Surprise Pikachu" width="800" height="436"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;AWS Security Agent makes pen testing something you can run on a Tuesday afternoon and act on by Wednesday morning. Whether that replaces the annual engagement entirely or just fills the gaps between them depends on your org. But the gap between "how fast we ship" and "how fast we test" just got a lot smaller.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://console.aws.amazon.com/securityagent/" rel="noopener noreferrer"&gt;AWS Security Agent Console&lt;/a&gt; | &lt;a href="https://docs.aws.amazon.com/securityagent/latest/userguide/what-is.html" rel="noopener noreferrer"&gt;Documentation&lt;/a&gt; | &lt;a href="https://aws.amazon.com/security-agent/pricing/" rel="noopener noreferrer"&gt;Pricing&lt;/a&gt;&lt;/p&gt;

</description>
      <category>aws</category>
      <category>security</category>
      <category>ai</category>
    </item>
    <item>
      <title>Google Uses the Same AI Stack It Sells You. That's Either Brilliant or a Problem.</title>
      <dc:creator>Mwanza Simi</dc:creator>
      <pubDate>Wed, 29 Apr 2026 14:09:20 +0000</pubDate>
      <link>https://dev.to/simimwanza/google-uses-the-same-ai-stack-it-sells-you-thats-either-brilliant-or-a-problem-1bjm</link>
      <guid>https://dev.to/simimwanza/google-uses-the-same-ai-stack-it-sells-you-thats-either-brilliant-or-a-problem-1bjm</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/google-cloud-next-2026-04-22"&gt;Google Cloud NEXT Writing Challenge&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Sundar Pichai dropped a line during the NEXT '26 opening keynote that most people scrolled past. "A big focus of ours is to always be customer zero for our own technologies." The same unified stack that powers Search, YouTube, Chrome, and Android is the one Google is selling to enterprises.&lt;/p&gt;

&lt;p&gt;A wild claim if you stop and think about it. Google isn't just building cloud tools and hoping customers find them useful. They're running Search and YouTube on the same infrastructure they're asking you to bet your business on.&lt;/p&gt;

&lt;p&gt;Nobody else does this across so many different workloads.&lt;/p&gt;

&lt;h2&gt;
  
  
  What "Customer Zero" actually means
&lt;/h2&gt;

&lt;p&gt;AWS runs Amazon's retail operations. Microsoft runs Office 365 on Azure. Both are serious dogfooding. But Google's internal usage spans a wider range of problems: search ranking, video streaming, email spam filtering, mobile OS services, browser infrastructure. Search alone processes around 8.5 billion queries a day. YouTube serves over a billion hours of video daily. These aren't side projects, they're stress tests across fundamentally different workload types that no single enterprise customer could replicate.&lt;/p&gt;

&lt;p&gt;When Google ships a new TPU generation or updates Gemini, they're not testing it on a staging environment and hoping for the best. They've already run it against Search ranking and YouTube recommendations before it ever reaches your console.&lt;/p&gt;

&lt;p&gt;That's the pitch, anyway.&lt;/p&gt;

&lt;h2&gt;
  
  
  The part Google doesn't talk about
&lt;/h2&gt;

&lt;p&gt;Being customer zero cuts both ways. If Google is the biggest user of its own stack, the stack gets optimized for Google's problems. Search needs low-latency inference at planetary scale. YouTube needs massive throughput for video processing. These are specific, unusual workloads.&lt;/p&gt;

&lt;p&gt;Your workload probably looks nothing like that. You might need steady, predictable performance for a few thousand concurrent users, not burst capacity for billions. You might care more about cost predictability than raw throughput. The features that get prioritized and the edge cases that get fixed first follow Google's internal needs before they follow yours.&lt;/p&gt;

&lt;p&gt;This isn't hypothetical. In 2022, Google announced it was killing Cloud IoT Core, giving enterprises about a year to migrate their IoT workloads somewhere else. The service launched in 2017, never got the investment it needed, and got axed because it didn't align with where Google was heading. If Google doesn't use a product internally, it's always at risk. killedbygoogle.com exists for a reason, and enterprise customers know it. The "customer zero" pitch is partly Google trying to counter that reputation. If they run it themselves, they won't kill it. Probably.&lt;/p&gt;

&lt;p&gt;There's a resource question too. Google announced eighth-generation TPUs at NEXT, with the TPU 8t scaling to 9,600 chips. But when demand spikes and capacity gets tight, who gets priority, YouTube or your production cluster? Google says over half their ML compute investment goes to the Cloud business. That still leaves a lot going to internal products that compete for the same silicon.&lt;/p&gt;

&lt;h2&gt;
  
  
  The 75% number makes this more interesting
&lt;/h2&gt;

&lt;p&gt;Pichai also mentioned that 75% of all new code at Google is now AI-generated and approved by engineers. Up from 25% in October 2024, then 50% by fall 2025. Google is using its own AI tools to build its own products at a pace that's hard to comprehend.&lt;/p&gt;

&lt;p&gt;This is where the customer zero argument gets compelling. If Gemini is writing three-quarters of the code that runs Search and YouTube, and those products are still working at scale, that's a stronger endorsement than any case study. Forget "Company X saved 30% on deployment time." Google rebuilt how they write software and the products you use every day didn't break.&lt;/p&gt;

&lt;p&gt;But it also means Google's AI tools are being shaped by how Google writes software and the patterns in their codebase. Whether those tools work as well for a 50-person startup or a bank with legacy Java everywhere, nobody's shown that yet.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this matters more than the feature announcements
&lt;/h2&gt;

&lt;p&gt;NEXT '26 had plenty of product launches. The Gemini Enterprise Agent Platform got the most attention, but there was also the Agentic Data Cloud and new security offerings with Wiz. All worth paying attention to. But the customer zero framing is the thing that ties them together and the thing that separates Google's pitch from everyone else's.&lt;/p&gt;

&lt;p&gt;AWS says "we have the most services." Azure says "we integrate with your existing Microsoft stack." Google is saying something different: "we use this stuff to run the biggest internet products on the planet, and now you can use it too."&lt;/p&gt;

&lt;p&gt;That's a strong argument. It's also a bet. You're betting that what works for Google's scale and Google's problems will translate to yours. For some workloads, especially anything involving large-scale AI inference, that bet probably pays off. Google has been doing this longer than anyone. For others, you might find yourself paying for optimization you don't need while the features you actually want sit lower on the roadmap.&lt;/p&gt;

&lt;h2&gt;
  
  
  The honest take
&lt;/h2&gt;

&lt;p&gt;Google being customer zero is probably a net positive for most enterprises adopting their AI stack. Battle-tested infrastructure is better than theoretical infrastructure. The Gemini models being forged against products that billions of people use daily is a real advantage.&lt;/p&gt;

&lt;p&gt;But "customer zero" also means "customer with the most influence over the product roadmap." And that customer's needs aren't your needs. The question isn't whether Google's stack is good. It obviously is. The question is whether being second in line behind the world's largest internet company is a comfortable place to build your business.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>cloudnextchallenge</category>
      <category>googlecloud</category>
    </item>
    <item>
      <title>Building Reverse Engineering Reality with Google Gemini</title>
      <dc:creator>Mwanza Simi</dc:creator>
      <pubDate>Wed, 04 Mar 2026 10:40:30 +0000</pubDate>
      <link>https://dev.to/simimwanza/building-reverse-engineering-reality-with-google-gemini-4mhc</link>
      <guid>https://dev.to/simimwanza/building-reverse-engineering-reality-with-google-gemini-4mhc</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/mlh/built-with-google-gemini-02-25-26"&gt;Built with Google Gemini: Writing Challenge&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Built with Google Gemini
&lt;/h2&gt;

&lt;p&gt;I built an app called "Reverse Engineering Reality." You upload a photo of any everyday object, and it gives you detailed instructions for assembling or disassembling it. The instructions are fictional but surprisingly detailed complete with materials, tools, step-by-step guides, and custom illustrations for each step.&lt;/p&gt;

&lt;p&gt;The idea came from that moment when you look at something and wonder how it's made. Instead of just wondering, you get an actual blueprint. It's part educational, part creative experiment. You can take a photo of your coffee maker or a lamp and get a full breakdown of how you'd theoretically build it from scratch.&lt;/p&gt;

&lt;p&gt;I used gemini-2.5-flash for the core analysis and text generation, and imagen-4.0-generate-001 for creating the step illustrations. The app analyses your photo, identifies objects in it, lets you pick which one you want instructions for, then generates everything. After that, there's a chat assistant that knows about the blueprint you just created, so you can ask followup questions.&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%2F01x2222jgddd9uf3wfag.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%2F01x2222jgddd9uf3wfag.png" alt="Phone Disassembly"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The structured output feature was critical here. I defined a JSON schema that tells Gemini exactly what format I need, object name, materials list, tools, numbered steps, image prompts for each step. Without that, I'd be parsing unstructured text and hoping for consistency. With it, I get clean, predictable data every time.&lt;/p&gt;

&lt;p&gt;For the illustrations, each step includes a text prompt that gets sent to Imagen. So the AI analyzes your photo, writes instructions, writes prompts for diagrams, then generates those diagrams. It's a full multimodal pipeline image to text to image.&lt;/p&gt;

&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;Here is the embedded app you can play with: &lt;/p&gt;

&lt;p&gt;

&lt;/p&gt;
&lt;div class="ltag__cloud-run"&gt;
  &lt;iframe height="600px" src="https://reverse-engineering-reality-763008050719.us-west1.run.app/"&gt;
  &lt;/iframe&gt;
&lt;/div&gt;




&lt;h2&gt;
  
  
  What I Learned
&lt;/h2&gt;

&lt;p&gt;Structured outputs changed how I think about building with AI. Instead of treating the model like a black box that returns text you have to wrangle, you can define exactly what you need and get it reliably. That makes the difference between a demo and something you can actually build a UI around.&lt;/p&gt;

&lt;p&gt;I also learned that chaining models works better than I expected. Using one model for understanding and another for generation gave me more control over each part of the process. The chat feature was straightforward to add once the main pipeline worked just pass the generated instructions as context and let users ask questions about them.&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%2F1ldf4sro5sc4uy45v1zv.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%2F1ldf4sro5sc4uy45v1zv.png" alt="Steps"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The biggest surprise was how good the generated illustrations turned out. I wasn't sure if Imagen could handle technical diagram style images from text prompts, but it consistently produced clear, relevant visuals that actually help explain the steps.&lt;/p&gt;

&lt;h2&gt;
  
  
  Google Gemini Feedback
&lt;/h2&gt;

&lt;p&gt;The structured output feature worked great. No complaints there it did exactly what I needed and made the whole project possible.&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%2Fitx1tdw6wu5tp1ss7ds9.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%2Fitx1tdw6wu5tp1ss7ds9.png" alt="Items"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The multimodal capabilities were solid. Image understanding was accurate enough for object detection and analysis, and the integration between models felt smooth. I didn't have to do much work to get them talking to each other.&lt;/p&gt;

&lt;p&gt;The main friction was prompt tuning. Getting the right balance between creative and practical in the instructions took some iteration. Too vague and the steps weren't useful, too rigid and they felt robotic. System instructions helped, but it still took testing to find the sweet spot. AI Studio made that easier since I could experiment with prompts before writing code.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>geminireflections</category>
      <category>gemini</category>
    </item>
    <item>
      <title>Reverse Engineering Reality with Google AI</title>
      <dc:creator>Mwanza Simi</dc:creator>
      <pubDate>Sun, 14 Sep 2025 16:14:26 +0000</pubDate>
      <link>https://dev.to/simimwanza/reverse-engineering-reality-with-google-ai-36nm</link>
      <guid>https://dev.to/simimwanza/reverse-engineering-reality-with-google-ai-36nm</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/google-ai-studio-2025-09-03"&gt;Google AI Studio Multimodal Challenge&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;I've created an application called "Reverse Engineering Reality." It's a creative tool that allows users to upload a photo of any everyday object and, using the power of AI, receive a detailed, imaginative set of instructions for either assembling it from scratch or disassembling it.&lt;/p&gt;

&lt;p&gt;The app solves the problem of curiosity and creativity. It transforms a passive observation of an object ("I wonder how that's made?") into an active, engaging, and educational experience. It provides users with a fictional "blueprint" for the world around them, complete with materials, tools, step-by-step guides, and custom illustrations, fostering a deeper appreciation for design and engineering.&lt;/p&gt;

&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://reverse-engineering-reality-763008050719.us-west1.run.app/" rel="noopener noreferrer"&gt;Try Out the applet here on a deployed cloudrun instance&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/xX83_dzi3ps"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  How I Used Google AI Studio
&lt;/h2&gt;

&lt;p&gt;This app is built directly on the Gemini API, the same technology that powers Google AI Studio. The development process mirrors the iterative prompting and schema design one would perform in the Studio.&lt;/p&gt;

&lt;p&gt;Here's how I leveraged its capabilities:&lt;/p&gt;

&lt;p&gt;Model Selection: I primarily use gemini-2.5-flash for its speed and powerful reasoning capabilities, which are perfect for analyzing images, generating structured text, and powering the chat assistant. For image generation, I use imagen-4.0-generate-001.&lt;/p&gt;

&lt;p&gt;Structured Output (JSON Mode): This is a critical feature. I provide the Gemini model with a strict JSON schema to ensure the output for the instructions (object name, materials, tools, steps, etc.) and object detection (bounding boxes) is predictable and machine-readable. This allows me to easily parse the AI's response and render it into a structured, user-friendly interface without complex string manipulation.&lt;/p&gt;

&lt;p&gt;System Instructions: I use system instructions to set the context for the AI. For instruction generation, the AI is prompted to act as an "expert reverse engineer and master craftsman." For the chat feature, it's prompted to be a helpful "AI Assembly Assistant," ensuring its responses are focused on the provided blueprint.&lt;/p&gt;

&lt;p&gt;Chat Functionality: The app uses the Gemini API's chat capabilities (ai.chats.create) to create a conversational assistant that has memory of the generated instructions, allowing users to ask follow-up questions in a natural way.&lt;/p&gt;

&lt;h2&gt;
  
  
  Multimodal Features
&lt;/h2&gt;

&lt;p&gt;The app is fundamentally multimodal, combining image and text inputs and outputs to create a rich, interactive experience.&lt;/p&gt;

&lt;p&gt;Image-to-Text (Core Analysis): The primary multimodal feature is the app's ability to understand an image uploaded by the user. It takes visual data (a photo of an object) and outputs structured text (a JSON object containing the full assembly/disassembly blueprint). This demonstrates a deep visual reasoning capability.&lt;/p&gt;

&lt;p&gt;Object Detection from Image: Before generating instructions, the app first analyzes the image to identify and locate distinct objects, returning their names and bounding box coordinates. This is another form of image-to-text functionality that enhances user control by allowing them to select the specific object of interest.&lt;/p&gt;

&lt;p&gt;Text-to-Image (Illustrations): To make the instructions more intuitive and engaging, the app uses a powerful text-to-image workflow. For each step in the generated blueprint, the AI also creates a descriptive imagePrompt (text). This text is then fed to the imagen-4.0-generate-001 model to generate a custom, diagram-style illustration for that specific step. This combination—analyzing an image to produce text, then using that text to create a new image—is a sophisticated multimodal pipeline that greatly enhances the final product.&lt;/p&gt;

&lt;p&gt;Together, these features allow a user to seamlessly translate a real-world object into a fully illustrated, interactive digital guide.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>googleaichallenge</category>
      <category>ai</category>
      <category>gemini</category>
    </item>
    <item>
      <title>"Kiro" Why This Name Perfectly Captures the AI Development Crossroads</title>
      <dc:creator>Mwanza Simi</dc:creator>
      <pubDate>Tue, 15 Jul 2025 22:08:22 +0000</pubDate>
      <link>https://dev.to/kirodotdev/the-kiro-meaning-why-this-name-perfectly-captures-the-ai-development-crossroads-4i5o</link>
      <guid>https://dev.to/kirodotdev/the-kiro-meaning-why-this-name-perfectly-captures-the-ai-development-crossroads-4i5o</guid>
      <description>&lt;p&gt;When AWS unveiled Kiro, its new AI-powered IDE, many developers likely honed in on its main features of it being an AI co-pilot, for spec driven development, and agent hooks. But have you ever wondered about the meaning behind the name itself? "Kiro" holds a deep significance, particularly in Japanese, that beautifully captures where AI stands in software development right now.&lt;/p&gt;

&lt;h3&gt;
  
  
  Diving into "Kiro"
&lt;/h3&gt;

&lt;p&gt;In Japanese, "Kiro" translates to "circuit," "pathway," or "route." This might seem simple, but it carries powerful symbolism when you think about a groundbreaking AI development environment.&lt;/p&gt;

&lt;p&gt;Consider this, Circuits are the core of computing. They're where logic unfolds, where inputs transform into outputs, and where intelligence takes shape physically. As an AI IDE its building and refining these digital circuits.&lt;/p&gt;

&lt;p&gt;Then there are pathways and routes. These words speak to direction, a journey, and progress. In development, we're always navigating tricky problems, searching for the most efficient way to a solution, and creating paths for data and how users interact with our software. It aims to light up these pathways, guiding developers and even charting new ones on its own, getting from a raw idea to a finished product, while helping you pave that very clear route.&lt;/p&gt;

&lt;h3&gt;
  
  
  At the Crossroads, Where Human Ingenuity Meets AI Automation
&lt;/h3&gt;

&lt;p&gt;The elegance of the name truly shines when we look at the current landscape of software development. For a long time, many AI coding assistants have focused on completing small code snippets or suggesting individual lines. This often led to what some call "vibe coding," where the big picture, the overall architecture, or the original intent could easily get lost, by emphasizing files like requirements.md and design.md, encourages a more structured approach. It's steering developers onto a clearer "pathway" instead of just helping them wander aimlessly.&lt;/p&gt;

&lt;p&gt;Think of it like a well designed circuit taking your high level goals as inputs and processes them. But you, the developer, remain the architect and the ultimate controller. You lay out the "circuit board," and getting the help to wire it up efficiently. The name subtly reinforces this collaboration, the intricate dance between human creativity and AI execution within a defined system.&lt;/p&gt;

&lt;p&gt;Modern cloud applications are incredibly intricate, with distributed systems, microservices, and vast AWS ecosystems, with a "route" through this complexity, breaking down intimidating tasks into manageable "circuits" of work, from generating code to writing tests and documentation. It's like having a map and a compass for your cloud native journey.&lt;/p&gt;

&lt;h3&gt;
  
  
  Precision, Connection, and Evolution
&lt;/h3&gt;

&lt;p&gt;Beyond its primary meaning, the concept of a "circuit" in Japanese also brings to mind the Precision as  circuits are designed with incredible care, every single connection matters. Aiming for this exact level of precision. Producing structured designs, thorough tests, and up-to-date documentation that are all interconnected and spot on.&lt;/p&gt;

&lt;p&gt;Connection of a circuit is essentially a network of linked components. With a true understanding these connections, within your codebase, between your services, and even between your big-picture ideas and the nitty-gritty implementation details. It fosters a more connected and complete development process.&lt;/p&gt;

&lt;p&gt;Evolution of  circuits themselves have evolved with new technologies like old vacuum tubes to tiny microchips, software development is constantly changing. Representing the next big leap in developer tools, adapting to new ways of thinking and pushing the boundaries of what you can achieve with AI.&lt;/p&gt;

&lt;p&gt;The name Kiro is a fantastic choice and a statement of purpose, guiding you through the intricate circuits of code and along the clearest paths to innovation.&lt;/p&gt;

&lt;p&gt;What are your initial thoughts, and how do you imagine it will shape the way you approach your development projects?&lt;/p&gt;

</description>
      <category>ai</category>
      <category>aws</category>
      <category>genai</category>
      <category>kiro</category>
    </item>
    <item>
      <title>AWS GuardDuty vs. Inspector vs. Shield, What’s the Difference?</title>
      <dc:creator>Mwanza Simi</dc:creator>
      <pubDate>Sun, 09 Mar 2025 21:56:17 +0000</pubDate>
      <link>https://dev.to/simimwanza/aws-guardduty-vs-inspector-vs-shield-whats-the-difference-15id</link>
      <guid>https://dev.to/simimwanza/aws-guardduty-vs-inspector-vs-shield-whats-the-difference-15id</guid>
      <description>&lt;p&gt;Securing your AWS environment can feel daunting as there are so many tools out there, and it’s not always clear which one does what. Take AWS GuardDuty, Inspector, and Shield, for example. At first glance, they might seem like they’re all doing the same thing of keeping your cloud safe. But dig a little deeper, and you’ll see they each have their own power. So, how do you know which one to use, What makes GuardDuty different from Inspector, and when does Shield come into play?&lt;/p&gt;

&lt;h2&gt;
  
  
  Your Cloud Detective,AWS GuardDuty
&lt;/h2&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%2F6w1q6gnrylj5dk38kvoq.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%2F6w1q6gnrylj5dk38kvoq.png" alt="Free detective searching man vector" width="800" height="807"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Think of AWS GuardDuty as a detective that’s always on the lookout for suspicious activity. It’s a threat detection service that continuously monitors your AWS environment for signs of trouble. it uses machine learning and analyzes data from various sources, like AWS CloudTrail logs, VPC Flow Logs, and DNS logs, to spot unusual behavior.&lt;/p&gt;

&lt;p&gt;For example, if someone tries to log in to your account from a strange location or if an EC2 instance starts communicating with a known malicious IP address, it will flag it. It’s like having a security guard who’s always watching and ready to raise the alarm.&lt;/p&gt;

&lt;p&gt;If you want to detect potential threats in real time, like unauthorized access, compromised instances, or suspicious network activity, GuardDuty is your tool.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Vulnerability Scanner, AWS Inspector
&lt;/h2&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%2Fiki4gtnt4exmdw0n5v0p.jpg" 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%2Fiki4gtnt4exmdw0n5v0p.jpg" alt="Inspections and Observations: Tech Improvements | SafetyStratus" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;AWS Inspector is designed to find vulnerabilities in your applications and infrastructure. It automatically assesses your resources, such as EC2 instances, and checks for common security issues, like open ports, missing patches, or misconfigurations.&lt;/p&gt;

&lt;p&gt;By running automated security assessments, it provides a detailed report with recommendations on how to fix the issues it finds. It’s not a real time like GuardDuty but a more of a periodic check-up to make sure everything is secure.&lt;/p&gt;

&lt;p&gt;If you’re looking to identify and fix vulnerabilities in your applications or infrastructure, Inspector is the right choice. It’s especially useful before deploying new applications or after making significant changes to your environment. Think of it as a way to ensure your systems are secure before they go live.&lt;/p&gt;

&lt;h2&gt;
  
  
  Your DDoS Bodyguard, AWS Shield
&lt;/h2&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%2Fencrypted-tbn0.gstatic.com%2Fimages%3Fq%3Dtbn%3AANd9GcSpfyit0PVg5x4ijdF6_Z8VblnC2XmBMp8dJw%26s" 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%2Fencrypted-tbn0.gstatic.com%2Fimages%3Fq%3Dtbn%3AANd9GcSpfyit0PVg5x4ijdF6_Z8VblnC2XmBMp8dJw%26s" alt="Mr Bodyguard | ID#: 353 | Funny Emoticons" width="225" height="225"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;AWS Shield is all about protecting your applications from Distributed Denial of Service (DDoS) attacks. These attacks can overwhelm your systems with traffic, making them unavailable to legitimate users. Shield comes in two versions: Standard and Advanced.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Shield Standard&lt;/strong&gt; is automatically included with all AWS accounts and provides basic protection against common DDoS attacks.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Shield Advanced&lt;/strong&gt; is a paid service that offers enhanced protection, including 24/7 access to the AWS DDoS Response Team, detailed attack reports, and financial protection against scaling costs during an attack.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you’re running applications that need to be highly available and you’re concerned about DDoS attacks, Shield is a must. Shield Advanced is ideal for businesses that need extra protection and support, especially if they’re running critical workloads.&lt;/p&gt;

&lt;h2&gt;
  
  
  How They Work Together
&lt;/h2&gt;

&lt;p&gt;While they all serve different purposes, they can work together to provide a comprehensive security strategy. Here’s how:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;GuardDuty&lt;/strong&gt; monitors for threats in real time, helping you detect and respond to suspicious activity.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Inspector&lt;/strong&gt; identifies vulnerabilities in your applications and infrastructure, giving you a chance to fix them before they’re exploited.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Shield&lt;/strong&gt; protects your applications from DDoS attacks, ensuring they stay online and available.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For example, Inspector might find an open port on one of your EC2 instances. You close the port, but GuardDuty later detects unusual traffic from that instance, indicating a potential compromise. Meanwhile, Shield is protecting your application from being taken offline by a DDoS attack. Together, these tools create a layered defense that keeps your AWS environment secure.&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%2Fencrypted-tbn0.gstatic.com%2Fimages%3Fq%3Dtbn%3AANd9GcSDDQYzjHsCY3ZS7VPJSkPwm_tNjpCsd3yg4A%26s" 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%2Fencrypted-tbn0.gstatic.com%2Fimages%3Fq%3Dtbn%3AANd9GcSDDQYzjHsCY3ZS7VPJSkPwm_tNjpCsd3yg4A%26s" alt="9 Really Funny Cartoons on Cloud" width="233" height="216"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>aws</category>
      <category>cloud</category>
      <category>security</category>
    </item>
    <item>
      <title>Deploying a simple HTML on Nginx using AWS</title>
      <dc:creator>Mwanza Simi</dc:creator>
      <pubDate>Wed, 29 Jan 2025 17:19:19 +0000</pubDate>
      <link>https://dev.to/simimwanza/deploying-a-simple-html-on-nginx-using-aws-21ao</link>
      <guid>https://dev.to/simimwanza/deploying-a-simple-html-on-nginx-using-aws-21ao</guid>
      <description>&lt;p&gt;This blog post documents my experience setting up a web server using Nginx, from spinning up an EC2 instance to configuring the server to serve a custom HTML page. It details the process, the challenges I faced, and the valuable lessons I learned.&lt;/p&gt;

&lt;h2&gt;
  
  
  EC2 and Nginx Installation:
&lt;/h2&gt;

&lt;p&gt;I began by launching an Amazon EC2 instance. I chose an Amazon Linux 2 AMI, as it's a stable and readily available option.  I selected a t2.micro instance for this simple setup, as it fits within the free tier.  Once the instance was running, I connected to it via SSH.&lt;/p&gt;

&lt;p&gt;The next step was installing Nginx.  Since I was using Amazon Linux 2, I used the yum package manager:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo yum update -y  
sudo yum install nginx -y 
sudo systemctl start nginx 
sudo systemctl enable nginx 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After installation, I verified that Nginx was running by accessing the instance's public IP address in my browser. The default Nginx welcome page confirmed a successful installation.&lt;/p&gt;

&lt;h2&gt;
  
  
  Creating the Custom Web Page:
&lt;/h2&gt;

&lt;p&gt;With Nginx up and running, it was time to create the custom HTML page. I created a directory to hold my website's files:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo mkdir -p /var/www/html
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then, I created the index.html file within this directory:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo nano /var/www/html/index.html
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Inside index.html, I added the following content, my name:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
    &amp;lt;title&amp;gt;Welcome&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
    &amp;lt;h1&amp;gt;Welcome to DevOps Stage 0 - [Your Name]/[SlackName]&amp;lt;/h1&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Challenges and Learning Opportunities:
&lt;/h2&gt;

&lt;p&gt;While the process was relatively straightforward, I encountered a challenge&lt;/p&gt;

&lt;p&gt;Firewall Configuration: Initially, I couldn't access my webpage even after Nginx was running.  I realized that the EC2 instance's security group (firewall) wasn't configured to allow inbound traffic on port 80 (HTTP).  This taught me the importance of properly configuring security groups to allow access to the necessary ports.  I learned how to add a rule to the security group to open port 80.&lt;/p&gt;

&lt;p&gt;Setting up a web server with Nginx on EC2 was a valuable learning experience.  I gained practical knowledge of EC2 instances, Nginx installation, and basic web server configuration.  The challenges I faced reinforced the importance of understanding these fundamental concepts. I am excited to continue exploring more advanced DevOps tools and skills.&lt;/p&gt;

&lt;p&gt;For more check out HNG internship, They offer resources for hiring various tech experts, including:&lt;/p&gt;

&lt;p&gt;DevOps Engineers: &lt;a href="https://hng.tech/hire/devops-engineers" rel="noopener noreferrer"&gt;https://hng.tech/hire/devops-engineers&lt;/a&gt;&lt;br&gt;
Cloud Engineers: &lt;a href="https://hng.tech/hire/cloud-engineers" rel="noopener noreferrer"&gt;https://hng.tech/hire/cloud-engineers&lt;/a&gt;&lt;br&gt;
Site Reliability Engineers: &lt;a href="https://hng.tech/hire/site-reliability-engineers" rel="noopener noreferrer"&gt;https://hng.tech/hire/site-reliability-engineers&lt;/a&gt;&lt;br&gt;
Platform Engineers: &lt;a href="https://hng.tech/hire/platform-engineers" rel="noopener noreferrer"&gt;https://hng.tech/hire/platform-engineers&lt;/a&gt;&lt;br&gt;
Infrastructure Engineers: &lt;a href="https://hng.tech/hire/infrastructure-engineers" rel="noopener noreferrer"&gt;https://hng.tech/hire/infrastructure-engineers&lt;/a&gt;&lt;br&gt;
Kubernetes Specialists: &lt;a href="https://hng.tech/hire/kubernetes-specialists" rel="noopener noreferrer"&gt;https://hng.tech/hire/kubernetes-specialists&lt;/a&gt;&lt;br&gt;
AWS Solutions Architects: &lt;a href="https://hng.tech/hire/aws-solutions-architects" rel="noopener noreferrer"&gt;https://hng.tech/hire/aws-solutions-architects&lt;/a&gt;&lt;br&gt;
Azure DevOps Engineers: &lt;a href="https://hng.tech/hire/azure-devops-engineers" rel="noopener noreferrer"&gt;https://hng.tech/hire/azure-devops-engineers&lt;/a&gt;&lt;br&gt;
Google Cloud Engineers: &lt;a href="https://hng.tech/hire/google-cloud-engineers" rel="noopener noreferrer"&gt;https://hng.tech/hire/google-cloud-engineers&lt;/a&gt;&lt;br&gt;
CI/CD Pipeline Engineers: &lt;a href="https://hng.tech/hire/ci-cd-pipeline-engineers" rel="noopener noreferrer"&gt;https://hng.tech/hire/ci-cd-pipeline-engineers&lt;/a&gt;&lt;br&gt;
Monitoring/Observability Engineers: &lt;a href="https://hng.tech/hire/monitoring-observability-engineers" rel="noopener noreferrer"&gt;https://hng.tech/hire/monitoring-observability-engineers&lt;/a&gt;&lt;br&gt;
Automation Engineers: &lt;a href="https://hng.tech/hire/automation-engineers" rel="noopener noreferrer"&gt;https://hng.tech/hire/automation-engineers&lt;/a&gt;&lt;br&gt;
Docker Specialists: &lt;a href="https://hng.tech/hire/docker-specialists" rel="noopener noreferrer"&gt;https://hng.tech/hire/docker-specialists&lt;/a&gt;&lt;br&gt;
Linux Developers: &lt;a href="https://hng.tech/hire/linux-developers" rel="noopener noreferrer"&gt;https://hng.tech/hire/linux-developers&lt;/a&gt;&lt;br&gt;
PostgreSQL Developers: &lt;a href="https://hng.tech/hire/postgresql-developers" rel="noopener noreferrer"&gt;https://hng.tech/hire/postgresql-developers&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
    </item>
    <item>
      <title>Amazon S3 Just Gave Us a Million Reasons to Smile</title>
      <dc:creator>Mwanza Simi</dc:creator>
      <pubDate>Sun, 26 Jan 2025 18:29:13 +0000</pubDate>
      <link>https://dev.to/simimwanza/amazon-s3-just-gave-us-a-million-reasons-to-smile-50l</link>
      <guid>https://dev.to/simimwanza/amazon-s3-just-gave-us-a-million-reasons-to-smile-50l</guid>
      <description>&lt;p&gt;Big news for anyone who uses Amazon S3, you can now create &lt;strong&gt;up to 1 million buckets&lt;/strong&gt; in your AWS account. That’s right, what used to be a limit of 100 buckets has now been bumped to &lt;strong&gt;10,000 by default&lt;/strong&gt;, and if you need more, you can request up to a million. Whether you’re a small business or a huge enterprise, this change is a big deal. Let’s break it down in simple terms and see how it can make your life easier.&lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;What’s Changed?&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Before this update, AWS accounts were limited to &lt;strong&gt;100 buckets&lt;/strong&gt; by default. Now, that number has jumped to &lt;strong&gt;10,000 buckets automatically&lt;/strong&gt;, and you can request to go all the way up to &lt;strong&gt;1 million buckets&lt;/strong&gt; if you need to. The best part? Your first &lt;strong&gt;2,000 buckets are free&lt;/strong&gt;. After that, there’s a small monthly fee, but it’s a small price to pay for the flexibility this brings.&lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;Why Should You Care?&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;More buckets mean more ways to organize, secure, and manage your data. Here’s why this matters:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Better Organization&lt;/strong&gt;: Instead of dumping everything into a few buckets, you can now create separate buckets for different projects, clients, or types of data. Think of it like having more drawers in a filing cabinet, it just makes life easier.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Stronger Security&lt;/strong&gt;: With more buckets, you can apply specific security settings to each one. For example, you can enable encryption for sensitive data or set strict access controls for confidential files.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Easier Backups and Replication&lt;/strong&gt;: Need to back up data or replicate it across regions? More buckets let you do this more efficiently, without mixing things up.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scalability&lt;/strong&gt;: Whether you’re a startup or a big company, this update ensures your storage can grow with your needs.&lt;/li&gt;
&lt;/ol&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;Fun and Practical Ways to Use More Buckets&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Here are some everyday scenarios where having more buckets can make a real difference:&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;1. Keep Your Data Neat and Tidy&lt;/strong&gt;
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;A marketing team can create a bucket for each client’s campaigns. No more digging through one giant bucket to find what you need. It’s like having a labeled folder for everything, saves time and reduces stress.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;2. Stay Compliant Without the Headache&lt;/strong&gt;
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;A healthcare company can use separate buckets for patient records, billing data, and general files. Each bucket can have its own security settings to meet compliance rules.Makes audits easier and keeps sensitive data safe.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;3. Backups Made Simple&lt;/strong&gt;
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;A tech team can create a bucket for each day’s database backups. If something goes wrong, finding the right backup is a breeze. No more scrambling to find the right file in a sea of backups.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;4. Boost Your Machine Learning Projects&lt;/strong&gt;
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;A data science team can use separate buckets for raw data, cleaned data, and finished models. This keeps everything organized and easy to access.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;5. Run a Multi-Tenant App Like a Pro&lt;/strong&gt;
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;A SaaS company can create a bucket for each customer. This keeps their data separate and secure. Customers get better security, and you get happier users.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;6. Track Events and Logs Effortlessly&lt;/strong&gt;
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;A gaming company can create a bucket for each game session, storing logs and player data separately. Troubleshooting and analysis now is way easier.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;7. Save Money on Storage&lt;/strong&gt;
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;A media company can use different buckets for active files (like videos being edited) and archived files (like old projects). Each bucket can use the most cost-effective storage option. Keeps costs down without sacrificing performance.&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;How to Get Started&lt;/strong&gt;
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Check Your Account&lt;/strong&gt;: The new default of 10,000 buckets is already applied to your AWS account. No need to do anything.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Request More if Needed&lt;/strong&gt;: If you need more than 10,000 buckets, just request a quota increase through the &lt;strong&gt;Service Quotas&lt;/strong&gt; console. You can go up to 1 million buckets.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Start Creating Buckets&lt;/strong&gt;: Your first 2,000 buckets are free. After that, there’s a small monthly fee, but it’s worth it for the flexibility.&lt;/li&gt;
&lt;/ol&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;Tips for Naming Your Buckets&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;With so many buckets, it’s important to stay organized. Here’s how:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use clear, consistent names (e.g., &lt;code&gt;project-name-data-type-region&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Add tags like &lt;code&gt;dev&lt;/code&gt; or &lt;code&gt;prod&lt;/code&gt; to show the environment.&lt;/li&gt;
&lt;li&gt;Avoid using sensitive info in bucket names (e.g., customer names or account numbers).&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;Why This Update Rocks&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;This change is all about giving you more freedom and flexibility. Whether you’re a solo developer or part of a huge team, having more buckets means you can work smarter, not harder. It’s like upgrading from a tiny closet to a walk-in wardrobe, you’ll wonder how you ever managed before.&lt;/p&gt;




&lt;p&gt;What’s the first thing you’ll do with your new buckets? Let me know in the comments&lt;/p&gt;

</description>
      <category>aws</category>
      <category>s3</category>
      <category>devops</category>
    </item>
  </channel>
</rss>
