<?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: Bervianto Leo Pratama</title>
    <description>The latest articles on DEV Community by Bervianto Leo Pratama (@berviantoleo).</description>
    <link>https://dev.to/berviantoleo</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F90909%2F4c11951a-d3a9-463c-8e6c-2e9448366906.jpg</url>
      <title>DEV Community: Bervianto Leo Pratama</title>
      <link>https://dev.to/berviantoleo</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/berviantoleo"/>
    <language>en</language>
    <item>
      <title>Getting Started with Amazon ECS Express Mode</title>
      <dc:creator>Bervianto Leo Pratama</dc:creator>
      <pubDate>Fri, 18 Sep 2026 11:40:08 +0000</pubDate>
      <link>https://dev.to/aws-builders/getting-started-with-amazon-ecs-express-mode-2pcd</link>
      <guid>https://dev.to/aws-builders/getting-started-with-amazon-ecs-express-mode-2pcd</guid>
      <description>&lt;h2&gt;
  
  
  AWS App Runner End of Support
&lt;/h2&gt;

&lt;p&gt;Did you know that AWS App Runner &lt;a href="https://aws.amazon.com/apprunner/" rel="noopener noreferrer"&gt;has been deprecated&lt;/a&gt;? &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fisiwi79b6if2aqziedsa.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fisiwi79b6if2aqziedsa.png" alt="AWS App Runner" width="800" height="162"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I've been using AWS App Runner for my simple services. It's a bit sad that I'm no longer able to create a new service, even though I can still maintain AWS App Runner services.&lt;/p&gt;

&lt;h2&gt;
  
  
  Quick Learning of Amazon ECS Express Mode
&lt;/h2&gt;

&lt;p&gt;Amazon ECS Express Mode is an alternative to AWS App Runner. I've tried to use Amazon ECS directly, but the setup is quite a lot. Let's delegate these tasks to Amazon ECS Express Mode.&lt;/p&gt;

&lt;h3&gt;
  
  
  Preparing the Service
&lt;/h3&gt;

&lt;p&gt;This is a kind of exploration, especially if you are a new learner of AWS. I think this is a good way to learn it.&lt;/p&gt;

&lt;p&gt;You can choose your preferred language. However, in this article, I will use C# and .NET. You may skip this step if you have a web application that is already using a container.&lt;/p&gt;

&lt;h4&gt;
  
  
  Prepare the project
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;Download and install &lt;a href="https://dotnet.microsoft.com/en-us/download" rel="noopener noreferrer"&gt;.NET SDK&lt;/a&gt; (if you haven't). I'm using .NET 10.&lt;/li&gt;
&lt;li&gt;Run &lt;code&gt;dotnet new sln&lt;/code&gt; to create a new solution.&lt;/li&gt;
&lt;li&gt;Run &lt;code&gt;dotnet new gitignore&lt;/code&gt; to create the &lt;code&gt;.gitignore&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Run &lt;code&gt;dotnet new webapi -o ApiSample&lt;/code&gt; to create the Project.&lt;/li&gt;
&lt;li&gt;Run &lt;code&gt;dotnet sln add ApiSample&lt;/code&gt; to connect the project to the solution.&lt;/li&gt;
&lt;li&gt;Test building the project with &lt;code&gt;dotnet build&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;You may need to add some lines to the &lt;code&gt;ApiSample/Program.cs&lt;/code&gt; file to add a health check API.&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Add this line before builder.Build()&lt;/span&gt;
&lt;span class="n"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Services&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;AddHealthChecks&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Build&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="c1"&gt;// ... truncated   &lt;/span&gt;

&lt;span class="c1"&gt;// Add this line before app.Run() &lt;/span&gt;
&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;MapHealthChecks&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/health"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;WithName&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"HealthCheck"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Run&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Try to run the app by using &lt;code&gt;dotnet run --project ApiSample&lt;/code&gt;. Open the API, for example, &lt;code&gt;localhost:5007/health&lt;/code&gt;; it should show "Healthy".&lt;/p&gt;&lt;/li&gt;
&lt;/ol&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fgz4uh12d8aihs9qe72bz.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fgz4uh12d8aihs9qe72bz.png" alt="Health API Result" width="800" height="645"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Preparing the Container Image
&lt;/h2&gt;

&lt;p&gt;I will use GitHub Container Registry to host the container image. So, let's build the CI/CD in GitHub Actions. Here is a sample to publish the container image. I saved the file in &lt;code&gt;.github/workflows/deploy.yml&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Deploy&lt;/span&gt;

&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;push&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;branches&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;main&lt;/span&gt;
  &lt;span class="na"&gt;workflow_dispatch&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;

&lt;span class="na"&gt;env&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;REGISTRY&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ghcr.io&lt;/span&gt;
  &lt;span class="na"&gt;IMAGE_NAME&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ github.repository }}/apisample&lt;/span&gt;

&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;

  &lt;span class="na"&gt;publish&lt;/span&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;Publish ApiSample image&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;
    &lt;span class="na"&gt;permissions&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;contents&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;read&lt;/span&gt;
      &lt;span class="na"&gt;packages&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;write&lt;/span&gt;
    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&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;Check out source&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;actions/checkout@v4&lt;/span&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;Log in to GitHub Container Registry&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/login-action@v3&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;registry&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ env.REGISTRY }}&lt;/span&gt;
          &lt;span class="na"&gt;username&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ github.actor }}&lt;/span&gt;
          &lt;span class="na"&gt;password&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.GITHUB_TOKEN }}&lt;/span&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 and push ApiSample&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;&amp;gt;-&lt;/span&gt;
          &lt;span class="s"&gt;dotnet publish ./ApiSample/ApiSample.csproj&lt;/span&gt;
          &lt;span class="s"&gt;--configuration Release&lt;/span&gt;
          &lt;span class="s"&gt;/t:PublishContainer&lt;/span&gt;
          &lt;span class="s"&gt;-p:ContainerRegistry=${{ env.REGISTRY }}&lt;/span&gt;
          &lt;span class="s"&gt;-p:ContainerRepository=${{ env.IMAGE_NAME }}&lt;/span&gt;
          &lt;span class="s"&gt;-p:ContainerImageTags='"${{ github.sha }};latest"'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Code explanation:

&lt;ol&gt;
&lt;li&gt;It will check out the code.&lt;/li&gt;
&lt;li&gt;It will authenticate to GitHub Container Registry.&lt;/li&gt;
&lt;li&gt;It will publish to GitHub Container Registry using dotnet publish.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Let's push the code to test if the CD codes are works.&lt;/p&gt;

&lt;p&gt;If it's successful. Your repository will have the Container Repository (Packages) like this. Ensure the repository is Public.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fru2pkn3km9uq6dsqznnm.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fru2pkn3km9uq6dsqznnm.png" alt="Container Repository" width="799" height="320"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I hosted my code &lt;a href="https://github.com/berviantoleo/aws-express-mode" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Preparing Infrastructure
&lt;/h2&gt;

&lt;p&gt;We will prepare the infrastructure by using Terraform. If you are not familiar with it, you may use another tool or manually create it; however, I'm not recommended to do it manually.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Please ensure you've installed AWS CLI and configured the credentials to access AWS.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ol&gt;
&lt;li&gt;Download and install &lt;a href="https://developer.hashicorp.com/terraform/install" rel="noopener noreferrer"&gt;Terraform CLI&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Create a new folder &lt;code&gt;infra&lt;/code&gt; in the previous project.&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Create a new file &lt;code&gt;main.tf&lt;/code&gt;. You may choose another region as you prefer.&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight terraform"&gt;&lt;code&gt;&lt;span class="k"&gt;terraform&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;required_providers&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;aws&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;source&lt;/span&gt;  &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"hashicorp/aws"&lt;/span&gt;
      &lt;span class="nx"&gt;version&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"~&amp;gt; 6.0"&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;# Configure the AWS Provider&lt;/span&gt;
&lt;span class="k"&gt;provider&lt;/span&gt; &lt;span class="s2"&gt;"aws"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;region&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"us-east-1"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Ensure your terminal has been changed to &lt;code&gt;infra&lt;/code&gt;. Run &lt;code&gt;terraform init&lt;/code&gt;. It will initialize and prepare the provider.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;We need two things before deployment. The first is hosted container images, and the second is ECS Express service mode. In this case, I have hosted the container image using GitHub Container Registry.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Add these lines to &lt;code&gt;main.tf&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight terraform"&gt;&lt;code&gt;&lt;span class="c1"&gt;# 1. Create IAM roles for ECS Express Gateway&lt;/span&gt;
&lt;span class="k"&gt;resource&lt;/span&gt; &lt;span class="s2"&gt;"aws_iam_role"&lt;/span&gt; &lt;span class="s2"&gt;"execution"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"ecs-express-gateway-execution-role"&lt;/span&gt;

  &lt;span class="nx"&gt;assume_role_policy&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;jsonencode&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="nx"&gt;Version&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"2012-10-17"&lt;/span&gt;
    &lt;span class="nx"&gt;Statement&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;Action&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"sts:AssumeRole"&lt;/span&gt;
        &lt;span class="nx"&gt;Effect&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"Allow"&lt;/span&gt;
        &lt;span class="nx"&gt;Principal&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="nx"&gt;Service&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"ecs-tasks.amazonaws.com"&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;]&lt;/span&gt;
  &lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;resource&lt;/span&gt; &lt;span class="s2"&gt;"aws_iam_role_policy_attachment"&lt;/span&gt; &lt;span class="s2"&gt;"execution"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;role&lt;/span&gt;       &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;aws_iam_role&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;execution&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;
  &lt;span class="nx"&gt;policy_arn&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"arn:aws:iam::aws:policy/service-role/AmazonECSTaskExecutionRolePolicy"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;resource&lt;/span&gt; &lt;span class="s2"&gt;"aws_iam_role"&lt;/span&gt; &lt;span class="s2"&gt;"infrastructure"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"ecs-express-gateway-infrastructure-role"&lt;/span&gt;

  &lt;span class="nx"&gt;assume_role_policy&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;jsonencode&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="nx"&gt;Version&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"2012-10-17"&lt;/span&gt;
    &lt;span class="nx"&gt;Statement&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;Action&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"sts:AssumeRole"&lt;/span&gt;
        &lt;span class="nx"&gt;Effect&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"Allow"&lt;/span&gt;
        &lt;span class="nx"&gt;Principal&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="nx"&gt;Service&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"ecs.amazonaws.com"&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;]&lt;/span&gt;
  &lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;resource&lt;/span&gt; &lt;span class="s2"&gt;"aws_iam_role_policy_attachment"&lt;/span&gt; &lt;span class="s2"&gt;"infrastructure"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;role&lt;/span&gt;       &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;aws_iam_role&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;infrastructure&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;
  &lt;span class="nx"&gt;policy_arn&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"arn:aws:iam::aws:policy/service-role/AmazonECSInfrastructureRoleforExpressGatewayServices"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;# 2. Create ECS Express Gateway Service&lt;/span&gt;

&lt;span class="k"&gt;resource&lt;/span&gt; &lt;span class="s2"&gt;"aws_ecs_express_gateway_service"&lt;/span&gt; &lt;span class="s2"&gt;"apisample"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;execution_role_arn&lt;/span&gt;      &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;aws_iam_role&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;execution&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;arn&lt;/span&gt;
  &lt;span class="nx"&gt;infrastructure_role_arn&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;aws_iam_role&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;infrastructure&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;arn&lt;/span&gt;
  &lt;span class="nx"&gt;health_check_path&lt;/span&gt;       &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"/health"&lt;/span&gt;

  &lt;span class="nx"&gt;primary_container&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;container_port&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;8080&lt;/span&gt;
    &lt;span class="nx"&gt;image&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"ghcr.io/berviantoleo/aws-express-mode/apisample:latest"&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="nx"&gt;depends_on&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="nx"&gt;aws_iam_role&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;execution&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;aws_iam_role&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;infrastructure&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;aws_iam_role_policy_attachment&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;execution&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;aws_iam_role_policy_attachment&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;infrastructure&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;# 3. Output the URL of the ECS Express Gateway Service&lt;/span&gt;

&lt;span class="k"&gt;output&lt;/span&gt; &lt;span class="s2"&gt;"apisample_url"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;aws_ecs_express_gateway_service&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;apisample&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ingress_paths&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Let's try to run &lt;code&gt;terraform apply&lt;/code&gt; to deploy the AWS ECS Express Mode. If it's successful, it will return the URL of the service. However, please note that the service may need a while to be fully deployed.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F5xsw70c64xb695af1vmj.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F5xsw70c64xb695af1vmj.png" alt="URL Service" width="800" height="351"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If it's successful, when I open the health URL, it will return Healthy.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fak5irvurci6nh3zb123z.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fak5irvurci6nh3zb123z.png" alt="Clean Up" width="799" height="75"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Clean Up
&lt;/h2&gt;

&lt;p&gt;Don't forget to clean up the AWS Resources if you are not using them. You can use &lt;code&gt;terraform destroy&lt;/code&gt; to remove the ECS Express Mode. As in the documentation, I've added depends_on to ensure that, while destroying the ECS Express Mode, we don't remove the IAM Role first, as it will leave the ECS Express Service stuck while draining.&lt;/p&gt;

&lt;h2&gt;
  
  
  Thank you
&lt;/h2&gt;

&lt;p&gt;Thank you for reading. If you have any feedback, please let me know.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fyh4562tqexj0oouafe4i.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fyh4562tqexj0oouafe4i.gif" alt="Thank You GIF" width="480" height="480"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>aws</category>
      <category>csharp</category>
      <category>tutorial</category>
      <category>terraform</category>
    </item>
    <item>
      <title>Modernizing Vue App by using IBM Bob</title>
      <dc:creator>Bervianto Leo Pratama</dc:creator>
      <pubDate>Sat, 12 Sep 2026 07:26:35 +0000</pubDate>
      <link>https://dev.to/berviantoleo/modernizing-vue-app-by-using-ibm-bob-25g2</link>
      <guid>https://dev.to/berviantoleo/modernizing-vue-app-by-using-ibm-bob-25g2</guid>
      <description>&lt;h2&gt;
  
  
  Background
&lt;/h2&gt;

&lt;p&gt;I have many applications that use Vue CLI and, of course, are mostly still on Vue 2. Vue CLI page also recommends moving the tooling.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fzz2pfkgore51rax9sra7.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fzz2pfkgore51rax9sra7.png" alt="Vue CLI Announcement" width="800" height="463"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I know there are a lot of guides on how to migrate Vue CLI to Vite. So, let's ask IBM Bob to help us.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why migrate?
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Vue CLI uses an old Node version, which may pose a risk for us if the old version has any security issues.&lt;/li&gt;
&lt;li&gt;The CI may not support the old Node version later, etc....&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Plan the Migration
&lt;/h2&gt;

&lt;p&gt;I'll start with a simple application that only lists data. So, I wonder if IBM Bob can tackle it easily without special guidance. I started using this &lt;a href="https://github.com/berviantoleo/indonesia-os-list" rel="noopener noreferrer"&gt;application&lt;/a&gt;.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Let's change IBM Bob's mode to Plan. Let's use a simple prompt. I used "Migrate from Vue CLI to Vite".&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fg8q4xid23ll2rk0b6aoe.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fg8q4xid23ll2rk0b6aoe.png" alt="Plan mode" width="799" height="200"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;IBM Bob will create a Markdown file with the migration strategies. You may need to review and adjust the plan if it doesn't meet your requirements. In this case, I'll use the generated plan. Don't forget to answer the follow-up questions, if any.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fusm00c3suvr4w600r1os.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fusm00c3suvr4w600r1os.png" alt="Questions" width="800" height="303"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Here is my sample answer.&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="p"&gt;1.&lt;/span&gt; Change the script name to follow the convention.
&lt;span class="p"&gt;2.&lt;/span&gt; Use vitest
&lt;span class="p"&gt;3.&lt;/span&gt; Yes and No, if possible add a simple test case
&lt;span class="p"&gt;4.&lt;/span&gt; Yes, change the script to follow up a new wayUpdate the plan and after that move to Agent mode.
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;&lt;p&gt;It generates around 8 tasks. Each task is sufficient for minimal migration. I decided to quickly answer and let IBM Bob move to Agent mode.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The migration process used around 10.49 IBM Bob Coins.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fswv92f1m0du5mxuxs35r.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fswv92f1m0du5mxuxs35r.png" alt="Coins Usage" width="797" height="51"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;I noticed that I forgot to mention using the latest version whenever possible. This left the version not up to date. So, I went back to plan mode to upgrade the dependencies after the migration was finished.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;It took around 5.30 Bob Coins. IBM Bob also detected some "Maintenance mode" dependencies, which is good.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fsb9iy8wspsfd3qms73sh.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fsb9iy8wspsfd3qms73sh.png" alt="Dependencies" width="797" height="71"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fa4f3ixt174tg33hnog7t.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fa4f3ixt174tg33hnog7t.png" alt="Dependencies summary" width="800" height="894"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;I asked IBM Bob to create the skill based on the first task (the migration process). In addition, I "debugged" visually, as I found some issues that might have been left over (before the migration was done).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Here is the &lt;a href="https://github.com/berviantoleo/indonesia-os-list/pull/1329" rel="noopener noreferrer"&gt;Pull Request&lt;/a&gt;.&lt;/p&gt;


&lt;div class="ltag_github-liquid-tag"&gt;
  &lt;h1&gt;
    &lt;a href="https://github.com/berviantoleo/indonesia-os-list/pull/1329" rel="noopener noreferrer"&gt;
      &lt;img class="github-logo" alt="GitHub logo" src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg"&gt;
      &lt;span class="issue-title"&gt;
        feat: migration to Vite
      &lt;/span&gt;
      &lt;span class="issue-number"&gt;#1329&lt;/span&gt;
    &lt;/a&gt;
  &lt;/h1&gt;
  &lt;div class="github-thread"&gt;
    &lt;div class="timeline-comment-header"&gt;
      &lt;a href="https://github.com/berviantoleo" rel="noopener noreferrer"&gt;
        &lt;img class="github-liquid-tag-img" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Favatars.githubusercontent.com%2Fu%2F15927349%3Fv%3D4" alt="berviantoleo avatar"&gt;
      &lt;/a&gt;
      &lt;div class="timeline-comment-header-text"&gt;
        &lt;strong&gt;
          &lt;a href="https://github.com/berviantoleo" rel="noopener noreferrer"&gt;berviantoleo&lt;/a&gt;
        &lt;/strong&gt; posted on &lt;a href="https://github.com/berviantoleo/indonesia-os-list/pull/1329" rel="noopener noreferrer"&gt;&lt;time&gt;Sep 12, 2026&lt;/time&gt;&lt;/a&gt;
      &lt;/div&gt;
    &lt;/div&gt;
    &lt;div class="ltag-github-body"&gt;
      
    &lt;/div&gt;
    &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/berviantoleo/indonesia-os-list/pull/1329" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Lesson Learned
&lt;/h2&gt;

&lt;p&gt;Well, overall is good, even without specifying my requirements and the related migration guides. What about you? Do you think worth doing it manually? Do you think worth using one script? Or... do you think let AI do the job?&lt;/p&gt;

&lt;p&gt;Please let me know if you have any further feedback!&lt;/p&gt;

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

</description>
      <category>vue</category>
      <category>ibmbob</category>
      <category>ai</category>
      <category>devjournal</category>
    </item>
    <item>
      <title>IBM Dev Day: Bob in Action Experiences</title>
      <dc:creator>Bervianto Leo Pratama</dc:creator>
      <pubDate>Fri, 04 Sep 2026 11:49:53 +0000</pubDate>
      <link>https://dev.to/berviantoleo/ibm-dev-day-bob-in-action-experiences-562m</link>
      <guid>https://dev.to/berviantoleo/ibm-dev-day-bob-in-action-experiences-562m</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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fh14vhmt4yog5qzlw8p7j.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fh14vhmt4yog5qzlw8p7j.png" alt="I'm attending image" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I attended and participated in IBM Dev Day: Bob in Action. It took place virtually from 27 to 30 August 2026. On 27-28 August 2026, it had amazing Dev Day Talks. You can register and see the replay &lt;a href="https://ibmdevday-bob-platform.bemyapp.com/#/event" rel="noopener noreferrer"&gt;here&lt;/a&gt;. It will be available for a limited time, so let's see it! The pre-event and some sessions were inspiring for me to do the hackathon.&lt;/p&gt;

&lt;p&gt;Even though I can't attend it live to interact with the speakers, at least the on-demand recording is really helpful. Yeah, the time zone is really hard for me to follow. :)&lt;/p&gt;




&lt;h2&gt;
  
  
  My hackathon idea
&lt;/h2&gt;

&lt;p&gt;Well, it's a pretty simple idea. I'm still thinking of building my expense tracker app. Do you know what? The POC can easily be done by using IBM Bob! I was submitting it near the deadline due to my daily activities.&lt;/p&gt;

&lt;p&gt;I utilized all 40 Bob Coins to build the application. I only used a few features of watsonx.ai. Overall, I'm glad with the POC result.&lt;/p&gt;

&lt;p&gt;Here is my repo.&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/berviantoleo" rel="noopener noreferrer"&gt;
        berviantoleo
      &lt;/a&gt; / &lt;a href="https://github.com/berviantoleo/spending-tracker" rel="noopener noreferrer"&gt;
        spending-tracker
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Spending Tracker
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Spending Tracker&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;AI-powered web app that scans receipts, auto-categorises spending with watsonx.ai, and tracks multi-currency expenses.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Stack:&lt;/strong&gt; React 19 + Vite 7 (PWA) · Express 5 + TypeScript · Supabase (Postgres / Auth / Storage) · watsonx.ai &lt;code&gt;llama-4-maverick-17b-128e-instruct-fp8&lt;/code&gt; · AWS ECS Fargate + S3 + CloudFront&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Prerequisites&lt;/h2&gt;
&lt;/div&gt;
&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;Version&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;Node.js&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;26 LTS&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://nodejs.org" rel="nofollow noopener noreferrer"&gt;nodejs.org&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;npm&lt;/td&gt;
&lt;td&gt;≥ 11&lt;/td&gt;
&lt;td&gt;bundled with Node 26&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Supabase CLI&lt;/td&gt;
&lt;td&gt;latest&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;brew install supabase/tap/supabase&lt;/code&gt; · &lt;a href="https://supabase.com/docs/guides/cli/getting-started" rel="nofollow noopener noreferrer"&gt;all platforms&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Docker&lt;/td&gt;
&lt;td&gt;latest&lt;/td&gt;
&lt;td&gt;required to build the server image or run &lt;code&gt;supabase start&lt;/code&gt; locally&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Terraform&lt;/td&gt;
&lt;td&gt;≥ 1.6&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://developer.hashicorp.com/terraform/downloads" rel="nofollow noopener noreferrer"&gt;terraform.io/downloads&lt;/a&gt; — AWS deployment only&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AWS CLI&lt;/td&gt;
&lt;td&gt;v2&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://aws.amazon.com/cli/" rel="nofollow noopener noreferrer"&gt;aws.amazon.com/cli&lt;/a&gt; — AWS deployment only&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Local Development&lt;/h2&gt;
&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;1 — Install dependencies&lt;/h3&gt;

&lt;/div&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;npm install          &lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; installs root + client/ + server/ workspaces in one command&lt;/span&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;2 — Configure environment variables&lt;/h3&gt;

&lt;/div&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;cp server/.env.example server/.env
cp client/.env.example client/.env&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;Fill in &lt;code&gt;server/.env&lt;/code&gt;:&lt;/p&gt;
&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Variable&lt;/th&gt;
&lt;th&gt;Where to find it&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;SUPABASE_URL&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Supabase Dashboard → Project Settings → API → Project URL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;SUPABASE_SERVICE_KEY&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;…&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/berviantoleo/spending-tracker" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;In short, it's utilizing watsonx.ai to capture the item lines of each receipt. You can also get the details of the process in &lt;a href="https://github.com/berviantoleo/spending-tracker/blob/master/bob-task-0d343ac9f590a52aeda258a99e787a91-2026-08-30.md" rel="noopener noreferrer"&gt;my chat with IBM Bob&lt;/a&gt;. :)&lt;/p&gt;

&lt;p&gt;Well, it's not fully aligned with the theme. However, at least I have tried my best. It was last minutes idea, so I didn't expect much.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ftn1ibjabl030j3cetzdp.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ftn1ibjabl030j3cetzdp.png" alt="Submitted" width="707" height="366"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  What's next?
&lt;/h2&gt;

&lt;p&gt;Don't need to worry; there are still many opportunities to learn IBM Bob! Let's join &lt;a href="https://aibuilderschallenge-bob.bemyapp.com" rel="noopener noreferrer"&gt;AI Builders Conference with IBM Bob&lt;/a&gt;! There are two specialized tracks: &lt;strong&gt;Student Track&lt;/strong&gt; and &lt;strong&gt;Faculty &amp;amp; Educator Track&lt;/strong&gt;.&lt;/p&gt;

</description>
      <category>devjournal</category>
      <category>ibmbob</category>
    </item>
    <item>
      <title>Leveraging IBM Bob with Aspire Skills to Analyze My Existing Aspire Projects</title>
      <dc:creator>Bervianto Leo Pratama</dc:creator>
      <pubDate>Mon, 17 Aug 2026 07:29:31 +0000</pubDate>
      <link>https://dev.to/berviantoleo/leveraging-ibm-bob-with-aspire-skills-to-analyze-my-existing-aspire-projects-4p64</link>
      <guid>https://dev.to/berviantoleo/leveraging-ibm-bob-with-aspire-skills-to-analyze-my-existing-aspire-projects-4p64</guid>
      <description>&lt;h2&gt;
  
  
  Skills
&lt;/h2&gt;

&lt;p&gt;What are skills? Some may be known as Agent Skills. Let's read some definitions.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Agent Skills are a lightweight, open format for extending AI agent capabilities with specialized knowledge and workflows.&lt;br&gt;
Source: &lt;a href="https://agentskills.io/home" rel="noopener noreferrer"&gt;https://agentskills.io/home&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Skills are folders of instructions, scripts, and resources that Claude loads dynamically to improve performance on specialized tasks. Skills teach Claude how to complete specific tasks in a repeatable way, whether that's creating documents with your company's brand guidelines, analyzing data using your organization's specific workflows, or automating personal tasks.&lt;br&gt;
Source: &lt;a href="https://support.claude.com/en/articles/12512176-what-are-skills" rel="noopener noreferrer"&gt;https://support.claude.com/en/articles/12512176-what-are-skills&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Have you ever asked the AI to run your project or analyze your project, but it came out as a hallucination? For example, running the wrong command, running a command which not exist, etc. As you may know, the base knowledge of the AI may not include the specific command that you use, especially whenever you have a custom project or custom command.&lt;/p&gt;

&lt;p&gt;I would like to learn how the skills work better while working on my Aspire Projects. I'm facing some issues lately while just using the AI with prompts and vibing. It's not getting better, but it's getting worse.&lt;/p&gt;

&lt;p&gt;In this moment, I will try to explore &lt;a href="https://aspire.dev/get-started/aspire-skills/" rel="noopener noreferrer"&gt;Aspire Skills&lt;/a&gt; and use it in IBM Bob. Lately, I have used Vibe and prompts in IBM Bob to &lt;a href="https://dev.to/berviantoleo/leveraging-ibm-bob-for-migrating-app-runner-to-ecs-express-mode-by-using-git-diff-or-final-state-2ed6"&gt;migrate my App Runner to ECS Express Mode&lt;/a&gt;. Let's now move on to understand the IBM Bob capability more.&lt;/p&gt;

&lt;h2&gt;
  
  
  Preparing Aspire guidance
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Prerequisite
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Ensure you have the &lt;a href="https://aspire.dev/get-started/install-cli/" rel="noopener noreferrer"&gt;Aspire CLI&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Let's prepare
&lt;/h3&gt;

&lt;p&gt;Simply run this command:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;aspire agent init&lt;/code&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Since I will use IBM Bob, I'll select the standard location, which is &lt;code&gt;.agent/skills&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I set up all the skills: &lt;code&gt;aspire&lt;/code&gt;, &lt;code&gt;aspire-deployment&lt;/code&gt;, &lt;code&gt;aspire-init&lt;/code&gt;, &lt;code&gt;aspire-monitoring&lt;/code&gt;, &lt;code&gt;aspire-orchestration&lt;/code&gt;, &lt;code&gt;aspireify&lt;/code&gt;, &lt;code&gt;dotnet-inspect&lt;/code&gt;, &lt;code&gt;playwright-cli&lt;/code&gt;, and &lt;code&gt;Install Aspire MCP server&lt;/code&gt;. If you don't plan to use Playwright and/or Install Aspire MCP server, you can leave the default ticked values/skills.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fa8nthwndoqhylh7nsxxn.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fa8nthwndoqhylh7nsxxn.png" alt="Skills selection" width="799" height="236"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;Notes: I also installed the Aspire extension&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;Skill has been detected&lt;/li&gt;
&lt;/ul&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F5hop2tbz4sv17cdnb740.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F5hop2tbz4sv17cdnb740.png" alt="Skills detected" width="800" height="927"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;MCP has been installed&lt;/li&gt;
&lt;/ul&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3k02afbz3cpplwuix4vy.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3k02afbz3cpplwuix4vy.png" alt="MCP" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What has IBM Bob been doing?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Fixing the migration issue.&lt;/li&gt;
&lt;li&gt;Migrating the test to Aspire Test.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Fixing the migration issue is an easy task for IBM Bob. However, after fixing the migration issue in CI (GitHub Actions), we found that there is a test issue. After some failed attempts by IBM Bob to fix it, I decided to ask IBM Bob to migrate the test to Aspire Test. It seems to be the most crucial thing to resolve the issue.&lt;/p&gt;

&lt;p&gt;For the first task of fixing the migration issue, we don't even need the skills. &lt;a href="https://github.com/bervProject/NETCoreAPIBoilerplate/commit/7c8c829c3e8cd9bf1974e60a1253bd853ed04330" rel="noopener noreferrer"&gt;Adding skills and fixing migration issue&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;It's different from the second task, which is migrating the test suite to Aspire Test. I believe IBM Bob will get the benefit from the skills. I noticed that after creating the tasks for the migration, in some tasks, IBM Bob will call the skills.&lt;/p&gt;

&lt;p&gt;As you can see in the chat, IBM used &lt;code&gt;dotnet-inspect&lt;/code&gt; to ensure some service (or dependencies) initialization.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Figoph16bc501ab6omn91.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Figoph16bc501ab6omn91.png" alt="dotnet-inspect usage" width="792" height="1381"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;However, after migrating to Aspire Test-based, I won't need to initiate the services myself in CI. Of course, IBM Bob has removed the service initiation from my CI. &lt;a href="https://github.com/bervProject/NETCoreAPIBoilerplate/commit/ddb5019919910254d154498cc1beb70f3410c80c" rel="noopener noreferrer"&gt;Migration Commit&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I wasn't satisfied with the result, as it turned out that the tests were not stopping. I provided the documentation on how Aspire Tests work. The best part is IBM Bob calling it using MCP.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Frv1flw4pgq5s7uyyvry1.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Frv1flw4pgq5s7uyyvry1.png" alt="MCP calling" width="795" height="752"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It's showing good progress, but I'm still not satisfied yet. I asked to read the log. IBM Bob was calling Playwright to read the link and download the logs. Which is looking good.&lt;/p&gt;

&lt;p&gt;However, I believe overall it is good. Even the test CI became indefinite. It seems more related to my config or an existing issue, not the migration result itself.&lt;/p&gt;

&lt;h2&gt;
  
  
  Thank you
&lt;/h2&gt;

&lt;p&gt;If you have some feedback, feel free to let me know!&lt;/p&gt;

&lt;p&gt;Cheers!&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Leo&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2nedyeuzo5kunbwqg1mz.gif" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2nedyeuzo5kunbwqg1mz.gif" alt="Thanks GIF" width="480" height="480"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>ibmbob</category>
      <category>bob</category>
      <category>csharp</category>
    </item>
    <item>
      <title>Leveraging IBM Bob for Migrating App Runner to ECS Express Mode by Using Git Diff or Final State</title>
      <dc:creator>Bervianto Leo Pratama</dc:creator>
      <pubDate>Tue, 28 Jul 2026 14:30:07 +0000</pubDate>
      <link>https://dev.to/berviantoleo/leveraging-ibm-bob-for-migrating-app-runner-to-ecs-express-mode-by-using-git-diff-or-final-state-2ed6</link>
      <guid>https://dev.to/berviantoleo/leveraging-ibm-bob-for-migrating-app-runner-to-ecs-express-mode-by-using-git-diff-or-final-state-2ed6</guid>
      <description>&lt;h2&gt;
  
  
  Background
&lt;/h2&gt;

&lt;p&gt;Based on this &lt;a href="https://docs.aws.amazon.com/apprunner/latest/dg/apprunner-availability-change.html" rel="noopener noreferrer"&gt;documentation&lt;/a&gt;, I need to migrate my existing services to ECS Express Mode. However, I was not sure I was using AI effectively to assist with the migration process. As shown in my previous post, I tried one of my more "complex" applications as the first migration. I hope the diff and lessons learned from that effort will help streamline subsequent migrations by leveraging the git diff or the "final state" of the migration.&lt;/p&gt;

&lt;h2&gt;
  
  
  Migrating the "Same" CDK Code
&lt;/h2&gt;

&lt;p&gt;I attempted the second migration on my CDK code, which uses the same language (TypeScript). I started with the git diff on the first run. Unfortunately, it still tried to rely on older knowledge and crafted detailed ECS service configurations. On the positive side, I did not need to explain or re-prompt regarding the CI/CD setup, as it was already captured in the diff.&lt;/p&gt;

&lt;p&gt;In the second chat, I tried to guide IBM Bob to use a specific class. IBM Bob did a great job exploring the library. However, it missed the IAM role, so I asked IBM Bob to investigate it. Surprisingly, IBM Bob was able to understand how the role works without much guidance.&lt;/p&gt;

&lt;h3&gt;
  
  
  Some Samples
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;First/initial chat&lt;/li&gt;
&lt;/ul&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxu8whlt6jh56kkrlsg96.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxu8whlt6jh56kkrlsg96.png" alt="First Chat" width="800" height="617"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Second chat&lt;/li&gt;
&lt;/ul&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxjfj4yrxnrtjhanax0kl.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxjfj4yrxnrtjhanax0kl.png" alt="Second chat" width="800" height="662"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Role chat&lt;/li&gt;
&lt;/ul&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fgh9dllqg8b58d2uzsbiu.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fgh9dllqg8b58d2uzsbiu.png" alt="Role chat" width="800" height="679"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Lessons from the Second Migration
&lt;/h3&gt;

&lt;p&gt;I appreciate how IBM Bob can quickly migrate existing services easily and seamlessly. Since it was the same language, I expected the migration to be straightforward, and it largely was.&lt;/p&gt;

&lt;h3&gt;
  
  
  Costs
&lt;/h3&gt;

&lt;p&gt;It took 4.6 Bob coins.&lt;/p&gt;

&lt;h2&gt;
  
  
  Migrating Another Language
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Migrating CDK in Python
&lt;/h3&gt;

&lt;p&gt;I was genuinely impressed by how IBM Bob tried to follow the rules I set. I asked it to use the diff as a reference for the migration; however, I forgot that the original code was in TypeScript while my target was Python. IBM Bob attempted to create a new script, which makes sense since the migration process should not delete or remove existing code and infrastructure directly.&lt;/p&gt;

&lt;p&gt;That was my fault for not being clear enough in the prompt. After I clarified that we should stick with Python, IBM Bob naturally fell back on its previous knowledge, which was the non-express mode approach.&lt;/p&gt;

&lt;p&gt;I then asked IBM Bob to explore the CDK library before proceeding. It got close to the goal, but I noticed a slight hallucination — it was not using the correct class. IBM Bob then tried to self-verify by generating a simple CDK script, which was a good approach.&lt;/p&gt;

&lt;p&gt;Once the code migration was complete and I kicked off the deployment, I encountered a failure during the first infrastructure initialization due to an outdated config. It turned out I needed to update the config before validating IBM Bob's output. Thankfully, IBM Bob also helped me review both the config and the application to resolve the issue.&lt;/p&gt;

&lt;h3&gt;
  
  
  Some Chats
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Guiding IBM Bob back to the goal&lt;/li&gt;
&lt;/ul&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0r7q9oftrtky4cme5kq1.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0r7q9oftrtky4cme5kq1.png" alt="IBM Bob use python" width="800" height="1175"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Hallucination&lt;/li&gt;
&lt;/ul&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fjgxf4j0uk9n55cuo1446.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fjgxf4j0uk9n55cuo1446.png" alt="Hallucination" width="800" height="881"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Costs
&lt;/h3&gt;

&lt;p&gt;It took 12.88 Bob coins. (Higher due to the additional help with reviewing the application and config.)&lt;/p&gt;

&lt;h2&gt;
  
  
  Migrating My Last Service (in C#)
&lt;/h2&gt;

&lt;p&gt;After the misstep with Python, I was more deliberate this time — I explicitly prompted IBM Bob to keep the C# language and ensure the CI/CD pipeline remained consistent. Even so, I noticed that IBM Bob did not explore the CDK before starting the migration. Once it realized the language was different from the reference, it stopped exploring on its own. I had to prompt it again to continue the CDK exploration.&lt;/p&gt;

&lt;p&gt;The first attempt failed because the task execution role was incorrect. After sharing the error in the chat, IBM Bob was able to fix it. I consider this acceptable, given that IBM Bob had to reason across different programming languages as well as the AWS infrastructure specifics.&lt;/p&gt;

&lt;h3&gt;
  
  
  Some Chats
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Summary&lt;/li&gt;
&lt;/ul&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fkup37gwledj3prflp62m.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fkup37gwledj3prflp62m.png" alt="Summary image" width="800" height="1157"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Costs
&lt;/h3&gt;

&lt;p&gt;It took approximately 4.69–6.06 Bob coins.&lt;/p&gt;

&lt;h2&gt;
  
  
  List of Repositories
&lt;/h2&gt;

&lt;p&gt;Here are the repositories that were migrated (mostly) with IBM Bob.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href="https://github.com/bervProject/tell-me-everything-api" rel="noopener noreferrer"&gt;Tell Me Everything API: TypeScript&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/bervProject/InvitationAPI" rel="noopener noreferrer"&gt;Invitation API: TypeScript&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/bervProject/my-telegram-bot" rel="noopener noreferrer"&gt;my-telegram-bot: Python&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/bervProject/SimplePasswordManagerService" rel="noopener noreferrer"&gt;SimplePasswordManagerService: C#&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Thank you
&lt;/h2&gt;

&lt;p&gt;Thank you for reading. Have a great day!&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3l8f22439ow0m9z91f2a.gif" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3l8f22439ow0m9z91f2a.gif" alt="Great Day GIF" width="500" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>aws</category>
      <category>ibmbob</category>
      <category>devjournal</category>
    </item>
    <item>
      <title>Getting Started with IBM Bob - Migrating Existing AWS Infrastructure</title>
      <dc:creator>Bervianto Leo Pratama</dc:creator>
      <pubDate>Sat, 18 Jul 2026 05:48:48 +0000</pubDate>
      <link>https://dev.to/berviantoleo/getting-started-with-ibm-bob-migrating-existing-aws-infrastructure-cc1</link>
      <guid>https://dev.to/berviantoleo/getting-started-with-ibm-bob-migrating-existing-aws-infrastructure-cc1</guid>
      <description>&lt;h2&gt;
  
  
  Motivation
&lt;/h2&gt;

&lt;p&gt;Hello, all. This is my first time exploring IBM Bob. I was using the Trial Version. Just want to know more about IBM Bob. I have some existing AWS Infrastructure and quite simple enough to be migrated. I asked IBM Bob to migrate AWS App Runner to Amazon ECS Express mode.&lt;/p&gt;

&lt;p&gt;As AWS App Runner has given notice to me about the end of support, I haven't thought to migrate yet. However, after some thought, as I may reuse some existing applications, I changed my mind.&lt;/p&gt;

&lt;p&gt;Reading the &lt;a href="https://docs.aws.amazon.com/apprunner/latest/dg/apprunner-availability-change.html?refid=6e912dda-6fca-4783-9726-1587e023aa98" rel="noopener noreferrer"&gt;migration guide&lt;/a&gt;, it was quite a lot of information for my simple application. I barely use AWS App Runner, AWS Secrets Manager, and AWS CDK. As I haven't used a custom domain yet, it should be straightforward.&lt;/p&gt;

&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;h3&gt;
  
  
  What's IBM Bob?
&lt;/h3&gt;

&lt;p&gt;If you don't know &lt;a href="https://bob.ibm.com" rel="noopener noreferrer"&gt;IBM Bob&lt;/a&gt;. This is the short introduction from &lt;a href="https://bob.ibm.com/docs/ide" rel="noopener noreferrer"&gt;the documentation&lt;/a&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;IBM Bob is an AI SDLC (Software Development Lifecycle) partner that augments your existing workflows and helps you work confidently with real codebases.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I would say, in short, it's an IDE that integrates with AI "natively". There are some specialized modes: Agent mode, Ask mode, and Plan mode. In this article, it heavily mentions the Plan mode, but it also involves Agent mode "in the background".&lt;/p&gt;

&lt;h3&gt;
  
  
  What's AWS App Runner?
&lt;/h3&gt;

&lt;p&gt;You may have a look at this short introduction of &lt;a href="https://aws.amazon.com/apprunner/" rel="noopener noreferrer"&gt;AWS App Runner&lt;/a&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;AWS App Runner builds and deploys web applications automatically, load balances traffic with encryption, scales to meet your traffic needs, and allows for the configuration of how services are accessed and communicate with other AWS applications in a private Amazon VPC.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In short, you can deploy your web application or API, especially when you have containerised the application; it will simply handle the infrastructure, and you only need to deploy your container image.&lt;/p&gt;

&lt;h3&gt;
  
  
  What's Amazon ECS Express mode?
&lt;/h3&gt;

&lt;p&gt;Here is the short introduction of &lt;a href="https://docs.aws.amazon.com/AmazonECS/latest/developerguide/express-service-overview.html" rel="noopener noreferrer"&gt;Amazon ECS Express Mode&lt;/a&gt;. In simple words, it's the replacement of AWS App Runner. But I don't want to use that term more widely. Let's learn more about Amazon ECS Express Mode later.&lt;/p&gt;

&lt;p&gt;It's really helpful to configure our infrastructure under Amazon ECS Express Mode, especially as a developer who wants to experiment with AWS. I was trying to configure Amazon ECS from scratch, and it took me a long time to successfully deploy a simple application. Which is stopping me from using it, and decide to use App Runner instead. But now we have Amazon ECS Express Mode, let's migrate it!&lt;/p&gt;

&lt;h3&gt;
  
  
  What's AWS CDK?
&lt;/h3&gt;

&lt;p&gt;Let's see in short about &lt;a href="https://aws.amazon.com/id/cdk/" rel="noopener noreferrer"&gt;AWS CDK&lt;/a&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Define your cloud application resources using familiar programming languages&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Behind AWS CDK, it will create the AWS CloudFormation; however, I can programmatically craft the infrastrucure use programing language such as &lt;br&gt;
TypeScript, JavaScript, Python, Java, C#, and Go.&lt;/p&gt;

&lt;h2&gt;
  
  
  Starting from planning
&lt;/h2&gt;

&lt;p&gt;I didn't like migrating the existing infrastructure directly, even though it's just a development environment. As a context, I want to migrate my development/experiment environment. Basically, my strategy is to initiate the ECS Express and keep the AWS App Runner.&lt;/p&gt;

&lt;h3&gt;
  
  
  Vibe Coding - The First Prompt for Planning
&lt;/h3&gt;

&lt;p&gt;I asked Bob to prepare the plan and prompt the very first prompt.&lt;/p&gt;

&lt;p&gt;There are some points that I love about how IBM Bob handled the plan.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;IBM Bob can clearly understand the existing infrastructure by quickly reading the application code and the infrastructure code.&lt;/li&gt;
&lt;li&gt;IBM Bob can advise on the best way to migrate, even though I didn't ask clearly before.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;However, it's assuming that I didn't want to. I would like Amazon ECS Express, which is the simple way to handle ECS without handling much of the infrastructure. As this is quite new knowledge, IBM Bob assumes I want a standard/regular Amazon ECS with Fargate. So the first attempt is partially good. Here is the &lt;a href="https://github.com/bervProject/tell-me-everything-api/commit/28a5341c876c3fe6450c0052e63481296554a14d#diff-cac944d48676945ee16862f94afebe27694fcb19b32278a5d9567326bf9db965" rel="noopener noreferrer"&gt;first commit/attemp&lt;/a&gt;.&lt;/p&gt;

&lt;h4&gt;
  
  
  Some Interactions Screenshots
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Question prompt&lt;/li&gt;
&lt;/ul&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ffaubzr0rvjxtwfp7e3rp.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ffaubzr0rvjxtwfp7e3rp.png" alt="Question prompt" width="800" height="699"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Finished the plan with IBM Bob's assumption.&lt;/li&gt;
&lt;/ul&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fwc535ffxbi3p38lkhaz6.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fwc535ffxbi3p38lkhaz6.png" alt="Planning" width="800" height="699"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Driving the IBM Bob to clearly understand the new knowledge
&lt;/h3&gt;

&lt;p&gt;IBM Bob can't stop surprising me. It's able to understand what I want by providing an article that explains how to use Amazon ECS Express in more detail. Even on the second attempt, I was providing the &lt;a href="https://docs.aws.amazon.com/apprunner/latest/dg/apprunner-availability-change.html?refid=6e912dda-6fca-4783-9726-1587e023aa98" rel="noopener noreferrer"&gt;migration guide&lt;/a&gt;, and IBM Bob didn't understand how to migrate into Amazon ECS Express.&lt;/p&gt;

&lt;p&gt;After driving Bob to explore &lt;code&gt;CfnExpressGatewayService&lt;/code&gt;, surprisingly, IBM Bob provided me with a quick fix after the first and second attempts. Here is the &lt;a href="https://github.com/bervProject/tell-me-everything-api/commit/0b6214bb8848e05397a72b0df9d4023d81b59b78" rel="noopener noreferrer"&gt;solid result&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Some Screenshots
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Resolving after driving to new knowledge&lt;/li&gt;
&lt;/ul&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fm97h7qqh721o4hc2u1zy.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fm97h7qqh721o4hc2u1zy.png" alt="Resolving after driving to new knowledge" width="800" height="699"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxq9fb2zvr693z7x6q9vc.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxq9fb2zvr693z7x6q9vc.png" alt="Resolving after driving to new knowledge - 2" width="800" height="699"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Lesson Learned
&lt;/h2&gt;

&lt;p&gt;There was a great experience trying IBM Bob. After the last attempt, I wasn't aware if my application was still broken. I didn't notice if the application wasn't aware of the Environment Variable. I'm not sure since when, however, after I tried to deploy. It kept failing. I was afraid it was the infra config; however, it was not. After more debugging on my local, I noticed the environment variable was not detected. So, I fixed the application and reverted the infra config to the IBM Bob suggested at first glance. Voilà, it's now running perfectly!&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fugjwr41l00d5eqkdkc7g.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fugjwr41l00d5eqkdkc7g.png" alt="GitHub Action-Success" width="799" height="372"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4hk00m2i96eja5oz0qcs.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4hk00m2i96eja5oz0qcs.png" alt="CF-Success" width="800" height="325"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2vseydyrn2i78sxbh3oq.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2vseydyrn2i78sxbh3oq.png" alt="ECS Express" width="800" height="156"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Thank you
&lt;/h2&gt;

&lt;p&gt;Thank you for reading. It was really quick for the fix/migration, but not for the debugging, as I didn't have enough time to execute or check in my local environment lately. After having some time to check on the application, I got the answer as to why the deployment was failing after the infra migration.&lt;/p&gt;

&lt;p&gt;This is just a little story, not the deep knowledge of how to migrate it step by step. As my prompt's result can be different for you, I don't want to rely on that. However, I will rely on how you should drive the AI to give the best context for the migration process. I hope it helps.&lt;/p&gt;

&lt;p&gt;Cheers!&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9dg7dkjvugwu8jy6dvy8.gif" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9dg7dkjvugwu8jy6dvy8.gif" alt="Thank you GIF" width="384" height="480"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>ibmbob</category>
      <category>bob</category>
      <category>aws</category>
    </item>
    <item>
      <title>Migration and Modernisation with Kiro CLI</title>
      <dc:creator>Bervianto Leo Pratama</dc:creator>
      <pubDate>Sat, 04 Apr 2026 05:45:49 +0000</pubDate>
      <link>https://dev.to/berviantoleo/migration-and-modernisation-with-kiro-cli-24ga</link>
      <guid>https://dev.to/berviantoleo/migration-and-modernisation-with-kiro-cli-24ga</guid>
      <description>&lt;h2&gt;
  
  
  Background
&lt;/h2&gt;

&lt;p&gt;Once upon a time, there was a developer who needed to keep updating the dependencies of each tool/product/software. There is a Dependabot that is still helpful for updating minor versions. However, it will need a manual update/migration whenever a major version comes. Migrating to a major version is frustrating for me if I need to update it in bulk. Updating only one app is pretty fine, but how about multiple apps? I believe we will stop doing it.&lt;/p&gt;

&lt;h2&gt;
  
  
  AI Era
&lt;/h2&gt;

&lt;p&gt;The AI (Artificial Intelligence) era has come. Much automation can be achieved by AI. I have a good belief that I can migrate much more easily whenever I use AI. Not like the old age, which needs many manual changes, especially the breaking changes!&lt;/p&gt;

&lt;h2&gt;
  
  
  Migration as Vibes
&lt;/h2&gt;

&lt;p&gt;I'm starting the migration as vibes. So, I only put a simple prompt to know how the AI will work. In this case, I tested Kiro CLI as an example.&lt;/p&gt;

&lt;p&gt;I have many legacy codes which still being used with &lt;a href="https://cli.vuejs.org/guide/cli-service.html" rel="noopener noreferrer"&gt;Vue CLI&lt;/a&gt;. Vue CLI is in Maintenance Mode, so many tools are deprecated and cannot adapt to the newer version of Typescript, Node, etc. It was frustrating while trying to migrate it to Vite. Many dependencies need to be changed.&lt;/p&gt;

&lt;p&gt;Surprisingly, I am amazed by the result of the simple prompt. It was a success to migrate a bunch of my repos, and at least it produced a basic migration.&lt;/p&gt;

&lt;p&gt;Example simple prompt:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Migrate to Vite from Vue CLI.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Well, that simple prompt is not recommended. :)&lt;/p&gt;

&lt;h2&gt;
  
  
  Lesson Learned
&lt;/h2&gt;

&lt;p&gt;I learned how to create a good prompt. I tried a basic/simple prompt in multiple repositories. The result? I need to change some code manually multiple times. I'm using a library that will raise an error by Vite, I "can" suppress the error as a warning, but I forgot to apply it in multiple projects. So I need to apply it multiple times. I should add more specific extra instructions for migration so I don't need to update it manually frequently.&lt;/p&gt;

&lt;h2&gt;
  
  
  The list of repo
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Migrating to Vite
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/bervProject/Pulau-Sebuku-GIS" rel="noopener noreferrer"&gt;https://github.com/bervProject/Pulau-Sebuku-GIS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/bervProject/liff-exploration" rel="noopener noreferrer"&gt;https://github.com/bervProject/liff-exploration&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/bervProject/siwb-ui" rel="noopener noreferrer"&gt;https://github.com/bervProject/siwb-ui&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Related to Upgrading version
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/bervProject/belitung-information-center" rel="noopener noreferrer"&gt;https://github.com/bervProject/belitung-information-center&lt;/a&gt; (Upgrading Angular, etc.)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/bervProject/my-personal-web-angular" rel="noopener noreferrer"&gt;https://github.com/bervProject/my-personal-web-angular&lt;/a&gt; (Upgrading Angular)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Future
&lt;/h2&gt;

&lt;p&gt;In the future, I will try to automate this and use a correct prompt. So, it should be automated; I only need to review and approve. :) Let's see.&lt;/p&gt;

&lt;p&gt;Thank you for reading. I hope you get an insight.&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%2Fxiejes2iz5zvcn73g7w5.gif" 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%2Fxiejes2iz5zvcn73g7w5.gif" alt="Thanks GIF" width="480" height="480"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>aws</category>
      <category>kiro</category>
      <category>kirocli</category>
      <category>migration</category>
    </item>
    <item>
      <title>re:Cap 2025 by AWS User Group Jakarta</title>
      <dc:creator>Bervianto Leo Pratama</dc:creator>
      <pubDate>Sat, 31 Jan 2026 12:12:26 +0000</pubDate>
      <link>https://dev.to/aws-builders/recap-2025-by-aws-user-group-jakarta-f8c</link>
      <guid>https://dev.to/aws-builders/recap-2025-by-aws-user-group-jakarta-f8c</guid>
      <description>&lt;h2&gt;
  
  
  TLDR
&lt;/h2&gt;

&lt;p&gt;AWS User Group Jakarta hosted re:Cap 2025. It was a great opportunity to speak at re:Cap 2025. For more information, you can visit,&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.meetup.com/aws-ug-jakarta/events/312636882/?eventOrigin=notifications&amp;amp;notificationId=%3Cinbox%3E%21306480235-1769723328220" rel="noopener noreferrer"&gt;Meetup&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://jakarta.awscommunity.id/events/reinvent-recap-2025/" rel="noopener noreferrer"&gt;AWS UG Jakarta - Event&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  My Session
&lt;/h2&gt;

&lt;p&gt;I was talking about some announcements that might be interested for developers. You may get &lt;a href="https://docs.google.com/presentation/d/106EWTPkdjf3fovBD5T0Sm-LPHPTvP2ZxdK3-brA5Wuc/edit?usp=sharing" rel="noopener noreferrer"&gt;my slide&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The focus is more on Lambda and AWS Transform. It's quite inline with migration and modernization.&lt;/p&gt;

&lt;p&gt;Migration and modernization are not simple tasks. That's why AWS Transform may help some organizations to migrate and modernise. However, AWS Transform may need to consider the security concern.&lt;/p&gt;

&lt;p&gt;I'm quite excited about Lambda Durable Function. It's quite helpful to extend the decision moving app to Lambda. Whenever configuring "complex" infrastructure, it may be hard to troubleshoot and migrate. Using a Lambda Durable Function may be a better solution for some cases.&lt;/p&gt;

&lt;h2&gt;
  
  
  Some Photos from the Organizer
&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%2F89z02ugq30szmdshrup1.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%2F89z02ugq30szmdshrup1.jpg" alt="Presenting 2" width="800" height="794"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7kqdd94ui7rmee969kl2.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%2F7kqdd94ui7rmee969kl2.jpg" alt="Presenting" width="800" height="796"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;If you are interested in another topic, feel free to reach out to the speakers. It's really great to attend re:cap 2025 by AWS UG Jakarta.&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%2Flkg9s3utxcwjrgy0pvca.gif" 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%2Flkg9s3utxcwjrgy0pvca.gif" alt="Happy GIF" width="480" height="260"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>aws</category>
      <category>modernise</category>
      <category>news</category>
      <category>tooling</category>
    </item>
    <item>
      <title>Importing my AWS IAM Role to Terraform using Terraform Search</title>
      <dc:creator>Bervianto Leo Pratama</dc:creator>
      <pubDate>Fri, 17 Oct 2025 08:24:20 +0000</pubDate>
      <link>https://dev.to/berviantoleo/importing-my-aws-iam-role-to-terraform-2n4m</link>
      <guid>https://dev.to/berviantoleo/importing-my-aws-iam-role-to-terraform-2n4m</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Cover image is generated by AI&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Motivation
&lt;/h2&gt;

&lt;p&gt;A long time ago... I want to manage my IAM Role with Terraform. But, I'm quite lazy for writing it manually... Especially for my existing IAM Role. I heard about &lt;strong&gt;Terraform Search&lt;/strong&gt;, which helps me import existing resources to write the resource configuration! Wow!&lt;/p&gt;

&lt;p&gt;Imagine you write the query something like this.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight terraform"&gt;&lt;code&gt;&lt;span class="nx"&gt;list&lt;/span&gt; &lt;span class="nx"&gt;aws_iam_role&lt;/span&gt; &lt;span class="nx"&gt;dev&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;provider&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;aws&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Run this command.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;terraform query &lt;span class="nt"&gt;-generate-config-out&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;generated.tf
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Boom! You got a generated resource file with the import blocks.&lt;/p&gt;

&lt;p&gt;Easy, right?&lt;/p&gt;
&lt;h2&gt;
  
  
  How did I do?
&lt;/h2&gt;
&lt;h3&gt;
  
  
  Prerequisite
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Terraform 1.14.x (still beta right now...)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you want to read more, please visit &lt;a href="https://developer.hashicorp.com/terraform/language/v1.14.x/import/bulk" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Keep in mind. Terraform Search supports are based on the Terraform provider.&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%2Fpetw83heja7cbiwclfqv.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%2Fpetw83heja7cbiwclfqv.png" alt="Documentation"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Run it locally
&lt;/h3&gt;

&lt;p&gt;Okay, you need to do it locally because HCP won't have the beta right now, except that Terraform 1.14 has been released. So, basically, these are my steps. In this case, I want to manage the state in HCP Terraform.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Install Terraform 1.14.x in Local&lt;/li&gt;
&lt;li&gt;Ensure you have the AWS Credentials in your local.&lt;/li&gt;
&lt;li&gt;Configure a workspace in HCP Terraform. Ensure you have the AWS Credentials. But temporarily set it as local execution.&lt;/li&gt;
&lt;li&gt;Write the &lt;code&gt;main.tf&lt;/code&gt; to configure the provider, in this case AWS provider.&lt;/li&gt;
&lt;li&gt;Write the &lt;code&gt;.tfquery.hcl&lt;/code&gt; file (look above section).&lt;/li&gt;
&lt;li&gt;Let's init first. &lt;code&gt;terraform init&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Run the query command &lt;code&gt;terraform query -generate-config-out=generated.tf&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Copy only resources that I want to manage.&lt;/li&gt;
&lt;li&gt;Run &lt;code&gt;terraform plan&lt;/code&gt; just to ensure it will import!&lt;/li&gt;
&lt;li&gt;Run &lt;code&gt;terraform apply&lt;/code&gt; if I'm sure of the configuration.&lt;/li&gt;
&lt;li&gt;Now my IAM Roles are managed by HCP Terraform!&lt;/li&gt;
&lt;li&gt;You may now change the execution to HCP Terraform (if you want to run it there).&lt;/li&gt;
&lt;/ol&gt;

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

&lt;ul&gt;
&lt;li&gt;It may expose your AWS Account ID and some information. Before you commit those codes, you may need to extract some information to create some variables.&lt;/li&gt;
&lt;/ul&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%2Fiwhiy9tgkzgu0b3csg1d.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%2Fiwhiy9tgkzgu0b3csg1d.png" alt="HCP Result"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Result
&lt;/h2&gt;

&lt;p&gt;You can visit my repo here.&lt;/p&gt;

&lt;p&gt;

&lt;/p&gt;
&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/bervProject" rel="noopener noreferrer"&gt;
        bervProject
      &lt;/a&gt; / &lt;a href="https://github.com/bervProject/AWSSecurityAsACode" rel="noopener noreferrer"&gt;
        AWSSecurityAsACode
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      AWS Security as a Code for BervProjects
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;My First AWS Security as Code&lt;/h1&gt;

&lt;/div&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Generate the resources import&lt;/h2&gt;

&lt;/div&gt;

&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;terraform query -generate-config-out=generated.tf&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;or&lt;/p&gt;

&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;./generate.sh&lt;/pre&gt;

&lt;/div&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;LICENSE&lt;/h2&gt;

&lt;/div&gt;

&lt;p&gt;MIT&lt;/p&gt;

&lt;/div&gt;
&lt;br&gt;
&lt;br&gt;
  &lt;/div&gt;
&lt;br&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/bervProject/AWSSecurityAsACode" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;





&lt;h2&gt;
  
  
  Thank you
&lt;/h2&gt;

&lt;p&gt;Thank you for reading!&lt;/p&gt;

&lt;p&gt;If you have any feedback, feel free to comment here.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fencrypted-tbn0.gstatic.com%2Fimages%3Fq%3Dtbn%3AANd9GcTZiYsNkgJKFu0dZiJuwNVdK5Pk9PqUtYMhQw%26s" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fencrypted-tbn0.gstatic.com%2Fimages%3Fq%3Dtbn%3AANd9GcTZiYsNkgJKFu0dZiJuwNVdK5Pk9PqUtYMhQw%26s" alt="Gracias GIF"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>security</category>
      <category>aws</category>
      <category>terraform</category>
      <category>devjournal</category>
    </item>
    <item>
      <title>Enhancing developer experience with Vagrant</title>
      <dc:creator>Bervianto Leo Pratama</dc:creator>
      <pubDate>Fri, 26 Sep 2025 05:21:15 +0000</pubDate>
      <link>https://dev.to/berviantoleo/enhancing-developer-experience-with-vagrant-ai0</link>
      <guid>https://dev.to/berviantoleo/enhancing-developer-experience-with-vagrant-ai0</guid>
      <description>&lt;p&gt;This is a part of my &lt;a href="https://www.hashicorp.com/en/conferences/hashiconf/agenda/9-25/enhancing-developer-experience-with-vagrant" rel="noopener noreferrer"&gt;HashiConf 2025&lt;/a&gt; talks.&lt;/p&gt;

&lt;h2&gt;
  
  
  Resources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://1drv.ms/p/c/e84502f01965f7c5/EY_e1LTdLVpBvL8826LOQEUBbavF6BJGlHi_mlo7JOejpQ?e=HKXaJQ" rel="noopener noreferrer"&gt;Original Slides&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;As a developer, it's quite common to get an issue which not replicable. It's either an undetailed or an assumption replication of steps, a configuration issue, an environment issue, etc. I believe some developers face issues when in production it doesn't work, but in their local was working. There is a common slogan, "it's work in my machine." So, why don't we bring our machine then?&lt;/p&gt;

&lt;h2&gt;
  
  
  Motivation
&lt;/h2&gt;

&lt;p&gt;We need to kill the configuration/environment issue. There is a great tool called Vagrant. I want to emphasize why Vagrant? Because it promises consistency. When in my machine works, of course, in yours, and should be productions!&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;When I developed some functionality, there was an issue that only happened in production. Either because different operating system, a different configuration, etc. Of course, when we use Vagrant, we are able to use the same operating system.&lt;/li&gt;
&lt;li&gt;How about the configuration? Yes, we can ensure the same config as production. It doesn't mean you will have the same architecture, but at least you have the prototype.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Trade Off
&lt;/h2&gt;

&lt;p&gt;Every choice will have a trade-off. For example, we will face the power of the host machine. Not all organizations will choose a very fancy specification. This will become a bottleneck. When they don't want to switch into the same operating system, but don't want to spend more money on providing more powerful development devices.&lt;/p&gt;

&lt;p&gt;Well, let's talk about why we use Docker directly. Of course, I will say yes, if...&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The operating system is the same as our target server.&lt;/li&gt;
&lt;li&gt;Having a mechanism to have the same configuration.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I faced some organizations having their developers which different tools, different operating systems, which is not appropriate. Okay, for example, I have a Windows operating system, but I want to run Docker. Oh well, we may say, oh, that's better. It's more reasonable now, lighter.&lt;/p&gt;

&lt;p&gt;Well, I was part of modernization and or refactoring from .NET Framework to .NET Core, which supports more operating systems. Back then, I faced a lot of problems when we started containerizing it to become a Linux container. Either it's only running in my machine, or just environment issues.&lt;/p&gt;

&lt;p&gt;For example, oh, I can run it in my local environment because I have some proper configurations. But the production doesn't know it, which is not a good one. Then, how about talking about the changes to the operation team regarding changes. Well, how long will it take? They have some BAU (Business As Usual). Some requests may not be taken into account.&lt;/p&gt;

&lt;p&gt;Oh no, so what will we do? Imagine...&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The developer can make some changes in their Vagrantfile.&lt;/li&gt;
&lt;li&gt;We have set the automatic system to detect the changes.&lt;/li&gt;
&lt;li&gt;If we get the changes, we start to sync them with production.&lt;/li&gt;
&lt;li&gt;Yeay! We win it!&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But, but, ... I can't say the current state of Vagrant is developer-friendly. It's a little bit operations team part. I would say it's a shared responsibility between the developer and operations. Well, at least it's a code, developers should learn it (sorry).&lt;/p&gt;

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

&lt;ol&gt;
&lt;li&gt;The providers may not matter. I select VirtualBox, because most of us are more familiar with it, but please select any providers that fit with your compliance. Maybe the other VM Virtualization will work. Please take note, why we don't choose Docker as a provider, it's a bit complex (oh, I mean more confusing) than the other. Because it will run a VM whenever it's not supporting Linux containerization.&lt;/li&gt;
&lt;li&gt;Choose any provisioner that meets your requirements. I love how Docker provisioner works. Even sometimes I still need &lt;strong&gt;shell&lt;/strong&gt;. I really hope the provisioner will grow up. Why? So we can easily get the high-level of Vagrantfile (without AI, of course, sorry AI).&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I understand we can improve our work with AI, but please understand the fundamentals. It will really help instead of blindly using AI, and (boom), you don't know what AI said.&lt;/p&gt;

&lt;p&gt;Finally, feel free to give any feedback. Any feedback is welcome, even if you do not agree with this article/supplement. I just want to share my perspective. Every team/organization may have its own challenges, which is why sharing is caring. I really love to learn how they tackle their challenges. It's really inspiring!&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%2Fyjlugcax0yk31kp13ooo.gif" 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%2Fyjlugcax0yk31kp13ooo.gif" alt="Thanks GIF" width="220" height="439"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>vagrant</category>
      <category>devops</category>
      <category>devex</category>
      <category>microservices</category>
    </item>
    <item>
      <title>Pengalaman Pertama menghadiri AWS Summit Jakarta 2025 sebagai Speaker</title>
      <dc:creator>Bervianto Leo Pratama</dc:creator>
      <pubDate>Sat, 30 Aug 2025 04:20:31 +0000</pubDate>
      <link>https://dev.to/aws-builders/pengalaman-pertama-menghadiri-aws-summit-jakarta-2025-sebagai-speaker-4i8a</link>
      <guid>https://dev.to/aws-builders/pengalaman-pertama-menghadiri-aws-summit-jakarta-2025-sebagai-speaker-4i8a</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Cover blog di-generate oleh AI&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Pembukaan
&lt;/h2&gt;

&lt;p&gt;Halo, semuanya!&lt;/p&gt;

&lt;p&gt;Ini merupakan tulisan pertama saya dalam bahasa Indonesia di sini. Saya sengaja menuliskannya dalam Bahasa Indonesia karena acara AWS Summit Jakarta 2025 ini diadakan di Indonesia. Acaranya diadakan tanggal 7 Agustus 2025.&lt;/p&gt;

&lt;p&gt;Saya sangat senang bertemu dengan rekan-rekan AWS Community Builder. Bertemu juga dengan rekan-rekan AWS User Group Jakarta. Apalagi waktu itu akhirnya bertemu muka dengan Shafraz Rahim (AWS - Senior Program Manager - Community, APJC) dan Jason Dunn (AWS CB Program Manager), yang biasanya bertemu di media sosial saja. :D&lt;/p&gt;

&lt;p&gt;Saya waktu itu berkesempatan untuk membicarakan topik Amazon Q Developer dengan kasus modernisasi.&lt;/p&gt;

&lt;h2&gt;
  
  
  Foto-Foto
&lt;/h2&gt;

&lt;p&gt;Berikut foto-fotonya. Hehehe...&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ini waktu saya berbicara&lt;/li&gt;
&lt;/ul&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%2Fiu2cxjtbbtt8j67htqib.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%2Fiu2cxjtbbtt8j67htqib.jpg" alt="Saat Berbicara"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Foto Grup Developer Lounge&lt;/li&gt;
&lt;/ul&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%2Fotcwpu6n4ehvevswk4py.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%2Fotcwpu6n4ehvevswk4py.jpg" alt="Foto Grup Developer Lounge"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ini makan malam setelah semuanya selesai.&lt;/li&gt;
&lt;/ul&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%2Fe5x95il94n2ydes9d80v.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%2Fe5x95il94n2ydes9d80v.jpg" alt="Makan-Makan"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Tambahan
&lt;/h2&gt;

&lt;p&gt;Berikut ini &lt;a href="https://1drv.ms/p/c/e84502f01965f7c5/IQSmucH97iPMRawP4f1vRj-jAYOWKcqDw8fAXn74cwAMSXM" rel="noopener noreferrer"&gt;slide-deck&lt;/a&gt; yang saya gunakan.&lt;/p&gt;

&lt;p&gt;Berikut ini juga video-nya.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Modernisasi&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;Upgrade&lt;/li&gt;
&lt;/ul&gt;

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

&lt;h2&gt;
  
  
  Terima kasih
&lt;/h2&gt;

&lt;p&gt;Terima kasih untuk teman-teman yang sudah hadir juga!&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%2Fzwkh42zcsm9ri5ffikul.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%2Fzwkh42zcsm9ri5ffikul.png" alt="Terima kasih"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Gambar "Thank you" di-generate oleh AI&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>aws</category>
      <category>awssummit</category>
      <category>devjournal</category>
      <category>experience</category>
    </item>
    <item>
      <title>Continuing ShortenUrl with Redis 8</title>
      <dc:creator>Bervianto Leo Pratama</dc:creator>
      <pubDate>Sat, 09 Aug 2025 06:17:20 +0000</pubDate>
      <link>https://dev.to/berviantoleo/continuing-shortenurl-with-redis-8-4o9o</link>
      <guid>https://dev.to/berviantoleo/continuing-shortenurl-with-redis-8-4o9o</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/redis-2025-07-23"&gt;Redis AI Challenge&lt;/a&gt;: Beyond the Cache&lt;/em&gt;.&lt;/p&gt;

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

&lt;p&gt;I was building ShortenUrl, which utilizes Redis Stack. Now, I'll try to utilize Redis 8 and add some features, for example, statistics.&lt;/p&gt;


&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/berviantoleo/simple-shorten-url-using-redis-and-auth0-lk7" class="crayons-story__hidden-navigation-link"&gt;Simple Shorten URL using Redis and Auth0&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/berviantoleo" class="crayons-avatar  crayons-avatar--l  "&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%2Fuser%2Fprofile_image%2F90909%2F4c11951a-d3a9-463c-8e6c-2e9448366906.jpg" alt="berviantoleo profile" class="crayons-avatar__image"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/berviantoleo" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Bervianto Leo Pratama
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Bervianto Leo Pratama
                
              
              &lt;div id="story-author-preview-content-1169651" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/berviantoleo" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&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%2Fuser%2Fprofile_image%2F90909%2F4c11951a-d3a9-463c-8e6c-2e9448366906.jpg" class="crayons-avatar__image" alt=""&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Bervianto Leo Pratama&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/berviantoleo/simple-shorten-url-using-redis-and-auth0-lk7" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Aug 28 '22&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/berviantoleo/simple-shorten-url-using-redis-and-auth0-lk7" id="article-link-1169651"&gt;
          Simple Shorten URL using Redis and Auth0
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/redishackathon"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;redishackathon&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/redis"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;redis&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/dotnet"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;dotnet&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/berviantoleo/simple-shorten-url-using-redis-and-auth0-lk7" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/exploding-head-daceb38d627e6ae9b730f36a1e390fca556a4289d5a41abb2c35068ad3e2c4b5.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/multi-unicorn-b44d6f8c23cdd00964192bedc38af3e82463978aa611b4365bd33a0f1f4f3e97.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;3&lt;span class="hidden s:inline"&gt;&amp;nbsp;reactions&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/berviantoleo/simple-shorten-url-using-redis-and-auth0-lk7#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              

              &lt;span class="hidden s:inline"&gt;Add&amp;nbsp;Comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            1 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


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

&lt;h3&gt;
  
  
  New Feature - Stats
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fec2rlv4o2otw4d5p0yid.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%2Fec2rlv4o2otw4d5p0yid.png" alt="Stats"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  How I Used Redis 8
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Details of usage, mostly in README.ME. I'll explain what the highlight features.&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;As a primary database, I'm using JSON for storing in Redis. It's speedy!&lt;/li&gt;
&lt;li&gt;Using aggregate/order in Redis.&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>redischallenge</category>
      <category>devchallenge</category>
      <category>database</category>
      <category>ai</category>
    </item>
  </channel>
</rss>
