<?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: Hoang Le</title>
    <description>The latest articles on DEV Community by Hoang Le (@hoangleitvn).</description>
    <link>https://dev.to/hoangleitvn</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F258286%2Fd2099950-990c-4e3d-a2ea-d60a925c5889.jpeg</url>
      <title>DEV Community: Hoang Le</title>
      <link>https://dev.to/hoangleitvn</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/hoangleitvn"/>
    <language>en</language>
    <item>
      <title>12 Hidden AWS Costs That Silently Drain Your Budget</title>
      <dc:creator>Hoang Le</dc:creator>
      <pubDate>Wed, 14 Jan 2026 10:01:03 +0000</pubDate>
      <link>https://dev.to/hoangleitvn/12-hidden-aws-costs-that-silently-drain-your-budget-46f2</link>
      <guid>https://dev.to/hoangleitvn/12-hidden-aws-costs-that-silently-drain-your-budget-46f2</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://innomizetech.com/blog/12-hidden-aws-costs-what-most-teams-miss-on-their-aws-bill" rel="noopener noreferrer"&gt;INNOMIZE&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; Most AWS waste comes from costs nobody thinks to check: snapshot accumulation ($2,500/month for 50TB), dormant resources ($100-500/month each), NAT Gateways ($100+/month), CloudWatch logs with infinite retention, and unattached Elastic IPs. The pattern is "set and forget." Quick win: delete snapshots older than 90 days. Enable &lt;a href="https://aws.amazon.com/aws-cost-management/aws-cost-anomaly-detection/" rel="noopener noreferrer"&gt;Cost Anomaly Detection&lt;/a&gt; (free). Read on for all 12 costs and two real case studies.&lt;/p&gt;




&lt;blockquote&gt;
&lt;p&gt;Your AWS bill tells you what you spent. It doesn't tell you what you wasted.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If you've ever looked at your monthly invoice and thought "why is this so high?", you're not alone. We've audited dozens of AWS accounts over the years, and we keep finding the same pattern: teams optimize the obvious costs (EC2 instances, RDS databases) while overlooking charges that accumulate quietly in the background.&lt;/p&gt;

&lt;p&gt;The problem isn't that these costs are hidden in the console. They're right there in &lt;a href="https://aws.amazon.com/aws-cost-management/aws-cost-explorer/" rel="noopener noreferrer"&gt;Cost Explorer&lt;/a&gt;. The problem is that nobody thinks to look.&lt;/p&gt;

&lt;p&gt;This is part 1 of our AWS Cost Optimization series. We'll walk through 12 costs that most teams miss, explain why they're easy to overlook, and show you what to check. In Part 2, we cover the optimization strategies that actually move the needle. In Part 3, we give you a step-by-step audit playbook.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Note: Part 2 and Part 3 will be published soon. Check back or subscribe for updates.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;If you're looking for a quick overview of cost optimization best practices, we also published a &lt;a href="https://innomizetech.com/blog/mastering-aws-cost-optimization-with-best-practices-and-hidden-costs" rel="noopener noreferrer"&gt;comprehensive guide to AWS cost optimization&lt;/a&gt; that covers the fundamentals.&lt;/p&gt;

&lt;h2&gt;
  
  
  Data transfer: the invisible cost
&lt;/h2&gt;

&lt;p&gt;Data transfer is one of the most commonly overlooked AWS charges. Most teams focus on compute and storage costs, assuming network charges are negligible. Then the bill arrives.&lt;/p&gt;

&lt;p&gt;AWS charges &lt;strong&gt;$0.02 - $0.09 per GB&lt;/strong&gt; (&lt;a href="https://aws.amazon.com/ec2/pricing/on-demand/#Data_Transfer" rel="noopener noreferrer"&gt;see Pricing&lt;/a&gt;) for inter-region transfers and internet egress. That doesn't sound like much until you do the math. A service sending 1TB of data between regions costs roughly &lt;strong&gt;$20/month&lt;/strong&gt;. Multiply that by multiple services across regions, and you're looking at hundreds of dollars.&lt;/p&gt;

&lt;p&gt;We've seen this catch teams off guard, especially in microservices architectures. Each service calls other services. Those calls cross availability zones. Sometimes they cross regions. The data transfer charges compound.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Data transfer costs are invisible until the bill arrives. Budget for them explicitly.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;What to check:&lt;/strong&gt; Look at cross-region API calls between microservices. Check backups replicated to other regions. Review large data exports to external systems. CDN origin fetches from S3 can add up too.&lt;/p&gt;

&lt;h2&gt;
  
  
  Snapshot accumulation: the backup nobody deletes
&lt;/h2&gt;

&lt;p&gt;EBS snapshots cost &lt;strong&gt;$0.05 per GB-month&lt;/strong&gt; (&lt;a href="https://aws.amazon.com/ebs/pricing/" rel="noopener noreferrer"&gt;see Pricing&lt;/a&gt;). That's the straightforward part. The problem is how they accumulate.&lt;/p&gt;

&lt;p&gt;Automated backup policies create snapshots on schedule. Daily backups. Weekly backups. Sometimes multiple backup tools running on the same volumes. The snapshots pile up. Nobody deletes them.&lt;/p&gt;

&lt;p&gt;We've seen accounts with &lt;strong&gt;50+ TB of snapshots&lt;/strong&gt;. That's &lt;strong&gt;$2,500/month&lt;/strong&gt; for data nobody will ever restore. When we ask teams about their retention policies, the answer is usually "we don't have one."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The fix is simple:&lt;/strong&gt; set retention policies. Delete snapshots older than 90 days unless compliance requires otherwise. Review snapshots from deleted volumes, they don't get cleaned up automatically. Check for duplicate snapshots created by overlapping backup tools.&lt;/p&gt;

&lt;h2&gt;
  
  
  Dormant resources: the zombies in your account
&lt;/h2&gt;

&lt;p&gt;Every AWS account has zombies. Load balancers with no targets. RDS instances nobody connects to. ElastiCache clusters for applications that were rewritten years ago. EC2 instances running at 5% CPU because nobody remembers what they do.&lt;/p&gt;

&lt;p&gt;These resources get created for testing, demos, or projects that ended. Nobody tracks them after the project ends. The charges continue.&lt;/p&gt;

&lt;p&gt;The cost varies widely, often &lt;strong&gt;$100-500/month per forgotten resource&lt;/strong&gt;, but the pattern is consistent. We've never audited an account that didn't have at least a few.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What to check:&lt;/strong&gt; EC2 instances with sustained low CPU utilization. Load balancers with zero healthy targets. RDS instances with zero connections over the past week. Elastic IPs not attached to running instances.&lt;/p&gt;

&lt;h2&gt;
  
  
  Case study: when "copy-paste infrastructure" costs $8,000/month extra
&lt;/h2&gt;

&lt;p&gt;This one still stands out as one of our most challenging and rewarding optimization projects.&lt;/p&gt;

&lt;p&gt;A client came to us managing multiple products across their organization. Their DevOps engineer had a straightforward approach: replicate the exact same environment setup for every project. Each product got its own EKS cluster (5 nodes), VPC, EC2 instances, bastion hosts, and VPN server.&lt;/p&gt;

&lt;p&gt;The problem? Different projects had vastly different needs.&lt;/p&gt;

&lt;p&gt;Some products didn't need Kubernetes at all. Others only required a single EC2 instance. A few genuinely needed the full EKS setup, but most didn't.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The result:&lt;/strong&gt; roughly &lt;strong&gt;$10,000/month&lt;/strong&gt; in AWS costs when it should have been &lt;strong&gt;$1,000-2,000/month&lt;/strong&gt;. That's &lt;strong&gt;$8,000/month in waste&lt;/strong&gt;, nearly &lt;strong&gt;$100,000/year&lt;/strong&gt;, because of a "one-size-fits-all" infrastructure approach.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How we fixed it:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Audited each project's actual resource usage&lt;/li&gt;
&lt;li&gt;Removed unused resources (idle EKS clusters, unnecessary bastion hosts)&lt;/li&gt;
&lt;li&gt;Redefined their Infrastructure as Code to match real requirements&lt;/li&gt;
&lt;li&gt;Created a clear playbook for how DevOps should provision and manage resources going forward&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The fix wasn't just a one-time cleanup. We built a system that prevents the same pattern from recurring.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Standardization is good. Blind replication is expensive. Every environment should be right-sized to its actual workload, not copy-pasted from a template.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Case study: when instance sprawl blocks your Savings Plans
&lt;/h2&gt;

&lt;p&gt;Another pattern we see repeatedly: teams that want to use Reserved Instances or Savings Plans but can't get meaningful coverage because their instance types are all over the place.&lt;/p&gt;

&lt;p&gt;One client had a mix of RDS instances across their environments. Some were db.t3.medium, others db.r5.large, a few db.m5.xlarge. Different teams had provisioned different instance types based on whatever seemed right at the time. No standardization. No governance.&lt;/p&gt;

&lt;p&gt;The problem? Reserved Instances are specific to instance type and size. Savings Plans are more flexible, but you still need predictable usage patterns to commit confidently. When every database is a different instance type, you can't commit to anything without risking underutilization.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The solution:&lt;/strong&gt; We helped them standardize on a smaller set of instance types. Not everything needs to be identical, but having three standard sizes instead of twelve makes capacity planning possible. Once they consolidated, they could purchase Savings Plans covering &lt;strong&gt;70% of their baseline&lt;/strong&gt;, saving roughly &lt;strong&gt;30% on RDS costs&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The broader lesson:&lt;/strong&gt; instance sprawl isn't just an operational problem. It's a cost optimization blocker. You can't benefit from commitment discounts if you don't know what you're committing to.&lt;/p&gt;

&lt;p&gt;We cover the Savings Plans vs Reserved Instances decision in detail in Part 2 of this series, including how to decide what commitment level makes sense for your organization.&lt;/p&gt;

&lt;h2&gt;
  
  
  NAT Gateway charges: the set-and-forget tax
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://docs.aws.amazon.com/vpc/latest/userguide/vpc-nat-gateway.html" rel="noopener noreferrer"&gt;NAT Gateways&lt;/a&gt; are essential infrastructure for private subnets that need outbound internet access. They're also expensive infrastructure that teams deploy without calculating the cost.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The pricing:&lt;/strong&gt; &lt;strong&gt;$0.045/hour plus $0.045/GB processed&lt;/strong&gt; (&lt;a href="https://aws.amazon.com/vpc/pricing/" rel="noopener noreferrer"&gt;see Pricing&lt;/a&gt;). The hourly charge alone is &lt;strong&gt;$32/month per gateway&lt;/strong&gt;. Teams often deploy NAT Gateways in every availability zone "for redundancy" without asking whether they need that redundancy. Three NAT Gateways means roughly &lt;strong&gt;$100/month&lt;/strong&gt; before any data flows through them.&lt;/p&gt;

&lt;p&gt;We're not saying don't use NAT Gateways. We're saying understand what you're paying for. Review the number of gateways versus actual HA requirements. Check the data volume flowing through each gateway. Consider whether &lt;a href="https://docs.aws.amazon.com/vpc/latest/privatelink/what-is-privatelink.html" rel="noopener noreferrer"&gt;VPC endpoints&lt;/a&gt; could replace NAT traffic for AWS service calls. They're often cheaper.&lt;/p&gt;

&lt;h2&gt;
  
  
  CloudWatch logs: infinite retention, infinite costs
&lt;/h2&gt;

&lt;p&gt;Logs are essential. Teams enable them everywhere. Nobody sets &lt;a href="https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/Working-with-log-groups-and-streams.html#SettingLogRetention" rel="noopener noreferrer"&gt;retention policies&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;CloudWatch pricing:&lt;/strong&gt; &lt;strong&gt;$0.03/GB for ingestion&lt;/strong&gt; plus &lt;strong&gt;$0.03/GB-month for storage&lt;/strong&gt; (&lt;a href="https://aws.amazon.com/cloudwatch/pricing/" rel="noopener noreferrer"&gt;see Pricing&lt;/a&gt;). An application logging at 10GB/day costs &lt;strong&gt;$9/day&lt;/strong&gt; for ingestion alone. After a year, you're storing &lt;strong&gt;3.6TB&lt;/strong&gt; at &lt;strong&gt;$108/month&lt;/strong&gt;, for logs nobody queries.&lt;/p&gt;

&lt;p&gt;The default retention for CloudWatch log groups is &lt;strong&gt;infinite&lt;/strong&gt;. Every log you ever wrote stays there forever, charging storage fees, unless you explicitly set a retention period.&lt;/p&gt;

&lt;h3&gt;
  
  
  The EKS Control Plane logging trap
&lt;/h3&gt;

&lt;p&gt;This catches many teams running Kubernetes on AWS. When you enable &lt;a href="https://docs.aws.amazon.com/eks/latest/userguide/control-plane-logs.html" rel="noopener noreferrer"&gt;EKS Control Plane logging&lt;/a&gt;, including API server logs, audit logs, authenticator logs, controller manager logs, and scheduler logs, the volume can be massive.&lt;/p&gt;

&lt;p&gt;A busy EKS cluster can generate &lt;strong&gt;gigabytes of control plane logs per day&lt;/strong&gt;. Enable all five log types across multiple clusters, and you're looking at significant CloudWatch costs before you've logged a single application event.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The question to ask:&lt;/strong&gt; do you actually need these logs in CloudWatch? For troubleshooting Kubernetes issues, maybe. For compliance, possibly. But many teams enable everything "just in case" without calculating the cost.&lt;/p&gt;

&lt;h3&gt;
  
  
  Consider self-hosted observability
&lt;/h3&gt;

&lt;p&gt;Teams running EKS often find that self-hosted monitoring and observability stacks are more cost-effective than CloudWatch at scale. The &lt;strong&gt;Prometheus/Grafana&lt;/strong&gt; ecosystem is mature, well-documented, and runs efficiently on Kubernetes.&lt;/p&gt;

&lt;p&gt;The tradeoff is operational overhead. You're managing another system. But if you're already running Kubernetes, you have the infrastructure expertise. And the cost savings at scale can be substantial, especially when you factor in log aggregation with tools like &lt;strong&gt;Loki&lt;/strong&gt; or the &lt;strong&gt;ELK stack&lt;/strong&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Before enabling every log type in CloudWatch, calculate the cost. Self-hosted observability often makes more sense for EKS-heavy organizations.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;What to check:&lt;/strong&gt; Log groups with no retention policy. Log groups storing more than 100GB. Debug-level logging enabled in production (it probably shouldn't be). Duplicate logs, such as application logs, container logs, and infrastructure logs capturing the same events.&lt;/p&gt;

&lt;h2&gt;
  
  
  The small charges that add up
&lt;/h2&gt;

&lt;p&gt;Some costs are individually small but signal poor hygiene. They matter because they indicate systemic issues with how resources are managed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Unattached Elastic IPs&lt;/strong&gt; cost &lt;strong&gt;$0.005/hour&lt;/strong&gt; (&lt;a href="https://aws.amazon.com/ec2/pricing/on-demand/#Elastic_IP_Addresses" rel="noopener noreferrer"&gt;see Pricing&lt;/a&gt;), about &lt;strong&gt;$3.60/month per IP&lt;/strong&gt;. Not catastrophic. But teams accumulate them during infrastructure changes. Twenty unused IPs means &lt;strong&gt;$72/month&lt;/strong&gt;. More importantly, it means nobody is cleaning up after themselves.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Idle load balancers&lt;/strong&gt; cost at least &lt;strong&gt;$16/month each&lt;/strong&gt; (&lt;a href="https://aws.amazon.com/elasticloadbalancing/pricing/" rel="noopener noreferrer"&gt;see ALB Pricing&lt;/a&gt;) for the base charge. Dev and staging environments often sit idle. Five idle ALBs across dev, staging, and QA environments means &lt;strong&gt;$80/month&lt;/strong&gt; for infrastructure serving no traffic.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Classic Load Balancers&lt;/strong&gt; are often forgotten entirely. If you're still running them, you should probably migrate to ALB or NLB. The pricing is similar, but the features and performance are better.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cross-region replication: enabled once, runs forever
&lt;/h2&gt;

&lt;p&gt;Replication features are powerful for disaster recovery. They're also easy to forget about once enabled.&lt;/p&gt;

&lt;p&gt;S3 cross-region replication for a 5TB bucket costs roughly &lt;strong&gt;$100/month&lt;/strong&gt; in data transfer plus &lt;strong&gt;$115/month&lt;/strong&gt; in destination storage. That's &lt;strong&gt;$215/month for one bucket&lt;/strong&gt;. Is your DR strategy worth that? Maybe. But you should be making that decision consciously, not discovering it on your bill.&lt;/p&gt;

&lt;p&gt;The same applies to RDS read replicas in other regions. DynamoDB global tables. Any replication that crosses regions incurs ongoing data transfer and storage charges.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Action:&lt;/strong&gt; Review what you have enabled. Ask whether you still need it. If you do need it, budget for it explicitly.&lt;/p&gt;

&lt;h2&gt;
  
  
  Third-party marketplace licensing: the hidden multiplier
&lt;/h2&gt;

&lt;p&gt;Marketplace charges are genuinely hidden in a way other costs aren't. They appear as "EC2-Other" in Cost Explorer. Teams see high EC2 costs without realizing it's software licensing, not compute.&lt;/p&gt;

&lt;p&gt;A marketplace AMI for a database or security tool can add &lt;strong&gt;$500-2000/month&lt;/strong&gt; on top of instance costs. We've seen teams pay &lt;strong&gt;2-3x&lt;/strong&gt; what they thought they were paying for compute because of marketplace licensing they didn't know they were using.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What to check:&lt;/strong&gt; EC2 instances launched from Marketplace AMIs. "EC2-Other" line items in Cost Explorer. Whether the software could be replaced with open-source or AWS-native alternatives.&lt;/p&gt;

&lt;h2&gt;
  
  
  Request-based pricing at scale
&lt;/h2&gt;

&lt;p&gt;Some AWS services charge per request. The per-request cost looks negligible until you scale.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://aws.amazon.com/api-gateway/pricing/" rel="noopener noreferrer"&gt;API Gateway&lt;/a&gt; charges &lt;strong&gt;$1.00-3.50 per million requests&lt;/strong&gt; depending on region and tier. At 100 million requests per month, that's &lt;strong&gt;$100-350&lt;/strong&gt;. Many teams don't realize API Gateway has its own charges separate from Lambda.&lt;/p&gt;

&lt;p&gt;S3 request pricing is similar. Everyone focuses on storage. Requests are an afterthought. But an application making 1 billion GET requests per month pays &lt;strong&gt;$400 in request charges&lt;/strong&gt; (&lt;a href="https://aws.amazon.com/s3/pricing/" rel="noopener noreferrer"&gt;see S3 Pricing&lt;/a&gt;), potentially more than storage. LIST operations are &lt;strong&gt;10x more expensive&lt;/strong&gt; than GET.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What to check:&lt;/strong&gt; Request volumes. Whether caching could reduce origin requests. For high-volume APIs, evaluate whether &lt;a href="https://aws.amazon.com/blogs/compute/using-aws-lambda-with-an-application-load-balancer/" rel="noopener noreferrer"&gt;ALB plus Lambda&lt;/a&gt; would be cheaper than API Gateway.&lt;/p&gt;

&lt;h2&gt;
  
  
  Reserved capacity underutilization: paying for commitments you don't use
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://aws.amazon.com/ec2/pricing/reserved-instances/" rel="noopener noreferrer"&gt;Reserved Instances&lt;/a&gt; and &lt;a href="https://aws.amazon.com/savingsplans/" rel="noopener noreferrer"&gt;Savings Plans&lt;/a&gt; are purchased centrally. Usage is decentralized. This creates a disconnect.&lt;/p&gt;

&lt;p&gt;We've seen accounts paying for Reserved Instances in us-east-1 while running workloads in eu-west-1. The reservation goes unused. The workload pays on-demand rates. Everyone loses.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What to check:&lt;/strong&gt; Reserved Instance utilization reports. Savings Plans utilization. Instance types that don't match your reservations. If you reserved m5.large but you're running m5.xlarge, the reservation doesn't apply.&lt;/p&gt;

&lt;h2&gt;
  
  
  The pattern behind hidden costs
&lt;/h2&gt;

&lt;p&gt;These 12 costs share common characteristics:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Set and forget.&lt;/strong&gt; They're enabled once and never revisited. Backup policies. Replication rules. NAT Gateways. Log groups. Once configured, they run indefinitely.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Small individually.&lt;/strong&gt; Each charge is easy to dismiss. $3.60/month for an Elastic IP? Not worth thinking about. But $50/month here and $100/month there adds up to "why is our bill so high?"&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Compound over time.&lt;/strong&gt; Snapshots accumulate. Logs grow. Zombie resources multiply. The costs grow even when nothing changes.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The fix isn't a one-time cleanup. It's building cost visibility into your operational routine.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  What to do next
&lt;/h2&gt;

&lt;p&gt;Three steps to take this week:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Quick win.&lt;/strong&gt; Check your EBS snapshots. Delete anything older than 90 days that isn't required for compliance. This is often the single highest-impact change you can make in 30 minutes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Enable monitoring.&lt;/strong&gt; Turn on &lt;a href="https://aws.amazon.com/aws-cost-management/aws-cost-anomaly-detection/" rel="noopener noreferrer"&gt;AWS Cost Anomaly Detection&lt;/a&gt;. It's free and catches unexpected charges before they accumulate.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Plan the audit.&lt;/strong&gt; In Part 3 of this series, we provide a complete audit playbook. Schedule time to run through it.&lt;/p&gt;

&lt;p&gt;In Part 2, we cover the six optimization strategies that actually move the needle: right-sizing, Savings Plans, auto-scaling, Spot instances, storage tiering, and serverless economics. Read that next if you want to understand how to systematically reduce costs, not just eliminate waste.&lt;/p&gt;

&lt;h2&gt;
  
  
  Related reading
&lt;/h2&gt;

&lt;p&gt;If you're also evaluating your compute architecture, these articles might help:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://innomizetech.com/blog/aws-database-cost-optimization-what-changed-at-re-invent-2025" rel="noopener noreferrer"&gt;AWS Database Cost Optimization: What Changed at re:Invent 2025&lt;/a&gt; - RDS, Aurora, and DynamoDB pricing updates that affect your database costs.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://innomizetech.com/blog/serverless-vs-containers-2025-aws-lambda-managed-instances-decision-guide" rel="noopener noreferrer"&gt;Serverless vs Containers in 2025: The Decision Framework Just Changed&lt;/a&gt; - AWS re:Invent 2025 changed the cost equation between Lambda and containers. We break down when each option makes sense.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://innomizetech.com/blog/aws-lambda-s-biggest-update-in-years-what-it-means-for-your-architecture" rel="noopener noreferrer"&gt;AWS Lambda's Biggest Update in Years&lt;/a&gt; - Lambda Managed Instances and Durable Functions explained, with architectural implications.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;strong&gt;Hoang Le&lt;/strong&gt; is the founder of &lt;a href="https://innomizetech.com" rel="noopener noreferrer"&gt;INNOMIZE&lt;/a&gt;, building cloud-native systems for startups and enterprises.&lt;br&gt;&lt;br&gt;
He also writes &lt;a href="https://buildsthatlast.substack.com" rel="noopener noreferrer"&gt;Builds That Last (BTL)&lt;/a&gt;, where he shares lessons from 15+ years of engineering on foundations, clarity, and sustainable software.  &lt;/p&gt;

&lt;p&gt;Connect on &lt;a href="https://linkedin.com/in/hoangleitvn" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt; for more on engineering leadership and platform engineering.&lt;/p&gt;

</description>
      <category>cloudcomputing</category>
      <category>aws</category>
      <category>finops</category>
      <category>devops</category>
    </item>
    <item>
      <title>The Builds That Last Manifesto</title>
      <dc:creator>Hoang Le</dc:creator>
      <pubDate>Sun, 11 Jan 2026 08:47:41 +0000</pubDate>
      <link>https://dev.to/hoangleitvn/the-builds-that-last-manifesto-218c</link>
      <guid>https://dev.to/hoangleitvn/the-builds-that-last-manifesto-218c</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://buildsthatlast.substack.com/p/why-foundation-comes-before-speed" rel="noopener noreferrer"&gt;Builds That Last&lt;/a&gt;&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;I've been building and leading engineering teams for 15 years. Over 50 projects. Startups, enterprises, legacy systems, greenfield builds.&lt;/p&gt;

&lt;p&gt;Same pattern every time.&lt;/p&gt;

&lt;p&gt;Teams ship fast. Then they slow down. Not because engineers got lazy. Because the foundation was never there.&lt;/p&gt;

&lt;p&gt;At my company, we maintain systems 20+ years old. No documentation. No standards. When we ask stakeholders about business logic, they say "read the code".&lt;/p&gt;

&lt;p&gt;My teams sometimes decompile binary files just to understand what's inside. Debug at runtime because that's the only way to see how things work. Previous teams deployed code to AWS without committing to source control. Gone.&lt;/p&gt;

&lt;p&gt;This is what engineering looks like for most of us. Not the AI demos. Not the apps shipped in a weekend.&lt;/p&gt;

&lt;h2&gt;
  
  
  The gap between posts and reality
&lt;/h2&gt;

&lt;p&gt;You'll see posts about vibe coding, AI-augmented development, shipping apps in hours.&lt;/p&gt;

&lt;p&gt;I'm not saying AI isn't real. I use these tools every day. The productivity gains are real.&lt;/p&gt;

&lt;p&gt;But there's a gap between what people post and what I see in actual projects.&lt;/p&gt;

&lt;p&gt;The posts show demos that work. Reality is production systems that break.&lt;/p&gt;

&lt;p&gt;The posts celebrate shipping fast. Reality is teams spending months paying back technical debt.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The demo works. The demo always works. It's what comes after that separates software that lasts from software that collapses.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  The iceberg problem
&lt;/h2&gt;

&lt;p&gt;What you see is 20% above water. The shiny demos. The fast shipping. Vibe coding, agentic AI, apps built in hours.&lt;/p&gt;

&lt;p&gt;What you don't see is the 80% below:&lt;/p&gt;

&lt;p&gt;→ Maintenance&lt;br&gt;
→ Technical debt&lt;br&gt;
→ Engineers connecting systems never meant to work together&lt;br&gt;
→ Data inconsistencies accumulated over years&lt;br&gt;
→ Teams spending days understanding what the previous developer was thinking&lt;/p&gt;

&lt;p&gt;That 80% is where my teams spend most of our time. And it's where the real lessons are.&lt;/p&gt;

&lt;h2&gt;
  
  
  The speed trap
&lt;/h2&gt;

&lt;p&gt;I see this pattern repeat.&lt;/p&gt;

&lt;p&gt;A team starts fast. AI tools, modern stack, motivated engineers. First version ships in weeks. Everyone celebrates.&lt;/p&gt;

&lt;p&gt;Then users show up. Edge cases appear. The payment flow breaks. Data sync fails silently. Features that worked in demo crash under real load.&lt;/p&gt;

&lt;p&gt;Suddenly the team that was "moving fast" spends months fixing things. Not building new features. Just paying back debt from shipping without foundation.&lt;/p&gt;

&lt;p&gt;Leadership gets frustrated. "Why is the team slow now?"&lt;/p&gt;

&lt;p&gt;The team isn't slow. They're doing work that should have been done upfront.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Speed without foundation creates the illusion of progress. Then reality catches up.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Maintenance costs more than building
&lt;/h2&gt;

&lt;p&gt;Here's something most people don't think about until it's too late.&lt;/p&gt;

&lt;p&gt;Maintaining software costs more than building it from scratch.&lt;/p&gt;

&lt;p&gt;Think about repairing a house. You don't just fix the broken part. You investigate the structure. Remove old materials. Work around things that can't be changed. Then build the new thing.&lt;/p&gt;

&lt;p&gt;Software is the same.&lt;/p&gt;

&lt;p&gt;When you inherit a system without documentation, without standards, every change becomes an archaeology project. You spend more time understanding than building.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The time you "save" by skipping foundation gets paid back with interest during maintenance.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  The AI paradox
&lt;/h2&gt;

&lt;p&gt;AI makes code generation 10x faster. That's real.&lt;/p&gt;

&lt;p&gt;AI also increases cognitive load by 30-40%.&lt;/p&gt;

&lt;p&gt;When AI generates code, someone still needs to verify it's secure. Check for edge cases. Understand the logic before shipping. Maintain it when something breaks.&lt;/p&gt;

&lt;p&gt;AI doesn't eliminate this work. It changes who's responsible for catching problems.&lt;/p&gt;

&lt;p&gt;Anthropic's CEO said 90% of their internal code is now AI-generated. The follow-up: "We're not replacing engineers".&lt;/p&gt;

&lt;p&gt;The 10% humans handle? That's the leverage zone. Architecture decisions. Debugging complex problems. Understanding &lt;em&gt;why&lt;/em&gt; something should work, not just &lt;em&gt;what&lt;/em&gt; it should do.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;AI is a turbo, not a robot.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Good foundation? AI makes you faster at building good software.&lt;/p&gt;

&lt;p&gt;Bad foundation? AI makes you faster at building bad software.&lt;/p&gt;

&lt;h2&gt;
  
  
  What this means for engineers
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;The fundamentals matter more than ever.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Everyone has access to AI now. The differentiator isn't who prompts better. It's who understands what they're building deeply enough to know when AI helps and when it hurts.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Own your code.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;"The AI wrote it" isn't an excuse when something breaks at 2am. You shipped it. You're responsible. Read the code. Understand the logic. Ship with confidence.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The 80% below water is where you build real skills.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Legacy systems, maintenance, debugging. Not glamorous. But it's where you learn how software actually behaves. Don't avoid it. Embrace it.&lt;/p&gt;

&lt;h2&gt;
  
  
  What this means for leaders
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;You're only seeing 20% of what your team deals with.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The demos work. Sprint reports look fine. But your team might be drowning in the 80% you don't see. The legacy code. Missing documentation. Tribal knowledge that walks out when someone leaves.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Buying tools is easy. Training is hard.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Teams that succeed with AI invested in foundation first. Standards, process, documentation. Then added AI.&lt;/p&gt;

&lt;p&gt;Teams that struggle added tools to existing chaos. Now they have faster chaos.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Remove friction before adding speed.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When you want to go faster, the instinct is to add more. More tools, more people, more pressure.&lt;/p&gt;

&lt;p&gt;Usually, the answer is to remove things. Remove blockers. Remove unnecessary process. Remove friction slowing your team down.&lt;/p&gt;

&lt;h2&gt;
  
  
  The bottom line
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;Real speed comes from clarity, not from typing faster.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In the AI era, shipping is easy. Building to last is what matters.&lt;/p&gt;

&lt;p&gt;Those legacy systems with no documentation? They taught me more than any greenfield project. Not because they were well-built. Because they showed what happens when foundation is missing.&lt;/p&gt;

&lt;p&gt;Every time I build something new, I think about the engineer maintaining it in 10 years. Will they understand our decisions? Can they change things confidently? Or will they be stuck doing archaeology?&lt;/p&gt;

&lt;p&gt;That's what foundation means. Building for the people who come after.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;What's your experience with the 80% below water?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;I write about foundation-first engineering at &lt;a href="https://buildsthatlast.substack.com" rel="noopener noreferrer"&gt;Builds That Last&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>programming</category>
      <category>career</category>
      <category>productivity</category>
      <category>architecture</category>
    </item>
    <item>
      <title>AWS re:Invent 2025: 3 Announcements That Matter for Your Architecture</title>
      <dc:creator>Hoang Le</dc:creator>
      <pubDate>Wed, 07 Jan 2026 14:40:51 +0000</pubDate>
      <link>https://dev.to/hoangleitvn/aws-reinvent-2025-3-announcements-that-matter-for-your-architecture-31m4</link>
      <guid>https://dev.to/hoangleitvn/aws-reinvent-2025-3-announcements-that-matter-for-your-architecture-31m4</guid>
      <description>&lt;p&gt;AWS re:Invent 2025 dropped a lot of announcements. Most won't change how you build. Three will.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Quick note: My last post here was November 2023. Life got busy. Running &lt;a href="https://innomizetech.com" rel="noopener noreferrer"&gt;INNOMIZE&lt;/a&gt;, shipping products, building teams. I'm back to writing in public. If you've been following along, thanks for sticking around.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I spent December 2025 digging through the announcements that affect real architecture decisions. Not the flashy keynote demos. The ones that change cost models, operational overhead, and what's possible.&lt;/p&gt;

&lt;p&gt;Here's the summary and where to go deeper.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Lambda gets Durable Functions and Managed Instances
&lt;/h2&gt;

&lt;p&gt;Lambda now has two capabilities that fix its biggest limitations.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Durable Functions&lt;/strong&gt; let you write multi-step workflows directly in Lambda code. No Step Functions. No ASL syntax. Just code with checkpoints that survive crashes. Can wait up to a year for external events.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Checkpoint, wait, resume&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;payment&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;step&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;process_payment&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;paymentService&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;charge&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;amount&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;waitForCallback&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;manager_approval&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;timeout&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;86400000&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;step&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;complete_order&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;orderService&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;complete&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;payment&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Managed Instances&lt;/strong&gt; keep Lambda warm. No cold starts. Works with Savings Plans (up to 72% off with 3-year commitment). Multiple concurrent requests per instance.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why this matters:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The "Lambda is expensive at scale" argument got weaker. For steady-state workloads processing millions of requests, Lambda Managed Instances with Savings Plans now competes with container pricing.&lt;/p&gt;

&lt;p&gt;The decision tree changed. The question is now "which compute model fits this workload?"&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Deep dive:&lt;/strong&gt; &lt;a href="https://innomizetech.com/blog/aws-lambda-s-biggest-update-in-years-what-it-means-for-your-architecture" rel="noopener noreferrer"&gt;AWS Lambda's Biggest Update in Years&lt;/a&gt; covers pricing comparisons, Durable Functions vs Step Functions, and Managed Instances trade-offs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Bonus:&lt;/strong&gt; &lt;a href="https://innomizetech.com/blog/serverless-vs-containers-2025-aws-lambda-managed-instances-decision-guide" rel="noopener noreferrer"&gt;Serverless vs Containers in 2025&lt;/a&gt; with updated decision tree.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. EKS Capabilities: managed ArgoCD, ACK, and KRO
&lt;/h2&gt;

&lt;p&gt;EKS Capabilities is a managed layer for three Kubernetes-native tools:&lt;/p&gt;

&lt;p&gt;→ &lt;strong&gt;Managed Argo CD&lt;/strong&gt;: AWS handles installation, scaling, patching, HA&lt;br&gt;
→ &lt;strong&gt;AWS Controllers for Kubernetes (ACK)&lt;/strong&gt;: Manage AWS resources via kubectl. S3, RDS, IAM through CRDs.&lt;br&gt;
→ &lt;strong&gt;Kube Resource Orchestrator (KRO)&lt;/strong&gt;: Reusable resource bundles. Backed by AWS, Google, and Azure jointly.&lt;/p&gt;

&lt;p&gt;Key architectural difference: these run in AWS-owned infrastructure, not on your worker nodes. Zero cluster overhead.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why this matters:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Running self-managed ArgoCD? You're spending engineer time on upgrades, patches, and HA configuration. AWS estimates 70-80% reduction in platform team overhead.&lt;/p&gt;

&lt;p&gt;ACK's resource adoption feature is interesting. You can migrate existing Terraform/CloudFormation resources without recreating them. Gradual migration becomes possible.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Trade-off:&lt;/strong&gt; Less flexibility. No multi-namespace deployments. No Image Updater. No custom SSO providers. If you need those, stay self-managed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Deep dive:&lt;/strong&gt; &lt;a href="https://innomizetech.com/blog/aws-eks-capabilities-what-we-learned-after-testing-it" rel="noopener noreferrer"&gt;AWS EKS Capabilities: What We Learned After Testing It&lt;/a&gt; covers feature comparisons, pricing, and when to use managed vs self-managed.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. Database Savings Plans and SQL Server Developer Edition
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Database Savings Plans&lt;/strong&gt;: Commit to $/hour usage over 1-year term. No upfront payment required.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Discount&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Serverless (Aurora, ElastiCache, etc.)&lt;/td&gt;
&lt;td&gt;Up to 35%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Provisioned instances&lt;/td&gt;
&lt;td&gt;Up to 20%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The gap is intentional. AWS wants you on serverless.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;SQL Server Developer Edition&lt;/strong&gt;: Now available on RDS. All Enterprise features, no licensing costs. Dev/test environments got cheaper.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;M7i/R7i with Optimize CPU&lt;/strong&gt;: Disable SMT, reduce vCPU count by 50%, pay for half the SQL Server licenses. Same physical cores, near-equivalent performance.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why this matters:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;We audited one project. Found 12 RDS instances on db.t3 (2018 instance family). The migration decision isn't straightforward:&lt;/p&gt;

&lt;p&gt;→ db.t4g: 10% cheaper on-demand, but no discount options at all&lt;br&gt;
→ db.t3: Older, but Reserved Instance eligible (37% off)&lt;br&gt;
→ db.r7g: Database Savings Plan eligible, better performance&lt;/p&gt;

&lt;p&gt;For always-on dev environments, t3 with Reserved Instance can be cheaper than t4g on-demand. Counterintuitive but true.&lt;/p&gt;

&lt;p&gt;For SQL Server projects, Developer Edition eliminates licensing costs for non-production. That's ~$240/month savings per db.r5.large instance.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Deep dive:&lt;/strong&gt; &lt;a href="https://innomizetech.com/blog/aws-database-cost-optimization-what-changed-at-reinvent-2025" rel="noopener noreferrer"&gt;AWS Database Cost Optimization&lt;/a&gt; covers the t3/t4g decision matrix, SQL Server migration path, and when Reserved Instances beat Savings Plans.&lt;/p&gt;

&lt;h2&gt;
  
  
  The pattern across all three
&lt;/h2&gt;

&lt;p&gt;AWS is sending clear pricing signals:&lt;/p&gt;

&lt;p&gt;→ Serverless gets better discounts: 35% for serverless databases vs 20% for provisioned&lt;br&gt;
→ Managed services reduce overhead: EKS Capabilities, Lambda Managed Instances&lt;br&gt;
→ Latest-gen instances get the deals: r7g/r8g qualify for Savings Plans, t4g doesn't&lt;/p&gt;

&lt;p&gt;The message: adopt managed services, use latest-gen infrastructure, commit to spend.&lt;/p&gt;

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

&lt;p&gt;At INNOMIZE, we're tracking these changes across client projects. The t3 → r7g migration is in progress. We're evaluating EKS Capabilities for new deployments. Lambda Managed Instances is on the roadmap for high-traffic APIs.&lt;/p&gt;

&lt;p&gt;I'm launching a newsletter called &lt;strong&gt;&lt;a href="https://buildsthatlast.substack.com" rel="noopener noreferrer"&gt;Builds that Last&lt;/a&gt;&lt;/strong&gt;. Covering platform engineering, cloud architecture, and engineering leadership. &lt;a href="https://buildsthatlast.substack.com" rel="noopener noreferrer"&gt;Subscribe here&lt;/a&gt; or &lt;a href="https://linkedin.com/in/hoangleitvn" rel="noopener noreferrer"&gt;connect on LinkedIn&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Which announcement impacts your architecture most?&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Hoang Le is the founder of &lt;a href="https://innomizetech.com" rel="noopener noreferrer"&gt;INNOMIZE&lt;/a&gt;, building cloud-native systems for startups and enterprises. Connect on &lt;a href="https://linkedin.com/in/hoangleitvn" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt; for more on engineering leadership and platform engineering.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>aws</category>
      <category>kubernetes</category>
      <category>devops</category>
      <category>serverless</category>
    </item>
    <item>
      <title>Exploring Serverless Billing Management: Architecture and Cost</title>
      <dc:creator>Hoang Le</dc:creator>
      <pubDate>Tue, 07 Nov 2023 10:17:13 +0000</pubDate>
      <link>https://dev.to/hoangleitvn/exploring-serverless-billing-management-architecture-and-cost-126l</link>
      <guid>https://dev.to/hoangleitvn/exploring-serverless-billing-management-architecture-and-cost-126l</guid>
      <description>&lt;p&gt;This &lt;a href="https://innomizetech.com/blog/exploring-serverless-billing-management-architecture-and-cost" rel="noopener noreferrer"&gt;article&lt;/a&gt; was originally published on our website.&lt;/p&gt;

&lt;p&gt;Over the past five years, as we've developed and managed a serverless system, we've gained valuable insights into design considerations and cost optimization. In this article, we aim to share our expertise, offering businesses a blueprint for addressing similar challenges efficiently. Our primary focus is on cost reduction while ensuring the key aspects of &lt;strong&gt;high availability, scalability, security, extensibility, and ease of development&lt;/strong&gt;. It's important to note that while this architecture can offer significant benefits, it may not be a universal solution. It's vital to thoroughly evaluate and adapt it to your specific requirements.&lt;/p&gt;

&lt;p&gt;If you're new to the concept of &lt;a href="https://innomizetech.com/blog/demystifying-serverless-architecture-the-future-of-cloud-computing" rel="noopener noreferrer"&gt;Serverless Architecture&lt;/a&gt;, we recommend familiarizing yourself with it before embarking on this architectural journey.&lt;/p&gt;

&lt;h2&gt;
  
  
  Overview of the System
&lt;/h2&gt;

&lt;p&gt;We were approached by a US-based client whose Billing Department grappled with the task of generating, managing, and collaborating with their legal team to send invoices to clients. The existing process involved producing &lt;strong&gt;paper invoices&lt;/strong&gt;, manually sending them to attorneys for review, and often &lt;strong&gt;taking more than a month&lt;/strong&gt; to complete a monthly billing cycle. With approximately &lt;strong&gt;2,000 invoices&lt;/strong&gt; to review and process each month, the manual nature of this process was not only &lt;strong&gt;time-consuming&lt;/strong&gt; but also &lt;strong&gt;resource-intensive&lt;/strong&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%2Fgzxv2z04357hfp7zg197.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%2Fgzxv2z04357hfp7zg197.jpg" alt="Human with papers" width="800" height="533"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Additionally, the billing team had the arduous task of uploading &lt;strong&gt;LEDES&lt;/strong&gt; files to over &lt;strong&gt;20 carrier sites&lt;/strong&gt;. Each upload required &lt;strong&gt;repetitive manual steps&lt;/strong&gt;, such as logging in to the carrier site and verifying the results either on the site or via email. &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Imagine how boring it is for users that they have to upload around 2000 files to various sites every month, how much effort is consumed?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Calculating this is straightforward. Let's assume that it takes a user roughly &lt;strong&gt;3 minutes&lt;/strong&gt; to log in, upload a file, check the results, and update the internal system for each file. So, with &lt;strong&gt;2000 files&lt;/strong&gt;, the total time required amounts to approximately &lt;strong&gt;6,000 minutes&lt;/strong&gt; (equivalent to 100 hours). In continuous operation, this task could span an entire month for a single person to complete. However, in reality, it may necessitate the effort of at least &lt;strong&gt;two full-time individuals&lt;/strong&gt; over the course of a month to accomplish this job. For US workers, how much does it cost for labor expenses?&lt;/p&gt;

&lt;p&gt;To address these challenges, we analyzed the client's requirements and developed a solution that streamlined the invoicing process. This solution allowed users to effortlessly view, track, and review assigned invoices while automating various steps in the process. This &lt;strong&gt;digital transformation&lt;/strong&gt; not only reduced &lt;strong&gt;manual efforts&lt;/strong&gt; but also significantly &lt;strong&gt;improved productivity&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  System Architecture
&lt;/h2&gt;

&lt;p&gt;After discussing the client's specific needs, which included a relatively small user base (around 150 users including Billing users and Attorneys) and the absence of in-house IT resources for system management, we opted for a &lt;strong&gt;serverless architecture&lt;/strong&gt;. This choice allowed the client to focus on the features they needed while &lt;strong&gt;minimizing operational overhead&lt;/strong&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%2F5645e7u0fn32423bv5jm.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%2F5645e7u0fn32423bv5jm.jpg" alt="Serverless Billing Management System" width="800" height="419"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Serverless Architecture for Billing Management System&lt;/p&gt;

&lt;p&gt;The Serverless Billing Management System comprises the following key components:&lt;/p&gt;

&lt;h3&gt;
  
  
  Serverless Compute Services with Lambda, API Gateway
&lt;/h3&gt;

&lt;p&gt;The backend system uses &lt;a href="https://aws.amazon.com/lambda/" rel="noopener noreferrer"&gt;AWS Lambda&lt;/a&gt; integrated with &lt;a href="https://aws.amazon.com/api-gateway/" rel="noopener noreferrer"&gt;API Gateway REST APIs&lt;/a&gt; to handle HTTP requests from clients, including both a web-based application and a mobile application.&lt;/p&gt;

&lt;p&gt;We leveraged the &lt;a href="https://www.serverless.com/" rel="noopener noreferrer"&gt;Serverless Framework&lt;/a&gt; for building, testing, and deploying Lambda functions to AWS. The stack included Node.js, TypeScript, &lt;a href="https://www.serverless.com/plugins/serverless-webpack" rel="noopener noreferrer"&gt;serverless-webpack&lt;/a&gt;, and &lt;a href="https://www.serverless.com/plugins/serverless-offline" rel="noopener noreferrer"&gt;serverless-offline&lt;/a&gt; plugins, which allowed us to simulate HTTP APIs locally and streamline the deployment of TypeScript code.&lt;/p&gt;

&lt;h3&gt;
  
  
  Datastore with Amazon RDS MySQL and S3
&lt;/h3&gt;

&lt;p&gt;While we initially considered &lt;a href="https://aws.amazon.com/dynamodb/" rel="noopener noreferrer"&gt;Amazon DynamoDB&lt;/a&gt; for our database needs, we ultimately selected &lt;a href="https://aws.amazon.com/rds/mysql/" rel="noopener noreferrer"&gt;Amazon RDS MySQL&lt;/a&gt; due to our specific schema and query requirements. We managed database changes through &lt;a href="https://www.liquibase.org/" rel="noopener noreferrer"&gt;Liquibase&lt;/a&gt;, which tracked database schema and data changes via changesets. Our data access layer was implemented using &lt;a href="https://www.npmjs.com/package/sequelize-typescript" rel="noopener noreferrer"&gt;sequelize-typescript&lt;/a&gt;, and for more complex queries and reporting, we used &lt;a href="https://www.npmjs.com/package/serverless-mysql" rel="noopener noreferrer"&gt;serverless-mysql&lt;/a&gt; and &lt;a href="https://knexjs.org/" rel="noopener noreferrer"&gt;knex&lt;/a&gt; as a query builder.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://aws.amazon.com/s3/" rel="noopener noreferrer"&gt;S3&lt;/a&gt; played a dual role, serving as the platform for our Angular-based billing portal and facilitating data replication from on-premises to AWS. The integration involved Node.js, S3, and Lambda to automate the process of capturing changes from a legacy system and synchronizing them with our database.&lt;/p&gt;

&lt;h3&gt;
  
  
  Authentication with Amazon Cognito
&lt;/h3&gt;

&lt;p&gt;Security being a paramount concern, we selected &lt;a href="https://aws.amazon.com/cognito/" rel="noopener noreferrer"&gt;Amazon Cognito&lt;/a&gt; as the user directory. It integrated seamlessly with other AWS services and provided a secure mechanism for protecting the backend services running on Lambda. We initiated user migration from ADFS using Cognito triggers and then disabled ADFS once all users had transitioned.&lt;/p&gt;

&lt;h3&gt;
  
  
  Event Sources with S3 and HTTPS Requests from API Gateway
&lt;/h3&gt;

&lt;p&gt;Our primary event sources were triggered by Lambda from API Gateway and data replication. APIs were secured using TLS/SSL and Cognito Authorizer.&lt;/p&gt;

&lt;h3&gt;
  
  
  Billing Portal with Angular, S3, and CloudFront
&lt;/h3&gt;

&lt;p&gt;We used Angular to develop a Single Page Application (SPA) for user interfaces, enabling smooth collaboration and review of invoices. Static assets and the website were deployed to an S3 bucket with &lt;a href="https://aws.amazon.com/cloudfront/" rel="noopener noreferrer"&gt;CloudFront&lt;/a&gt; distribution.&lt;/p&gt;

&lt;h3&gt;
  
  
  Mobile Application with React Native
&lt;/h3&gt;

&lt;p&gt;A mobile application was developed to enable users to view and book timesheets against Matter records. This app was created using &lt;a href="https://reactnative.dev/" rel="noopener noreferrer"&gt;React Native&lt;/a&gt; and seamlessly replicated all time entries back to the Case Management System running on-premise servers.&lt;/p&gt;

&lt;h3&gt;
  
  
  Headless Automation for LEDES Uploads with CDK, AWS Fargate, Selenium, and Protractor
&lt;/h3&gt;

&lt;p&gt;To automate the time-consuming process of manually uploading invoices to carrier sites, we employed headless automation with technologies such as Selenium and Protractor. Given the potentially lengthy execution time, &lt;a href="https://aws.amazon.com/fargate/" rel="noopener noreferrer"&gt;AWS Fargate (ECS Fargate)&lt;/a&gt; was used to handle the automation. We used &lt;a href="https://aws.amazon.com/cdk/" rel="noopener noreferrer"&gt;AWS CDK&lt;/a&gt; to build and deploy ECS Fargate tasks and services, which were triggered by Lambda functions when invoices were ready for upload.&lt;/p&gt;

&lt;h3&gt;
  
  
  Monitoring and Logging with AWS CloudWatch, Sentry
&lt;/h3&gt;

&lt;p&gt;We initially relied on third-party monitoring but later transitioned to &lt;a href="https://aws.amazon.com/cloudwatch/" rel="noopener noreferrer"&gt;CloudWatch&lt;/a&gt; for log and alert management. &lt;a href="https://sentry.io/" rel="noopener noreferrer"&gt;Sentry&lt;/a&gt; is used for error reporting and integrated with Lambda functions. Additionally, Slack was connected to Sentry to receive alerts on new errors.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://aws.amazon.com/sns/" rel="noopener noreferrer"&gt;SNS&lt;/a&gt; and &lt;a href="https://aws.amazon.com/ses/" rel="noopener noreferrer"&gt;SES&lt;/a&gt; were used for alerting and email notifications.&lt;/p&gt;

&lt;h3&gt;
  
  
  IaC with Serverless Framework and AWS CDK
&lt;/h3&gt;

&lt;p&gt;The development process was facilitated by the &lt;a href="https://www.serverless.com/" rel="noopener noreferrer"&gt;Serverless Framework&lt;/a&gt; for building, testing, and deploying Lambda functions. In the absence of native support for certain functionalities, we utilized the following plugins:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/trek10inc/serverless-secrets-plugin" rel="noopener noreferrer"&gt;serverless-secrets-plugin&lt;/a&gt;: For encrypting and decrypting secret files, allowing secure storage in source control.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/jeremydaly/serverless-plugin-split-stacks" rel="noopener noreferrer"&gt;serverless-split-stacks&lt;/a&gt;: To mitigate CloudFormation stack resource limits by splitting resources per Lambda function.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/amplify-education/serverless-domain-manager" rel="noopener noreferrer"&gt;serverless-domain-manager&lt;/a&gt;: For creating custom domains for API Gateway.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/FidelLimited/serverless-plugin-warmup" rel="noopener noreferrer"&gt;serverless-plugin-warmup&lt;/a&gt;: A custom plugin to warm up Lambda functions with CloudWatch schedules.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/k1LoW/serverless-s3-sync" rel="noopener noreferrer"&gt;serverless-s3-sync&lt;/a&gt;: Used to deploy the Angular application to an S3 bucket.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://aws.amazon.com/cdk/" rel="noopener noreferrer"&gt;Amazon Web Services Cloud Development Kit (AWS CDK)&lt;/a&gt; was instrumental in building, testing, and deploying the automated processes with ECS Fargate. Its abstraction design allowed easy creation of a headless stack and integration with CI/CD pipelines. Jenkins was used for CI/CD, with the ability to manage multiple environments and deploy changes to AWS environments in minutes. Checkout the &lt;a href="https://innomizetech.com/blog/serverless-web-scraping-an-aws-well-architected-solution" rel="noopener noreferrer"&gt;Long-running Serverless Web Scraping – An AWS Well-architected Solution&lt;/a&gt; for more details on how you can build, test and deploy automated headless process with CDK, ECS Fargate.&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%2Ffbs2a0ry7soede2iqhhu.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%2Ffbs2a0ry7soede2iqhhu.png" width="800" height="432"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Jenkins CI/CD Pipeline&lt;/p&gt;

&lt;p&gt;For designing and building IaC, we recommend separating the core infrastructure components such as networking, databases, and Cognito user pools into separate services with their CI/CD pipelines. Depending on your tech team's preference, either &lt;a href="https://aws.amazon.com/cdk/" rel="noopener noreferrer"&gt;AWS CDK&lt;/a&gt; or &lt;a href="https://www.terraform.io/" rel="noopener noreferrer"&gt;Terraform&lt;/a&gt; can be used to provision and configure the infrastructure. For service components, co-locating them with the service repository streamlines build, test, and deployment processes. In the case of this solution, a single repository housed around 25 functions, each providing CRUD APIs for relevant entities/tables, and some functions for reporting, data replication, and Cognito user pool triggers. For systems with fewer services, consider using &lt;a href="https://nx.dev/" rel="noopener noreferrer"&gt;NX DevTool&lt;/a&gt; to build, test, and deploy Serverless services in a &lt;a href="https://monorepo.tools/" rel="noopener noreferrer"&gt;monorepo&lt;/a&gt;. You can also employ &lt;a href="https://github.com/vendia/serverless-express" rel="noopener noreferrer"&gt;vendia/serverless-express&lt;/a&gt;, &lt;a href="https://github.com/middyjs/middy" rel="noopener noreferrer"&gt;Middy&lt;/a&gt;, and &lt;a href="https://nestjs.com/" rel="noopener noreferrer"&gt;Nest.js&lt;/a&gt; for deploying scalable REST APIs running on Lambda.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;You might observe a significant aspect in our setup: the utilization of a Site-to-Site VPN. Initially, we employed this method to establish connectivity between AWS and our on-premise infrastructure. It served the purpose of creating a linked server for our MS SQL Database to communicate with the RDS MySQL instance on AWS. However, as time progressed, we encountered operational challenges that demanded a more stable connection. In response, we decided to revamp our approach for the data replication component, which ran on our on-premise servers. Instead of relying on VPN, we pivoted towards exposing REST APIs. To enhance security, we implemented IP address whitelisting and introduced basic authentication protocols.&lt;/p&gt;
&lt;/blockquote&gt;

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

&lt;p&gt;Now, let's delve into the cost breakdown of the architecture. Here's a snapshot of the AWS bills from the last six months:&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%2Fgwhac5vtsfovy9m07v55.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%2Fgwhac5vtsfovy9m07v55.png" alt="AWS Billing" width="800" height="325"&gt;&lt;/a&gt; &lt;/p&gt;

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

&lt;p&gt;The most substantial portion of the expenditure is attributed to the database. Our choice of an &lt;a href="https://aws.amazon.com/rds/mysql/" rel="noopener noreferrer"&gt;AWS RDS MySQL&lt;/a&gt; database in a fully managed capacity amounted to approximately $184 per month over the last six months. Notably, we opted not to utilize &lt;a href="https://aws.amazon.com/rds/features/multi-az/" rel="noopener noreferrer"&gt;Multi-AZs&lt;/a&gt;. This decision was grounded in the understanding that our system did not necessitate a fully highly available configuration, aligning with our goal to optimize costs efficiently.&lt;/p&gt;

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

&lt;p&gt;Lambda services, constituting the backbone for handling HTTP requests and powering custom integration services for data replication, emerged as the second most significant cost factor. The monthly expenditure hovered around $57. The uniqueness of Lambda lies in its adaptability to fluctuating workloads. While the volume of HTTP requests can be predicted, Lambda execution for data replication is less predictable. In the recent bills, the total amount of Lambda function was reduced a lot (around $20 per month), mostly because the amount of data that needs to be replicated is reduced. Lambda's scalability feature allowed us to dynamically respond to the varying data replication needs without the overhead of infrastructure management.&lt;/p&gt;

&lt;h3&gt;
  
  
  ECS (Fargate) Costs
&lt;/h3&gt;

&lt;p&gt;ECS (Elastic Container Service) claimed the third spot in the list of expenses, accounting for around $29 per month. ECS served as a vital component for our headless automation processes. The system's scalability directly corresponded to the number of invoices requiring upload each month. ECS Fargate afforded us the flexibility to efficiently run these automation tasks, eliminating the need for the laborious setup and management of virtual machines, which would have been the case with a traditional architectural approach.&lt;/p&gt;

&lt;h3&gt;
  
  
  API Gateway Costs
&lt;/h3&gt;

&lt;p&gt;Our system efficiently managed around 800,000 monthly requests. API Gateway's pricing structure is tiered, with the first 333 million requests billed at a rate of $3.5 per million, resulting in our average cost for API Gateway being $3.2 per month.&lt;/p&gt;

&lt;h3&gt;
  
  
  Other Services Costs
&lt;/h3&gt;

&lt;p&gt;Beyond these major cost components, several other services contributed to the overall monthly expense. These included S3, KMS (Key Management Service), CloudFront, SES (Simple Email Service), and SNS (Simple Notification Service). Their collective costs amounted to roughly $5 per month.&lt;/p&gt;

&lt;h3&gt;
  
  
  Total Monthly Cost
&lt;/h3&gt;

&lt;p&gt;When considering the combined expenses of all these components, the total monthly cost of operating the entire system averaged around $280. This cost-effective solution provided scalability and security while significantly reducing the operational burden for the client. This architecture allowed the client to focus on feature development, thus streamlining their operations and cutting down on operational expenses. &lt;/p&gt;

&lt;p&gt;The cost breakdown presented focuses on the &lt;strong&gt;production environment&lt;/strong&gt;. If you're curious about expenses in other settings like &lt;strong&gt;Staging&lt;/strong&gt; or &lt;strong&gt;Development&lt;/strong&gt;, here's the good news – in &lt;strong&gt;non-production environments&lt;/strong&gt;, additional costs are minimal, and you can rest assured that these expenses won't be a significant concern. These environments typically handle low volumes of requests and user interactions. Furthermore, the database is shared among these instances for specific purposes. This showcases the efficiency of serverless architecture in meeting non-production needs while still adhering to the system's non-functional requirements. Now, the question that arises is: How can you achieve similar results with a traditional architecture while ensuring all non-functional prerequisites are met?&lt;/p&gt;

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

&lt;p&gt;You might see that based on the billing that we have captured here, we can do some actions to save costs, but, this is not the high priority that our team can focus on right now to save a few dollars. We still have a lot of feature development that we should focus on which increases ROI for the client. However, there are some tips or best practices we have applied according to our article &lt;a href="https://innomizetech.com/blog/mastering-aws-cost-optimization-with-best-practices-and-hidden-costs" rel="noopener noreferrer"&gt;Mastering AWS Cost Optimization with Best Practices and Hidden Costs&lt;/a&gt; as below:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;VPC S3 Gateway Endpoint&lt;/strong&gt;: For processing files on Lambda from a private subnet, establishing a VPC S3 gateway endpoint is highly recommended to mitigate potential cost overheads.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lifecycle Policies for S3&lt;/strong&gt;: Implementing lifecycle policies to automatically delete processed files from S3 after a specified time period is a cost-effective measure.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Right Retention for CloudWatch Logs&lt;/strong&gt;: Configuring appropriate retention settings for CloudWatch log groups ensures efficient use of resources.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lambda Power Tuning&lt;/strong&gt;: Leveraging Lambda Power Tuning assists in identifying the optimal resource allocation (CPU and Memory) for Lambda functions, thus achieving cost savings while maintaining performance.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;In conclusion, AWS Serverless services have proven to be a game-changer, especially for businesses seeking &lt;a href="https://innomizetech.com/services/custom-software-development" rel="noopener noreferrer"&gt;custom software solutions&lt;/a&gt;. By combining popular serverless services like &lt;strong&gt;Lambda, API Gateway, and DynamoDB&lt;/strong&gt;, businesses can design, build, and deploy well-architected solutions that deliver a substantial &lt;a href="https://www.forbes.com/advisor/investing/roi-return-on-investment/" rel="noopener noreferrer"&gt;return on investment (ROI)&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cost optimization, designing serverless application architectures, DevOps, and digital transformation&lt;/strong&gt; are all key elements of this success story. This architecture not only streamlines complex processes but also reduces operational burdens, allowing businesses to focus on delivering core features while leaving the infrastructure management to the cloud provider. It's worth noting that while &lt;a href="https://innomizetech.com/blog/demystifying-serverless-architecture-the-future-of-cloud-computing" rel="noopener noreferrer"&gt;serverless architecture&lt;/a&gt; offers numerous advantages, it may involve vendor lock-in and reduced control over underlying infrastructure, aspects that organizations should carefully consider.&lt;/p&gt;

&lt;p&gt;At &lt;strong&gt;INNOMIZE&lt;/strong&gt;, our proficiency in &lt;strong&gt;cloud computing&lt;/strong&gt;, &lt;strong&gt;digital transformation&lt;/strong&gt;, and &lt;strong&gt;serverless development services&lt;/strong&gt; has enabled us to craft a solution that not only streamlines billing processes but also paves the way for future scalability and innovation. Our track record of over five years of seamless operation stands as a testament to our commitment to excellence. We understand that every business is unique, and our tailored solutions reflect this understanding.&lt;/p&gt;

&lt;p&gt;If you're grappling with similar challenges or seeking to embark on a digital transformation journey, INNOMIZE is here to help. Our team of experts is ready to collaborate with you, analyze your specific needs, and deliver solutions that not only solve your problems but also position your business for a dynamic, cloud-native future.&lt;/p&gt;

&lt;h3&gt;
  
  
  Ready to Embrace Digital Transformation? Contact INNOMIZE Today!
&lt;/h3&gt;

&lt;p&gt;Your journey toward a more agile, cost-effective, and innovative future begins here. Don't hesitate to &lt;a href="https://innomizetech.com/contact-us" rel="noopener noreferrer"&gt;get in touch&lt;/a&gt; with INNOMIZE and unlock the power of cloud computing and serverless solutions.&lt;/p&gt;

</description>
      <category>aws</category>
      <category>serverless</category>
      <category>cloudcomputing</category>
      <category>technicalsolution</category>
    </item>
    <item>
      <title>Continuous Delivery  -  Deploying a Node.js app to AWS EC2 using Ansible</title>
      <dc:creator>Hoang Le</dc:creator>
      <pubDate>Mon, 03 Feb 2020 02:50:35 +0000</pubDate>
      <link>https://dev.to/hoangleitvn/continuous-delivery-deploying-a-node-js-app-to-aws-ec2-using-ansible-443g</link>
      <guid>https://dev.to/hoangleitvn/continuous-delivery-deploying-a-node-js-app-to-aws-ec2-using-ansible-443g</guid>
      <description>&lt;p&gt;The main key point for all our projects is trying to automate all things, it helps to reduce errors (e.g. human mistake), fast and easy to deploy / rollback, and improve customer satisfaction.&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%2Fcdn-images-1.medium.com%2Fmax%2F800%2F0%2ARBJGZPYN8d8R2BuB" 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%2Fcdn-images-1.medium.com%2Fmax%2F800%2F0%2ARBJGZPYN8d8R2BuB" alt="Continuous Delivery and Automation are Key" width="638" height="359"&gt;&lt;/a&gt;&lt;a rel="noreferrer noopener" href="https://www.google.com.vn/url?sa=i&amp;amp;source=images&amp;amp;cd=&amp;amp;ved=2ahUKEwiJ2rKF0bfeAhXYaN4KHcZ_D8QQjhx6BAgBEAM&amp;amp;url=https%3A%2F%2Fwww.slideshare.net%2Fdcjuengst%2Fcloudbeesjenkinsplatform2016&amp;amp;psig=AOvVaw1RxLgKUvrZis9gBgTe1LLi&amp;amp;ust=1541314216834361"&gt;Images Sources&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We do have some approaches to automate the deployment process that we have been applying to our projects such as using &lt;a rel="noreferrer noopener" href="https://aws.amazon.com/elasticbeanstalk/"&gt;Amazon Elastic BeanStalk&lt;/a&gt; or &lt;a rel="noreferrer noopener" href="https://aws.amazon.com/ecs/"&gt;Amazon Elastic Container Service&lt;/a&gt;. However, in some cases, our customers they don’t want to use those approaches because they don’t use AWS, they’ve already had the servers to run the app, they want to keep their app on their On-Prime Data Center and have their IT guy to manage it. It led us to have to find out another approach to automate our delivery process. And we have chosen Ansible as the tool to implement our Continuous Delivery pipeline.&lt;/p&gt;

&lt;p&gt;So I would like to write this article to share with you and outline our workflow and provide a brief introduction along with sample code to build this flow.&lt;/p&gt;

&lt;h4&gt;The Tools&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://jenkins.io/doc/" rel="noreferrer noopener"&gt;Jenkins&lt;/a&gt;: Jenkins is a self-contained, open-source automation server that can be used to automate all sorts of tasks related to building, testing, and delivering or deploying software.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.ansible.com/" rel="noreferrer noopener"&gt;Ansible&lt;/a&gt;: Ansible is an open-source automation platform. Ansible can help you with configuration management, application deployment, task automation. It can also do IT orchestration, where you have to run tasks in sequence and create a chain of events that must happen on several different servers or devices.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://slack.com" rel="noreferrer noopener"&gt;Slack&lt;/a&gt;: a cloud-based set of proprietary team collaboration tools and services.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;Why Ansible?&lt;/h4&gt;

&lt;p&gt;As you know, there are a lot of tools for infrastructure automation (infrastructure as code) such as Terraform, Chef, Ansible, Juju, and more. But there are a few reasons that make me selected Ansible as below:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It is very, &lt;a href="https://docs.ansible.com/ansible/2.7/installation_guide/intro_installation.html" rel="noreferrer noopener"&gt;very simple to set up &lt;/a&gt;and yet powerful.&lt;/li&gt;
&lt;li&gt;Ansible is a radically simple IT automation platform that makes your applications and systems easier to deploy. Avoid writing scripts or custom code to deploy and update your applications.&lt;/li&gt;
&lt;li&gt;Automate in a language that approaches plain English, using SSH, with no agents (likes Puppet or Chef) to install on remote systems.&lt;/li&gt;
&lt;li&gt;Easy to integrate with our CI/CD pipeline using the Jenkins server.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;The Steps&lt;/h4&gt;

&lt;p&gt;What we are going to build is the following deployment flow:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Launch EC2 instance(s) (optional).&lt;/li&gt;
&lt;li&gt;Update OS and install needed dependencies such as install Node.js.&lt;/li&gt;
&lt;li&gt;Deploy the Node.js app to EC2 instance(s).&lt;/li&gt;
&lt;li&gt;Configure DNS (optional).&lt;/li&gt;
&lt;li&gt;Smock test.&lt;/li&gt;
&lt;/ol&gt;

&lt;h4&gt;Let’s coding…&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Project Structure&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When doing any coding stuff, the &lt;em&gt;project structure&lt;/em&gt; is one of the most importing things I pay attention to. If you have experience in working with Ansible, you should know how to organize the Ansible project. I followed the alternative approach mentioned in &lt;a href="https://docs.ansible.com/ansible/latest/user_guide/playbooks_best_practices.html#directory-layout" rel="noreferrer noopener"&gt;this&lt;/a&gt; article, feel free to select your own approach.&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%2Fcdn-images-1.medium.com%2Fmax%2F800%2F1%2A4Juvy1AXwPQwI0UwADyXlw.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%2Fcdn-images-1.medium.com%2Fmax%2F800%2F1%2A4Juvy1AXwPQwI0UwADyXlw.png" alt="Ansible project structure" width="770" height="1134"&gt;&lt;/a&gt;Ansible Project Structure&lt;/p&gt;

&lt;p&gt;My project contains the following root directories/files:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;scripts&lt;/em&gt;: it contains a shell &lt;em&gt;setup&lt;/em&gt; script to install Ansible, Ansible Galaxy,  generate a self-signed certificate to run our Node.js app in secure mode (HTTPS).&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;cert&lt;/em&gt;: directory to keep a self-signed certificate.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;ansible&lt;/em&gt;: put all Ansible code into this directory including playbooks, roles, var files, etc.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Jenkinsfile&lt;/em&gt;: the Jenkins pipeline code for CI/CD pipeline.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Role&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;In Ansible, the role is the primary mechanism for breaking a playbook into multiple files. This simplifies writing &lt;strong&gt;complex playbooks&lt;/strong&gt;, and it makes them easier to reuse. The breaking of playbook allows you to logically break the playbook into reusable components.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;Here are the following roles we will use on this project:&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%2Fcdn-images-1.medium.com%2Fmax%2F800%2F1%2AJhtfl60VH2zu9m268e9SzA.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%2Fcdn-images-1.medium.com%2Fmax%2F800%2F1%2AJhtfl60VH2zu9m268e9SzA.png" alt="Ansible roles" width="530" height="376"&gt;&lt;/a&gt;Ansible Roles&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;apache-server&lt;/em&gt;: we don’t use this role on this project but I wanted to keep it here. This role will configure the Apache using our own &lt;em&gt;httpd.conf&lt;/em&gt; template file. To install Apache, we can use &lt;a rel="noreferrer noopener" href="https://github.com/geerlingguy/ansible-role-apache"&gt;geerlingguy.apache&lt;/a&gt; role.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;common&lt;/em&gt;: put all your comment stuff into this role such as update your OS to ensure your server(s) are up to date.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;launch-ec2&lt;/em&gt;: this role to launch EC2 instance(s) to deploy our app.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;node-server&lt;/em&gt;: contains all needed steps to deploy and run the Node.js app&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;nodejs&lt;/em&gt;: install the Node.js runtime.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;Conclusion&lt;/h4&gt;

&lt;p&gt;Using Ansible, you can easy to provision and install software to run your application automatically, you can manage your infrastructure as code (IaC). However, running your software is not simple likes this demo, you will need to do more things such as setup network, configure firewall, auto-scaling. To do those things, you might need to combine with other tools. For example, you can use the AWS CDK framework to provide your AWS infrastructure (network, database, EC2 instances, and auto-scaling), then use Ansible to provision your EC2 instances and configure your applications. &lt;/p&gt;

&lt;p&gt;I hope this post will bring some ideas to you to design and deploy your application. If you have any issues or need help, just let me know by adding comments on this post. &lt;/p&gt;

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

&lt;p&gt;This post is originally published on &lt;a href="https://innomizetech.com/blog/continuous-delivery-deploying-a-node-js-app-to-aws-ec2-using-ansible" rel="noopener noreferrer"&gt;our blog&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>devops</category>
      <category>ansible</category>
      <category>iac</category>
    </item>
    <item>
      <title>Check list to avoid scam for Freelancer</title>
      <dc:creator>Hoang Le</dc:creator>
      <pubDate>Thu, 26 Dec 2019 03:02:57 +0000</pubDate>
      <link>https://dev.to/hoangleitvn/check-list-to-avoid-scam-for-freelancer-jn2</link>
      <guid>https://dev.to/hoangleitvn/check-list-to-avoid-scam-for-freelancer-jn2</guid>
      <description>&lt;p&gt;When I working as a Freelancer, I saw a job on a Freelancer site, they just say on the description that if anyone wants to work with them, then send them an email to get job descriptions. I emailed them and got their feedback on the next day, and we have a few more conversations, then they asked me for estimation, I replied then they accepted without asking for more details. After that, they ask me to send them the relative person in the USA in order to receive money for me. &lt;/p&gt;

&lt;p&gt;They bring another person, they called them as their private consultant, he/she will send me the material (logo, image artwork to create a website). Not sure where he/she is living but they said he/she cannot receive money on PayPal or credit card. &lt;/p&gt;

&lt;p&gt;I asked my friend in the USA and send them relative person info, but after that, I had a feeling, something wrong with this job, it is really odd. I discuss it with my US friend to get their advice. After some conversations, my friend asked some questions and help me realized that this is a SCAM.&lt;/p&gt;

&lt;p&gt;Below are some messages from my friends asking me about the work.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;This doesn’t sound legitimate. Why can’t they pay the other person directly? I’m not comfortable accepting and distributing money like this. Also, the email is very odd. You haven’t actually given her any details around the exact estimate and yet they are moving forward? Something isn’t right here. &lt;/p&gt;

&lt;p&gt;Unfortunately, there are many people scamming out there. I feel like this could be some sort of scam or way for this person to pay someone without directly transferring the funds to them. Using us as a middle man. That could get us into a lot of trouble. &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Finally, I replied back and said that I cancel this job and they disappeared, no response so far after weeks.&lt;/p&gt;

&lt;p&gt;So when you try to bid any work, pay attention to some points as below, it will help recognize and avoid scam that will bring troubles, even lose your money:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Sender information: is the name spell correctly or check the email address, is that good? You can search by email address and you may see some posts about scam relates to that email address.&lt;/li&gt;
&lt;li&gt;Project description: are they provide a valued description, deadlines or more specific information?&lt;/li&gt;
&lt;li&gt;Check the payment option they prefer and never accept cashier's checks as payments&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can also read this &lt;a href="https://www.google.com/amp/s/blog.freelancersunion.org/2018/11/23/how-to-dodge-scam-clients/amp/" rel="noopener noreferrer"&gt;post&lt;/a&gt;, it describes exactly my situation and helped me to avoid a SCAM. I hope it can help you too.&lt;/p&gt;

</description>
      <category>freelancer</category>
      <category>scam</category>
    </item>
    <item>
      <title>re:Invent 2019 announcements</title>
      <dc:creator>Hoang Le</dc:creator>
      <pubDate>Fri, 20 Dec 2019 08:26:04 +0000</pubDate>
      <link>https://dev.to/hoangleitvn/re-invent-2019-announcements-46a7</link>
      <guid>https://dev.to/hoangleitvn/re-invent-2019-announcements-46a7</guid>
      <description>&lt;p&gt;If you didn't have a chance to review all recent AWS announcements on their #awsreinvent2019, you can review this table.&lt;/p&gt;

&lt;h1&gt;
  
  
  aws #cloudcomputing #clouddevelopment #cloudconsulting #cloudengineer #news #announcements #serverless
&lt;/h1&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%2F7rgeujml0xq5k50fxnyv.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%2F7rgeujml0xq5k50fxnyv.png" alt="Alt Text" width="800" height="608"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>aws</category>
      <category>news</category>
    </item>
    <item>
      <title>A brief summary of JavaScript Learning Path</title>
      <dc:creator>Hoang Le</dc:creator>
      <pubDate>Fri, 20 Dec 2019 06:00:51 +0000</pubDate>
      <link>https://dev.to/hoangleitvn/javascript-learning-path-5bgb</link>
      <guid>https://dev.to/hoangleitvn/javascript-learning-path-5bgb</guid>
      <description>&lt;p&gt;This post is originally published on our &lt;a href="https://innomizetech.com/blog/a-brief-summary-of-javascript-learning-path" rel="noopener noreferrer"&gt;blog&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;JavaScript is a popular language among web developers which gave rise to several frameworks that simplify your code. According to the largest online developer communities, &lt;a href="https://insights.stackoverflow.com/survey/" rel="noopener noreferrer"&gt;StackOverflow&lt;/a&gt; in their 2019 survey of the most sought-after programming languages shed some light on what to expect in the coming year:&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%2Fblog.innomizetech.com%2Fwp-content%2Fuploads%2F2019%2F12%2Fimage.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%2Fblog.innomizetech.com%2Fwp-content%2Fuploads%2F2019%2F12%2Fimage.png" alt="" width="800" height="400"&gt;&lt;/a&gt;Top Programming Languages in 2019&lt;/p&gt;

&lt;p&gt;For the seventh year in a row, &lt;a rel="noreferrer noopener" href="https://stackoverflow.com/jobs?sort=i&amp;amp;q=javascript"&gt;JavaScript&lt;/a&gt; is the most commonly used programming language. So how to learn &lt;strong&gt;JavaScript&lt;/strong&gt;, how to up-level of your programming language skills, what is the path for learning JavaScript from the beginning? If you don't know how to get started, then you should read this post.&lt;/p&gt;

&lt;h4&gt;Step 1 - Learn basic and fundamentals&lt;/h4&gt;

&lt;p&gt;Firstly, you need to understand basic concepts and fundamental of JavaScript, you can learn from&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.w3schools.com/js/" rel="noopener noreferrer"&gt;W3 Schools&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://javascript.info/" rel="noopener noreferrer"&gt;Javascript.info&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://github.com/getify/You-Dont-Know-JS" rel="noopener noreferrer"&gt;You-Dont-Know-JS&lt;/a&gt; this is a series of books diving deep into the core mechanisms of the JavaScript language. You should read this to get more overview and advanced concepts of JavaScript such as Scope &amp;amp; Closures, Objects &amp;amp; Classes, Sync &amp;amp; Async, ES.Next &amp;amp; Beyond.&lt;/p&gt;

&lt;h4&gt;Step 2 - Learn modern JavaScript&lt;/h4&gt;

&lt;p&gt;Learning basic isn't enough, you need to learn more about advanced and modern JavaScript concepts/syntax, it helps you write code efficiently, quickly, and high performance&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://es6.io/" rel="noopener noreferrer"&gt;ES6 for Everyone&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://eloquentjavascript.net/" rel="noopener noreferrer"&gt;Eloquent JavaScript&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;Step 3 - Coding style and Convention&lt;/h4&gt;

&lt;p&gt;Coding standards (also sometimes known as ‘Coding Conventions’ or ‘Coding Rules’) are a set of guidelines that a group of developers stick to, to ensure that they are all essentially follow the same style.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a rel="noreferrer noopener" href="https://github.com/airbnb/javascript"&gt;Airbnb JavaScript Style Guide&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a rel="noreferrer noopener" href="https://google.github.io/styleguide/jsguide.html#features-this"&gt;Google JavaScript Style Guide&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a rel="noreferrer noopener" href="https://contribute.jquery.org/style-guide/js/"&gt;jQuery Style Guide&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Read about &lt;a href="https://prettier.io/" rel="noopener noreferrer"&gt;prettier&lt;/a&gt; and see how to configure it in order to format your code and save your time.&lt;/p&gt;

&lt;h4&gt;Step 4 - Review your knowledge&lt;/h4&gt;

&lt;p&gt;Now is the time to review your understanding about JavaScript by answering interview questions&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.edureka.co/blog/interview-questions/javascript-interview-questions/" rel="noopener noreferrer"&gt;Top 50 JavaScript Interview Questions You Must Prepare in 2020&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.guru99.com/javascript-interview-questions-answers.html" rel="noopener noreferrer"&gt;Top 85 JavaScript Interview Questions &amp;amp; Answers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.toptal.com/javascript/interview-questions" rel="noopener noreferrer"&gt;37 Essential JavaScript Interview Questions&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;Step 5 - Practices&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Learning JavaScript libraries (e.g. Lodash, ReactJS, Moment, jQuery, Ramda, and a lot more)&lt;/li&gt;
&lt;li&gt;Learn JavaScript Frameworks such as Angular, VueJS, EmberJS)&lt;/li&gt;
&lt;li&gt;Task runner (e.g. Gulp, Grunt) and module bunder (e.g. Webpack, Browserify)&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;Step 6 - Be an expert&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Continue learning core concepts in JavaScript such as Closure, Hosting, Scope, Coercion, Prototypes&lt;/li&gt;
&lt;li&gt;Learn OOP, &lt;a href="https://medium.com/javascript-scene/master-the-javascript-interview-what-is-functional-programming-7f218c68b3a0" rel="noopener noreferrer"&gt;Functional Programming&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Read this book &lt;a href="https://addyosmani.com/resources/essentialjsdesignpatterns/book/" rel="noopener noreferrer"&gt;Learning JavaScript Design Patterns&lt;/a&gt; or &lt;a href="https://www.dofactory.com/javascript/design-patterns" rel="noopener noreferrer"&gt;design-patterns&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you want to become a web, backend or full-stack developer, JavaScript isn't enough, you need to learn more. Check out this roadmap and pick your path &lt;a href="https://github.com/kamranahmedse/developer-roadmap" rel="noopener noreferrer"&gt;Web Developer Roadmap 2019&lt;/a&gt; and keep yourself up to date.&lt;/p&gt;

&lt;p&gt;Visit our &lt;a href="https://innomizetech.com/blog" rel="noopener noreferrer"&gt;blog&lt;/a&gt; for more interesting articles. If you have any questions or need help you can contact me via &lt;a href="https://twitter.com/hoangleitvn" rel="noopener noreferrer"&gt;Twitter&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If you are looking for developers, offshore team, or need consulting about the AWS cloud, Serverless architecture, and so on, then &lt;a href="https://blog.innomizetech.com/hire-us/" rel="noopener noreferrer"&gt;hire us&lt;/a&gt;, we can help you!&lt;/p&gt;

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

</description>
      <category>javascript</category>
      <category>beginners</category>
      <category>typescript</category>
    </item>
    <item>
      <title>07 best practices when using AWS SSM Parameter Store</title>
      <dc:creator>Hoang Le</dc:creator>
      <pubDate>Thu, 21 Nov 2019 03:28:41 +0000</pubDate>
      <link>https://dev.to/hoangleitvn/07-best-practices-when-using-aws-ssm-parameter-store-6m2</link>
      <guid>https://dev.to/hoangleitvn/07-best-practices-when-using-aws-ssm-parameter-store-6m2</guid>
      <description>&lt;p&gt;This post appears first on &lt;a href="https://innomizetech.com/blog/07-best-practices-when-using-aws-ssm-parameter-store" rel="noopener noreferrer"&gt;our blog&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%2Fblog.innomizetech.com%2Fwp-content%2Fuploads%2F2019%2F11%2FiStock_33780344_VSMALL.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%2Fblog.innomizetech.com%2Fwp-content%2Fuploads%2F2019%2F11%2FiStock_33780344_VSMALL.jpg" alt="Cloud Encryption" width="800" height="400"&gt;&lt;/a&gt;&lt;a href="https://blog.hubstor.net/cloud-storage-and-data-encryption-how-businesses-can-protect-information-in-the-cloud" rel="noopener noreferrer"&gt;Cloud Encryption&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Security&lt;/strong&gt; is one of 5 pillars of the Well-Architected framework, it can archive by applying best practices and principals in &lt;strong&gt;IAM&lt;/strong&gt;, &lt;strong&gt;Encryption&lt;/strong&gt;, &lt;strong&gt;Complician&lt;/strong&gt;, and &lt;strong&gt;Governance&lt;/strong&gt;. Of course, best practices aren't enough, you need to learn more. In this post, I only share our best practices and tip when working with AWS SSM Parameter Store. By sharing our best practices, my hope is to encourage you to build and deploy secure and reliable applications and also giving us your feedback. &lt;/p&gt;

&lt;p&gt;As you know, AWS Lambda supports native environment variables, you can easy to define and add any environment variables you want during deployment or change on the AWS Console Management. But using native environment variables contains some disadvantages:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It stores plaint-text variables which easy to see its value. You had an option to encrypt variables in the console using KMS, but it still fetching per innovation causes increase your bill.&lt;/li&gt;
&lt;li&gt;Hard to share across projects and teams that add complexity to your applications and services. More complexity requires more time to operate and increase the cost, therefore, you won't meed the conditional for the &lt;strong&gt;Operational Excellence&lt;/strong&gt; pillar of the Well-Architected framework.&lt;/li&gt;
&lt;li&gt;As per Yan Cui, it hards for implementing fine-grained access to sensitive data. &lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
&lt;strong&gt;What is AWS Systems Manager Parameter Store (aka SSM Parameter Store)?&lt;/strong&gt; &lt;/h4&gt;

&lt;blockquote&gt;&lt;p&gt;AWS Systems Manager Parameter Store provides secure, hierarchical storage for configuration data management and secrets management. You can store data such as passwords, database strings, and license codes as parameter values. You can store values as plain text or encrypted data. You can then reference values by using the unique name that you specified when you created the parameter. Highly scalable, available, and durable, Parameter Store is backed by the AWS Cloud. ~&lt;a href="https://docs.aws.amazon.com/systems-manager/latest/userguide/systems-manager-parameter-store.html" rel="noopener noreferrer"&gt;AWS&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt;

&lt;h4&gt;What are the benefits?&lt;/h4&gt;

&lt;p&gt;There are a lot of benefits when using AWS SSM Parameter Store, I just copied those from the AWS documentation:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use a secure, scalable, hosted secrets management service with no servers to manage.&lt;/li&gt;
&lt;li&gt;Improve your security posture by separating your data from your code.&lt;/li&gt;
&lt;li&gt;Store configuration data and secure strings in hierarchies and track versions.&lt;/li&gt;
&lt;li&gt;Control and audit access at granular levels.&lt;/li&gt;
&lt;li&gt;Configure change notifications and trigger automated actions for both parameters and parameter policies.&lt;/li&gt;
&lt;li&gt;Tag parameters individually, and then secure access from different levels, including operational, parameter, Amazon EC2 tag, and path levels.&lt;/li&gt;
&lt;li&gt;Reference AWS Secrets Manager secrets by using Parameter Store parameters.&lt;/li&gt;
&lt;li&gt;Use Parameter Store parameters with other Systems Manager capabilities and AWS services to retrieve secrets and configuration data from a central store. &lt;/li&gt;
&lt;li&gt;Configure integration with the AWS services for encryption, notification, monitoring, and auditing.&lt;/li&gt;
&lt;/ul&gt;








&lt;p&gt;So now you understand what is the SSM parameter store and its challenges, let talk about how we use it by reviewing the following our best practices and tips:&lt;/p&gt;

&lt;h4&gt;#1 - Organizing parameters into hierarchies&lt;/h4&gt;

&lt;p&gt;AWS provides detailed &lt;a href="https://docs.aws.amazon.com/systems-manager/latest/userguide/sysman-paramstore-su-organize.html" rel="noopener noreferrer"&gt;instructions&lt;/a&gt; on how to organize your SSM &lt;strong&gt;Parameter Store&lt;/strong&gt; to define and manage parameters easily. Following its best practices can help you and make your life easier. Below are a couple of formats/conventions that our team normally using:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;/environment/service-name/type/application-name/parameter_name i.e. &lt;em&gt;/prod/billing/databases/invoicing-portal/db_connection_string&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;You also can add your department name as well i.e.  &lt;em&gt;/prod/human-resource/employee/user_list&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;#2 - Consistent naming convention&lt;/h4&gt;

&lt;p&gt;Using a &lt;strong&gt;well-defined&lt;/strong&gt; hierarchy helps you to manage and retrieve parameters more efficiently, but you also need to use a consistent &lt;a href="https://en.wikipedia.org/wiki/Naming_convention_(programming)" rel="noopener noreferrer"&gt;naming convention&lt;/a&gt; across your AWS account, your departments, and your teams.  &lt;/p&gt;

&lt;p&gt;By archiving this best practice, it reduces your reviewing efforts by focusing on critical business logic rather than syntax and naming standards and then increase your productivity and quality which can increase your customer satisfaction.  &lt;/p&gt;

&lt;h4&gt;#3 - Restrict IAM permission&lt;/h4&gt;

&lt;p&gt;AWS SSM Parameter Store normally keeps your sensitive information, so restrict permissions are required to improve your security of the application. Each Parameter Store has a unique Resource ARN per account and region, so you can easier to define role and policy base on the hierarchy of the parameter store.&lt;/p&gt;

&lt;p&gt;Below is a sample code from the AWS official document shows how to define a policy to restrict access to the Parameter Store&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ssm:*"
            ],
            "Resource": "arn:aws:ssm:us-east-2::parameter/*"
        },
        {
            "Effect": "Deny",
            "Action": [
                "ssm:GetParametersByPath"
            ],
            "Condition": {
                "StringEquals": {
                    "ssm:Recursive": [
                        "true"
                    ]
                }
            },
            "Resource": "arn:aws:ssm:us-east-2:123456789012:parameter/Dev/ERP/Oracle/*"
        },
        {
            "Effect": "Deny",
            "Action": [
                "ssm:PutParameter"
            ],
            "Condition": {
                "StringEquals": {
                    "ssm:Overwrite": [
                        "false"
                    ]
                }
            },
            "Resource": "arn:aws:ssm:us-east-2:123456789012:parameter/*"
        }
    ]
}
&lt;/code&gt;&lt;/pre&gt;

&lt;h4&gt;#4 - Combine into a single parameter likes database connection string and keep it all together (co-location)&lt;/h4&gt;

&lt;p&gt;By using consistency hierarchies and naming convention you can archive this idea. Keep all related parameters all together makes easy to find and retrieve. Using fewer parameters can reduce your bills.&lt;/p&gt;

&lt;p&gt;Instead of using 4 separated parameters for the database connection string as below:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;/{env}/{service}/databases/master/host = db.domain.com
                                 /user = username
                                 /password = password
                                 /port = 3306&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;We combine into a single parameter using a standard connection string format:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;/{env}/{service}/databases/master/db_connection = jdbc://username:password@db_host:port/database_name&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Using community library such as &lt;em&gt;connection-string-parser&lt;/em&gt;, you can easy to parse the parameter values and use to open connection, see below code snippet:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;import { createConnection as createConnectionPromise, Connection } from 'promise-mysql';
import { ConnectionStringParser } from 'connection-string-parser';

const parseConnectionString = (dialect: string, connectionUri: string) =&amp;gt; {
  const connectionParser = new ConnectionStringParser({
    scheme: dialect || 'mysql',
    hosts: []
  });
  const connectionStrParams = connectionParser.parse(connectionUri);

  return {
    host: connectionStrParams.hosts[0].host,
    port: connectionStrParams.hosts[0].port || 3306,
    database: connectionStrParams.endpoint,
    user: connectionStrParams.username,
    password: connectionStrParams.password
  };
};

export const createConnection = (connectionUri: string): Promise&amp;lt;Connection&amp;gt; =&amp;gt; {
  return createConnectionPromise(parseConnectionString('mysql', connectionUri));
};&lt;/code&gt;&lt;/pre&gt;

&lt;h4&gt;#5 - Use tool/library to fetch, cache, and export to environment variables at runtime&lt;/h4&gt;

&lt;p&gt;You are charged for API integration to SSM parameters, every time you retrieve your parameter from the store, you will increase your bill. What could you do to reduce your billing? &lt;/p&gt;

&lt;p&gt;By default, &lt;strong&gt;max throughput (transactions per second) to retrieve parameter via API is 1000&lt;/strong&gt;, how do you manage and avoid exceed throughput error?&lt;/p&gt;

&lt;p&gt;&lt;a href="https://twitter.com/theburningmonk" rel="noopener noreferrer"&gt;@Yan Cui&lt;/a&gt; wrote an &lt;a href="https://hackernoon.com/you-should-use-ssm-parameter-store-over-lambda-env-variables-5197fc6ea45b" rel="noopener noreferrer"&gt;article&lt;/a&gt; describes reasons why you should use AWS SSM Parameter Store over Lambda environment variables, he also mentioned approaches for caching and cache expiration using his custom client library. &lt;/p&gt;

&lt;p&gt;Our team is using &lt;a href="https://github.com/middyjs/middy" rel="noopener noreferrer"&gt;middy&lt;/a&gt; middleware to deal with some cross-cutting concerns outside business logic, like input parsing and validation, output serialization, error handling. Application configuration also an aspect that every developer needs to work out and manage to run business logic. Out of the box, middy provides &lt;a href="https://github.com/middyjs/middy/blob/master/docs/middlewares.md#ssm" rel="noopener noreferrer"&gt;ssm&lt;/a&gt; middleware support fetch and cache parameters from the AWS SSM Parameter Store, it also supports assign parameter values to environment variables.&lt;/p&gt;

&lt;p&gt;Here is a sample code on how to use middy to fetch and cache parameter store&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;const middy = require('middy');
const { ssm } = require('middy/middlewares');

export const handler = middy((event, context, cb) =&amp;gt; {
  // You can access the parameter value inside function handler
  console.log(process.env.HARVESTAR_PCMSS_DB_CONNECTION);

  // Your business logic here
}).use(
  ssm({
    cache: true,
    names: {
      // Should have a prefix that include this micro service i.e. pcmss
      HARVESTAR_PCMSS_DB_CONNECTION: '/dev/harvestar/pcmss/db_connection'
    }
  })
);&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;There are some alternative open-sourced libraries out there:&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;&lt;a href="https://www.npmjs.com/package/aws-parameter-cache" rel="noopener noreferrer"&gt;aws-parameter-cache&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;

&lt;ul&gt;&lt;li&gt;&lt;a href="https://github.com/alexcasalboni/ssm-cache-python" rel="noopener noreferrer"&gt;ssm-cache-python&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Do you really trust the community package? &lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I head from some people, basically, they don't want to assign variables into environment variables (i.e. variables you can access through the &lt;em&gt;process.env&lt;/em&gt; global object in Node.js runtime). If you do so, I have some advice as below:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Instead of assign variables to &lt;em&gt;environment variables&lt;/em&gt;, you also have another option to assign the &lt;em&gt;context&lt;/em&gt; object of the AWS Lambda when using &lt;strong&gt;middy/ssm&lt;/strong&gt; middleware.&lt;/li&gt;
&lt;li&gt;To avoid sending your sensitive information such as data credentials, accessing to the &lt;em&gt;/tmp &lt;/em&gt;directory, or running a child process when executing your serverless functions. You can use &lt;a href="https://www.npmjs.com/package/@puresec/function-shield" rel="noopener noreferrer"&gt;@puresec/function-shield&lt;/a&gt; library. We are also using it in our production environment.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;TIPS - Avoid fetching parameters at build/deploy time, fetch it at runtime instead. If you do so, you have to redeploy each time the parameter changed.&lt;/strong&gt;&lt;/p&gt;&lt;/blockquote&gt;

&lt;h4&gt;#6 - Using hardcoded environment variables for your local development&lt;/h4&gt;

&lt;p&gt;Do you need to run your function locally that fetches AWS SSM Parameter Store directly? The answer is it is optional, for your local environment, you might not need to use AWS SSM Parameter Store, you can use a .&lt;em&gt;env &lt;/em&gt;file to keep your local variables. Below are some approaches you can use to archive that idea, note you still need to test your function with your desired approach on  AWS environment:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use the &lt;a href="https://www.npmjs.com/package/env-cmd" rel="noopener noreferrer"&gt;env-cmd&lt;/a&gt; library to load, extract and assign to &lt;em&gt;process.env &lt;/em&gt;global object. By running &lt;em&gt;&lt;strong&gt;env-cmd serverless offline&lt;/strong&gt;&lt;/em&gt; command, you can access all variables defined in your .env file.&lt;/li&gt;
&lt;li&gt;Using the &lt;a href="https://github.com/serverless/serverless-secrets-plugin" rel="noopener noreferrer"&gt;serverless-secrets-plugin&lt;/a&gt; to define the environment variable in a secured manner, you can easier to share across the team and commit the encrypted file.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Using the same code as below with a modification, you can skip fetching parameter store from AWS and reduce your bill:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;const middy = require('middy');
const { ssm } = require('middy/middlewares');

const isLocalEnv = process.env.IS_OFFLINE || process.env.IS_LOCAL;

export const handler = middy((event, context, cb) =&amp;gt; {
  // You can access the parameter value inside function handler
  console.log(process.env.HARVESTAR_PCMSS_DB_CONNECTION);

  // Your business logic here
}).use(
  ssm({
    cache: true,
    // By setting the paramsLoaded, you tell the middleware to
    // not fetch it from AWS SSM
    paramsLoaded: isLocalEnv,
    names: {
      // Should have a prefix that include this micro service i.e. pcmss
      HARVESTAR_PCMSS_DB_CONNECTION: '/dev/harvestar/pcmss/db_connection'
    }
  })
);&lt;/code&gt;&lt;/pre&gt;

&lt;h4&gt;#7 - Pay attention to services limits&lt;/h4&gt;

&lt;p&gt;Likes other AWS services, AWS SSM Parameter Store also has some limits, such as the maximum number of params per account and region, max param value size, max history. Understanding its limits help us design and build applications with high reliability. For example, avoid storing large items into the SSM parameter because of size limits (4KB for standard and 8KB for the advanced parameter). Refer to &lt;a href="https://docs.aws.amazon.com/general/latest/gr/aws_service_limits.html" rel="noopener noreferrer"&gt;AWS service limits documentation&lt;/a&gt; for more others.&lt;/p&gt;

&lt;h4&gt;Resources&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://hackernoon.com/you-should-use-ssm-parameter-store-over-lambda-env-variables-5197fc6ea45b" rel="noopener noreferrer"&gt;You should use SSM Parameter Store over Lambda env variables&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://Sharing%20Secrets%20with%20AWS%20Lambda%20Using%20AWS%20Systems%20Manager%20Parameter%20Store" rel="noopener noreferrer"&gt;Sharing Secrets with AWS Lambda Using AWS Systems Manager Parameter Store&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://velotio.com/blog/2018/9/2/managing-secrets-using-aws-systems-manager-parameter-store" rel="noopener noreferrer"&gt;Managing Secrets Using AWS Systems Manager Parameter Store and IAM Roles&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;Conclusion&lt;/h4&gt;

&lt;p&gt;By applying best practices, you can implement your applications more &lt;strong&gt;reliable&lt;/strong&gt;, &lt;strong&gt;secure&lt;/strong&gt;, &lt;strong&gt;efficient, and cost-effective&lt;/strong&gt; software on the cloud. &lt;/p&gt;

&lt;p&gt;I hope this post brings some ideas to you and save your time.  There are more interesting and useful articles, so find and read them to get more information. Feel free to let me know your recommendations or suggestions by adding comments below.&lt;/p&gt;

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

</description>
      <category>security</category>
      <category>serverless</category>
      <category>aws</category>
      <category>ssm</category>
    </item>
    <item>
      <title>What are the best ways to explore Singapore IT startup projects?</title>
      <dc:creator>Hoang Le</dc:creator>
      <pubDate>Tue, 19 Nov 2019 10:50:08 +0000</pubDate>
      <link>https://dev.to/hoangleitvn/what-are-the-best-ways-to-explore-singapore-it-startup-projects-ijd</link>
      <guid>https://dev.to/hoangleitvn/what-are-the-best-ways-to-explore-singapore-it-startup-projects-ijd</guid>
      <description>&lt;p&gt;I am trying to find a way to explore the Singapore IT startup industry to find more clients and help startups to build and bootstrap their development to bring their product to the market. &lt;/p&gt;

&lt;p&gt;Suggesting ideas and approaches are very appreciated.&lt;/p&gt;

&lt;p&gt;Thank you in advance! &lt;/p&gt;

</description>
      <category>startup</category>
      <category>outsourcing</category>
    </item>
    <item>
      <title>My Cloud computing journey</title>
      <dc:creator>Hoang Le</dc:creator>
      <pubDate>Sat, 16 Nov 2019 14:27:34 +0000</pubDate>
      <link>https://dev.to/hoangleitvn/my-cloud-computing-journey-2ajk</link>
      <guid>https://dev.to/hoangleitvn/my-cloud-computing-journey-2ajk</guid>
      <description>&lt;p&gt;&lt;em&gt;&lt;strong&gt;Cloud computing&lt;/strong&gt;&lt;/em&gt; is a buzzing &lt;em&gt;word nowadays&lt;/em&gt;. It appeared as early as 1996, with the first known mention in a Compaq internal document (&lt;a href="https://en.wikipedia.org/wiki/Cloud_computing" rel="noopener noreferrer"&gt;per Wiki&lt;/a&gt;). Many companies are joining the cloud computing journey and archived a lot of benefits. &lt;/p&gt;

&lt;p&gt;I have been working on various cloud computing projects from start to finish; involved in the full project lifecycle, including design, planning, development, deployment, testing, maintenance, and support. Some clients prefer to use their on-premise data centers, but most of my projects used the cloud - &lt;a href="https://aws.amazon.com/" rel="noopener noreferrer"&gt;Amazon Web Services&lt;/a&gt;, &lt;a href="https://azure.microsoft.com/en-us/" rel="noopener noreferrer"&gt;Microsoft Azure&lt;/a&gt; and &lt;a href="https://www.heroku.com/" rel="noopener noreferrer"&gt;Heroku&lt;/a&gt;.  So, I wanted to write this post to share my &lt;a href="https://en.wikipedia.org/wiki/Cloud_computing" rel="noopener noreferrer"&gt;cloud computing&lt;/a&gt; journey. My hope is to encourage you to build secure, scalable, highly available and cost-effective cloud applications. &lt;strong&gt;Learn to share and share to learn &lt;/strong&gt;will help us all grow, don't you agree?&lt;/p&gt;

&lt;p&gt;If you are new to the cloud and wanted to explore more information, check out some articles as below:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.bluesilvershift.com/why-are-so-many-businesses-moving-to-the-cloud-2/" rel="noopener noreferrer"&gt;Why are so many businesses are moving to the cloud?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.technologyreview.com/s/425970/who-coined-cloud-computing/" rel="noopener noreferrer"&gt;Who Coined 'Cloud Computing'?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://cloudcomputing521.wordpress.com/2017/05/01/history-of-cloud-computing/" rel="noopener noreferrer"&gt;History of Cloud computing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Check out &lt;a href="https://www.softwaretestinghelp.com/cloud-computing-service-providers/" rel="noopener noreferrer"&gt;15 Top Cloud Computing Services Provider Companies&lt;/a&gt;
&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%2Fblog.innomizetech.com%2Fwp-content%2Fuploads%2F2019%2F11%2FCloud_computing.svg_-1024x928.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%2Fblog.innomizetech.com%2Fwp-content%2Fuploads%2F2019%2F11%2FCloud_computing.svg_-1024x928.png" alt="Cloud Computing" width="800" height="400"&gt;&lt;/a&gt;Cloud Computing from Wiki&lt;/p&gt;

&lt;p&gt;This is a lengthy article. So, if you prefer to simply view a particular topic, you can use the table of contents below.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Who am I?&lt;/li&gt;
&lt;li&gt;Starting my career as a software developer&lt;/li&gt;
&lt;li&gt;The beginning of my cloud computing journey&lt;/li&gt;
&lt;li&gt;My startup journey is just started&lt;/li&gt;
&lt;li&gt;My own company is officially established&lt;/li&gt;
&lt;li&gt;We got the first AWS certification&lt;/li&gt;
&lt;li&gt;A few more serverless projects&lt;/li&gt;
&lt;li&gt;Our most recent cloud computing projects&lt;/li&gt;
&lt;li&gt;Other works&lt;/li&gt;
&lt;li&gt;My future plan&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;Who am I?&lt;/h4&gt;

&lt;p&gt;Firstly, I'd like to introduce myself. My name is &lt;strong&gt;Hoang&lt;/strong&gt;, I am the &lt;strong&gt;Co-founder and CTO &lt;/strong&gt;of &lt;a href="https://www.innomizetech.com/" rel="noopener noreferrer"&gt;InnomizeTech&lt;/a&gt;. My title is &lt;strong&gt;CTO&lt;/strong&gt; but I am a &lt;strong&gt;full-stack developer&lt;/strong&gt; &lt;strong&gt;and software architect&lt;/strong&gt;, passionate about &lt;strong&gt;Cloud Computing&lt;/strong&gt;, &lt;strong&gt;Serverless&lt;/strong&gt;, &lt;strong&gt;DevOps&lt;/strong&gt;, &lt;strong&gt;Machine Learning&lt;/strong&gt;, and &lt;strong&gt;IoT&lt;/strong&gt;.  &lt;/p&gt;

&lt;p&gt;With 7+ years of experience in software development (web, desktop, and mobile), systems integration, Cloud computing, DevOps engineering, project management, and agile methodology, I thrive working both independently and collaboratively in a team, and have strong leadership and communication skills from working directly with both technical and non-technical stakeholders. &lt;/p&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;Starting my career as a software developer&lt;/h4&gt;

&lt;p&gt;Before transitioning to &lt;a href="https://en.wikipedia.org/wiki/Cloud_computing" rel="noopener noreferrer"&gt;Cloud computing&lt;/a&gt;, I worked for an &lt;a href="https://en.wikipedia.org/wiki/Outsourcing" rel="noopener noreferrer"&gt;outsourcing&lt;/a&gt; company in Vietnam for four years after I graduated from University. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;For the first two years&lt;/strong&gt;, the primary programming language I used was &lt;strong&gt;C# (AWS .NET WebForm and AWS .NET MVC)&lt;/strong&gt;. &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;For the next year&lt;/strong&gt;, I transitioned to another role, leading a team working with system integration stuff using &lt;a href="https://wso2.com/" rel="noopener noreferrer"&gt;WSO2&lt;/a&gt; and &lt;a href="https://en.wikipedia.org/wiki/Microsoft_BizTalk_Server" rel="noopener noreferrer"&gt;BizTalk&lt;/a&gt;, among other tools. I had a chance to work with our client's CTO. We had a lot of fun and we did a great job.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;The beginning of my cloud computing journey&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;In the third year&lt;/strong&gt;, I started my first &lt;strong&gt;Cloud computing&lt;/strong&gt; project. We had a project from a US-based client to build an application for activating mobile devices for various carriers. I was the technical lead of that project. After studying the requirements, we selected the following technology stack:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://nodejs.org/en/" rel="noopener noreferrer"&gt;Node.js&lt;/a&gt; for back-end, using the &lt;a href="https://sailsjs.com/" rel="noopener noreferrer"&gt;Sails&lt;/a&gt;&lt;strong&gt;&lt;a href="https://sailsjs.com/" rel="noopener noreferrer"&gt;.&lt;/a&gt;&lt;/strong&gt;&lt;a href="https://sailsjs.com/" rel="noopener noreferrer"&gt;js&lt;/a&gt; framework&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.mysql.com/" rel="noopener noreferrer"&gt;MySQL&lt;/a&gt; database and using &lt;a href="https://sequelize.org/master/manual/getting-started.html" rel="noopener noreferrer"&gt;Sequelize&lt;/a&gt; for ORM. We used &lt;a href="https://www.liquibase.org/" rel="noopener noreferrer"&gt;Liquibase&lt;/a&gt; generate, migrate database schema using source control.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://angular.io/" rel="noopener noreferrer"&gt;Angular&lt;/a&gt; for the front-end application&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Actually, it isn't a real &lt;a href="https://searchcloudcomputing.techtarget.com/definition/cloud-application" rel="noopener noreferrer"&gt;cloud-based application&lt;/a&gt;, since we used only a few cloud services to build the app. We have built the app and used the &lt;strong&gt;&lt;a href="https://aws.amazon.com/elasticbeanstalk/" rel="noopener noreferrer"&gt;Elastic Beanstalk&lt;/a&gt;&lt;/strong&gt; service for hosting. I have studied &lt;a href="https://jenkins.io/" rel="noopener noreferrer"&gt;Jenkins&lt;/a&gt; and built a Jenkins job for analyzing code, building, testing, and deploying to the Elastic Beanstalk app. Here is the diagram of the CI/CD I've built at that time:&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%2Flh6.googleusercontent.com%2FyOk8wjRhW5bKQWktKIM3ntmOZaW7hDoWWKoLHv11XJvapQoNolW9iCzhlaS5hGGEf2ZYp4HOQdt4Aqx1fjzoYoTy_5azOADKqbVmX1fB3G2duqN_gizSvh9KJfTUKy7IfYs2RepbzxGckPE8Bw" 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%2Flh6.googleusercontent.com%2FyOk8wjRhW5bKQWktKIM3ntmOZaW7hDoWWKoLHv11XJvapQoNolW9iCzhlaS5hGGEf2ZYp4HOQdt4Aqx1fjzoYoTy_5azOADKqbVmX1fB3G2duqN_gizSvh9KJfTUKy7IfYs2RepbzxGckPE8Bw" alt="C:UsersHoangDownloadsCI-CD With Jenkins + Docker Cloud (1).png" width="613" height="335"&gt;&lt;/a&gt;CI/CD with Jenkins CI&lt;/p&gt;

&lt;p&gt;We initially hosted the application on &lt;strong&gt;Elastic Beanstalk&lt;/strong&gt; apps in order to apply our CI/CD script using AWS Beanstalk plugin on Jenkins for deployment. However, our client wanted to host it on their data center. Then we still use Beanstalk for our SIT/UAT environments, but we had to write documentation around &lt;strong&gt;10 pages&lt;/strong&gt; to describe how to set up &lt;strong&gt;Web Servers, App Servers&lt;/strong&gt;, &lt;strong&gt;NGINX&lt;/strong&gt;, &lt;strong&gt;Node.js,&lt;/strong&gt; &lt;strong&gt;RDS&lt;/strong&gt;, &lt;strong&gt;etc&lt;/strong&gt;. A lot of back and forth communications between our &lt;strong&gt;development team&lt;/strong&gt; and &lt;strong&gt;infra team&lt;/strong&gt; because of issues and errors. But finally, we have successfully deployed, the app is up and running&lt;strong&gt;.&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;We kept working on that project for around a year. While developing new features, I also learned &lt;a href="https://www.ansible.com/" rel="noopener noreferrer"&gt;Ansible&lt;/a&gt; and built some playbooks to allow my client to deploy the app automatically without manual steps. &lt;/p&gt;

&lt;ul&gt;&lt;li&gt;&lt;a href="https://blog.innomizetech.com/2019/10/24/continuous-deployment%" rel="noopener noreferrer"&gt;Continuous Deployment - Deploying A Node.Js App To AWS EC2 Using Ansible&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;

&lt;p&gt;At that time, I and my co-workers have established a technical club to study and share about cloud computing. We learning cloud computing concepts, doing some hand-on exercises with &lt;strong&gt;AWS&lt;/strong&gt; and &lt;strong&gt;Microsoft Azure&lt;/strong&gt;.  You can visit our &lt;a href="https://www.facebook.com/groups/992679037443304/" rel="noopener noreferrer"&gt;Facebook page&lt;/a&gt; to see our activities and great memories.  &lt;/p&gt;

&lt;p&gt;Before leaving the company, I have studied and shared my CI/CD experiences. I have presented &lt;a href="https://www.slideshare.net/HoangLe84/introduction-to-cicd-190596305" rel="noopener noreferrer"&gt;this presentation&lt;/a&gt; for my promotion to the &lt;strong&gt;Senior Engineer&lt;/strong&gt; position (I have changed a few things to share with everyone).&lt;/p&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;My startup journey is just started&lt;/h4&gt;

&lt;p&gt;In &lt;strong&gt;August 2017&lt;/strong&gt;, I have started my&lt;strong&gt; own job&lt;/strong&gt;. We had a project for building a core/shared backend API for various client applications including &lt;strong&gt;SPA&lt;/strong&gt;, &lt;strong&gt;Mobile App&lt;/strong&gt;,&lt;strong&gt; Integration services&lt;/strong&gt;. After clarifying requirements with our clients, we have selected the below technology stack:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://aws.amazon.com/lambda/" rel="noopener noreferrer"&gt;AWS Lambda&lt;/a&gt; using Node.js runtime and &lt;a href="https://aws.amazon.com/api-gateway/" rel="noopener noreferrer"&gt;Amazon API Gateway&lt;/a&gt; that utilize Auth, Caching, Logging, Monitoring Throttling, Bursting Elastic features for backend services.&lt;/li&gt;
&lt;li&gt;We use the &lt;a href="https://serverless.com/" rel="noopener noreferrer"&gt;Serverless&lt;/a&gt; framework for building API, deploy and configure AWS resources such as S3 bucket, SNS topic, Queue, DynamoDB. At this time, we used &lt;strong&gt;JavaScript&lt;/strong&gt; as the primary programming language. &lt;/li&gt;
&lt;li&gt;
&lt;a href="https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-user-identity-pools.html" rel="noopener noreferrer"&gt;Amazon Cognito User Pool &lt;/a&gt;for authentication and authorization.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://aws.amazon.com/rds/aurora/" rel="noopener noreferrer"&gt;Amazon Aurora&lt;/a&gt; for the relational database. We keep using &lt;a href="https://sequelize.org/master/manual/getting-started.html" rel="noopener noreferrer"&gt;Sequelize&lt;/a&gt; and &lt;a href="https://www.liquibase.org/" rel="noopener noreferrer"&gt;Liquibase&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://aws.amazon.com/elasticache/" rel="noopener noreferrer"&gt;Amazon Elastic Cache (Redis) &lt;/a&gt;for in-memory caching.&lt;/li&gt;
&lt;li&gt;Other AWS services we have used such as VPC, S3, SNS, SQS, CloudWatch, Route53, Certification Manager, AWS System Manager, AWS Parameter Store, X-Ray&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://angular.io/" rel="noopener noreferrer"&gt;Angular&lt;/a&gt; for the frontend app. Static hosting with&lt;a href="https://blog.innomizetech.com/2019/10/25/how-do-we-host-our-static-website/" rel="noopener noreferrer"&gt; S3 and CloudFront&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://jasmine.github.io/" rel="noopener noreferrer"&gt;Jasmine&lt;/a&gt;, &lt;a href="https://www.protractortest.org/#/" rel="noopener noreferrer"&gt;Protractor&lt;/a&gt; for unit test, integration test and E2E test.&lt;/li&gt;
&lt;li&gt;We still use Jenkins for our DevOps server. But instead of defining the job manually on the admin console page, we wrote a Jenkinsfile that using the &lt;a href="https://jenkins.io/doc/tutorials/build-a-multibranch-pipeline-project/https://jenkins.io/doc/tutorials/build-a-multibranch-pipeline-project/" rel="noopener noreferrer"&gt;Mutliplebranch pipeline.&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;And more...&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%2Fi0.wp.com%2Fblog.innomizetech.com%2Fwp-content%2Fuploads%2F2019%2F11%2Fimage-7.png%3Ffit%3D640%252C231%26ssl%3D1" 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%2Fi0.wp.com%2Fblog.innomizetech.com%2Fwp-content%2Fuploads%2F2019%2F11%2Fimage-7.png%3Ffit%3D640%252C231%26ssl%3D1" alt="" width="800" height="400"&gt;&lt;/a&gt;Jenkins Pipeline Execution&lt;/p&gt;

&lt;p&gt;We kept applying the same stack to a few projects for other clients and continuously improve and refactoring our core modules/libraries. We have delivered and received positive feedback from our clients. The applications were running well, lower cost, high availability, secured.&lt;/p&gt;

&lt;p&gt;In relation to &lt;strong&gt;DevOps&lt;/strong&gt;, we have all the stuff scripted and provided CLIs to allow build and deploy applications automatically. We've used &lt;a href="https://aws.amazon.com/cloudformation/" rel="noopener noreferrer"&gt;CloudFormation&lt;/a&gt; to provision and configure infrastructure components such as VPC, RDS. We outlined steps to deploy/remove and send it over to our client, DevOps engineers, they can deploy a new environment using a few commands then remove completely without manually step. &lt;strong&gt;Automation reduces human mistakes and increases productivity and quality.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;My own company is officially established&lt;/h4&gt;

&lt;p&gt;In &lt;strong&gt;October 2018&lt;/strong&gt;, we officially established &lt;a href="https://www.innomizetech.com/" rel="noopener noreferrer"&gt;InnomizeTech&lt;/a&gt;, our mission is to create awesome products that will make your everyday life easier.  &lt;strong&gt;My aim is to build a professional team with passion, enthusiasm, and talent that can help bring more value to our customers, help them moving fast and right direction. &lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;Experienced engineering and development team at &lt;strong&gt;Innomize&lt;/strong&gt; are committed, passionate, and continually challenge themselves on the advancements and changes of the technologies we utilize to deliver the most up-to-date and innovative solutions.&lt;/p&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;We got the first AWS certification&lt;/h4&gt;

&lt;p&gt;I and my team have been learning, building a lot of real-world cloud-based applications for many years. To prove with our clients that we had experiences to do their jobs, we have studied and taken some AWS exams and finally, our team got AWS certifications:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;02 AWS Certified Solution Architecture - Associate&lt;/li&gt;
&lt;li&gt;02 AWS Cloud Practioner&lt;/li&gt;
&lt;li&gt;01 AWS Certified Developer - Associate&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We have been with &lt;a href="https://www.thecoraledge.com/" rel="noopener noreferrer"&gt;The Coral Edge&lt;/a&gt; our partner and primary client. Recently, they officially became the &lt;strong&gt;Select Consulting Partner&lt;/strong&gt; with &lt;strong&gt;AWS&lt;/strong&gt; and we are their Development Team. &lt;/p&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;A few more serverless projects&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Early 2019&lt;/strong&gt;, we had a contract with another client from the US, we will help their development team maintenance and build new features for their micro-services (the integration component for their e-commerce system). They used &lt;a href="https://www.scala-lang.org/" rel="noopener noreferrer"&gt;Scala&lt;/a&gt; as their programming language, &lt;a href="https://gradle.org/" rel="noopener noreferrer"&gt;Gradle&lt;/a&gt; for the build tool, their developer implemented some &lt;a href="https://gradle.org/" rel="noopener noreferrer"&gt;Gradle&lt;/a&gt; tasks to deploy Lambda function, create the API gateway, and other required AWS resources.  Here is the technology stack I can summary:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Each microservice has its own &lt;strong&gt;Lambda&lt;/strong&gt; function and &lt;strong&gt;API Gateway&lt;/strong&gt; as the original design. They had an &lt;a href="https://www.nginx.com/" rel="noopener noreferrer"&gt;NGINX&lt;/a&gt; server as a &lt;a href="https://en.wikipedia.org/wiki/Reverse_proxy" rel="noopener noreferrer"&gt;reserved proxy &lt;/a&gt;server that will route traffic to AWS API gateways based on the request path.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/http4s/http4s" rel="noopener noreferrer"&gt;http4s&lt;/a&gt; as the interfaces for Restful API.&lt;/li&gt;
&lt;li&gt;They used the &lt;strong&gt;Postgres&lt;/strong&gt; database and also using &lt;strong&gt;Liquibase&lt;/strong&gt; to manage their database schema and versioning. They used &lt;a href="https://github.com/tpolecat/doobie" rel="noopener noreferrer"&gt;Doobie&lt;/a&gt; for functional JDBC for Scala.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://sentry.io/welcome/" rel="noopener noreferrer"&gt;Sentry&lt;/a&gt; for error monitoring and reporting.&lt;/li&gt;
&lt;li&gt;They do use &lt;a href="https://aws.amazon.com/codebuild/" rel="noopener noreferrer"&gt;AWS CodeBuild&lt;/a&gt;,  &lt;a href="https://aws.amazon.com/codedeploy/" rel="noopener noreferrer"&gt;AWS CodeDeploy&lt;/a&gt;, and &lt;a href="https://aws.amazon.com/codepipeline/" rel="noopener noreferrer"&gt;AWS CodePipeline&lt;/a&gt; to implement CI/CD but it isn't fully implemented when we join their team.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When our developers working with their team, we have proposed some approaches to enhance and refactor their design:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;To remove their NGINX server and cost, we suggest they apply the &lt;a href="https://www.jeremydaly.com/serverless-microservice-patterns-for-aws/" rel="noopener noreferrer"&gt;Robust API&lt;/a&gt; pattern.&lt;/li&gt;
&lt;li&gt;We helped design and built a &lt;strong&gt;project template&lt;/strong&gt; in order to add a new microservice easily. Here are some of our ideas:&lt;ul&gt;
&lt;li&gt;Defining a project template that uses AWS CodeStart which will allow us creating &lt;strong&gt;CodeCommit&lt;/strong&gt; repository, define &lt;strong&gt;CodeBuild&lt;/strong&gt; projects, &lt;strong&gt;CodePipelines&lt;/strong&gt; automatically when creating a new project. New microservices can be up and running by using a single command.&lt;/li&gt;
&lt;li&gt;We suggest using &lt;a href="https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/what-is-sam.html" rel="noopener noreferrer"&gt;AWS SAM&lt;/a&gt; framework for building Lambda function and defining required AWS resources (i.e. Queue, Bucket, Topic, etc.). Previously, they deployed Lambda and other resources by implementing custom Gradle tasks.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;Our most recent cloud computing projects&lt;/h4&gt;

&lt;p&gt;Recently, we have been working on some projects that apply Micro-service architecture. We continue the above technology stacks with some changes/improvements:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;We used &lt;a href="https://nx.dev/angular" rel="noopener noreferrer"&gt;NX Dev Tool&lt;/a&gt; to define our workspace on a Monorepo. We built our CI/CD pipeline that supports deploy only affected apps by a change instead of redeploying all services. Thanks to the &lt;strong&gt;NX&lt;/strong&gt; team for their idea and awesome tool.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://aws.amazon.com/step-functions/" rel="noopener noreferrer"&gt;Step Functions&lt;/a&gt; for our micro-service communication, automated workflow.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://nestjs.com/" rel="noopener noreferrer"&gt;NestJS&lt;/a&gt; for our Restful API that running on AWS Lambda.&lt;/li&gt;
&lt;li&gt;AWS CDK to provision and configure our infrastructure as code (IoC)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://jestjs.io/" rel="noopener noreferrer"&gt;Jest&lt;/a&gt;, &lt;a href="https://www.cypress.io/" rel="noopener noreferrer"&gt;Cypress&lt;/a&gt; for unit test, integration test, and E2E testing.&lt;/li&gt;
&lt;li&gt;Along with using &lt;a href="https://aws.amazon.com/cognito/" rel="noopener noreferrer"&gt;Cognito&lt;/a&gt; we also using &lt;a href="https://www.okta.com/" rel="noopener noreferrer"&gt;Okta&lt;/a&gt;, &lt;a href="https://auth0.com/" rel="noopener noreferrer"&gt;AuthO&lt;/a&gt; for authentication and authorization.&lt;/li&gt;
&lt;li&gt;CI/CD with &lt;a href="https://aws.amazon.com/products/developer-tools/" rel="noopener noreferrer"&gt;AWS Develop Tools,&lt;/a&gt; &lt;a href="https://jenkins.io/" rel="noopener noreferrer"&gt;Jenkins&lt;/a&gt;, &lt;a href="https://azure.microsoft.com/en-us/services/devops/" rel="noopener noreferrer"&gt;Azure DevOps&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Along with using Node.js runtime, we also using &lt;strong&gt;Java/Scala&lt;/strong&gt;, &lt;strong&gt;.NET Core&lt;/strong&gt; runtime.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;Other works&lt;/h4&gt;

&lt;p&gt;We focused on &lt;strong&gt;AWS&lt;/strong&gt; as the primary cloud vendor and wanted to become an active development service as partnering with them.  Along with cloud computing, our team also has experience in other technologies. We work with the latest technologies specializing in Web Development, Mobile Development, Cloud Computing (AWS, Azure), DevOps, and Automation Testing.  Refer to our &lt;a href="https://www.innomizetech.com/#services" rel="noopener noreferrer"&gt;Services&lt;/a&gt; section on our website for more information.&lt;/p&gt;

&lt;p&gt;We continue working on some other projects such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;DevOps using &lt;a href="https://aws.amazon.com/cloudformation/" rel="noopener noreferrer"&gt;CloudFormation&lt;/a&gt;, &lt;a href="https://docs.aws.amazon.com/cdk/latest/guide/home.html" rel="noopener noreferrer"&gt;AWS CDK&lt;/a&gt;, &lt;a href="https://www.ansible.com/" rel="noopener noreferrer"&gt;Ansible&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://aws-amplify.github.io/" rel="noopener noreferrer"&gt;Amplify&lt;/a&gt; framework: hosting, authentication, Mobile App with AppSync.&lt;/li&gt;
&lt;li&gt;Ruby on Rails app on AWS ECS.&lt;/li&gt;
&lt;li&gt;Headless upload bills to various sites with AWS ECS and Protractor (&lt;a href="https://www.youtube.com/watch?v=OJ4B81630MI&amp;amp;t=29s" rel="noopener noreferrer"&gt;End to end automation test with Protractor&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://blog.innomizetech.com/2019/11/01/building-serverless-web-crawler-with-puppeteer-on-aws-fargate/" rel="noopener noreferrer"&gt;Serverless web crawler with Puppeteer on AWS Fargate&lt;/a&gt; that I recently wrote that post.&lt;/li&gt;
&lt;li&gt;React, Amplify, AppSync.&lt;/li&gt;
&lt;li&gt;Work with other AWS services such as &lt;strong&gt;AWS WAF,&lt;/strong&gt; &lt;strong&gt;AWS Shield&lt;/strong&gt;, &lt;strong&gt;Glue&lt;/strong&gt;, &lt;strong&gt;ElasticSearch&lt;/strong&gt;, &lt;strong&gt;Kenesis&lt;/strong&gt;, &lt;strong&gt;Athena&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;We helped some clients design and define &lt;strong&gt;DevOps&lt;/strong&gt;, CI/CD pipeline using &lt;strong&gt;AWS Developer Tools&lt;/strong&gt;, &lt;strong&gt;Azure DevOps&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;My future plan&lt;/h4&gt;

&lt;p&gt;My quote is &lt;strong&gt;"Learn to share and share to learn"&lt;/strong&gt;, I am continually challenging myself on the advancements and changes of the technologies. I wanted to meet more people, talk, work and help them. I do have a few things in my list to I am going to do:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Build &lt;a href="https://www.innomizetech.com/" rel="noopener noreferrer"&gt;INNOMIZE&lt;/a&gt; stronger, work with more clients and collaborate with more people.&lt;/li&gt;
&lt;li&gt;Learn more things such as Machine Learning, Deep Learning, Transfer Learning, Convolution Neural Network, IoT.&lt;/li&gt;
&lt;li&gt;Build my own product.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I cannot describe anything about myself on this post, if you wanted to know more about me and our team, then you can get in touch with me via:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/hoangleitvn" rel="noopener noreferrer"&gt;Twitter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.linkedin.com/in/hoangleitvn/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/hoangleitvn"&gt;DEV Community&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/hoang-innomizetech" rel="noopener noreferrer"&gt;Github&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/@hoangleitvn" rel="noopener noreferrer"&gt;Medium&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="mailto:hoang@innomizetech.com"&gt;Email&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you are looking for developers, offshore team, or need consulting about the AWS cloud, Serverless architecture, and so on, then &lt;a href="https://innomizetech.com/contact-us/" rel="noopener noreferrer"&gt;hire us&lt;/a&gt;, we can help you!&lt;/p&gt;

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

</description>
      <category>journey</category>
      <category>cloudcomputing</category>
      <category>clouddev</category>
      <category>learning</category>
    </item>
    <item>
      <title>Top reasons why we use AWS CDK over CloudFormation</title>
      <dc:creator>Hoang Le</dc:creator>
      <pubDate>Tue, 12 Nov 2019 02:58:59 +0000</pubDate>
      <link>https://dev.to/hoangleitvn/top-reasons-why-we-use-aws-cdk-over-cloudformation-2b2f</link>
      <guid>https://dev.to/hoangleitvn/top-reasons-why-we-use-aws-cdk-over-cloudformation-2b2f</guid>
      <description>&lt;p&gt;If you're working with &lt;strong&gt;AWS Infrastructure&lt;/strong&gt;, you may know that currently there are some tools/frameworks support to implement your AWS infrastructure such as &lt;a href="https://aws.amazon.com/cloudformation/" rel="noopener noreferrer"&gt;CloudFormation&lt;/a&gt;, &lt;a href="https://www.terraform.io/" rel="noopener noreferrer"&gt;Terraform&lt;/a&gt;, &lt;a href="https://docs.aws.amazon.com/cdk/latest/guide/home.html" rel="noopener noreferrer"&gt;AWS CDK&lt;/a&gt;. What is the best tool that your team can rely on and use? What is the best tool can help you increase productivity and quality? Do you have the answer? If not, read this post, I will give you our answer and reasons.&lt;/p&gt;

&lt;p&gt;Our team has been working with &lt;strong&gt;AWS&lt;/strong&gt; for a couple of years. We have designed and implemented infrastructure components including &lt;strong&gt;networking&lt;/strong&gt;, &lt;strong&gt;server&lt;/strong&gt;, &lt;strong&gt;storage&lt;/strong&gt;, and other AWS services either &lt;strong&gt;manually&lt;/strong&gt; or &lt;strong&gt;automation&lt;/strong&gt;. Before using A&lt;strong&gt;WS CDK&lt;/strong&gt;, we have used &lt;strong&gt;AWS CloudFormation&lt;/strong&gt;, but working with it is a challenge, hard to define and get an overview for a complex template in either &lt;strong&gt;JSON&lt;/strong&gt; or &lt;strong&gt;YAML&lt;/strong&gt; format. &lt;/p&gt;

&lt;p&gt;In this post, I will not provide specific detail of &lt;strong&gt;AWS CDK.&lt;/strong&gt; If you don't know what it is, then check out the &lt;a href="https://docs.aws.amazon.com/cdk/latest/guide/home.html" rel="noopener noreferrer"&gt;AWS CDK home page&lt;/a&gt; to get some overviews and see how it works.&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%2Fi1.wp.com%2Fblog.innomizetech.com%2Fwp-content%2Fuploads%2F2019%2F11%2FScreen-Shot-2019-11-11-at-9.40.30-PM.png%3Ffit%3D640%252C514%26ssl%3D1" 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%2Fi1.wp.com%2Fblog.innomizetech.com%2Fwp-content%2Fuploads%2F2019%2F11%2FScreen-Shot-2019-11-11-at-9.40.30-PM.png%3Ffit%3D640%252C514%26ssl%3D1" alt="AWS CDK sample" width="800" height="400"&gt;&lt;/a&gt;Sample code how to create a VPC on AWS with AWS CDK&lt;/p&gt;

&lt;p&gt;We select AWS CDK as the &lt;strong&gt;primary&lt;/strong&gt; tool for our Infrastructure as Code (IaC) because of the following reasons:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;With AWS CDK we "WRITE LESS AND DO MORE&lt;/strong&gt;"&lt;/p&gt;

&lt;p&gt;We first impressed &lt;strong&gt;AWS CDK&lt;/strong&gt;, when we try to find alternative ways to reduce complexity and overcome challenges of using &lt;strong&gt;CloudFormation&lt;/strong&gt;. For example, we have a CloudFormation template to define and configure networking resources including VPC, subnets, route tables, security groups, bastion hosts, integrate gateway, nat gateways, etc. We need to write around &lt;strong&gt;1000 lines of code&lt;/strong&gt; in JSON format using CloudFormation. When we try with AWS CDK, we only need to write around &lt;strong&gt;50 lines of code&lt;/strong&gt;. As you can see, &lt;strong&gt;AWS CDK can do the same thing, even add more features such as conditional number of NAT gateway, number of subnets and availability zones.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The following code will create all required resources that allow you to create a new VPC on AWS in minutes, you can then modify or add more resources depends on your requirements:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;import * as cdk from '@aws-cdk/core';
import * as ec2 from '@aws-cdk/aws-ec2';

export class NetworkStack extends cdk.Stack {
  public readonly vpc: ec2.Vpc;

  constructor(scope: cdk.Construct, id: string, props?: cdk.StackProps) {
    super(scope, id, props);

    this.vpc = new ec2.Vpc(this, 'VPC', {
      cidr: '10.0.0.0/16',
      natGatewaySubnets: {
        subnetName: 'Public'
      },
      subnetConfiguration: [
        {
          cidrMask: 26,
          name: 'Public',
          subnetType: ec2.SubnetType.PUBLIC
        },
        {
          name: 'Application',
          subnetType: ec2.SubnetType.PRIVATE
        },
        {
          cidrMask: 27,
          name: 'Database',
          subnetType: ec2.SubnetType.ISOLATED
        }
      ]
    });

    const vpcSecurityGroup = new ec2.SecurityGroup(this, 'SecurityGroup', {
      vpc: this.vpc,
      description: 'Allow ssh access to ec2 instances',
      allowAllOutbound: true
    });

    vpcSecurityGroup.addIngressRule(
      ec2.Peer.anyIpv4(),
      ec2.Port.tcp(22),
      'allow ssh access from the world'
    );
  }
}&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;Easy to share and reuse your infrastructure as a library&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Declarative infrastructure as code&lt;/strong&gt; tends to be in languages that we don’t use every day like HCL, YAML, or JSON. AWS CDK uses&lt;strong&gt; object-oriented,&lt;/strong&gt; provides &lt;strong&gt;abstraction&lt;/strong&gt; techniques to create a model of our system, we can define &lt;strong&gt;modules&lt;/strong&gt; to &lt;strong&gt;share across projects&lt;/strong&gt;. We can use built-in construct libraries or from the community that can increase our productivity.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;CDK is a developer-friendly version of Cloud Formation&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;AWS CDK is an &lt;strong&gt;imperative&lt;/strong&gt; programming language, supporting Java, JavaScript, Python, TypeScript and .NET. We can utilize our developer programming skills to reduce the time for learning a new syntax like &lt;strong&gt;Terraform&lt;/strong&gt;. Think about a project that we use TypeScript as the primary programming language for Front-end, Back-end, CI/CD and IoC.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Easy to use logic (if statements, for-loops, etc) when defining your infrastructure&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;We know how to write an if or for-loops, right? How hard is it to write a &lt;strong&gt;condition&lt;/strong&gt; when using CloudFormation? If you know the answer, then you will know why love AWS CDK.&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%2Fi2.wp.com%2Fblog.innomizetech.com%2Fwp-content%2Fuploads%2F2019%2F11%2Fimage-9.png%3Ffit%3D640%252C241%26ssl%3D1" 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%2Fi2.wp.com%2Fblog.innomizetech.com%2Fwp-content%2Fuploads%2F2019%2F11%2Fimage-9.png%3Ffit%3D640%252C241%26ssl%3D1" alt="CDK conditional logic" width="800" height="400"&gt;&lt;/a&gt;Condition logic with AWS CDK&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Easy to get and integrate with our coding review workflow&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;AWS CDK provides commands to generate the &lt;strong&gt;CloudFormation&lt;/strong&gt; template, so we can still review the generated CloudFormation template before applying, it also can generate dif that makes it easy to review and make the decision.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Code completion within your IDE&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Does anyone remember how to define a full detail of an AWS resource using CloudFormation? Is there any &lt;strong&gt;schema&lt;/strong&gt; or &lt;strong&gt;intelligent&lt;/strong&gt; for the CloudFormation template that you can use for &lt;strong&gt;code completion&lt;/strong&gt; to speed up your coding time? &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%2Fi0.wp.com%2Fblog.innomizetech.com%2Fwp-content%2Fuploads%2F2019%2F11%2FScreen-Shot-2019-11-11-at-9.46.41-PM.png%3Ffit%3D640%252C346%26ssl%3D1" 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%2Fi0.wp.com%2Fblog.innomizetech.com%2Fwp-content%2Fuploads%2F2019%2F11%2FScreen-Shot-2019-11-11-at-9.46.41-PM.png%3Ffit%3D640%252C346%26ssl%3D1" alt="CDK code completion" width="800" height="400"&gt;&lt;/a&gt;Code completion with AWS CDK&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Allow us to test our code&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;AWS CDK allowing us to perform snapshot tests, fine-grained assertions, help us build reliable and testable code, &lt;a href="https://aws.amazon.com/blogs/developer/testing-infrastructure-with-the-aws-cloud-development-kit-cdk/" rel="noopener noreferrer"&gt;here is the post&lt;/a&gt; that provides step by step guide to write and run unit tests using &lt;a href="https://jestjs.io/" rel="noopener noreferrer"&gt;Jest&lt;/a&gt;. With CloudFormation, you also can write some tests, but it requires another tool, check out &lt;a href="https://aws.amazon.com/blogs/infrastructure-and-automation/up-your-aws-cloudformation-testing-game-using-taskcat/" rel="noopener noreferrer"&gt;this post&lt;/a&gt; more details.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Easy to integrate with our CI/CD process&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Deployment can be done with one single command requiring installing any additional tool.  We also use AWS CDK to define our CI/CD pipeline using AWS DevOps tools such as CodeBuild, CodeDeploy, which is much better than writing a lot of CloudFormation code.&lt;/p&gt;

&lt;p&gt;The A&lt;strong&gt;WS CDK&lt;/strong&gt; just a high level of &lt;strong&gt;CloudFormation&lt;/strong&gt;, so if you want to how exactly it works, my suggestion is to have a try with &lt;strong&gt;CloudFormation&lt;/strong&gt;, do some works around it, then try to convert it into AWS CDK, you will find out whether you will continue with CloudFormation or change to use AWS, or maybe you can change to other tools such as Terraform. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Nothings is the best, it depends on your requirement, team, project and your company&lt;/strong&gt;.  &lt;strong&gt;Have a nice coding!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This post is originally published on &lt;a href="https://innomizetech.com/blog/top-reasons-why-we-use-aws-cdk-over-cloudformation" rel="noopener noreferrer"&gt;our blog&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Hoang Le&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Learn to Share and Share to Learn.&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>aws</category>
      <category>awscdk</category>
      <category>cloudformation</category>
      <category>devops</category>
    </item>
  </channel>
</rss>
