<?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: Trent Hornibrook</title>
    <description>The latest articles on DEV Community by Trent Hornibrook (@tnh).</description>
    <link>https://dev.to/tnh</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%2F1758668%2Fd3a480f9-8e6b-4b75-b2ab-597a2fc362a7.jpeg</url>
      <title>DEV Community: Trent Hornibrook</title>
      <link>https://dev.to/tnh</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/tnh"/>
    <language>en</language>
    <item>
      <title>From the Developer Lounge: Building a Secure Container Pipeline with Amazon Inspector &amp; GitHub Actions at AWS Sydney Summit 2025</title>
      <dc:creator>Trent Hornibrook</dc:creator>
      <pubDate>Fri, 06 Jun 2025 06:39:19 +0000</pubDate>
      <link>https://dev.to/aws-builders/from-the-developer-lounge-building-a-secure-container-pipeline-with-amazon-inspector-github-23ig</link>
      <guid>https://dev.to/aws-builders/from-the-developer-lounge-building-a-secure-container-pipeline-with-amazon-inspector-github-23ig</guid>
      <description>&lt;p&gt;This week at the &lt;strong&gt;AWS Summit Sydney 2025&lt;/strong&gt; I had the privilege of speaking in the Developer Lounge about a topic that’s close to my heart: &lt;em&gt;baking security straight into the CI pipeline&lt;/em&gt;.&lt;br&gt;
In this post I’ll recap the session and leave you with practical next-steps you can put into production today.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;br&gt;
&lt;em&gt;Scan early, scan often, scan cheaply.&lt;/em&gt; With Amazon Inspector, GitHub Actions, and a few well-placed network controls you can catch vulnerabilities before they ever reach a cluster—often for around &lt;strong&gt;$0.01 a scan&lt;/strong&gt; and in &lt;strong&gt;~10 seconds&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&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%2Fzhj02ewer4wm457sxhhd.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%2Fzhj02ewer4wm457sxhhd.jpg" alt="AWS Sydney Summit 2025" width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Why Container Security Still Hurts 🔍
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;87 %&lt;/strong&gt; of production container images contain &lt;em&gt;critical&lt;/em&gt; or &lt;em&gt;high-severity&lt;/em&gt; vulnerabilities (Sysdig Cloud-Native Security Report 2023). The reasons are familiar:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Upstream code moves fast&lt;/strong&gt; – new CVEs land daily.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Images live long&lt;/strong&gt; – they’re rebuilt far less frequently than source.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Runtime drift is opaque&lt;/strong&gt; – knowing &lt;em&gt;exactly&lt;/em&gt; what’s running when a zero-day drops is hard.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The goal: bring continuous, automated vulnerability insight &lt;em&gt;into&lt;/em&gt; the developer feedback loop, instead of treating it as an after-thought.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Stack I Showcased ⚙️
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Layer&lt;/th&gt;
&lt;th&gt;What We Used&lt;/th&gt;
&lt;th&gt;Why It Matters&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;CI&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;GitHub Actions&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Native for most teams; easy to extend with Marketplace actions.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Scanning&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Amazon Inspector GitHub Action&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Full CVE scan + SBOM (CycloneDX) creation in one step.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Scheduling&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;GitHub Actions – cron&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Daily rebuilds keep “known-good” images fresh.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Cost&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;≈ AUD 0.015 / scan&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Cheap enough to run &lt;em&gt;every&lt;/em&gt; build.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Network guard-rails&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;VPC Interface Endpoints, AWS Network Firewall &amp;amp; Route 53 DNS Firewall&lt;/td&gt;
&lt;td&gt;Ensure only approved images are pulled, and egress is controlled.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Posture visibility&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;AWS Security Hub&lt;/td&gt;
&lt;td&gt;See which ECR images are vulnerable.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Dependency hygiene&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Renovate Bot&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Automated PRs to keep base images &amp;amp; libraries current.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;AI code reviews&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Amazon Q Developer for GitHub&lt;/strong&gt; (preview)&lt;/td&gt;
&lt;td&gt;Inline suggestions &amp;amp; security insights on every PR.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;em&gt;All the code is open-source here → &lt;a href="https://github.com/tnhtnh/container-pipeline-sydney-summit-2025" rel="noopener noreferrer"&gt;https://github.com/tnhtnh/container-pipeline-sydney-summit-2025&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Walkthrough: The Secure Pipeline in Action 🚀
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Set the risk for the workload
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;env&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;AWS_REGION&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ vars.AWS_REGION || 'ap-southeast-2' }}&lt;/span&gt;
  &lt;span class="na"&gt;ECR_REPOSITORY&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ vars.ECR_REPOSITORY || 'my-ecr-repo' }}&lt;/span&gt;
  &lt;span class="na"&gt;CRITICAL_THRESHOLD&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ vars.CRITICAL_THRESHOLD || 0 }}&lt;/span&gt;
  &lt;span class="na"&gt;HIGH_THRESHOLD&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ vars.HIGH_THRESHOLD || 0 }}&lt;/span&gt;
  &lt;span class="na"&gt;MEDIUM_THRESHOLD&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ vars.MEDIUM_THRESHOLD || 10 }}&lt;/span&gt;
  &lt;span class="na"&gt;LOW_THRESHOLD&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ vars.LOW_THRESHOLD || 10 }}&lt;/span&gt;
  &lt;span class="na"&gt;OTHER_THRESHOLD&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ vars.OTHER_THRESHOLD || 20 }}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Build the Image
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Build Docker image&lt;/span&gt;
        &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;docker/build-push-action@v6&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;context&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;.&lt;/span&gt;
          &lt;span class="na"&gt;file&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;./Dockerfile&lt;/span&gt;
          &lt;span class="na"&gt;push&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
          &lt;span class="na"&gt;build-args&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
            &lt;span class="s"&gt;GIT_SHA=${{ github.sha }}&lt;/span&gt;
          &lt;span class="na"&gt;tags&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
            &lt;span class="s"&gt;${{ steps.login-ecr.outputs.registry }}/${{ env.ECR_REPOSITORY }}:${{ github.sha }}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. &lt;strong&gt;Scan with Amazon Inspector&lt;/strong&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Scan built image with Inspector&lt;/span&gt;
        &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;aws-actions/vulnerability-scan-github-action-for-amazon-inspector@v1&lt;/span&gt;
        &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;inspector&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;artifact_type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;container'&lt;/span&gt;
          &lt;span class="na"&gt;artifact_path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;${{&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;steps.login-ecr.outputs.registry&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;}}/${{&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;env.ECR_REPOSITORY&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;}}:${{&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;github.sha&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;}}'&lt;/span&gt;
          &lt;span class="na"&gt;critical_threshold&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ env.CRITICAL_THRESHOLD }}&lt;/span&gt;
          &lt;span class="na"&gt;high_threshold&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ env.HIGH_THRESHOLD }}&lt;/span&gt;
          &lt;span class="na"&gt;medium_threshold&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ env.MEDIUM_THRESHOLD }}&lt;/span&gt;
          &lt;span class="na"&gt;low_threshold&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ env.LOW_THRESHOLD }}&lt;/span&gt;
          &lt;span class="na"&gt;other_threshold&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ env.OTHER_THRESHOLD }}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;Average runtime during the demo: *&lt;/em&gt;~10 seconds***.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Fail the job if it exceeds my risk threshold
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Fail job if vulnerability threshold is exceeded&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;exit ${{ steps.inspector.outputs.vulnerability_threshold_exceeded }}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Pro tip:&lt;/strong&gt; Add a &lt;em&gt;scheduled&lt;/em&gt; workflow (&lt;code&gt;schedule: cron: "0 2 * * *"&lt;/code&gt;) to rebuild &lt;strong&gt;daily&lt;/strong&gt;. If a new CVE surfaces, the pipeline fails and you’re notified immediately—long before it hits prod.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Beyond CI: Defence-in-Depth 🛡️
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Control&lt;/th&gt;
&lt;th&gt;What It Does&lt;/th&gt;
&lt;th&gt;Quick Win&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;VPC Interface Endpoints (ECR)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Keep image pulls on private links; block public Internet.&lt;/td&gt;
&lt;td&gt;Enable &lt;code&gt;com.amazonaws.&amp;lt;region&amp;gt;.ecr.dkr&lt;/code&gt; in your build VPC.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;AWS Network Firewall&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Enforce allow-lists / Suricata rules for egress.&lt;/td&gt;
&lt;td&gt;Deny outbound traffic to public Docker Hub.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Route 53 DNS Firewall&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Policy-based DNS filtering.&lt;/td&gt;
&lt;td&gt;Block wildcard &lt;code&gt;*.docker.io&lt;/code&gt; except the repos you explicitly mirror.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Combine these with &lt;strong&gt;Security Hub’s Inspector container findings&lt;/strong&gt; to answer, &lt;em&gt;“Which running tasks are based on image X?”&lt;/em&gt; in seconds.&lt;/p&gt;




&lt;h2&gt;
  
  
  Cost &amp;amp; Performance Numbers 💰
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Item&lt;/th&gt;
&lt;th&gt;Cost (Sydney)&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;On-demand image scan&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;≈ AUD 0.015&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;First 1000 / mo on Free Tier.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Continuous re-scan&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;≈ AUD 0.003&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;When using ECR continuous scanning.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Build time impact&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;+ ~10 s&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Scales with image size; cache your layers!&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;For most teams the spend is &lt;strong&gt;pennies compared to the blast-radius&lt;/strong&gt; of shipping a vulnerable container.&lt;/p&gt;




&lt;h2&gt;
  
  
  Pulling It All Together 🧩
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Fork the demo repo&lt;/strong&gt; and adapt the workflow to your project.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Set your thresholds&lt;/strong&gt;—zero criticals in prod, relaxed for dev.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Schedule daily (or hourly) rebuilds&lt;/strong&gt; to detect new CVEs fast.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lock down egress&lt;/strong&gt; with VPC endpoints &amp;amp; firewalls.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Enable Security Hub&lt;/strong&gt; for a single pane of glass across Inspector, GuardDuty, and more.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Let Renovate &amp;amp; Amazon Q Developer&lt;/strong&gt; keep dependencies—and your colleagues—honest.&lt;/li&gt;
&lt;/ol&gt;




&lt;p&gt;Follow me on &lt;a href="https://www.linkedin.com/in/trenthornibrook/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt; for updates, and if you tried the pipeline, tell me how it went—I’d love to feature real-world lessons in a future post!&lt;/p&gt;




&lt;h3&gt;
  
  
  ✨ Resources
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;GitHub repo&lt;/strong&gt; – &lt;a href="https://github.com/tnhtnh/container-pipeline-sydney-summit-2025" rel="noopener noreferrer"&gt;https://github.com/tnhtnh/container-pipeline-sydney-summit-2025&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AWS Blog&lt;/strong&gt; – Inspector ↔️ running-container mapping announcement
&lt;a href="https://aws.amazon.com/blogs/aws/amazon-inspector-enhances-container-security-by-mapping-amazon-ecr-images-to-running-containers/" rel="noopener noreferrer"&gt;https://aws.amazon.com/blogs/aws/amazon-inspector-enhances-container-security-by-mapping-amazon-ecr-images-to-running-containers/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Amazon Q Developer for GitHub (preview)&lt;/strong&gt;
&lt;a href="https://aws.amazon.com/blogs/aws/amazon-q-developer-in-github-now-in-preview-with-code-generation-review-and-legacy-transformation-capabilities/" rel="noopener noreferrer"&gt;https://aws.amazon.com/blogs/aws/amazon-q-developer-in-github-now-in-preview-with-code-generation-review-and-legacy-transformation-capabilities/&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🙏 A big Thank You
&lt;/h3&gt;

&lt;p&gt;Thank you to Community Builders team, especially Shafraz Rahim for allowing me to share my knowledge on container security to the group at Summit. And thank you to &lt;a href="https://www.linkedin.com/in/ssennettau/" rel="noopener noreferrer"&gt;Stephen Sennett&lt;/a&gt; for being the Community Builder Community Advocate for the class of AWS Sydney Summit 2025! &lt;/p&gt;




&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;Security shouldn’t slow developers down—it should &lt;strong&gt;empower&lt;/strong&gt; them to ship with confidence.&lt;br&gt;
With Amazon Inspector costing about the same as a few kilobytes of S3 storage, there’s no excuse not to give every container the green light before it heads to production.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;See you at the next event, and happy (secure) building!&lt;/em&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Amazon Q Developer: A Follow-up Experience with Code Transformation</title>
      <dc:creator>Trent Hornibrook</dc:creator>
      <pubDate>Tue, 06 May 2025 05:32:03 +0000</pubDate>
      <link>https://dev.to/aws-builders/amazon-q-developer-a-follow-up-experience-with-code-transformation-3jjj</link>
      <guid>https://dev.to/aws-builders/amazon-q-developer-a-follow-up-experience-with-code-transformation-3jjj</guid>
      <description>&lt;p&gt;I recently experimented with &lt;a href="https://dev.to/aws-builders/hands-on-with-amazon-q-developer-in-github-building-an-aws-sam-app-from-scratch-587g"&gt;Amazon Q Developer for GitHub&lt;/a&gt;, testing its ability to transform code from one language to another. While Amazon Q Developer shows promise, my experience revealed some interesting limitations in its current preview state.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Project: EC2 Underutilization Report Tool
&lt;/h2&gt;

&lt;p&gt;My test case involved &lt;a href="https://github.com/alokshanhbti/ec2-underutilized-report" rel="noopener noreferrer"&gt;Alok Shankar's EC2 underutilization reporting tool&lt;/a&gt; - a clever Bash script that identifies idle EC2 instances to reduce AWS costs. The original script:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Collects 7-day average CPU usage from CloudWatch&lt;/li&gt;
&lt;li&gt;Gathers memory metrics when CloudWatch Agent is configured&lt;/li&gt;
&lt;li&gt;Captures EC2 metadata (ID, type, Name tag)&lt;/li&gt;
&lt;li&gt;Generates downsizing recommendations&lt;/li&gt;
&lt;li&gt;Sends HTML email reports with CSV attachments&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This tool represented an ideal candidate for transformation - a useful utility written in Bash that could benefit from Python's improved maintainability, error handling, and testability.&lt;/p&gt;

&lt;h2&gt;
  
  
  My Experience with Amazon Q Developer
&lt;/h2&gt;

&lt;p&gt;After forking the repository to &lt;a href="https://github.com/tnh/ec2-underutilized-report" rel="noopener noreferrer"&gt;my GitHub account&lt;/a&gt;, I created &lt;a href="https://github.com/tnh/ec2-underutilized-report/issues/1" rel="noopener noreferrer"&gt;Issue #1&lt;/a&gt; with detailed requirements for transforming the script to Python. My prompt was comprehensive, requesting:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Complete rewrite in Python for better reliability&lt;/li&gt;
&lt;li&gt;Preservation of output format&lt;/li&gt;
&lt;li&gt;Addition of pytest unit tests&lt;/li&gt;
&lt;li&gt;Enhanced metrics collection beyond CPU&lt;/li&gt;
&lt;li&gt;More actionable cost-saving recommendations&lt;/li&gt;
&lt;li&gt;Adherence to Python best practices&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I then added the "Amazon Q transform agent" label to engage the AI assistant.&lt;/p&gt;

&lt;h2&gt;
  
  
  Unexpected Results
&lt;/h2&gt;

&lt;p&gt;What happened next was surprising. Instead of addressing my Python transformation request:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Amazon Q Developer immediately responded: "I'm getting ready to upgrade your code to Java 17"&lt;/li&gt;
&lt;li&gt;It attempted to run a GitHub Actions workflow for a Java/Maven project&lt;/li&gt;
&lt;li&gt;When this failed, it requested I configure a Java workflow configuration&lt;/li&gt;
&lt;li&gt;The entire context of my transformation request was seemingly ignored&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Amazon Q Developer: Key Limitations and Lessons
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;The Transform agent&lt;/strong&gt;: Surprisingly, despite being labeled as a general "transform agent," Amazon Q Developer appears primarily designed for Java upgrades. The label "Amazon Q transform agent" should be updated to clearly indicate "Amazon Q Java transform agent" to avoid confusion.&lt;/p&gt;

&lt;h2&gt;
  
  
  Takeaways
&lt;/h2&gt;

&lt;p&gt;The concept remains promising - automated code transformations via GitHub issues could dramatically improve developer productivity.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Hands-On with Amazon Q Developer in GitHub: Building an AWS SAM App from Scratch</title>
      <dc:creator>Trent Hornibrook</dc:creator>
      <pubDate>Mon, 05 May 2025 22:27:55 +0000</pubDate>
      <link>https://dev.to/aws-builders/hands-on-with-amazon-q-developer-in-github-building-an-aws-sam-app-from-scratch-587g</link>
      <guid>https://dev.to/aws-builders/hands-on-with-amazon-q-developer-in-github-building-an-aws-sam-app-from-scratch-587g</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;In mid-April, I blogged about &lt;a href="https://www.linkedin.com/pulse/leveraging-cloud-genai-2025-developers-guide-value-trent-xmfjc/" rel="noopener noreferrer"&gt;leveraging cloud and generative AI to maximize developer productivity&lt;/a&gt;. Among other areas, I highlighted the potential of AI in the PR Review/Gitflow process, suggesting tools like Evolua.io or CodeRabbit to offload routine code reviews and low-value fixes to AI assistants.&lt;/p&gt;

&lt;p&gt;Today, I'm excited to explore Amazon's latest offering in this space: &lt;a href="https://aws.amazon.com/blogs/aws/amazon-q-developer-in-github-now-in-preview-with-code-generation-review-and-legacy-transformation-capabilities/" rel="noopener noreferrer"&gt;Amazon Q Developer in GitHub&lt;/a&gt;, which has just been released in preview. As an AWS Community Builder, I've had early access to this tool for over a week, and I wanted to put it through its paces with a real-world test: &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can Amazon Q Developer build a complete AWS SAM application from scratch, based solely on requirements provided in GitHub issues?&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  How Amazon Q Developer for GitHub Works
&lt;/h2&gt;

&lt;p&gt;Before diving into my experiment, let's quickly review how Amazon Q Developer integrates with GitHub:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Issue-based development&lt;/strong&gt;: Create a GitHub issue describing your feature requirements, add the "Amazon Q development agent" label, and Q Developer will generate a complete implementation and submit it as a pull request.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;PR-based collaboration&lt;/strong&gt;: Add the Q Developer label to an existing PR, and it will review your code, suggest improvements, or address requested changes.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;In both cases, Amazon Q analyzes the context of your repository and comments, then either generates new code or modifies existing code. The AWS blog post explains the current capabilities and limitations of this preview version in detail.&lt;/p&gt;

&lt;h2&gt;
  
  
  My Experiment: Building an AWS SAM App from a Blank Repository
&lt;/h2&gt;

&lt;p&gt;To test Amazon Q Developer's capabilities, I created a &lt;a href="https://github.com/tnh/blank-repo-using-amazon-q-to-build-a-aws-sam-app" rel="noopener noreferrer"&gt;blank repository&lt;/a&gt; with just a README file. My goal was to see if Amazon Q could build a serverless photo application with AWS SAM, complete with GitHub Actions pipeline, solely based on requirements provided in issues.&lt;/p&gt;

&lt;h3&gt;
  
  
  Lesson #1: Crafting Effective Prompts is Critical
&lt;/h3&gt;

&lt;p&gt;Following best practices for working with generative AI, I spent time crafting a detailed issue description that specified all the requirements for my AWS SAM application. This included:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Application architecture details&lt;/li&gt;
&lt;li&gt;Required AWS resources&lt;/li&gt;
&lt;li&gt;Code structure&lt;/li&gt;
&lt;li&gt;Testing requirements&lt;/li&gt;
&lt;li&gt;GitHub Actions pipeline specifications&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I submitted this as &lt;a href="https://github.com/tnh/blank-repo-using-amazon-q-to-build-a-aws-sam-app/issues/1" rel="noopener noreferrer"&gt;Issue #1&lt;/a&gt;, added the Amazon Q development agent label, and waited.&lt;/p&gt;

&lt;h3&gt;
  
  
  Lesson #2: Mind the Context Window
&lt;/h3&gt;

&lt;p&gt;Within minutes, I received my first lesson in the limitations of Amazon Q Developer:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;⚠️ The issue description is too long. I will only look at the first 1000 words.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Like most LLM-based tools, Amazon Q Developer has a context window limitation. My detailed prompt exceeded this limit, meaning it would only process part of my requirements.&lt;/p&gt;

&lt;h3&gt;
  
  
  Lesson #3: Concise Requirements Are More Effective
&lt;/h3&gt;

&lt;p&gt;Taking this feedback, I used an LLM to help condense my requirements into a more focused version. I submitted this as &lt;a href="https://github.com/tnh/blank-repo-using-amazon-q-to-build-a-aws-sam-app/issues/2" rel="noopener noreferrer"&gt;Issue #2&lt;/a&gt;, focusing on just the essential specifications. While this issue acknowledged receipt of the task, it also encountered issues.&lt;/p&gt;

&lt;h3&gt;
  
  
  Lesson #4: Third Time's the Charm!
&lt;/h3&gt;

&lt;p&gt;Not giving up, I created &lt;a href="https://github.com/tnh/blank-repo-using-amazon-q-to-build-a-aws-sam-app/issues/3" rel="noopener noreferrer"&gt;Issue #3&lt;/a&gt; with an even more concise and structured requirements list. This time, success! Amazon Q Developer processed the issue and created &lt;a href="https://github.com/tnh/blank-repo-using-amazon-q-to-build-a-aws-sam-app/pull/4" rel="noopener noreferrer"&gt;Pull Request #4&lt;/a&gt; with a complete implementation of the AWS SAM photo application.&lt;/p&gt;

&lt;h3&gt;
  
  
  Lesson #5: Amazon Q Developer Self-Checks Its Code
&lt;/h3&gt;

&lt;p&gt;What happened next was less impressive than it should have been: Amazon Q Developer had to scan its own generated code for security vulnerabilities and other issues. Perhaps it should have simply written secure code from the start, rather than creating problems that required subsequent fixes.&lt;/p&gt;

&lt;p&gt;However, it's valuable that Amazon Q Developer can perform an additional security scan on the changeset, providing an extra layer of protection to catch vulnerabilities before they're committed to the codebase.&lt;/p&gt;

&lt;h2&gt;
  
  
  Key Lessons from My Initial Testing
&lt;/h2&gt;

&lt;p&gt;While my experiment hit some initial snags, the ultimate success revealed several valuable insights:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Master the art of concise prompting&lt;/strong&gt; - Your issue descriptions must be detailed enough to guide Q Developer effectively while staying under 1000 words. This constraint forces you to prioritize the most critical requirements.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Start with focused, smaller tasks&lt;/strong&gt; - Rather than requesting a complete application, begin with individual components or features to maximize success rate and learn the tool's capabilities.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Embrace an iterative workflow&lt;/strong&gt; - Amazon Q Developer shines as a collaborative partner in an iterative development process, not as a one-shot solution. Be prepared to refine requirements and review generated code carefully.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Value the security scanning&lt;/strong&gt; - The automatic security review of generated code is a standout feature that helps ensure you're not introducing vulnerabilities into your codebase.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Amazon Q Developer: Production-Ready or Preview Promise?
&lt;/h2&gt;

&lt;p&gt;Despite being in preview, Amazon Q Developer shows remarkable potential for transforming development workflows. The GitHub integration feels natural, and the ability to generate code directly from issue descriptions could dramatically accelerate development cycles for teams willing to adapt their processes.&lt;/p&gt;

&lt;p&gt;The automatic security scanning feature is particularly valuable, as it helps address one of the main concerns with AI-generated code: security and best practices. By actively scanning its own output, Amazon Q Developer demonstrates a commitment to both speed and quality.&lt;/p&gt;

&lt;p&gt;That said, be prepared for the expected preview-stage limitations. Beyond the context window restriction, you might encounter occasional bugs or inconsistent results. The service may also experience capacity constraints since it's currently free to use—AWS might be throttling resources during peak times, leading to slower responses or temporary unavailability.&lt;/p&gt;

&lt;h2&gt;
  
  
  I Strongly Recommend Trying It Today
&lt;/h2&gt;

&lt;p&gt;I encourage you to experiment with Amazon Q Developer in your GitHub repositories. It costs nothing during the preview period and requires no AWS account setup, making it the perfect time to explore its capabilities and limitations.&lt;/p&gt;

&lt;p&gt;I'll be continuing my experiment by testing how well Amazon Q Developer handles iterations and revisions to the generated code. Watch for a follow-up post with more detailed results and practical tips for maximizing this tool's value for your team.&lt;/p&gt;

</description>
      <category>amazonq</category>
    </item>
    <item>
      <title>AWS Landing Zone Odyssey Part 2: Escaping Account Purgatory</title>
      <dc:creator>Trent Hornibrook</dc:creator>
      <pubDate>Fri, 25 Apr 2025 06:50:46 +0000</pubDate>
      <link>https://dev.to/tnh/aws-landing-zone-odyssey-part-2-escaping-account-purgatory-3561</link>
      <guid>https://dev.to/tnh/aws-landing-zone-odyssey-part-2-escaping-account-purgatory-3561</guid>
      <description>&lt;h2&gt;
  
  
  The Saga Continues
&lt;/h2&gt;

&lt;p&gt;In my &lt;a href="https://dev.to/aws-builders/my-aws-landing-zone-odyssey-a-tale-of-tears-timeouts-and-suspended-accounts-34g9"&gt;previous post&lt;/a&gt;, I shared my harrowing experience trying to deploy AWS Landing Zone with the Trusted Enclaves pattern. I ended that post stuck in what I called "Account Purgatory" - unable to remove suspended accounts from my organization, blocking any further progress.&lt;/p&gt;

&lt;p&gt;Well, good news! After much trial and error (and several more AWS support tickets), I've finally escaped! Here's how I managed to exorcise those stubborn accounts and get back on track.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Solution: Root Access and The Magical Obscure Link
&lt;/h2&gt;

&lt;p&gt;The key to removing accounts from an AWS Organization isn't documented prominently anywhere I could find. After days of frustration, here's what finally worked:&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1: Recover Root Access to Child Accounts
&lt;/h3&gt;

&lt;p&gt;First, I needed to access each child account as the root user:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;For each account, I needed the email address used during creation&lt;/li&gt;
&lt;li&gt;I had to initiate password recovery for each root account&lt;/li&gt;
&lt;li&gt;Set a new root password for each account&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Step 2: The Obscure Link - The Only Thing You Really Need
&lt;/h3&gt;

&lt;p&gt;Here's the crucial discovery: In the AWS documentation about &lt;a href="https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_accounts_remove.html" rel="noopener noreferrer"&gt;removing member accounts&lt;/a&gt;, there's an easily missed link labeled simply "this link" buried in the text.&lt;/p&gt;

&lt;p&gt;The link appears in this section:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;We recommend that you sign in to the member account by choosing Copy link, and then pasting it into the address bar of a new incognito browser window. If you do not see Copy link, use &lt;strong&gt;this link&lt;/strong&gt; to go the Sign up for AWS page and complete the missing registration steps.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;This mysterious "this link" is all you actually need!&lt;/strong&gt; When clicked while logged in as the root user of a child account, it takes you to a special page that will automatically prompt you for all required information, including:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Payment method details&lt;/li&gt;
&lt;li&gt;Support plan selection (Basic is free)&lt;/li&gt;
&lt;li&gt;Phone verification&lt;/li&gt;
&lt;li&gt;Any other missing account verification steps&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;You don't need to manually navigate to the billing console or payment preferences first - this link will guide you through everything required to make the account eligible to leave the organization.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 3: Finally Leaving the Organization
&lt;/h3&gt;

&lt;p&gt;After completing the steps via "the link," you can then:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;From the child account (still logged in as root)&lt;/li&gt;
&lt;li&gt;Navigate to AWS Organizations&lt;/li&gt;
&lt;li&gt;Select "Leave Organization"&lt;/li&gt;
&lt;li&gt;Confirm your choice&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Step 4: Don't Forget to Close the Account!
&lt;/h3&gt;

&lt;p&gt;Lastly, don't forget to close that account once it's disconnected from the organization. Now that it's a standalone account with your payment method attached, it will start accruing charges for any resources left running.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Is This So Complicated?
&lt;/h2&gt;

&lt;p&gt;The process is designed this way for good reason - to ensure accounts have everything they need to operate independently before leaving an organization. But the documentation and user experience could certainly be improved.&lt;/p&gt;

&lt;p&gt;The biggest issue is that AWS doesn't clearly indicate what's missing from an account. You're just left with cryptic error messages like "The account cannot be removed because it's missing required information."&lt;/p&gt;

&lt;h2&gt;
  
  
  Lessons Learned
&lt;/h2&gt;

&lt;p&gt;Beyond the technical steps, here are the key takeaways from this experience:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;AWS Organization account management is intricate&lt;/strong&gt; - Understand the full lifecycle before creating or removing accounts.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Documentation has gaps&lt;/strong&gt; - Sometimes the most crucial information is buried in obscure places or missing entirely.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Share Your Experiences
&lt;/h2&gt;

&lt;p&gt;Have you gone through similar struggles with AWS Organizations or Landing Zone? I'd love to hear your stories and any additional tips you might have!&lt;/p&gt;

</description>
    </item>
    <item>
      <title>My AWS Landing Zone Odyssey: A Tale of Tears, Timeouts, and Suspended Accounts</title>
      <dc:creator>Trent Hornibrook</dc:creator>
      <pubDate>Thu, 24 Apr 2025 04:46:46 +0000</pubDate>
      <link>https://dev.to/aws-builders/my-aws-landing-zone-odyssey-a-tale-of-tears-timeouts-and-suspended-accounts-34g9</link>
      <guid>https://dev.to/aws-builders/my-aws-landing-zone-odyssey-a-tale-of-tears-timeouts-and-suspended-accounts-34g9</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;As an AWS Community Builder, I was thrilled to receive $500 of AWS credits to build something practical. My vision? Setting up a Trusted Enclaves landing zone pattern with Entra ID integration for AWS access management. Little did I know I was embarking on a journey that would test my patience, troubleshooting skills, and sanity.&lt;/p&gt;

&lt;p&gt;Join me on this cautionary tale of what happens when AWS Landing Zone deployment goes sideways.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Initial Plan
&lt;/h2&gt;

&lt;p&gt;My approach seemed straightforward:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Use my personal AWS account + $500 Community Builders credit&lt;/li&gt;
&lt;li&gt;Deploy AWS Landing Zone Accelerator with Control Tower as the account creation mechanism&lt;/li&gt;
&lt;li&gt;Apply the Trusted Enclaves configuration&lt;/li&gt;
&lt;li&gt;Connect everything to Entra ID for streamlined access&lt;/li&gt;
&lt;li&gt;Document the process to help fellow builders&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Simple, right? Oh, how naïve I was.&lt;/p&gt;

&lt;h2&gt;
  
  
  Day 1: The Innocent Beginnings
&lt;/h2&gt;

&lt;p&gt;I started by following the AWS Landing Zone Accelerator documentation. First hurdle? Service quotas.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Dear AWS User,

Your service quota increase request for the number of accounts in Organizations
is being processed. This may take up to 12 hours.

Regards,
AWS Support
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A 12-hour wait just to increase my account quota. Fine, I can be patient. Little did I know this was just the appetizer to a feast of frustration.&lt;/p&gt;

&lt;h2&gt;
  
  
  Day 2: Control Tower Dreams and SCP Nightmares
&lt;/h2&gt;

&lt;p&gt;After quota increases cleared, I successfully deployed stage one of the landing zone and then applied the Trusted Enclaves configuration. That's when my troubles truly began.&lt;/p&gt;

&lt;p&gt;The configuration attempted to create a new OU and apply a 6th Service Control Policy (SCP) to it. Problem? AWS only allows 5 SCPs per OU by default. &lt;/p&gt;

&lt;p&gt;"No problem," I thought. "I'll just remove the direct all-access SCP on the OU to make room."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Narrator&lt;/strong&gt;: &lt;em&gt;That was, in fact, a problem.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The process progressed further but then became completely wedged. The newly created accounts lost their trust relationships to both the audit account and the master billing account. I spent hours digging through CloudWatch logs trying to understand what went wrong.&lt;/p&gt;

&lt;p&gt;I even attempted heroic measures - manually applying new cross-account trust relationships to help reinduct these wayward accounts back into Control Tower. No luck.&lt;/p&gt;

&lt;h2&gt;
  
  
  Day 3-4: The Clean Slate Approach
&lt;/h2&gt;

&lt;p&gt;After much hair-pulling, I decided to throw everything out and start fresh. But there was a catch - I needed to keep my master billing account to retain that precious $500 credit.&lt;/p&gt;

&lt;p&gt;My plan:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Close all child accounts&lt;/li&gt;
&lt;li&gt;Remove all resources (with help from bash scripts to hunt down and terminate everything)&lt;/li&gt;
&lt;li&gt;Get the master biller account back to pristine condition&lt;/li&gt;
&lt;li&gt;Suspend/close all other accounts&lt;/li&gt;
&lt;li&gt;Try again&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;But when I attempted the new deployment, I ran into &lt;a href="https://github.com/awslabs/landing-zone-accelerator-on-aws/issues/771" rel="noopener noreferrer"&gt;this issue&lt;/a&gt; - the Landing Zone Accelerator was detecting my suspended accounts as active accounts and refusing to deploy!&lt;/p&gt;

&lt;h2&gt;
  
  
  Day 5-6: Account Purgatory
&lt;/h2&gt;

&lt;p&gt;Now I needed those suspended accounts to be unsuspended so I could properly remove them from the organization. Cue another support case and another 24-hour wait.&lt;/p&gt;

&lt;p&gt;When the accounts were finally unsuspended, I logged into each one, set up billing information, and tried to leave the organization cleanly (to then close them properly).&lt;/p&gt;

&lt;p&gt;The response? An unexplained error. No reason. Just failure.&lt;/p&gt;

&lt;p&gt;And so here I am, with another AWS support case open, waiting to understand why these child accounts refuse to leave the organization - like adult children who keep returning to live in your basement.&lt;/p&gt;

&lt;h2&gt;
  
  
  Lessons Learned (The Hard Way)
&lt;/h2&gt;

&lt;p&gt;Service Quotas Matter: Request quota increases well in advance of starting deployment.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;SCPs Are Tricky:&lt;/strong&gt; Understand the SCP limits and how they affect your architecture before modifying them.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Document Everything:&lt;/strong&gt; Track every change, error message, and support response. You'll need it to piece together the story later.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Understand Account Lifecycle:&lt;/strong&gt; AWS accounts have complex lifecycle states that can affect operations in non-obvious ways.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Allow More Time Than You Think:&lt;/strong&gt; What I estimated would take a weekend has stretched into a multi-week saga.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Question for Fellow Builders
&lt;/h2&gt;

&lt;p&gt;Have you deployed AWS Landing Zone with enhanced security controls? What challenges did you face? I'd love to hear your experiences - misery loves company, after all!&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Securing Your Container Pipeline: Using AWS Inspector with GitHub Actions</title>
      <dc:creator>Trent Hornibrook</dc:creator>
      <pubDate>Sat, 15 Mar 2025 03:02:43 +0000</pubDate>
      <link>https://dev.to/aws-builders/securing-your-container-pipeline-using-aws-inspector-with-github-actions-4fma</link>
      <guid>https://dev.to/aws-builders/securing-your-container-pipeline-using-aws-inspector-with-github-actions-4fma</guid>
      <description>&lt;p&gt;As an AWS Community Builder, I'm excited to share a practical approach to integrating security scanning into your container deployment pipeline. Today, I'll walk you through an example GitHub repository that demonstrates how to use the AWS Inspector Vulnerability Scan GitHub Action to scan Docker images before they're pushed to Amazon ECR.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Container Security Challenge
&lt;/h2&gt;

&lt;p&gt;Containers have revolutionised how we deploy applications, but they also introduce unique security challenges. A common misconception is that containerisation automatically guarantees security. In reality, containers can harbour vulnerabilities in their base images, dependencies, or application code.&lt;/p&gt;

&lt;h2&gt;
  
  
  Enter AWS Inspector and GitHub Actions
&lt;/h2&gt;

&lt;p&gt;To address this challenge, I'd like to highlight this &lt;a href="https://github.com/tnh/docker-ecr-github-action-inspector-scanner-example" rel="noopener noreferrer"&gt;example&lt;/a&gt; repository that demonstrates a complete workflow for building, scanning, and deploying Docker containers with built-in security controls.&lt;/p&gt;

&lt;p&gt;The repository implements a GitHub Actions workflow that:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Builds your Docker image&lt;/li&gt;
&lt;li&gt;Scans it for vulnerabilities using AWS Inspector&lt;/li&gt;
&lt;li&gt;Only pushes to ECR if the image meets your defined security thresholds&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  How the Workflow Works
&lt;/h2&gt;

&lt;p&gt;At its core, the workflow uses the &lt;a href="https://github.com/aws-actions/vulnerability-scan-github-action-for-amazon-inspector" rel="noopener noreferrer"&gt;Vulnerability Scan GitHub Action for Amazon Inspector&lt;/a&gt;, which integrates with AWS Inspector to perform comprehensive vulnerability scanning on your container images.&lt;/p&gt;

&lt;p&gt;Here's a key section from the workflow file that handles the scanning:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;- name: Scan built image with Inspector
  uses: aws-actions/vulnerability-scan-github-action-for-amazon-inspector@v1
  id: inspector
  with:
    artifact_type: 'container'
    artifact_path: '${{ steps.login-ecr.outputs.registry }}/${{ env.ECR_REPOSITORY }}:${{ github.sha }}'
    critical_threshold: ${{ env.CRITICAL_THRESHOLD }}
    high_threshold: ${{ env.HIGH_THRESHOLD }}
    medium_threshold: ${{ env.MEDIUM_THRESHOLD }}
    low_threshold: ${{ env.LOW_THRESHOLD }}
    other_threshold: ${{ env.OTHER_THRESHOLD }}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The workflow includes configurable thresholds for different vulnerability severity levels, allowing you to define what constitutes an acceptable level of risk for your organisation:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;env:
  CRITICAL_THRESHOLD: 0  # No critical vulnerabilities allowed
  HIGH_THRESHOLD: 0      # No high vulnerabilities allowed
  MEDIUM_THRESHOLD: 5    # Up to 5 medium vulnerabilities allowed
  LOW_THRESHOLD: 5       # Up to 5 low vulnerabilities allowed
  OTHER_THRESHOLD: 5     # Up to 5 other vulnerabilities allowed
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Why You Should Implement Container Scanning
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Catch Vulnerabilities Before Deployment
&lt;/h3&gt;

&lt;p&gt;By scanning container images during the build process, you prevent vulnerable containers from ever being pushed to your registry. This provides a critical security checkpoint at the beginning of your deployment pipeline.&lt;/p&gt;

&lt;p&gt;The example repository demonstrates a fail-fast approach:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;- name: Fail job if vulnerability threshold is exceeded
  run: exit ${{ steps.inspector.outputs.vulnerability_threshold_exceeded }}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Regular Scanning Identifies New Vulnerabilities
&lt;/h3&gt;

&lt;p&gt;New vulnerabilities are discovered constantly. By implementing scheduled builds of your container images (e.g., weekly), you can leverage this scanning mechanism to identify when previously secure images become vulnerable due to newly discovered CVEs.&lt;/p&gt;

&lt;p&gt;This proactive approach means you'll discover vulnerabilities through your CI/CD pipeline rather than through a security incident.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Improved Security Posture
&lt;/h3&gt;

&lt;p&gt;Implementing this scanning workflow significantly improves your overall security posture by:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt; Creating a Software Bill of Materials (SBOM) for each image&lt;/li&gt;
&lt;li&gt; Establishing clear security standards through configurable thresholds&lt;/li&gt;
&lt;li&gt; Providing audit trails of security scanning results&lt;/li&gt;
&lt;li&gt; Integrating security directly into your development workflow&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4. Streamlined Deployment Process
&lt;/h3&gt;

&lt;p&gt;The workflow not only scans but also handles the complete deployment process to ECR, making it an all-in-one solution for secure container deployment.&lt;/p&gt;

&lt;h2&gt;
  
  
  Important Security Considerations
&lt;/h2&gt;

&lt;p&gt;While this scanning approach significantly improves your container security, it's crucial to understand that &lt;strong&gt;it doesn't absolve you of all security responsibilities&lt;/strong&gt;. Container scanning focuses on known vulnerabilities in the container image, but it doesn't:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Detect runtime security issues&lt;/li&gt;
&lt;li&gt;Protect against misconfigurations in how the container is deployed&lt;/li&gt;
&lt;li&gt;Replace the need for network security controls&lt;/li&gt;
&lt;li&gt;Eliminate the need for regular patching of running containers&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You should combine this approach with other security practices like runtime protection, network policies, and regular updates to running containers.&lt;/p&gt;

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

&lt;p&gt;Before implementing this solution, it's important to understand the cost structure for AWS Inspector in your region. For the Sydney (ap-southeast-2) region, the pricing is:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ECR Container Image Scanning:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Initial scan on push to ECR: $0.09 per image&lt;/li&gt;
&lt;li&gt;Automated rescans for continuous scanning: $0.01 per rescan&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;On-demand Container Image Scanning&lt;/strong&gt; (including within CI/CD solutions):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;$0.03 per image scanned&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For most organisations, this cost is minimal compared to the potential cost of a security incident. For example, if you build and scan 100 container images per month with this workflow, your cost would be approximately $3.00 per month.&lt;/p&gt;

&lt;h3&gt;
  
  
  Setting Up the Solution
&lt;/h3&gt;

&lt;p&gt;The example repository provides detailed instructions for setting up:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;OIDC authentication between GitHub and AWS&lt;/li&gt;
&lt;li&gt;Required IAM roles with appropriate permissions&lt;/li&gt;
&lt;li&gt;GitHub Secrets configuration&lt;/li&gt;
&lt;li&gt;Example Dockerfile with security best practices&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The implementation uses role chaining for enhanced security, ensuring that your GitHub Actions have only the minimum permissions required.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;The &lt;a href="https://github.com/tnh/docker-ecr-github-action-inspector-scanner-example" rel="noopener noreferrer"&gt;docker-ecr-github-action-inspector-scanner-example &lt;/a&gt;repository provides a production-ready solution for integrating container security scanning into your deployment workflow. By implementing this approach, you create a strong first line of defense against container vulnerabilities.&lt;/p&gt;

&lt;p&gt;Remember that security is a continuous process. Using this scanning approach in combination with regular scheduled builds gives you a powerful mechanism for identifying and addressing new vulnerabilities before they impact your production environment.&lt;/p&gt;

&lt;p&gt;Have you implemented container scanning in your workflows? I'd love to hear about your experiences in the comments below!&lt;/p&gt;

</description>
    </item>
    <item>
      <title>AWS Fargate Deep Dive: Key Takeaways from Melbourne User Group</title>
      <dc:creator>Trent Hornibrook</dc:creator>
      <pubDate>Thu, 13 Mar 2025 21:43:04 +0000</pubDate>
      <link>https://dev.to/aws-builders/aws-fargate-deep-dive-key-takeaways-from-melbourne-user-group-kl5</link>
      <guid>https://dev.to/aws-builders/aws-fargate-deep-dive-key-takeaways-from-melbourne-user-group-kl5</guid>
      <description>&lt;p&gt;Last night, I spoke at the AWS Melbourne User Group, providing a deep dive into AWS Fargate.&lt;/p&gt;

&lt;p&gt;I began by recounting my first talk at the AWSUG in 2012 &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%2F9v23rfwglkvky0rqatk4.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%2F9v23rfwglkvky0rqatk4.png" alt="Image description" width="800" height="594"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Talking at the AWSUG Aug 2012&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Fargate?
&lt;/h2&gt;

&lt;p&gt;I highlighted the key challenges Fargate aims to solve:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;With the rise of 12-factor apps, teams want to focus on deploying containers without managing underlying infrastructure&lt;/li&gt;
&lt;li&gt;Keeping operating systems up-to-date is often difficult and easily neglected&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Fargate Architecture
&lt;/h2&gt;

&lt;p&gt;AWS Fargate (Linux version) is powered by Firecracker VM technology, providing security isolation for Linux-based Fargate containers and Lambda functions. The compute resource appears in your AWS account and is shared via a network interface (ENI).&lt;/p&gt;

&lt;h2&gt;
  
  
  Pricing Considerations
&lt;/h2&gt;

&lt;p&gt;Fargate pricing depends on several factors:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Spot vs. on-demand instances&lt;/li&gt;
&lt;li&gt;ARM vs. X86 architecture (note: Windows Fargate doesn't yet support ARM)&lt;/li&gt;
&lt;li&gt;Windows vs. Linux (Windows incurs additional licensing costs)&lt;/li&gt;
&lt;li&gt;CPU shares and memory allocation from a predefined menu (custom configurations not available)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Container Scheduler Platforms
&lt;/h2&gt;

&lt;p&gt;AWS offers two main container scheduler platforms:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Elastic Kubernetes Service (EKS)&lt;/li&gt;
&lt;li&gt;Elastic Container Service (ECS)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Both platforms support:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Running containers on Fargate&lt;/li&gt;
&lt;li&gt;Running containers on self-managed EC2 instances (or managed nodegroups in EKS)&lt;/li&gt;
&lt;li&gt;Mixed deployment models&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  ECS vs. EKS: Key Differences
&lt;/h2&gt;

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

&lt;ul&gt;
&lt;li&gt;Highly opinionated and simple&lt;/li&gt;
&lt;li&gt;AWS-specific&lt;/li&gt;
&lt;li&gt;Supports decentralized "you build it, you run it" operating models&lt;/li&gt;
&lt;li&gt;Suited for multiple ECS clusters&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;Highly flexible with a rich plugin ecosystem&lt;/li&gt;
&lt;li&gt;Requires specialized skills to operate effectively&lt;/li&gt;
&lt;li&gt;Better suited for centralized operations&lt;/li&gt;
&lt;li&gt;Typically uses fewer, larger clusters&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Choosing the Right Approach
&lt;/h2&gt;

&lt;p&gt;Consider your organization's operating model:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;For traditional SRE centralized operations, EKS might be preferable&lt;/li&gt;
&lt;li&gt;For decentralized operations that empower teams, ECS's simplicity may be advantageous&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Note: Regardless of platform choice, developer-focused golden path tooling remains critical!&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Fargate Limitations at Scale
&lt;/h2&gt;

&lt;p&gt;When operating at scale, Fargate on EKS has some limitations:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cannot run daemonsets (requires sidecar pattern instead)&lt;/li&gt;
&lt;li&gt;Risk of overprovisioning if pod requirements don't align with Fargate launch options&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For a middle-ground approach, consider Bottlerocket as an AMI in EKS to reduce OS-level security risks. Additionally, running kube-scheduler on Fargate (including Karpenter) while using Karpenter to manage EC2-based nodes offers an excellent compromise.&lt;/p&gt;

&lt;p&gt;This is the video of my talk: &lt;a href="https://youtu.be/q1Aw8arr-B8?t=1631" rel="noopener noreferrer"&gt;here&lt;/a&gt;&lt;/p&gt;

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