<?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: Danielle Heberling</title>
    <description>The latest articles on DEV Community by Danielle Heberling (@deeheber).</description>
    <link>https://dev.to/deeheber</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%2F420049%2F68b97457-929c-4597-91d1-f2093c522459.jpg</url>
      <title>DEV Community: Danielle Heberling</title>
      <link>https://dev.to/deeheber</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/deeheber"/>
    <language>en</language>
    <item>
      <title>I Rewrote My Step Function as a Durable Function</title>
      <dc:creator>Danielle Heberling</dc:creator>
      <pubDate>Sun, 01 Mar 2026 12:12:03 +0000</pubDate>
      <link>https://dev.to/aws-heroes/i-rewrote-my-step-function-as-a-durable-function-2je5</link>
      <guid>https://dev.to/aws-heroes/i-rewrote-my-step-function-as-a-durable-function-2je5</guid>
      <description>&lt;p&gt;Ever since AWS announced &lt;a href="https://docs.aws.amazon.com/lambda/latest/dg/durable-functions.html" rel="noopener noreferrer"&gt;Lambda durable functions&lt;/a&gt; at re:Invent 2025, I've been wanting to try them on a real project. Not a cookie cutter tutorial, but something where I could actually compare the two approaches. I already had the perfect candidate: my &lt;a href="https://github.com/deeheber/weather-site" rel="noopener noreferrer"&gt;weather site&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Quick Background
&lt;/h2&gt;

&lt;p&gt;If you haven't read &lt;a href="https://dev.to/aws-builders/serverless-weather-reporting-with-aws-step-functions-and-cdk-8c8"&gt;my original blog post&lt;/a&gt;, here's the short version. I built &lt;a href="https://isitsnowinginhillsboro.com/" rel="noopener noreferrer"&gt;isitsnowinginhillsboro.com&lt;/a&gt; because the existing Portland snow site wasn't accurate for my area. It's a serverless workflow that checks the &lt;a href="https://openweathermap.org/api" rel="noopener noreferrer"&gt;OpenWeatherMap API&lt;/a&gt; every 10 minutes and updates a static S3 site with a YES or NO answer. The original uses a Step Function triggered by EventBridge Scheduler.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Rewrite It?
&lt;/h2&gt;

&lt;p&gt;I think a lot of us have been wondering when you'd pick durable functions over Step Functions. This project was small enough to rewrite quickly, but complex enough to exercise real patterns like API calls, branching logic, parallel execution, and multiple AWS services. Building the same thing both ways seemed like the best way to form my own opinion.&lt;/p&gt;

&lt;p&gt;The durable function version is &lt;a href="https://github.com/deeheber/durable-function-weather-site" rel="noopener noreferrer"&gt;here on GitHub&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  How the Two Approaches Compare
&lt;/h2&gt;

&lt;p&gt;The workflow logic is identical in both versions. Same end result. But the developer experience is pretty different.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step Functions
&lt;/h3&gt;

&lt;p&gt;You define your workflow as a state machine, chaining together states like &lt;code&gt;LambdaInvoke&lt;/code&gt;, &lt;code&gt;Choice&lt;/code&gt;, &lt;code&gt;Pass&lt;/code&gt;, and direct SDK integrations in CDK. The visual representation in the console is nice for understanding the flow at a glance, and it feels very "managed" in the best sense. The service handles state tracking, retries, and transitions for you.&lt;/p&gt;

&lt;p&gt;The tradeoff is that CDK code for Step Functions can get verbose. Passing data between states and setting up error handling means understanding how Step Functions manages its JSON payload. You're giving up some control for the convenience of the service doing the heavy lifting.&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%2F2ixqn0xhadfdekiocnig.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%2F2ixqn0xhadfdekiocnig.png" alt="step function view" width="800" height="440"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Durable functions
&lt;/h3&gt;

&lt;p&gt;With durable functions, you write your workflow as plain TypeScript. Wrap your logic in &lt;code&gt;ctx.step()&lt;/code&gt; calls, use regular &lt;code&gt;if&lt;/code&gt; statements for branching, &lt;code&gt;ctx.parallel()&lt;/code&gt; for parallel execution. Need to call an AWS service? Just use the SDK like you normally would inside a step.&lt;/p&gt;

&lt;p&gt;Here's the thing that surprised me: this version felt more natural to write. I wasn't thinking about "states" or "transitions." I was just writing code. Since it's TypeScript with a thin SDK wrapper, it also feels more portable. If another cloud provider or open source project adopted a similar checkpoint/replay pattern, the mental model (and probably a good chunk of the code) would transfer over.&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%2F70yk3vojbimcb4w6ty4u.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%2F70yk3vojbimcb4w6ty4u.png" alt="durable function view" width="800" height="366"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Side by Side
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Concept&lt;/th&gt;
&lt;th&gt;Step Functions&lt;/th&gt;
&lt;th&gt;Durable functions&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Workflow definition&lt;/td&gt;
&lt;td&gt;JSON/YAML state machine (ASL)&lt;/td&gt;
&lt;td&gt;Plain TypeScript code&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;State management&lt;/td&gt;
&lt;td&gt;Managed by the service&lt;/td&gt;
&lt;td&gt;Automatic checkpointing via SDK&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AWS service calls&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;CallAwsService&lt;/code&gt; task or direct integration&lt;/td&gt;
&lt;td&gt;Regular AWS SDK calls inside &lt;code&gt;ctx.step()&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HTTP calls&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;HttpInvoke&lt;/code&gt; task + Connection resource&lt;/td&gt;
&lt;td&gt;Standard &lt;code&gt;fetch()&lt;/code&gt; inside &lt;code&gt;ctx.step()&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Conditional logic&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;Choice&lt;/code&gt; state&lt;/td&gt;
&lt;td&gt;Plain &lt;code&gt;if&lt;/code&gt; statement&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Parallel execution&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;Parallel&lt;/code&gt; state&lt;/td&gt;
&lt;td&gt;&lt;code&gt;ctx.parallel([...])&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Scheduling&lt;/td&gt;
&lt;td&gt;EventBridge Scheduler -&amp;gt; Step Function&lt;/td&gt;
&lt;td&gt;EventBridge Scheduler -&amp;gt; Lambda&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Infrastructure&lt;/td&gt;
&lt;td&gt;State Machine + Connection + Lambda(s)&lt;/td&gt;
&lt;td&gt;Single Lambda function&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Debugging&lt;/td&gt;
&lt;td&gt;Step Function execution history (visual)&lt;/td&gt;
&lt;td&gt;Durable execution history&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  The Gotcha That Got Me
&lt;/h2&gt;

&lt;p&gt;Durable functions require a &lt;strong&gt;qualified ARN&lt;/strong&gt; for invocation, meaning a published version or alias. When I first wired up EventBridge Scheduler, I was using the unqualified ARN and couldn't figure out why it wasn't working.&lt;/p&gt;

&lt;p&gt;The issue? The CDK &lt;code&gt;LambdaInvoke&lt;/code&gt; scheduler target uses &lt;code&gt;functionArn&lt;/code&gt; under the hood, which for a plain &lt;code&gt;Function&lt;/code&gt; is the unqualified ARN — no version or alias suffix. Durable functions reject unqualified ARNs entirely.&lt;/p&gt;

&lt;p&gt;What ended up working was creating a Lambda alias in CDK and passing that to the scheduler target instead. Since an alias implements &lt;code&gt;IFunction&lt;/code&gt;, the construct picks up its qualified ARN automatically.&lt;/p&gt;

&lt;p&gt;If you're getting started with durable functions and things aren't behaving as expected, check your invocation ARN first.&lt;/p&gt;

&lt;h2&gt;
  
  
  So Which One Should You Use?
&lt;/h2&gt;

&lt;p&gt;In my opinion, both approaches are solid for a workflow like this. It really comes down to developer experience.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If you prefer writing workflows as code&lt;/strong&gt; , durable functions are going to feel great. The code reads like a normal application, the infrastructure footprint is smaller, and the patterns are more transferable if you ever need to move beyond AWS.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If you value visual debugging and a fully managed experience&lt;/strong&gt; , Step Functions has the edge right now. The console gives you a step-by-step view of every execution with clear status indicators. Durable functions have a visual for execution history too, but I prefer how Step Functions handles it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If you need Distributed Map for massive fan-out scenarios&lt;/strong&gt; (up to 10,000 concurrent executions) or rely heavily on Step Functions' 220+ native service integrations, Step Functions is the better option.&lt;/p&gt;

&lt;p&gt;AWS also has &lt;a href="https://docs.aws.amazon.com/lambda/latest/dg/durable-step-functions.html" rel="noopener noreferrer"&gt;official guidance&lt;/a&gt;. One thing I found interesting is they mention that hybrid architectures are totally valid, using durable functions for application-level logic while Step Functions handles higher-level cross-service coordination.&lt;/p&gt;

&lt;h2&gt;
  
  
  Wrapping Up
&lt;/h2&gt;

&lt;p&gt;If you're curious about durable functions, I'd encourage trying it with a project you already have. You'll learn way more than a tutorial can teach you.&lt;/p&gt;

&lt;p&gt;Both repos are open source:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Step Functions version:&lt;/strong&gt; &lt;a href="https://github.com/deeheber/weather-site" rel="noopener noreferrer"&gt;github.com/deeheber/weather-site&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Durable functions version:&lt;/strong&gt; &lt;a href="https://github.com/deeheber/durable-function-weather-site" rel="noopener noreferrer"&gt;github.com/deeheber/durable-function-weather-site&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I'd love to hear from anyone else who's been experimenting with durable functions. Let me know what your experience has been! 🚀&lt;/p&gt;

</description>
      <category>aws</category>
      <category>function</category>
      <category>lambda</category>
      <category>cdk</category>
    </item>
    <item>
      <title>Let an AI Agent Do Your Job Searching</title>
      <dc:creator>Danielle Heberling</dc:creator>
      <pubDate>Sun, 08 Feb 2026 09:12:03 +0000</pubDate>
      <link>https://dev.to/aws-heroes/let-an-ai-agent-do-your-job-searching-558a</link>
      <guid>https://dev.to/aws-heroes/let-an-ai-agent-do-your-job-searching-558a</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Photo by &lt;a href="https://unsplash.com/@markuswinkler?utm\_source=unsplash&amp;amp;utm\_medium=referral&amp;amp;utm\_content=creditCopyText" rel="noopener noreferrer"&gt;Markus Winkler&lt;/a&gt; on &lt;a href="https://unsplash.com/photos/a-typewriter-with-a-job-application-printed-on-it-XKKuY4ottJ0?utm\_source=unsplash&amp;amp;utm\_medium=referral&amp;amp;utm\_content=creditCopyText" rel="noopener noreferrer"&gt;Unsplash&lt;/a&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%2Ff1dlvtuq5eu5we254tuq.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%2Ff1dlvtuq5eu5we254tuq.jpg" alt="Job Application Typewriter" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Quick disclaimer before I get into this: I'm no longer actively job hunting. I started building this project during my last job search and decided to finish what I started. Partly because I wanted to learn more about agents and partly because I think it might be useful for someone else out there. With that out of the way, here's the story.&lt;/strong&gt;&lt;/p&gt;

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

&lt;p&gt;Ever since I started my last job search, one thing kept bugging me. I had a list of "dream companies" that I wanted to work at, and I'd manually go check their career pages every few days to see if anything new popped up. Sometimes daily. Sometimes I'd forget for a week and miss a posting entirely.&lt;/p&gt;

&lt;p&gt;Here's the thing: job searching is already stressful enough without having to remember to check 10+ career pages on a regular cadence. I'd open a browser tab, search around, get distracted by Slack or email, and then forget where I left off. Multiply that by several companies and it becomes a real time sink.&lt;/p&gt;

&lt;p&gt;I kept thinking there has to be a better way. What if something could just watch those companies for me in the background and send me an email when there's an opening that matches what I'm looking for?&lt;/p&gt;

&lt;p&gt;That's when I decided to build it myself.&lt;/p&gt;

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

&lt;p&gt;The &lt;a href="https://github.com/deeheber/job-search-agent" rel="noopener noreferrer"&gt;job-search-agent&lt;/a&gt; is an AI agent built with &lt;a href="https://strandsagents.com" rel="noopener noreferrer"&gt;Strands Agents&lt;/a&gt; and deployed to &lt;a href="https://docs.aws.amazon.com/bedrock-agentcore/latest/devguide/agents-tools-runtime.html" rel="noopener noreferrer"&gt;Amazon Bedrock AgentCore Runtime&lt;/a&gt;. You give it a company name (and optionally a job title or location filter), and it searches the web for open positions at that company. Then it returns what it finds with links to the actual job postings.&lt;/p&gt;

&lt;p&gt;You can also set it up to run on a schedule and optionally send you email alerts when a company is hiring. That's the part I was most excited about.&lt;/p&gt;

&lt;h2&gt;
  
  
  Design Decisions
&lt;/h2&gt;

&lt;p&gt;Here's how the architecture works at a high level:&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%2Fros1vxwejq6b1rhm2332.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%2Fros1vxwejq6b1rhm2332.png" alt="Job Search Architecture" width="800" height="252"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;EventBridge Scheduler&lt;/strong&gt; kicks things off on whatever cadence you configure. This triggers the agent running in &lt;strong&gt;AgentCore Runtime&lt;/strong&gt; , which is where the Strands agent lives. The agent does its thing (searching for jobs at the companies you've specified), and if you've provided one or more email addresses in the environment variables and there is a job posting, it sends the results via &lt;strong&gt;SNS&lt;/strong&gt; as an email notification.&lt;/p&gt;

&lt;p&gt;The infrastructure is all defined in CDK (TypeScript), and the agent code is Python. I talked about why I use that particular combo in my &lt;a href="https://danielleheberling.xyz/blog/strands-agent-template/" rel="noopener noreferrer"&gt;strands-agent-template post&lt;/a&gt;, but the short version is that each framework is strongest in its native language right now.&lt;/p&gt;

&lt;p&gt;Is this a bit over-engineered for what it does? Most likely. But I wanted to use the opportunity to build something I'd actually use while learning about agents and AgentCore. In my experience, the best way to learn new tech is to solve a real problem with it, even if the solution is fancier than it needs to be.&lt;/p&gt;

&lt;h2&gt;
  
  
  Challenges
&lt;/h2&gt;

&lt;p&gt;When I first started building this, I took what felt like the simplest approach. I put instructions in the agent's system prompt to construct the career page URLs for each company. Something along the lines of "for company X, try going to company.com/careers and look for job postings."&lt;/p&gt;

&lt;p&gt;This didn't work well at all.&lt;/p&gt;

&lt;p&gt;The agent would guess at URLs that didn't exist, hallucinate job listings, and burn through a ton of tokens trying to figure out where the careers page actually was. Some companies have their postings on Greenhouse. Others use Lever, Ashby, or their own custom systems. There's no standard for this, and asking an LLM to guess the right URL is a recipe for frustration.&lt;/p&gt;

&lt;p&gt;So I decided to build a tool for the agent to use instead. During that research, I came across &lt;a href="https://www.tavily.com/" rel="noopener noreferrer"&gt;Tavily&lt;/a&gt;, which is a search API built specifically for AI agents. Even better, Strands already had a pre-built Tavily tool available. I plugged it in, and the difference was night and day. Instead of guessing URLs, the agent now searches the web for actual career pages and job boards, then extracts the relevant information from those results.&lt;/p&gt;

&lt;p&gt;This was a good reminder for me that agents are only as useful as the tools you give them. The LLM is great at reasoning and formatting responses, but it shouldn't be doing the heavy lifting of web searching through prompt instructions alone.&lt;/p&gt;

&lt;p&gt;There was one more quirk worth mentioning. EventBridge Scheduler supports &lt;a href="https://docs.aws.amazon.com/scheduler/latest/UserGuide/managing-targets-universal.html" rel="noopener noreferrer"&gt;universal targets&lt;/a&gt;, which let you call pretty much any AWS API action directly without needing a Lambda function in between. You just give it the service ARN and the request payload, and it makes the API call for you. There's a &lt;a href="https://docs.aws.amazon.com/scheduler/latest/UserGuide/managing-targets-universal.html#unsupported-api-actions" rel="noopener noreferrer"&gt;list of unsupported action prefixes&lt;/a&gt; in the docs (things like &lt;code&gt;get&lt;/code&gt;, &lt;code&gt;describe&lt;/code&gt;, &lt;code&gt;list&lt;/code&gt;). Interestingly, &lt;code&gt;invokeModel&lt;/code&gt; is explicitly blocked, but &lt;code&gt;invokeAgentRuntime&lt;/code&gt; is not.&lt;/p&gt;

&lt;p&gt;So I set up EventBridge Scheduler to call the Bedrock AgentCore &lt;code&gt;invokeAgentRuntime&lt;/code&gt; action on a schedule. And it works. The agent gets invoked, does its thing, and returns results. But for some reason, EventBridge Scheduler &lt;em&gt;thinks&lt;/em&gt; the invocation failed. Every single time.&lt;/p&gt;

&lt;p&gt;If you leave retries enabled, the scheduler will retry the invocation multiple times even though the first call succeeded. That means your agent runs (and costs you money) three or four times instead of once. Also you may get duplicate email notifications. Not great.&lt;/p&gt;

&lt;p&gt;My workaround was to disable retries on the scheduler and set up a Dead Letter Queue (DLQ) to capture these "failed" invocations so I can monitor them. I'm honestly not sure if this is something I'm doing wrong or if it's a quirk on the AWS side that'll get fixed eventually. AgentCore is still pretty new, so it's possible this just hasn't been ironed out yet. If you've run into something similar, I'd love to hear about it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Outcome
&lt;/h2&gt;

&lt;p&gt;After getting Tavily integrated, the agent started returning real job listings with real links. I set up EventBridge to run the searches on a schedule and configured SNS to email me the results.&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%2F9wx207v7wi6g0zg9h9oh.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%2F9wx207v7wi6g0zg9h9oh.png" alt="Job Search Results Email" width="800" height="453"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The time savings were immediately obvious. Instead of spending 30+ minutes bouncing between career pages every few days, I'd get an email in my inbox with a summary of who's hiring and links directly to the postings. Even when nothing new showed up, it was nice to not wonder if I'd missed something.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Note on Cost
&lt;/h2&gt;

&lt;p&gt;If you decide to deploy this yourself, keep in mind that it will cost you money. Specifically:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Bedrock usage&lt;/strong&gt; is the main cost driver here. Every time the agent runs, it's making calls to a foundation model, and those tokens add up. How much depends on how many companies you're monitoring and how often the scheduler runs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tavily&lt;/strong&gt; has a free tier that's pretty generous for personal use, but if you're running searches frequently or monitoring a lot of companies, you could exceed it. Keep an eye on your usage.&lt;/p&gt;

&lt;p&gt;I'd recommend starting with a low frequency schedule (maybe once a day or even once a week) and a small list of companies to get a feel for the costs before scaling up.&lt;/p&gt;

&lt;p&gt;Everything else in the stack (AgentCore Runtime, EventBridge Scheduler, SNS) will likely fall within the AWS free tier for personal use. But "likely" isn't a guarantee, so check the &lt;a href="https://aws.amazon.com/pricing/" rel="noopener noreferrer"&gt;pricing pages&lt;/a&gt; against the usage you expect before deploying.&lt;/p&gt;

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

&lt;p&gt;I think the biggest takeaway from this project is that building something you actually need is still the best way to learn new tech. I could have followed a tutorial to build a generic chatbot, but because this was solving a real problem for me, I was way more motivated to push through the frustrating parts.&lt;/p&gt;

&lt;p&gt;If you're curious about agents but not sure where to start, I'd suggest finding a small, annoying, repetitive task in your life and trying to automate it. It doesn't have to be fancy. The learning happens in the process of figuring out what works and what doesn't.&lt;/p&gt;

&lt;h2&gt;
  
  
  Give It a Try
&lt;/h2&gt;

&lt;p&gt;The full source code is on &lt;a href="https://github.com/deeheber/job-search-agent" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;. It includes instructions for running locally and deploying to AWS.&lt;/p&gt;

&lt;p&gt;If you're currently job hunting and this looks useful, take it for a spin. If you find bugs or have ideas for improvements, open an issue or submit a PR. I'm curious to hear what other folks build with it.&lt;/p&gt;

&lt;p&gt;Good luck out there 💪&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>aws</category>
      <category>tools</category>
    </item>
    <item>
      <title>A Strands Agent Template (For the Impatient)</title>
      <dc:creator>Danielle Heberling</dc:creator>
      <pubDate>Fri, 23 Jan 2026 10:12:03 +0000</pubDate>
      <link>https://dev.to/aws-heroes/a-strands-agent-template-for-the-impatient-412j</link>
      <guid>https://dev.to/aws-heroes/a-strands-agent-template-for-the-impatient-412j</guid>
      <description>&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%2Fgzltu4cbgie1px0jj2zh.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%2Fgzltu4cbgie1px0jj2zh.jpg" alt="Puzzle" width="800" height="538"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Photo by &lt;a href="https://unsplash.com/@ttepavac?utm\_source=unsplash&amp;amp;utm\_medium=referral&amp;amp;utm\_content=creditCopyText" rel="noopener noreferrer"&gt;Tanja Tepavac&lt;/a&gt; on &lt;a href="https://unsplash.com/photos/a-piece-of-a-puzzle-with-a-missing-piece-cWMhxNmQVq0?utm\_source=unsplash&amp;amp;utm\_medium=referral&amp;amp;utm\_content=creditCopyText" rel="noopener noreferrer"&gt;Unsplash&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Ever since AWS announced &lt;a href="https://docs.aws.amazon.com/bedrock-agentcore/latest/devguide/agents-tools-runtime.html" rel="noopener noreferrer"&gt;Bedrock AgentCore Runtime&lt;/a&gt; back in July 2025, I've been experimenting with deploying agents to production. The hype around "agentic AI" is everywhere, but most examples I found were either too simple or way too complex for what I actually needed.&lt;/p&gt;

&lt;p&gt;Here's what I wanted 👉 a way to go from zero to a deployed agent on AWS without spending three days on infrastructure setup. So I built a template that does exactly that.&lt;/p&gt;

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

&lt;p&gt;The &lt;a href="https://github.com/deeheber/strands-agent-template" rel="noopener noreferrer"&gt;strands-agent-template&lt;/a&gt; repo is a GitHub template that gives you everything you need to deploy a &lt;a href="https://strandsagents.com/latest/" rel="noopener noreferrer"&gt;Strands agent&lt;/a&gt; to Amazon Bedrock AgentCore Runtime. Click "Use this template" and you're most of the way there.&lt;/p&gt;

&lt;p&gt;What's included:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ Production-ready CDK infrastructure with IAM, logging, and tracing&lt;/li&gt;
&lt;li&gt;✅ Local development setup so you can test before deploying&lt;/li&gt;
&lt;li&gt;✅ GitHub Actions for CI/CD&lt;/li&gt;
&lt;li&gt;✅ OpenTelemetry observability built in&lt;/li&gt;
&lt;li&gt;✅ Testing, linting, and formatting configured&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why Python + TypeScript?
&lt;/h2&gt;

&lt;p&gt;I went with Python for the agent code and TypeScript for infrastructure. This isn't because I love context switching (I don't), but because each framework is strongest in its native language. Strands has great Python support and documentation, while CDK is cleanest in TypeScript.&lt;/p&gt;

&lt;p&gt;As these frameworks mature, I might consolidate to one language. But for now, this combo gives you access to the best libraries and examples for both.&lt;/p&gt;

&lt;h2&gt;
  
  
  Quick Start
&lt;/h2&gt;

&lt;p&gt;If you just want to see it work after setting up the AWS CLI and configuring credentials:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Test locally
cd agent &amp;amp;&amp;amp; source .venv/bin/activate &amp;amp;&amp;amp; python src/agentcore_app.py
# Test in another terminal
curl -X POST http://localhost:8080/invocations -H "Content-Type: application/json" -d '{"prompt": "What is 42 * 137?"}'
# Deploy to AWS
cd cdk &amp;amp;&amp;amp; npm install &amp;amp;&amp;amp; npm run build &amp;amp;&amp;amp; npm run cdk:deploy

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

&lt;/div&gt;



&lt;p&gt;The template comes with a basic example agent. Replace it with your own logic and you're done. Under 10 minutes from clone to deployed.&lt;/p&gt;

&lt;h2&gt;
  
  
  What You Actually Get
&lt;/h2&gt;

&lt;p&gt;Here's what stood out to me after using this in a few projects.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Local testing that doesn't lie.&lt;/strong&gt; You can run your agent locally before deploying anything to AWS. This matters more than you'd think. I've wasted too much time debugging issues that only showed up after deployment.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Observability without the extra work.&lt;/strong&gt; CloudWatch logs and OpenTelemetry tracing are configured out of the box. When something breaks (and it will), you can actually figure out why.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;CI/CD that works.&lt;/strong&gt; GitHub Actions run your tests on every push. Both Python and TypeScript tooling is configured. It catches the obvious stuff before you deploy.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  If You're Just Getting Started
&lt;/h2&gt;

&lt;p&gt;If this is your first time deploying an agent to AWS, here's what I'd focus on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Start by running the example locally. Don't deploy anything yet. Get familiar with how Strands agents work.&lt;/li&gt;
&lt;li&gt;Then make a tiny change to the agent logic. See how it behaves. Break something on purpose and watch what happens.&lt;/li&gt;
&lt;li&gt;Only then deploy to AWS. Use the CloudWatch dashboard to see what your agent is actually doing.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The template includes detailed deployment docs in the DEPLOYMENT.md file. I tried to write them for someone who hasn't used CDK or AgentCore before.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's Next
&lt;/h2&gt;

&lt;p&gt;I'm actively using this template for a few projects, so it'll keep evolving based on what I learn. If you find gaps or have suggestions, open an issue or submit a PR. The CONTRIBUTING.md file has guidelines.&lt;/p&gt;

&lt;p&gt;This is meant to be a starting point, not a finished product. Take it, modify it, make it yours.&lt;/p&gt;

&lt;p&gt;You can find the template on &lt;a href="https://github.com/deeheber/strands-agent-template" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Let me know if you use it. I'm curious what works and what doesn't for other folks trying to deploy agents on AWS.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>aws</category>
      <category>agentcore</category>
    </item>
    <item>
      <title>Use Social Media Mindfully</title>
      <dc:creator>Danielle Heberling</dc:creator>
      <pubDate>Sat, 17 Jan 2026 10:12:03 +0000</pubDate>
      <link>https://dev.to/deeheber/use-social-media-mindfully-1596</link>
      <guid>https://dev.to/deeheber/use-social-media-mindfully-1596</guid>
      <description>&lt;p&gt;I quit Facebook in 2020 when a former coworker was spreading misinformation about what was happening in Portland, OR. He'd never been there and had no plans to visit. I was literally living in Portland at the time, telling him what I was seeing firsthand, but that didn't matter to him. That was it for me. I miss it sometimes, but mostly I don't.&lt;/p&gt;

&lt;p&gt;Here's what I've noticed since then: the heyday of social media feels like it's behind us. In my opinion, Facebook peaked in 2008. Back then, it was about connecting with friends, sharing actually interesting updates about our lives. Minimal ads. It felt genuine.&lt;/p&gt;

&lt;p&gt;Now? Wannabe influencers everywhere. More ads and brand accounts in your timeline than content from people you actually know. Bots running campaigns to get engagement through false things or distortions of reality. It's exhausting.&lt;/p&gt;

&lt;p&gt;But here's the thing: I'm not saying abandon social media entirely. I'm saying use it differently.&lt;/p&gt;

&lt;h2&gt;
  
  
  How I Think About Social Media Now
&lt;/h2&gt;

&lt;p&gt;I'm not scrolling feeds endlessly anymore. No traps of getting lost in reels or stories. I use &lt;a href="https://buffer.com/" rel="noopener noreferrer"&gt;Buffer&lt;/a&gt; to schedule posts, which keeps me from even looking at a timeline. I check in with intention when I need to, then I'm out. This one's harder than it sounds, but it makes a real difference in how much time you lose to these platforms.&lt;/p&gt;

&lt;p&gt;With that said, social media still works for connections. DMs are good. Having actual conversations in comments is good. Longer discussions where you're genuinely exchanging ideas? Even better. This is where I think the platforms still have value if you're intentional about it.&lt;/p&gt;

&lt;p&gt;I try to share things that might help someone else. Good articles I've read. Things I'm learning. Mistakes I've made. If it could save one person some time or frustration, it's worth sharing. The stuff you've learned the hard way, the patterns you're seeing in your day job...not to build a personal brand or chase engagement metrics, but because someone else is probably dealing with the same problems.&lt;/p&gt;

&lt;p&gt;If you're job hunting, LinkedIn especially can help you connect with the right people. It's not your whole career strategy, but it's a useful tool when you need it.&lt;/p&gt;

&lt;p&gt;Here's where I think we've lost the plot though: we've forgotten that coffee with friends to catch up beats any social media interaction. Travel somewhere to see people you care about. Those face-to-face conversations are what actually matter.&lt;/p&gt;

&lt;h2&gt;
  
  
  What This Actually Looks Like
&lt;/h2&gt;

&lt;p&gt;For me, this means I spend my time learning, reading, and building things. When I do post, it's usually because I want to hear what other people think about something I'm working through. Or I've hit a problem that took me way too long to solve and I figure sharing it might save someone else the trouble.&lt;/p&gt;

&lt;p&gt;I'm not trying to go viral. I'm not optimizing for engagement. I'm definitely not checking how many likes something got.&lt;/p&gt;

&lt;p&gt;The goal is simple: be helpful. Connect with people who are thinking about similar problems. Have real conversations, even if they happen in threads or comment sections. That's what matters and what I'm focused on in 2026.&lt;/p&gt;

&lt;p&gt;Spend your time learning, reading, and building things. Use social media when it serves a purpose. Skip it when it doesn't.&lt;/p&gt;

&lt;p&gt;What's your approach? I'd be curious to hear how other people are thinking about this stuff.&lt;/p&gt;

</description>
      <category>community</category>
      <category>socialmedia</category>
      <category>internet</category>
      <category>communication</category>
    </item>
    <item>
      <title>How You Do It Matters</title>
      <dc:creator>Danielle Heberling</dc:creator>
      <pubDate>Wed, 19 Nov 2025 15:12:03 +0000</pubDate>
      <link>https://dev.to/deeheber/how-you-do-it-matters-3nhn</link>
      <guid>https://dev.to/deeheber/how-you-do-it-matters-3nhn</guid>
      <description>&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%2Fig4e06t8qjx7cjeuxx0b.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%2Fig4e06t8qjx7cjeuxx0b.jpg" alt="Winding path" width="640" height="480"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Photo by &lt;a href="https://unsplash.com/@jack\_anstey?utm\_source=unsplash&amp;amp;utm\_medium=referral&amp;amp;utm\_content=creditCopyText" rel="noopener noreferrer"&gt;Jack Anstey&lt;/a&gt; on &lt;a href="https://unsplash.com/photos/aerial-photography-of-road-zS4lUqLEiNA?utm\_source=unsplash&amp;amp;utm\_medium=referral&amp;amp;utm\_content=creditCopyText" rel="noopener noreferrer"&gt;Unsplash&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Looking back on my career, the connections and opportunities I value most weren't the result of optimizing for speed. They grew from taking the long view.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;How&lt;/em&gt; you do it matters just as much as &lt;em&gt;what&lt;/em&gt; you do.&lt;/p&gt;

&lt;p&gt;Take professional networking, for example. I've found that showing up consistently to community events, contributing even when I don't need anything, has led to the most meaningful connections and opportunities. That might look like speaking at a meetup, volunteering to help organize one, reviewing someone's resume, or answering career questions in Slack. Similarly, I'm drawn to organizations where solving real user problems is at the heart of what we build.&lt;/p&gt;

&lt;p&gt;I once worked at a startup where the CEO's departing words really stuck with me. This man was far from perfect, but I enjoyed working with him professionally and did it twice, mostly because of our alignment on what matters.&lt;/p&gt;

&lt;p&gt;Here's what he said upon his departure.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;As you continue to grow without me, I'd ask you to keep one thing in mind: the way we do it matters. We haven't gotten here because we're the cleverest copywriters, the fastest programmers, or the slickest sales people. We don't work sixteen hour days, and we're not ruthless or cutthroat. We're kind. We care about each other. We bring out the best of each other's strengths, and we bridge each other's weaknesses. We create opportunities to experiment and take risks. We're humble. And we're better for it.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Of course, pragmatic tradeoffs are part of the job. I can move fast when needed, whether that's shipping a quick fix to unblock progress or meeting a tight deadline. The key is being intentional: planning to address the root cause rather than letting temporary solutions pile up. It's about being honest with yourself and your team about what you're doing and why.&lt;/p&gt;

&lt;p&gt;In an age of viral videos for quick wins, I know it can be challenging to play the long game...but I encourage you to consider it.&lt;/p&gt;

&lt;p&gt;This approach has led me to opportunities and relationships I wouldn't trade for anything. If you're wondering whether it's worth it to take a more intentional approach - I'd say give it a shot and see where it takes you.&lt;/p&gt;

</description>
      <category>career</category>
      <category>networking</category>
      <category>community</category>
    </item>
    <item>
      <title>Learning Outside Your Specialty | Why I Got a Kubernetes Cert</title>
      <dc:creator>Danielle Heberling</dc:creator>
      <pubDate>Sun, 12 Oct 2025 10:12:03 +0000</pubDate>
      <link>https://dev.to/deeheber/learning-outside-your-specialty-why-i-got-a-kubernetes-cert-5aj0</link>
      <guid>https://dev.to/deeheber/learning-outside-your-specialty-why-i-got-a-kubernetes-cert-5aj0</guid>
      <description>&lt;p&gt;Earlier this month I took the exam for the &lt;a href="https://training.linuxfoundation.org/certification/kubernetes-cloud-native-associate/" rel="noopener noreferrer"&gt;Kubernetes and Cloud Native Associate (KCNA) certification&lt;/a&gt; and passed.&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%2F2ph65226dyo9webtcptg.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%2F2ph65226dyo9webtcptg.png" alt="KCNA Badge" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After years of working in AWS Serverless, this raised some eyebrows. People asked: why?&lt;/p&gt;

&lt;p&gt;Here's the honest answer: I've passed on applying to jobs because I didn't know Kubernetes (K8s). That needed to change.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Reality of Job Postings
&lt;/h2&gt;

&lt;p&gt;Look at DevOps and platform engineering roles today. Many of them want AWS experience, serverless knowledge, AND K8s expertise. Not all, but enough that it's a pattern.&lt;/p&gt;

&lt;p&gt;Specializing deeply in serverless has been valuable for my career. But at some point, gaps in your knowledge start closing doors. When I'm scanning job postings and thinking "I could do this role, except for that one requirement," it's time to consider filling the gap.&lt;/p&gt;

&lt;p&gt;This isn't about chasing every new technology. It's about recognizing when a skill has become common enough in your field that not having it limits options.&lt;/p&gt;

&lt;h2&gt;
  
  
  What "Best Tool for the Job" Actually Means
&lt;/h2&gt;

&lt;p&gt;I still believe in "serverless first." But here's what I've learned: the best tool depends on context.&lt;/p&gt;

&lt;p&gt;At the end of the day, users care that what you build is reliable, works, and solves their problem. Unless they're an engineer or tech geek, they don't care if you used K8s or serverless. They care about the outcome.&lt;/p&gt;

&lt;p&gt;Tech decisions are made by people. People make choices based on their experiences and what they know. A lot of teams use K8s. Whether they "need" it is a value judgment that depends entirely on your perspective and experience. That's not what this post is about.&lt;/p&gt;

&lt;p&gt;What I've realized: if I'm working with a team that's chosen K8s, fighting against that to use serverless creates friction. Understanding their world helps me work with them effectively, even if I'd make different choices.&lt;/p&gt;

&lt;p&gt;This isn't about one technology being better than the other. It's about understanding enough of both to collaborate with different teams and make informed decisions when I do have a choice.&lt;/p&gt;

&lt;h2&gt;
  
  
  K8s Is Complex, But Learnable
&lt;/h2&gt;

&lt;p&gt;People aren't wrong when they say K8s is complex. It is. There are a lot of moving parts.&lt;/p&gt;

&lt;p&gt;But here's what studying for the KCNA taught me: if you take the time to understand the components and how they fit together, it's not magic. It's learnable. Breaking it down into pieces makes it manageable.&lt;/p&gt;

&lt;p&gt;The complexity isn't a reason to avoid it. It's just a reason to approach it systematically.&lt;/p&gt;

&lt;h2&gt;
  
  
  My Advice: Depth First, Then Breadth
&lt;/h2&gt;

&lt;p&gt;If someone asked me "should I learn K8s?" a year ago, I would have said: &lt;strong&gt;get really good at one thing first.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Master the fundamentals of whatever stack you're working in. Build that depth. Then expand your toolbelt.&lt;/p&gt;

&lt;p&gt;Trying to learn everything at once means you'll be mediocre at many things instead of excellent at one. Depth first, breadth later.&lt;/p&gt;

&lt;p&gt;Disclaimer: this is what works for me. Your situation might be different, and that's okay.&lt;/p&gt;

&lt;p&gt;That's what this K8s certification represents for me. Not abandoning serverless or becoming a "K8s person." Just adding another tool to solve different problems.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's Next
&lt;/h2&gt;

&lt;p&gt;The plan is to complete the &lt;a href="https://cloudresumechallenge.dev/docs/extensions/kubernetes-challenge/" rel="noopener noreferrer"&gt;Kubernetes Resume Challenge&lt;/a&gt; and build some personal projects. The goal is practical knowledge, not just cert credentials.&lt;/p&gt;

&lt;p&gt;Honestly, it's been fun to be a beginner again.&lt;/p&gt;

&lt;p&gt;I'd love to hear from you: Have you learned outside your specialty? What pushed you to do it, and what did you learn in the process?&lt;/p&gt;

</description>
      <category>cloud</category>
      <category>kubernetes</category>
      <category>containers</category>
      <category>certifications</category>
    </item>
    <item>
      <title>Most Valuable When Least Visible | The Security Paradox</title>
      <dc:creator>Danielle Heberling</dc:creator>
      <pubDate>Wed, 18 Jun 2025 10:12:03 +0000</pubDate>
      <link>https://dev.to/aws-heroes/most-valuable-when-least-visible-the-security-paradox-48nm</link>
      <guid>https://dev.to/aws-heroes/most-valuable-when-least-visible-the-security-paradox-48nm</guid>
      <description>&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%2F8fboi04zi6afdsbfsod8.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%2F8fboi04zi6afdsbfsod8.jpg" alt="Computer Lock" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Photo by &lt;a href="https://unsplash.com/@flyd2069?utm\_content=creditCopyText&amp;amp;utm\_medium=referral&amp;amp;utm\_source=unsplash" rel="noopener noreferrer"&gt;FlyD&lt;/a&gt; on &lt;a href="https://unsplash.com/photos/pink-and-silver-padlock-on-black-computer-keyboard-F7aZ8G7gGBQ?utm\_content=creditCopyText&amp;amp;utm\_medium=referral&amp;amp;utm\_source=unsplash" rel="noopener noreferrer"&gt;Unsplash&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

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

&lt;p&gt;Tale as old as time: the friction between building out new features and the foundations necessary to deliver those features. By foundations, I'm referring to things such as but not limited to: security, testing, Continuous Integration/Continuous Delivery, observability, and Infrastructure as Code.&lt;/p&gt;

&lt;p&gt;Recently I attended &lt;a href="https://reinforce.awsevents.com/" rel="noopener noreferrer"&gt;AWS re:Inforce&lt;/a&gt;, an AWS security focused conference. Speaking with fellow attendees it was very common for people ask some variant of "how can I get people in my organization to care about security?"&lt;/p&gt;

&lt;p&gt;Disclaimer that I do not consider myself a security person™️, but I do champion security initiatives often. Security is everyone's responsibility. Sometimes in the real world people get excited about new features and forget about less visible things such as security.&lt;/p&gt;

&lt;p&gt;Here are some of my thoughts in the form of unsolicited advice on how I attempt to navigate this.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Just Do It
&lt;/h2&gt;

&lt;p&gt;If you work in an organization that gives you the freedom to allocate your time to projects beyond what is officially committed to in the sprint, just do it. Then once it's finished, you can share with your team what you did, how it works, and why it's important.&lt;/p&gt;

&lt;p&gt;It is often faster to just do it rather than spend the same amount of time asking for permission. Especially at smaller early stage startups, delivering results speak louder than words.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. View Yourself as an Enabler
&lt;/h2&gt;

&lt;p&gt;Security is often (and mistakenly) seen as an obstacle to rapid feature development. I suggest reframing the conversation to highlight how security actually empowers the team to deliver features more quickly.&lt;/p&gt;

&lt;p&gt;Many security measures may not seem urgent now, but by the time they are, it’s often too late. Focus on communicating the value of being proactive instead of reactive.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Learn Incentives
&lt;/h2&gt;

&lt;p&gt;Incentives influence our perspectives and priorities. Invest time in understanding key stakeholders, especially decision-makers, to learn what drives them and what matters most to them.&lt;/p&gt;

&lt;p&gt;This understanding will help you frame your arguments more effectively when proposing needs that don’t have the allure of a shiny new feature.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bonus: Get Involved in the Community
&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%2Fmzxu0vu9wyhoiiwvkfh4.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%2Fmzxu0vu9wyhoiiwvkfh4.jpg" alt="AWS Community at Reinforce" width="800" height="602"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As tech professionals, it’s easy to find ourselves working in silos within our organizations. But the more I connect with colleagues outside of my current company, the more I discover that the challenges I’m facing have often already been solved by someone else.&lt;/p&gt;

&lt;p&gt;Why reinvent the wheel when we can learn from each other’s experiences - and share our own insights to help others grow? Engage in conversations, exchange ideas, and don’t hesitate to ask questions, even if they seem basic. Often, those “simple” questions lead to the most valuable discussions and solutions.&lt;/p&gt;

&lt;p&gt;In person conferences aren't your thing? Shameless plug to check out the &lt;a href="https://www.believeinserverless.com/" rel="noopener noreferrer"&gt;Believe in Serverless Community on Discord&lt;/a&gt;!&lt;/p&gt;

&lt;h2&gt;
  
  
  Closing
&lt;/h2&gt;

&lt;p&gt;Ultimately, trust is the foundation of successful software. When it’s present, it’s invisible; when it’s missing, it becomes impossible to ignore. Once broken, trust is incredibly difficult to rebuild—especially for early-stage startups still working to establish their reputation. If users can’t trust your product, they won’t use it.&lt;/p&gt;

&lt;p&gt;I’m not claiming to have all the answers when it comes to security, but I hope sharing these thoughts sparks reflection or helps someone else feel less alone in facing these challenges. Your efforts to prioritize security truly matter, even when they go unseen. Keep pushing forward and championing the importance of strong foundations.&lt;/p&gt;

&lt;p&gt;I’d love to hear from you: What strategies or insights have helped you balance the tension between shipping new features and building secure, reliable products? &lt;br&gt; &lt;br&gt;&lt;/p&gt;

</description>
      <category>cloud</category>
      <category>security</category>
      <category>community</category>
    </item>
    <item>
      <title>AWS Fargate on a Budget</title>
      <dc:creator>Danielle Heberling</dc:creator>
      <pubDate>Tue, 18 Feb 2025 11:12:03 +0000</pubDate>
      <link>https://dev.to/aws-heroes/aws-fargate-on-a-budget-489j</link>
      <guid>https://dev.to/aws-heroes/aws-fargate-on-a-budget-489j</guid>
      <description>&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%2Fdanielleheberling.xyz%2Fassets%2Fbudget.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%2Fdanielleheberling.xyz%2Fassets%2Fbudget.jpg" alt="Money counting" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Photo by &lt;a href="https://unsplash.com/@sharonmccutcheon?utm\_content=creditCopyText&amp;amp;utm\_medium=referral&amp;amp;utm\_source=unsplash" rel="noopener noreferrer"&gt;Alexander Grey&lt;/a&gt; on &lt;a href="https://unsplash.com/photos/focus-photography-of-person-counting-dollar-banknotes--8a5eJ1-mmQ?utm\_content=creditCopyText&amp;amp;utm\_medium=referral&amp;amp;utm\_source=unsplash" rel="noopener noreferrer"&gt;Unsplash&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  The Business Problem
&lt;/h2&gt;

&lt;p&gt;At the day job, there's a new application that needs to be deployed in a manner that meets these requirements:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the code is server side and it needs to run longer than 15 minutes&lt;/li&gt;
&lt;li&gt;this is an internal use app, it can tolerate occasional disruptions&lt;/li&gt;
&lt;li&gt;non-engineering stakeholders should be able to access this application&lt;/li&gt;
&lt;li&gt;the application will be used by fewer then 10 people and there will be periods of time where no one will be using it&lt;/li&gt;
&lt;li&gt;it is faster to get approval if we use Amazon Web Services, because we currently use AWS heavily&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  A Solution
&lt;/h2&gt;

&lt;p&gt;For non-disclosure agreement and security reasons this is a variation of the solution, not the exact solution.&lt;/p&gt;

&lt;p&gt;It includes the following:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;One Fargate Spot instance behind an Application Load Balancer&lt;/li&gt;
&lt;li&gt;Two EventBridge Scheduler schedules that turn the Fargate Spot instances on at a specified time and off at a specified time&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Disclaimer: this is not the only way to accomplish this.&lt;/p&gt;

&lt;h2&gt;
  
  
  Architecture Diagram and Example Code
&lt;/h2&gt;

&lt;p&gt;Here's the high level architecture diagram of this solution.&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%2Fuo7qji0nl02mo97krj3r.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%2Fuo7qji0nl02mo97krj3r.png" alt="Fargate Scheduler Architecture" width="800" height="537"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Example code with instructions on how to deploy this into your AWS account, can be found in &lt;a href="https://github.com/deeheber/fargate-on-a-budget-demo" rel="noopener noreferrer"&gt;this GitHub repo&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Disclaimer: in this example, we are using a demo Docker image. If you are setting up an application that contains information that shouldn't be open to the public internet, ensure that authentication is in place. Authentication has been intentionally omitted, because it is not the focus of this article.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Let's zoom in a bit closer on the two major components of this solution:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Fargate Spot&lt;/li&gt;
&lt;li&gt;EventBridge Scheduler&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Fargate Spot
&lt;/h2&gt;

&lt;p&gt;With Fargate there are two capacity provider types: Fargate and Fargate Spot.&lt;/p&gt;

&lt;p&gt;Fargate is the standard which gives you on-demand access to containerized compute.&lt;/p&gt;

&lt;p&gt;Fargate Spot is similar to Fargate, but cheaper (advertised as up to 70% discounted) and can be interrupted by AWS. The reason for this is because AWS operates at a massive scale and lots of times there are instances available that will run and cost AWS money regardless. In order to make money off of this extra capacity, AWS offers this extra capacity as Spot instances at a discounted rate. Because AWS might need this capacity back as demand rises, they reserve the right to give you a two minute warning before shutting down your instance to put it back into the regular Fargate on-demand pool.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://aws.amazon.com/blogs/aws/aws-fargate-spot-now-generally-available/" rel="noopener noreferrer"&gt;The launch blog post&lt;/a&gt; has an excellent overview for an AWS official description.&lt;/p&gt;

&lt;p&gt;Launching a Fargate Spot instance involves 1. launching it and 2. setting up the container to handle a graceful shutdown given a two minute warning from AWS.&lt;/p&gt;

&lt;h3&gt;
  
  
  Launch the Instance
&lt;/h3&gt;

&lt;p&gt;The example code uses the &lt;a href="https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_ecs_patterns.ApplicationLoadBalancedFargateService.html" rel="noopener noreferrer"&gt;&lt;code&gt;ApplicationLoadBalancedFargateService&lt;/code&gt;&lt;/a&gt; CDK construct.&lt;/p&gt;

&lt;p&gt;You can specify one or multiple capacity providers with the &lt;code&gt;capacityProviderStrategies&lt;/code&gt; property with weights. The higher the weight, the more often that launch type will be utilized.&lt;/p&gt;

&lt;p&gt;The example code sets things up to prefer Spot, but to use a regular Fargate launch type in case there is no Spot availability.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;capacityProviderStrategies: [
          {
            capacityProvider: 'FARGATE_SPOT',
            weight: 50,
          },
          // Backup in case FARGATE_SPOT is not available
          {
            capacityProvider: 'FARGATE',
            weight: 1,
          },
        ],

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

&lt;/div&gt;



&lt;h3&gt;
  
  
  Handle Graceful Shutdowns
&lt;/h3&gt;

&lt;p&gt;In the example code, this is done in two places:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Adds a &lt;code&gt;stopTimeout&lt;/code&gt; to the container on the Fargate Task for 120 seconds (needs to be &amp;lt;= 2 minutes)&lt;/li&gt;
&lt;li&gt;Sets the deregistration delay on the Application Load Balancer at 30 seconds to give the instance time to separate from the Load Balancer before terminating (also needs to be &amp;lt;= 2 minutes)&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  EventBridge Scheduler
&lt;/h2&gt;

&lt;p&gt;In the example, there are two EventBridge Scheduler schedules - "up" and "down".&lt;/p&gt;

&lt;p&gt;This is accomplished by using an AWS CLI command to set the &lt;code&gt;desiredCount&lt;/code&gt; on the ECS Service to either &lt;code&gt;1&lt;/code&gt; (on/up) or &lt;code&gt;0&lt;/code&gt; (off/down). Here's &lt;a href="https://awscli.amazonaws.com/v2/documentation/api/2.1.21/reference/ecs/update-service.html" rel="noopener noreferrer"&gt;the official documentation for the command&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If this command were run on the command line via the AWS CLI it would look something like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;aws ecs update-service --cluster &amp;lt;cluster-name&amp;gt; --service &amp;lt;service-name&amp;gt; --desired-count &amp;lt;desired-count-int&amp;gt;

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

&lt;/div&gt;



&lt;p&gt;For this app, we're using &lt;a href="https://docs.aws.amazon.com/scheduler/latest/UserGuide/managing-targets-universal.html" rel="noopener noreferrer"&gt;EventBridge's Universal Targets&lt;/a&gt; feature. Universal Targets allow you to run most (not all - see the link to view unsupported commands) AWS CLI commands directly in an EventBridge Schedule without the need to add (and pay for) compute (such as Lambda).&lt;/p&gt;

&lt;p&gt;In our example, we have one Schedule that sets the &lt;code&gt;desiredCount&lt;/code&gt; to &lt;code&gt;1&lt;/code&gt; (on/up) at 9am PT Mon-Fri and another that sets the &lt;code&gt;desiredCount&lt;/code&gt; to &lt;code&gt;0&lt;/code&gt; (off/down) at 5pm PT Mon-Fri.&lt;/p&gt;

&lt;p&gt;These cron expressions can be adjusted...be sure to ask your stakeholder(s) when they plan to use the app to ensure it is available.&lt;/p&gt;

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

&lt;p&gt;This was a walkthrough of a solution that allows us to run a Fargate instance on a budget. The solution utilizes Fargate Spot and EventBridge Scheduler to periodically shut down the Fargate Tasks during periods of no usage.&lt;/p&gt;

&lt;p&gt;The example code repository can be found &lt;a href="https://github.com/deeheber/fargate-on-a-budget-demo" rel="noopener noreferrer"&gt;on GitHub&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;What tips and tricks do you have for saving money with Fargate?&lt;/p&gt;



</description>
      <category>aws</category>
      <category>containers</category>
      <category>fargate</category>
      <category>cloud</category>
    </item>
    <item>
      <title>Ephemeral Jobs Longer than the Lambda Timeout</title>
      <dc:creator>Danielle Heberling</dc:creator>
      <pubDate>Thu, 07 Nov 2024 15:12:03 +0000</pubDate>
      <link>https://dev.to/aws-heroes/ephemeral-jobs-longer-than-the-lambda-timeout-2ale</link>
      <guid>https://dev.to/aws-heroes/ephemeral-jobs-longer-than-the-lambda-timeout-2ale</guid>
      <description>&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%2Fdanielleheberling.xyz%2Fassets%2Fhorse-race.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%2Fdanielleheberling.xyz%2Fassets%2Fhorse-race.jpg" alt="horse race" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Photo by &lt;a href="https://unsplash.com/@cadop?utm\_content=creditCopyText&amp;amp;utm\_medium=referral&amp;amp;utm\_source=unsplash" rel="noopener noreferrer"&gt;Mathew Schwartz&lt;/a&gt; on &lt;a href="https://unsplash.com/photos/equestrian-riding-horse-at-daytime-5qRWQEdK7Sg?utm\_content=creditCopyText&amp;amp;utm\_medium=referral&amp;amp;utm\_source=unsplash" rel="noopener noreferrer"&gt;Unsplash&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

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

&lt;p&gt;There's an ad-hoc job that runs in the background that doesn't have a client waiting for a synchronous response.&lt;/p&gt;

&lt;p&gt;You could run this in AWS Lambda to save money. A benefit with an ephemeral job run is that AWS only charges for when the Lambda is running.&lt;/p&gt;

&lt;p&gt;Problem is that this specific job runs longer than the Lambda timeout (at the time of writing this it is 15 minutes). We could write extra logic to make it work, but that adds unnecessary complexity.&lt;/p&gt;

&lt;p&gt;You still want to run this ephemerally to save money and resources...so what can you do?&lt;/p&gt;

&lt;h2&gt;
  
  
  A Solution
&lt;/h2&gt;

&lt;p&gt;One option is to use &lt;a href="https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_RunTask.html" rel="noopener noreferrer"&gt;ECS run-task&lt;/a&gt; with a &lt;a href="https://aws.amazon.com/fargate/" rel="noopener noreferrer"&gt;Fargate&lt;/a&gt; launch type.&lt;/p&gt;

&lt;p&gt;AWS Resources Needed:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://docs.aws.amazon.com/AmazonECS/latest/developerguide/clusters.html" rel="noopener noreferrer"&gt;An ECS Cluster&lt;/a&gt; - a logical grouping of tasks or services (in my example we're using the &lt;code&gt;default&lt;/code&gt; cluster that comes with new AWS accounts)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definitions.html" rel="noopener noreferrer"&gt;A Task Definition&lt;/a&gt; - a blueprint for your application which contains one or more containers and parameters to run&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://aws.amazon.com/what-is/cloud-containers/" rel="noopener noreferrer"&gt;A Container&lt;/a&gt; - a lightweight, standalone, executable package of software that includes everything needed to run an application. This is commonly used with &lt;a href="https://www.docker.com/" rel="noopener noreferrer"&gt;Docker&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Once those resources are deployed, the container can be triggered to run on demand with &lt;code&gt;ECS run-task&lt;/code&gt;. Once the code is done running and the container exits, then the running ECS Task will disappear. The benefit is that you'll no longer be charged money for a running Fargate task.&lt;/p&gt;

&lt;p&gt;There's a few ways to run an ECS task on demand:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;AWS CLI&lt;/li&gt;
&lt;li&gt;AWS SDK (could invoke from within Lambda etc)&lt;/li&gt;
&lt;li&gt;In a Step Function state&lt;/li&gt;
&lt;li&gt;EventBridge Scheduler&lt;/li&gt;
&lt;li&gt;AWS Console&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Here's an example of what this command looks like via the AWS CLI:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;aws ecs run-task \
  --cluster default \
  --task-definition my-task \
  --launch-type FARGATE \
  --network-configuration "awsvpcConfiguration={subnets=[subnet1,subnet2],securityGroups=[securityGroup1],assignPublicIp=ENABLED}"

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

&lt;/div&gt;



&lt;h2&gt;
  
  
  Show Me the Code
&lt;/h2&gt;

&lt;p&gt;There's a &lt;a href="https://github.com/deeheber/ecs-run-task-demo" rel="noopener noreferrer"&gt;full code example&lt;/a&gt; of how to deploy these cloud resources and invoke the deployed task via ecs run-task with the AWS CLI.&lt;/p&gt;

&lt;p&gt;Take a look at &lt;a href="https://github.com/deeheber/ecs-run-task-demo/blob/main/README.md" rel="noopener noreferrer"&gt;the &lt;code&gt;README&lt;/code&gt; file&lt;/a&gt; for directions.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bonus
&lt;/h2&gt;

&lt;p&gt;There are a few more benefits to ECS run-task that I won't mention, but one notable one is the ability to override specific things in the task definition.&lt;/p&gt;

&lt;p&gt;For example, if you want to override the &lt;code&gt;CMD&lt;/code&gt; defined in the &lt;code&gt;Dockerfile&lt;/code&gt; used to build the Container Image for the task, you could do this by adding the &lt;code&gt;--overrides&lt;/code&gt; flag.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;aws ecs run-task \
  --cluster default \
  --task-definition my-task \
  --launch-type FARGATE \
  --network-configuration "awsvpcConfiguration={subnets=[subnet1,subnet2],securityGroups=[securityGroup1],assignPublicIp=ENABLED}" \
  --overrides '{"containerOverrides":[{"name":"my-container","command":["npm", "run", "migrate"]}]}'

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

&lt;/div&gt;



&lt;p&gt;I've seen this used for one off commands that need to run every now and then such as database migrations, though I'm certain there are other good use cases. Here's &lt;a href="https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_TaskOverride.html" rel="noopener noreferrer"&gt;the full list&lt;/a&gt; of what can be overridden.&lt;/p&gt;

&lt;p&gt;Special thanks to &lt;a href="https://www.linkedin.com/in/chasedouglas/" rel="noopener noreferrer"&gt;Chase Douglas&lt;/a&gt; for giving me this idea. 🙌🏻&lt;/p&gt;



</description>
      <category>devops</category>
      <category>aws</category>
      <category>cloud</category>
      <category>containers</category>
    </item>
    <item>
      <title>Playdate Review</title>
      <dc:creator>Danielle Heberling</dc:creator>
      <pubDate>Sat, 28 Sep 2024 05:12:03 +0000</pubDate>
      <link>https://dev.to/deeheber/playdate-review-e8d</link>
      <guid>https://dev.to/deeheber/playdate-review-e8d</guid>
      <description>&lt;h2&gt;
  
  
  What is a Playdate?
&lt;/h2&gt;

&lt;p&gt;The Playdate is a small hand held game system with a crank, buttons (D-pad, a, b), and a small black and white screen (similar to e-paper).&lt;/p&gt;

&lt;p&gt;With dimensions of 76 × 74 × 9 mm, the console can easily fit into most pockets for on the go game playing.&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%2F36znfdymmwkl99nozjc7.jpeg" 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%2F36znfdymmwkl99nozjc7.jpeg" alt="playdate console" width="800" height="720"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://panic.com/" rel="noopener noreferrer"&gt;Panic&lt;/a&gt; is the company that created the Playdate. You might have heard of Panic from playing &lt;a href="https://goose.game/" rel="noopener noreferrer"&gt;Untitled Goose Game&lt;/a&gt; or &lt;a href="https://www.firewatchgame.com/" rel="noopener noreferrer"&gt;Firewatch&lt;/a&gt;. Or you might have used Mac apps such as &lt;a href="https://panic.com/transmit/" rel="noopener noreferrer"&gt;Transmit&lt;/a&gt; or &lt;a href="https://nova.app/" rel="noopener noreferrer"&gt;Coda (renamed to Nova)&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The CEO and co-founder of Panic gave &lt;a href="https://gdcvault.com/play/1034707/The-Playdate-Story-What-Was" rel="noopener noreferrer"&gt;an in depth talk&lt;/a&gt; about the story behind the creation of the Playdate which is entertaining and informative if you would like to go deeper.&lt;/p&gt;

&lt;h2&gt;
  
  
  Nice!
&lt;/h2&gt;

&lt;p&gt;These are some things that I enjoyed about the Playdate:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You get 24 free games (also called "season one") 2 games delievered each week until you have them all. It's delightful to see that notification light that there's new games to play at the beginning of owning this game system.&lt;/li&gt;
&lt;li&gt;Games aren't limited to their catalog, you can also build your own games using &lt;a href="https://play.date/dev/" rel="noopener noreferrer"&gt;their SDK&lt;/a&gt; or side load games from places such as &lt;a href="https://itch.io/" rel="noopener noreferrer"&gt;itch.io&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;The crank as an input device is surpisingly delightful and unique.&lt;/li&gt;
&lt;li&gt;Most games have enhanced details. We're talking beautiful storytelling, visuals, and music.&lt;/li&gt;
&lt;li&gt;This game system is minimally connected to the internet to allow downloading of games, but otherwise there aren't distractions that would exist on a smart phone.&lt;/li&gt;
&lt;li&gt;The battery life has been great so far. Marketing copy for this product boasts 8 hours when playing games and 14 days while in standby clock mode. This has matched my experience. They also use a generic usb-c charger as well, so it's likely you already have the plug/cord for it (though it comes with one).&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Oh.
&lt;/h2&gt;

&lt;p&gt;These are some things that I think could be improved with the Playdate:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;This game system does not have a backlight, so if you don't have good lighting it will be hard to see the screen.&lt;/li&gt;
&lt;li&gt;I'm left handed and would love to have a "lefty" version with the crank on the left side of the game system.&lt;/li&gt;
&lt;li&gt;Right now the only body color is yellow which is great, but I would like more color options especially when having multiple Playdates in my house.&lt;/li&gt;
&lt;li&gt;There is not a way to shut it off. It will go in standby clock mode which is fine, but I would like the ability to fully shut the game system off without needing to let the battery die.&lt;/li&gt;
&lt;li&gt;Right now for sound, it is wired headphones only. Looking through their website it appears that bluetooth is likely coming soon with a software update. To my knowledge the wifi chip they have in the game system should also double as bluetooth, so I don't think a hardware update is needed for this.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Where and how to buy
&lt;/h2&gt;

&lt;p&gt;I'm seeing a few resellers, but the official place to buy and where I bought one was from &lt;a href="https://play.date/shop/" rel="noopener noreferrer"&gt;the official playdate shop&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  My opinion
&lt;/h2&gt;

&lt;p&gt;I would highly recommend buying this game system. The Playdate is a lovely distraction from a world full of advertisements, pop ups, and notifications.&lt;/p&gt;

&lt;p&gt;As a kid, I could sit for hours and play video games, but as an adult I find that I do not have much time to devote to playing video games. The games on this system are perfect for that. You pick up the game system, play for 15-30 min here and there plus the controls aren't complicated...so you're not spending time trying to remember how to play the game.&lt;/p&gt;

&lt;p&gt;Also anything Panic creates, I know will be high quality and well thought out.&lt;/p&gt;

&lt;h2&gt;
  
  
  Side story
&lt;/h2&gt;

&lt;p&gt;Panic holds a special place in my heart. Back when I recently relocated to Portland, OR I was looking to get out of my current company and saw that they had an open customer support role. I was currently working in customer support, but moonlighting by taking night/weekend classes at a local code school to switch into being a software engineer. I went into their office and did the full interview round (including an interview with their CEO, Cabel Sasser). The next day I received the nicest rejection email from Cabel stating that they really liked me, but think that I would be better suited to becoming a software engineer and recommended that I continue down that path.&lt;/p&gt;

&lt;p&gt;Anyway I highly recommend the Playdate and anything that Panic creates, because I know it will be high quality in terms of the aesthetics and story telling.&lt;/p&gt;

</description>
      <category>games</category>
      <category>gaming</category>
      <category>review</category>
      <category>fun</category>
    </item>
    <item>
      <title>Devs are Not the Target Market for AI</title>
      <dc:creator>Danielle Heberling</dc:creator>
      <pubDate>Fri, 30 Aug 2024 12:12:03 +0000</pubDate>
      <link>https://dev.to/deeheber/devs-are-not-the-target-market-for-ai-ba5</link>
      <guid>https://dev.to/deeheber/devs-are-not-the-target-market-for-ai-ba5</guid>
      <description>&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%2F6l8ol63lz4npmex7gde6.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%2F6l8ol63lz4npmex7gde6.png" alt="Robot devs" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Background
&lt;/h2&gt;

&lt;p&gt;The year is 2024 in the tech industry. Layoffs and downsizing are everywhere. It is a very challenging job seeker market. There are lots of recent code school and computer science degree graduates seeking their first software engineer job. Amidst all of this noise, there is massive hype about "generative AI."&lt;/p&gt;

&lt;h2&gt;
  
  
  More on Artificial Intelligence (AI)
&lt;/h2&gt;

&lt;p&gt;In my part of the world, software engineers are tired of hearing about AI and feel like it is mostly a solution looking for a problem. Everyday users I interact with also echo these sentiments.&lt;/p&gt;

&lt;p&gt;To contast this, I'm seeing two groups of people that are very excited about AI 👉🏻 people selling things and business executives/investors at various companies.&lt;/p&gt;

&lt;p&gt;The motivations of people trying to sell you something is pretty straighforward. They want to sell things to make money for their business.&lt;/p&gt;

&lt;p&gt;The executives/investor's motivations are less clear. Here's my theory, many of them view employing humans as a liability both because dealing with humans can be messy but also because paying employees a salary is expensive and they think that AI can be a substitute.&lt;/p&gt;

&lt;p&gt;A harsh truth is that many businesses exist to make money and to be profitable. If they no longer need to have the expense of paying employee salaries, this can help them move closer to that goal. Most companies &lt;strong&gt;do not&lt;/strong&gt; exist for the purpose of providing jobs to people.&lt;sup&gt;1&lt;/sup&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  My Opinion on AI
&lt;/h2&gt;

&lt;p&gt;I have concerns over AI ethics. Bias in the models, creator's work getting stolen for use in AI models without compensation, and environmental concerns of needing to run many servers to train these huge models. Many members of the United States government do not understand how technology works, so I don't trust that they can effectively regulate.&lt;/p&gt;

&lt;p&gt;I think that these tools are quite good, but they're not sophisticated enough yet to fully replace human software engineering labor on a wider scale.&lt;/p&gt;

&lt;p&gt;I have concerns over the ability for human or AI software engineers to be able to effectively troubleshoot and maintain unvetted AI generated code that gets pushed to production.&lt;/p&gt;

&lt;p&gt;I am excited about the potential for AI to do boring and mundane tasks for us humans, so we can focus on imaginative creativity. An example: I'd like AI to do the dishes for me, so I can write my next novel, paint my next portrait, or compose my next song. I haven't seen many examples of this yet.&lt;/p&gt;

&lt;h2&gt;
  
  
  My Opinion Ultimately Doesn't Matter
&lt;/h2&gt;

&lt;p&gt;What does matter if you want to be employed as a software engineer in this industry is the opinion of those who are in positions of power that make the budget and hiring decisions.&lt;/p&gt;

&lt;h2&gt;
  
  
  Unsolicited Advice
&lt;/h2&gt;

&lt;p&gt;If you want to be hired and maintain a job in this industry as a software engineer, you need to figure out the motivations of people in positions of power and do the work to be able to effectively and genuinely sell yourself to them.&lt;/p&gt;

&lt;h2&gt;
  
  
  Some Ideas
&lt;/h2&gt;

&lt;p&gt;Here's some themes I've seen lately with people in positions of power at various companies. Note that my bias leans toward small/medium size businesses since that is where the majority of my social network is employed. Your experience may be different.&lt;/p&gt;

&lt;h3&gt;
  
  
  They want to do more with less
&lt;/h3&gt;

&lt;p&gt;I would advise being curious. When something isn't working as expected, be willing to adventure outside of your comfort zone to figure why, fix it, and learn new things.&lt;/p&gt;

&lt;p&gt;On the web development front, more places desire to hire "fullstack" engineers. Just doing frontend is not enough for many companies.&lt;/p&gt;

&lt;h3&gt;
  
  
  They want to deliver solutions
&lt;/h3&gt;

&lt;p&gt;Focus on shipping. It's not enough to only write code, you need to know how to get a full working application into production that satisfies all product requirements. You also need to know how to troubleshoot and diagnose bugs that happen to your users in production.&lt;/p&gt;

&lt;p&gt;It's also important to be someone who can be trusted to follow through with what you say you will deliver. If you get stuck on something, it's your responsiblity to ask for help to get the assistance you need to follow through all the way.&lt;/p&gt;

&lt;h3&gt;
  
  
  They're excited about AI and some want to replace us devs with AI because it is cheaper than paying a salary
&lt;/h3&gt;

&lt;p&gt;I would advise investing time in learning and using these new AI tools. Learn what they're good at and use them to accelerate your output. Learn what they're bad at and invest the time in learning how to do these things well by yourself. Learning those skills is a good way to emphasize your value to executives as to why they should hire you and pay you a salary instead of using AI.&lt;/p&gt;

&lt;h2&gt;
  
  
  Closing
&lt;/h2&gt;

&lt;p&gt;Anyway, these are some thoughts I've had over the past few months. I'm just another person on the internet with opinions, giving unsolicited advice. What you do or do not do with it is up to you. I welcome polite engaged feedback and conversation on this topic.&lt;/p&gt;

&lt;p&gt;&lt;sup&gt;1&lt;/sup&gt; Note that this is not commentary from me saying that I like the status quo. This is a comment plainly stating the status quo.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>career</category>
    </item>
    <item>
      <title>I'm Worried About Generative AI</title>
      <dc:creator>Danielle Heberling</dc:creator>
      <pubDate>Sat, 04 May 2024 22:12:03 +0000</pubDate>
      <link>https://dev.to/deeheber/im-worried-about-generative-ai-5e54</link>
      <guid>https://dev.to/deeheber/im-worried-about-generative-ai-5e54</guid>
      <description>&lt;p&gt;I’m worried about generative AI. I say this as someone who uses AI to help with work tasks daily. I do believe there are some neat things that AI can do and there is high potential for it in the future as it improves, but I have concerns.&lt;/p&gt;

&lt;p&gt;No this post isn’t about the common objections I’ve been seeing in the discourse. Things like bias in the models, hallucinations, and people’s jobs being replaced. Although they are very important things to monitor.&lt;/p&gt;

&lt;p&gt;I’m concerned with AI monopolizing the focus of companies.&lt;/p&gt;

&lt;p&gt;Take the big tech companies for example. There are reports everywhere about multiple layoff rounds but also news of higher rates of investment (both money and people resources) in AI than ever before. These large companies have huge ecosystems that many folks depend on. Does this mean since the main focus is AI that there will be less focus on their non-AI products and services? Does this mean that service reliability will degrade as time goes on because engineers who previously responded to outages were moved to teams working on AI or were laid off?&lt;/p&gt;

&lt;p&gt;On the other end of the spectrum we have tech startups. I’m seeing many chatbots being built and their marketing tells me this is the solution to my problems (that I didn’t know I had). I’m excited that this opens up opportunity for new ideas and businesses to take shape, but when the core of a product is centered on what is essentially a black box that might be very wrong sometimes…this doesn’t feel like a good business model to me until the tech matures. My overall impression is that AI is a magic word that these companies can use to attract more customers who like shiny new things and also to attract venture capital funding.&lt;/p&gt;

&lt;p&gt;I’ve also seen lots of companies throwing AI at things when it wasn’t needed. An example: a company who will remain nameless was demoing a new tool that uses AI to help users troubleshoot error messages that surface in their app. A developer watching the demo yelled out “or you could consider writing better error messages that users will understand instead of bringing AI into this.”&lt;/p&gt;

&lt;p&gt;These are my opinions based off of observation of the world around me. I do not have data to present as evidence. This is all based off of vibes. I sure hope my vibes are wrong, that I’m overreacting to all of this, and that I should take off my tin foil hat.&lt;/p&gt;

&lt;p&gt;Time will tell.&lt;/p&gt;

&lt;p&gt;AI has promise and it does have the potential to be helpful for specific types of tasks, but let’s not forget that we should attempt to solve problems that already exist before bringing in tools that have the potential to cause even more problems.&lt;/p&gt;

&lt;p&gt;What are your thoughts?&lt;/p&gt;

</description>
      <category>ai</category>
      <category>news</category>
      <category>opinion</category>
    </item>
  </channel>
</rss>
