<?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: nainarmalik</title>
    <description>The latest articles on DEV Community by nainarmalik (@nainarmalik).</description>
    <link>https://dev.to/nainarmalik</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%2F837588%2F21bb48c1-3674-4d7b-a20b-2575ec0de79f.png</url>
      <title>DEV Community: nainarmalik</title>
      <link>https://dev.to/nainarmalik</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/nainarmalik"/>
    <language>en</language>
    <item>
      <title>How I Finally Passed the AWS Certified Solutions Architect – Professional Exam (SAP-C02)</title>
      <dc:creator>nainarmalik</dc:creator>
      <pubDate>Fri, 19 Dec 2025 14:25:14 +0000</pubDate>
      <link>https://dev.to/aws-builders/how-i-finally-passed-the-aws-certified-solutions-architect-professional-exam-sap-c02-2agj</link>
      <guid>https://dev.to/aws-builders/how-i-finally-passed-the-aws-certified-solutions-architect-professional-exam-sap-c02-2agj</guid>
      <description>&lt;p&gt;Hey dev.to community! 👋&lt;/p&gt;

&lt;p&gt;After months of preparation (and a fair bit of stress), I finally passed the AWS Certified Solutions Architect – Professional exam on my first attempt. This certification has a reputation for being one of the toughest in the IT world – often called a "beast" – and I can confirm: it lives up to the hype.&lt;br&gt;
If you're gearing up for the SAP-C02 (the current version as of late 2025), I wanted to share my exact study strategy, resources, and lessons learned. This approach worked for me with real-world AWS experience under my belt, but it focused heavily on deep understanding rather than rote memorization.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why This Certification Matters
&lt;/h2&gt;

&lt;p&gt;The AWS Solutions Architect Professional validates your ability to design complex, distributed systems on AWS – think multi-account strategies, hybrid architectures, migration at scale, cost optimization, security, and resilience. It's not just about knowing services; it's about choosing the right ones for real-world scenarios.&lt;br&gt;
It's challenging because:&lt;/p&gt;

&lt;p&gt;Questions are long, scenario-based, and full of distractors.&lt;br&gt;
You need to weigh trade-offs (cost vs. performance vs. security).&lt;br&gt;
It covers a massive scope, including advanced topics like organizations, multi-region DR, and service integrations.&lt;/p&gt;

&lt;p&gt;But passing it feels incredible – it's a huge confidence booster and a standout on any resume.&lt;/p&gt;

&lt;h2&gt;
  
  
  My Study Resources
&lt;/h2&gt;

&lt;p&gt;I kept it simple and stuck to two high-quality resources that are widely praised in the community:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Stéphane Maarek's Ultimate AWS Certified Solutions Architect Professional Course on Udemy&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;This was my primary resource. Stéphane is an AWS Hero and an excellent instructor – clear, concise, and focused on exam-relevant architectures.&lt;/li&gt;
&lt;li&gt;I watched the entire course once at normal speed to fully understand the topics (services deep-dives, Well-Architected Framework, migration strategies, etc.).&lt;/li&gt;
&lt;li&gt;Then, I rewatched the same videos at 2x speed for reinforcement. This helped solidify concepts without burning out.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Tutorials Dojo Practice Exams (by Jon Bonso)&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;These are gold standard for Professional-level prep. The questions are tough, detailed, and very close to the real exam in style and difficulty.&lt;/li&gt;
&lt;li&gt;I took all the sets in timed mode first, then switched to review mode.&lt;/li&gt;
&lt;li&gt;Crucially: I reviewed every single question, even the ones I got right. I compared my reasoning to the explanations to ensure my logic aligned (or to learn better approaches).&lt;/li&gt;
&lt;li&gt;This process revealed my weak spots (e.g., advanced networking, organizations, or specific service limits), and I went back to Stéphane's course or AWS docs to drill those.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No other resources – no books, no free YouTube scattered videos. Consistency with these two was key.&lt;br&gt;
My Study Timeline&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Total time: About 2-3 months (part-time, alongside work).&lt;/li&gt;
&lt;li&gt;Phase 1: Full course watch + notes.&lt;/li&gt;
&lt;li&gt;Phase 2: 2x speed review.&lt;/li&gt;
&lt;li&gt;Phase 3: Practice exams (multiple rounds) + targeted revision.&lt;/li&gt;
&lt;li&gt;I aimed for 85%+ consistently on Tutorials Dojo before booking the exam.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Pro tip: Hands-on experience is invaluable. If you don't have it from work, build labs (e.g., multi-account setups, migrations) using the AWS Free Tier or Skill Builder labs.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Exam Day Experience
&lt;/h2&gt;

&lt;p&gt;*&lt;em&gt;The exam was a beast.&lt;br&gt;
*&lt;/em&gt;&lt;br&gt;
75 questions, 180 minutes.&lt;br&gt;
Scenarios are wordy – expect paragraphs describing enterprise setups with multiple requirements and constraints.&lt;br&gt;
Many questions have 4-5 viable-sounding options; you have to spot the best one based on nuances.&lt;br&gt;
Time management is critical: I flagged tricky ones and returned later.&lt;br&gt;
I finished with ~20 minutes left for review.&lt;/p&gt;

&lt;p&gt;I walked out unsure (classic AWS exam feeling), but the pass notification came quickly. Score was solid – thanks to the deep review process.&lt;/p&gt;

&lt;h2&gt;
  
  
  Key Tips for Success
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Understand, don't memorize:&lt;/strong&gt; Know why a service is chosen over alternatives.&lt;br&gt;
&lt;strong&gt;Master the distractors:&lt;/strong&gt; AWS loves throwing in plausible but suboptimal options.&lt;br&gt;
&lt;strong&gt;Focus on domains:&lt;/strong&gt; Organizational complexity, resilience, migration, and cost optimization are heavy.&lt;br&gt;
&lt;strong&gt;Read explanations deeply:&lt;/strong&gt; Especially in practice exams – this is where the real learning happens.&lt;br&gt;
&lt;strong&gt;Simulate exam conditions:&lt;/strong&gt; Timed, no distractions.&lt;br&gt;
&lt;strong&gt;Stay calm:&lt;/strong&gt; The exam tests endurance as much as knowledge.&lt;/p&gt;

&lt;p&gt;If you're preparing, you got this! It's tough, but achievable with disciplined prep. Drop a comment if you have questions – happy to help.&lt;br&gt;
Now onto the next one... maybe GenAI Professional? :-)&lt;/p&gt;

</description>
      <category>awscertified</category>
      <category>sapc02</category>
      <category>certification</category>
      <category>aws</category>
    </item>
    <item>
      <title>Building and Sharing an AMI Using AWS Image Builder</title>
      <dc:creator>nainarmalik</dc:creator>
      <pubDate>Fri, 27 Sep 2024 09:38:08 +0000</pubDate>
      <link>https://dev.to/nainarmalik/building-and-sharing-an-ami-using-aws-image-builder-p1e</link>
      <guid>https://dev.to/nainarmalik/building-and-sharing-an-ami-using-aws-image-builder-p1e</guid>
      <description>&lt;p&gt;AWS Image Builder is a powerful tool that helps automate the process of creating and distributing Amazon Machine Images (AMIs) across AWS accounts or regions. In many scenarios, you might want to share an AMI with another AWS account without actually copying it to that account, reducing storage costs and making management easier.&lt;/p&gt;

&lt;p&gt;In this blog post, I will walk you through how I set up an Image Builder pipeline to create a custom Windows Server 2022 AMI. As part of this process, we will install Terraform, the AWS PowerShell Module, and other tools. The key objective is to share the AMI with a target AWS account without copying it. This setup is useful for environments where you need to distribute AMIs for usage across different accounts while keeping centralized control over the image versions.&lt;/p&gt;

&lt;p&gt;By the end of this guide, you’ll understand how to:&lt;/p&gt;

&lt;p&gt;Set up the necessary AWS infrastructure (VPC, Subnets, IAM roles) for the Image Builder process.&lt;br&gt;
Create Image Builder components to install tools like Terraform and AWS PowerShell on a Windows Server 2022 base image.&lt;br&gt;
Build and share the AMI with a target AWS account without copying it, saving storage and simplifying management.&lt;br&gt;
Step 1: Setting Up the AWS Infrastructure&lt;br&gt;
Before creating and distributing an AMI, it’s important to set up the networking and security infrastructure to host the EC2 instance that Image Builder will use to create the AMI.&lt;/p&gt;

&lt;p&gt;1.1 Create a Custom VPC&lt;br&gt;
We start by setting up a custom Virtual Private Cloud (VPC) to provide the networking environment for our resources. This VPC includes a public subnet, an Internet Gateway for internet access, and a route table to direct traffic.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;resource "aws_vpc" "custom_vpc" {
  cidr_block           = "10.0.0.0/16"
  enable_dns_support   = true
  enable_dns_hostnames = true
  tags = { Name = "CustomVPC" }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;1.2 Create a Public Subnet and Internet Gateway&lt;br&gt;
Next, we create a public subnet within the VPC. This subnet will allow the EC2 instances to have public IP addresses for accessing resources like AWS services or the internet. An Internet Gateway and appropriate route table are also created to route traffic.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;resource "aws_subnet" "public_subnet" {
  vpc_id                  = aws_vpc.custom_vpc.id
  cidr_block              = "10.0.1.0/24"
  map_public_ip_on_launch = true
  tags = { Name = "PublicSubnet" }
}

resource "aws_internet_gateway" "custom_igw" {
  vpc_id = aws_vpc.custom_vpc.id
  tags = { Name = "CustomInternetGateway" }
}

resource "aws_route_table" "custom_route_table" {
  vpc_id = aws_vpc.custom_vpc.id
  route {
    cidr_block = "0.0.0.0/0"
    gateway_id = aws_internet_gateway.custom_igw.id
  }
  tags = { Name = "CustomRouteTable" }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;1.3 Create a Security Group&lt;br&gt;
A security group is created to allow inbound and outbound traffic to/from the EC2 instances in the public subnet. Here, all traffic is allowed, but in production, you might want to restrict access to specific ports.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;resource "aws_security_group" "custom_sg" {
  vpc_id      = aws_vpc.custom_vpc.id
  description = "Security group for allowing all inbound and outbound traffic"
  ingress {
    from_port   = 0
    to_port     = 0
    protocol    = "-1"  # All protocols
    self        = true  # Allow traffic from itself
  }
  egress {
    from_port   = 0
    to_port     = 0
    protocol    = "-1"
    cidr_blocks = ["0.0.0.0/0"]
  }
  tags = { Name = "CustomSecurityGroup" }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Step 2: Setting Up the EC2 Instance Profile and IAM Role&lt;br&gt;
To allow the EC2 instances to interact with other AWS services, such as SSM (AWS Systems Manager) and Image Builder, we need an IAM role with appropriate permissions. This role will be associated with an EC2 instance profile.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;resource "aws_iam_role" "custom_ec2_instance_profile_role" {
  name = "EC2InstanceProfileForImageBuilderCustom"
  assume_role_policy = jsonencode({
    Version = "2012-10-17",
    Statement = [
      {
        Effect    = "Allow",
        Principal = { Service = "ec2.amazonaws.com" },
        Action    = "sts:AssumeRole"
      }
    ]
  })
}

resource "aws_iam_role_policy_attachment" "custom_ec2_ssm_policy" {
  role       = aws_iam_role.custom_ec2_instance_profile_role.name
  policy_arn = "arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore"
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This IAM role allows the EC2 instance to interact with the AWS Systems Manager (SSM) for seamless management of the instance during AMI creation.&lt;/p&gt;

&lt;p&gt;Step 3: Creating AWS Image Builder Components&lt;br&gt;
AWS Image Builder allows us to define custom components (scripts and instructions) that will be executed during the AMI creation process. Let’s create two custom components that install Terraform and the AWS PowerShell module.&lt;/p&gt;

&lt;p&gt;3.1 Component to Install Terraform&lt;br&gt;
We can create a component that uses PowerShell to install Terraform during the AMI build process.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;resource "aws_imagebuilder_component" "terraform_powershell_component" {
  name        = "TerraformThroughPowershell"
  version     = "1.0.0"
  platform    = "Windows"
  data = &amp;lt;&amp;lt;EOT
{
  "schemaVersion": "1.0",
  "phases": [
    {
      "name": "build",
      "steps": [
        {
          "name": "InstallTerraform",
          "action": "ExecutePowerShell",
          "inputs": {
            "commands": [
              "Invoke-WebRequest -Uri 'https://releases.hashicorp.com/terraform/1.5.0/terraform_1.5.0_windows_amd64.zip' -OutFile 'C:\\terraform.zip';",
              "Expand-Archive -Path 'C:\\terraform.zip' -DestinationPath 'C:\\terraform';",
              "Move-Item -Path 'C:\\terraform\\terraform.exe' -Destination 'C:\\Windows\\System32\\';",
              "terraform -version;"
            ]
          }
        }
      ]
    }
  ]
}
EOT
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;3.2 Component to Install NuGet and AWS PowerShell&lt;br&gt;
This component installs NuGet and the AWS PowerShell module, allowing the EC2 instance to interact with AWS services.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;resource "aws_imagebuilder_component" "nuget_aws_powershell_component" {
  name        = "NuGetAndAWSPowerShellInstaller"
  version     = "1.0.0"
  platform    = "Windows"
  data = &amp;lt;&amp;lt;EOT
{
  "schemaVersion": "1.0",
  "phases": [
    {
      "name": "build",
      "steps": [
        {
          "name": "InstallNuGetAndAWSPowerShell",
          "action": "ExecutePowerShell",
          "inputs": {
            "commands": [
              "Install-PackageProvider -Name NuGet -Force -Scope CurrentUser;",
              "Install-Module -Name AWSPowerShell -AllowClobber -Force -SkipPublisherCheck;"
            ]
          }
        }
      ]
    }
  ]
}
EOT
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Step 4: Creating an AWS Image Builder Recipe&lt;br&gt;
An Image Builder recipe combines components and parent images to define how an AMI should be built. In this case, we are using Windows Server 2022 as the base image and adding the Terraform and AWS PowerShell components to it.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;resource "aws_imagebuilder_image_recipe" "custom_recipe" {
  name          = "CustomRecipe"
  version       = "1.0.0"
  parent_image  = "arn:aws:imagebuilder:eu-central-1:aws:image/windows-server-2022-english-core-base-x86/x.x.x"

  component {
    component_arn = aws_imagebuilder_component.terraform_powershell_component.arn
  }

  component {
    component_arn = aws_imagebuilder_component.nuget_aws_powershell_component.arn
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Step 5: Sharing the AMI Without Copying It&lt;br&gt;
AWS Image Builder can share the AMI with a target account by setting launch_permission in the distribution configuration. This allows the target account to launch instances using the AMI without copying it.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;resource "aws_imagebuilder_distribution_configuration" "custom_distribution" {
  name = "CustomDistribution"

  distribution {
    region = "eu-central-1"

    ami_distribution_configuration {
      name = "${var.ami_name}-{{ imagebuilder:buildDate }}"

      launch_permission {
        user_ids = [var.target_account_id]
      }
    }
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Step 6: Creating the Image Builder Pipeline&lt;br&gt;
Finally, the Image Builder pipeline is configured to orchestrate the entire AMI build process.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;resource "aws_imagebuilder_image_pipeline" "custom_pipeline" {
  name                               = "CustomPipeline"
  image_recipe_arn                   = aws_imagebuilder_image_recipe.custom_recipe.arn
  infrastructure_configuration_arn   = aws_imagebuilder_infrastructure_configuration.custom_infra_config.arn
  distribution_configuration_arn     = aws_imagebuilder_distribution_configuration.custom_distribution.arn
  status                             = "ENABLED"
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Conclusion&lt;/p&gt;

&lt;p&gt;Using AWS Image Builder, we can easily automate the creation and sharing of AMIs across accounts. In this example, we set up a Windows Server 2022 AMI and installed useful tools like Terraform and the AWS PowerShell module. By configuring launch permissions, the AMI can be shared with other AWS accounts without copying it, reducing storage costs and simplifying management. This setup, combined with Terraform, makes the process repeatable and efficient.&lt;/p&gt;

</description>
      <category>aws</category>
      <category>ec2</category>
      <category>ami</category>
      <category>imagebuilder</category>
    </item>
    <item>
      <title>Restrict Access to AWS Quicksight based on source ip</title>
      <dc:creator>nainarmalik</dc:creator>
      <pubDate>Sun, 11 Feb 2024 19:48:57 +0000</pubDate>
      <link>https://dev.to/nainarmalik/restrict-access-to-aws-quicksight-based-on-source-ip-ed0</link>
      <guid>https://dev.to/nainarmalik/restrict-access-to-aws-quicksight-based-on-source-ip-ed0</guid>
      <description>&lt;p&gt;Amazon &lt;a href="https://aws.amazon.com/quicksight/" rel="noopener noreferrer"&gt;QuickSight&lt;/a&gt; is a fast, cloud-native business intelligence service that makes it easy to create and share interactive dashboards. It offers machine learning insights to all users, connects to many data sources, and has a cost-effective pay-per-session pricing model. QuickSight simplifies data analysis, helping businesses make informed decisions quickly.&lt;/p&gt;

&lt;p&gt;We noticed that the quicksight can be accessed from any device which was surprising to us in the beginning. Here are the steps we followed to restrict the access based on ip of the client.&lt;/p&gt;

&lt;p&gt;To enable IP-based restrictions for the users who has access to QuickSight admin console takes the following steps:&lt;/p&gt;

&lt;p&gt;On the QuickSight console, on the user name menu, choose Manage QuickSight.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.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%2Fjs48ig68wvis2aassixi.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fjs48ig68wvis2aassixi.jpg" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In the navigation pane, choose Security &amp;amp; permissions.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.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%2Fus9pochgoxlh2ga4dtl2.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fus9pochgoxlh2ga4dtl2.jpeg" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Under IP restrictions, choose Manage.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.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%2Foolznvozau5ydovswf8l.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Foolznvozau5ydovswf8l.jpeg" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For IP address, enter the IP address which is to be allowed access in CIDR format.&lt;/p&gt;

&lt;p&gt;Choose Add.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.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%2Flfsz38lu5f6wijsfs1pt.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Flfsz38lu5f6wijsfs1pt.jpeg" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To edit an existing rule, choose the pencil icon next to the rule.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.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%2Ftil187fdp7rwux4qlzlv.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Ftil187fdp7rwux4qlzlv.jpeg" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To delete an existing rule, choose the trash icon next to the rule.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.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%2Fvyfrqufpw6nuqnxc0n52.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fvyfrqufpw6nuqnxc0n52.jpeg" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Make sure to add your own IP address to the list to prevent being locked out yourself.&lt;/p&gt;

&lt;p&gt;After you add, edit or delete IP address rules, choose Save changes.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.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%2Fwmubmbdenm5x0m5bqlap.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fwmubmbdenm5x0m5bqlap.jpeg" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Turn on the rules to start your IP-based restriction.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.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%2Fdepute4uu7x17gef3vp2.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fdepute4uu7x17gef3vp2.jpg" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When the IP restriction is turned on and the list of allowed IP addresses in CIDR format is in place, any authorised user trying to access QuickSight when not logged in to the organizations VPN (regardless of their role of admin, author, or reader) is presented with an error page.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.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%2Fjdibb4699ec1k9d2w5iu.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fjdibb4699ec1k9d2w5iu.jpeg" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>aws</category>
      <category>quicksight</category>
      <category>businessintelligence</category>
      <category>amazonwebservice</category>
    </item>
    <item>
      <title>get IAM users from all AWS accounts (organization)</title>
      <dc:creator>nainarmalik</dc:creator>
      <pubDate>Thu, 16 Feb 2023 12:12:24 +0000</pubDate>
      <link>https://dev.to/nainarmalik/iam-users-from-the-whole-aws-organization-3amn</link>
      <guid>https://dev.to/nainarmalik/iam-users-from-the-whole-aws-organization-3amn</guid>
      <description>&lt;p&gt;Hi,&lt;/p&gt;

&lt;p&gt;IAM (Identity and Access Management) users are a critical component of any organization's security infrastructure. They represent the individuals or entities that have access to an organization's sensitive information, systems, and applications. It is essential to keep an eye on the IAM users of the entire organization for several reasons:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Security&lt;/strong&gt;: IAM users are the gatekeepers of an organization's digital assets. If a hacker gains access to an IAM user account, they can potentially access confidential data, modify or delete important files, and even bring down the entire network. Monitoring IAM users can help identify suspicious activities, such as attempts to access restricted resources or unusual login patterns, allowing security teams to respond quickly and prevent unauthorized access.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Compliance&lt;/strong&gt;: Many regulatory frameworks require organizations to have proper access controls in place and to monitor and audit user activity. Keeping an eye on IAM users can help organizations ensure that they are meeting compliance requirements and avoid costly fines and legal repercussions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;User management&lt;/strong&gt;: Monitoring IAM users can help organizations identify inactive or unnecessary accounts, which can be removed or disabled, reducing the attack surface and improving the overall security posture. Additionally, organizations can use IAM user monitoring to identify users who have too many privileges and limit their access to reduce the risk of internal threats.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Data protection&lt;/strong&gt;: By keeping an eye on IAM users, organizations can ensure that only authorized individuals have access to sensitive data. IAM user monitoring can help identify and alert security teams to any unusual access attempts, which can indicate a potential data breach.&lt;/p&gt;

&lt;p&gt;In summary, keeping an eye on IAM users is critical to maintaining the security, compliance, and overall risk posture of an organization. It allows organizations to proactively identify potential threats and take action to mitigate risks before they can cause significant damage.&lt;/p&gt;

&lt;p&gt;Here is how you can get the list of all IAM users in your organization:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Get all the member accounts.&lt;/li&gt;
&lt;li&gt;Trigger "generate_credential_report" API on all the member accounts by assuming a role on the member accounts.&lt;/li&gt;
&lt;li&gt;Trigger "get_credential_report" API on all the member accounts by assuming a role on the member accounts. &lt;/li&gt;
&lt;li&gt;Consolidate the report.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;P.S: Step 2 and 3 are done separately as I was encountering report not ready exception sometimes.&lt;/p&gt;

&lt;p&gt;If you're looking for further help, here is a snippet you can modify according to your need.&lt;/p&gt;

&lt;p&gt;`&lt;br&gt;
import json&lt;br&gt;
import boto3&lt;br&gt;
import io&lt;br&gt;
import csv&lt;/p&gt;

&lt;p&gt;from datetime import datetime&lt;/p&gt;

&lt;p&gt;def lambda_handler(event, context):&lt;br&gt;
    organizations_client = boto3.client('organizations')&lt;br&gt;
    sts_client = boto3.client('sts')&lt;br&gt;
    iam_client = boto3.client('iam')&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;#1. Get all the member accounts
marker=None
paginator = organizations_client.get_paginator('list_accounts')
page_iterator = paginator.paginate(PaginationConfig={
 'MaxItems': 200,
 'PageSize': 10,
    'StartingToken':marker
})
active_accounts=[]  
f = open("/tmp/all_users.csv", "w+")
temp_csv_file = csv.writer(f, escapechar=' ', quoting=csv.QUOTE_NONE)

#2.Filter for only active accounts
for page in page_iterator:        
    for account in page['Accounts']:
        if account['Status']=='ACTIVE':
            account=str(account['Id'])
            active_accounts.append(account)

current_account = sts_client.get_caller_identity()['Account']
consolidated_data=''

#3.Generate Credentials Report
for account in active_accounts:
    if account !=current_account:
        ROLE_ARN=f'arn:aws:iam::{account}:role/OrganizationAccountAccessRole'
        sts_response = sts_client.assume_role(RoleArn=ROLE_ARN, RoleSessionName=account)
        assumed_client=boto3.client('iam',aws_access_key_id=sts_response["Credentials"]["AccessKeyId"],aws_secret_access_key=sts_response["Credentials"]["SecretAccessKey"],aws_session_token=sts_response["Credentials"]["SessionToken"])
        assumed_client.generate_credential_report()
    else:
        response = iam_client.generate_credential_report()

#4.Generate Credentials Report &amp;amp; consolidate
for account in active_accounts:
    if account !=current_account:
        ROLE_ARN=f'arn:aws:iam::{account}:role/OrganizationAccountAccessRole'
        sts_response = sts_client.assume_role(RoleArn=ROLE_ARN, RoleSessionName=account)
        assumed_client=boto3.client('iam',aws_access_key_id=sts_response["Credentials"]["AccessKeyId"],aws_secret_access_key=sts_response["Credentials"]["SecretAccessKey"],aws_session_token=sts_response["Credentials"]["SessionToken"])
        response = assumed_client.get_credential_report()
        user_data=response['Content']
        user_data_decoded=user_data.decode('utf-8')
        consolidated_data=consolidated_data+user_data_decoded
    else:
        response = iam_client.get_credential_report()
        user_data=response['Content']
        user_data_decoded=user_data.decode('utf-8')
        consolidated_data=consolidated_data+user_data_decoded

temp_csv_file.writerow([consolidated_data])
f.close()
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;`&lt;/p&gt;

</description>
      <category>vibecoding</category>
    </item>
    <item>
      <title>DynamoDB get all records</title>
      <dc:creator>nainarmalik</dc:creator>
      <pubDate>Tue, 19 Jul 2022 13:13:30 +0000</pubDate>
      <link>https://dev.to/nainarmalik/dynamodb-get-all-records-11i6</link>
      <guid>https://dev.to/nainarmalik/dynamodb-get-all-records-11i6</guid>
      <description>&lt;p&gt;Hey,&lt;/p&gt;

&lt;p&gt;Here is a quick hands-on of retrieving all rows from a dynamodb table.&lt;/p&gt;

&lt;p&gt;`&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&lt;/code&gt;`&lt;br&gt;
from pprint import pprint&lt;br&gt;
from time import sleep&lt;br&gt;
import boto3&lt;br&gt;
from botocore.exceptions import ClientError&lt;/p&gt;

&lt;p&gt;def get_data(dynamodb=None):&lt;br&gt;
    if not dynamodb:&lt;br&gt;
        dynamodb = boto3.resource('dynamodb',region_name='YOUR_REGION')&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;table = dynamodb.Table('YOUR_TABLE_NAME')

try:
    response = table.scan()
    data = response['Items']

    while 'LastEvaluatedKey' in response:
        response = table.scan(ExclusiveStartKey=response['LastEvaluatedKey'])
        data.extend(response['Items'])

except ClientError as e:
    print(e.response['Error']['Message'])
else:
    return response
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;if &lt;strong&gt;name&lt;/strong&gt; == '&lt;strong&gt;main&lt;/strong&gt;':&lt;br&gt;
    data = get_data()&lt;br&gt;
    if data:&lt;br&gt;
        pprint(data, sort_dicts=False)&lt;br&gt;
`&lt;code&gt;&lt;/code&gt;&lt;br&gt;
`&lt;/p&gt;

&lt;p&gt;P.S:&lt;br&gt;
1.You need to configure the aws credentials.&lt;br&gt;
2.Replace YOUR_REGION with the region name where the dynamodb table is located.&lt;br&gt;
3.Replace YOUR_TABLE_NAME with the actual name of the dynamodb table.&lt;/p&gt;

&lt;p&gt;Feel free to ask if you have any clarifications.&lt;/p&gt;

</description>
      <category>aws</category>
      <category>dynamodb</category>
      <category>boto3</category>
      <category>python</category>
    </item>
    <item>
      <title>S3 Cross account Replication with KMS</title>
      <dc:creator>nainarmalik</dc:creator>
      <pubDate>Thu, 07 Jul 2022 14:28:22 +0000</pubDate>
      <link>https://dev.to/nainarmalik/s3-cross-account-replication-with-kms-359k</link>
      <guid>https://dev.to/nainarmalik/s3-cross-account-replication-with-kms-359k</guid>
      <description>&lt;p&gt;This post describes how can we replicate objects to a bucket owned by a different AWS account? What if the objects are encrypted? &lt;/p&gt;

&lt;p&gt;This article discusses a method to configure replication for S3 objects from a bucket in one AWS account to a bucket in another AWS account, using server-side encryption using Key Management Service (KMS).&lt;br&gt;
*&lt;em&gt;Setup Requirements *&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;Two AWS accounts:&lt;/strong&gt;&lt;/em&gt; We need two AWS accounts with their account IDs.  &lt;/p&gt;

&lt;p&gt;&lt;em&gt;Source and destination buckets:&lt;/em&gt; We need an S3 bucket in the source account where the objects are created/uploaded and an S3 bucket in the destination account to store the replicated objects.  &lt;/p&gt;

&lt;p&gt;&lt;em&gt;Source and destination KMS keys:&lt;/em&gt; We need KMS keys created in both source and destination accounts.  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Some of the requirements for configuring replication are: &lt;/li&gt;
&lt;li&gt;Both source and destination buckets must have versioning enabled. &lt;/li&gt;
&lt;li&gt;S3 service must be allowed permissions to replicate objects from the source bucket to the destination bucket on your behalf. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Let’s refer to the source AWS account as account A and the destination AWS account as account B. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.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%2Frnm71gtynezrbfl4pvfz.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Frnm71gtynezrbfl4pvfz.jpeg" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Configuration needed on account A:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1.&lt;/strong&gt; Create AssumeRole and allow S3 service &lt;/p&gt;

&lt;p&gt;&lt;code&gt;{ &lt;br&gt;
   "Version": "2012-10-17", &lt;br&gt;
   "Statement": [ &lt;br&gt;
     { &lt;br&gt;
       "Action": "sts:AssumeRole", &lt;br&gt;
       "Principal": { &lt;br&gt;
         "Service": "s3.amazonaws.com" &lt;br&gt;
       }, &lt;br&gt;
       "Effect": "Allow", &lt;br&gt;
       "Sid": "VisualEditor0" &lt;br&gt;
     } &lt;br&gt;
   ] &lt;br&gt;
 }&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2.&lt;/strong&gt;&lt;br&gt;
Create IAM policy allowing KMS keys to encrypt and decrypt&lt;/p&gt;

&lt;p&gt;&lt;code&gt;{ &lt;br&gt;
   "Version": "2012-10-17", &lt;br&gt;
   "Statement": [ &lt;br&gt;
     { &lt;br&gt;
       "Action": [ &lt;br&gt;
         "s3:ListBucket", &lt;br&gt;
         "s3:GetReplicationConfiguration", &lt;br&gt;
         "s3:GetObjectVersionForReplication", &lt;br&gt;
         "s3:GetObjectVersionAcl", &lt;br&gt;
         "s3:GetObjectVersionTagging", &lt;br&gt;
         "s3:GetObjectVersion", &lt;br&gt;
         "s3:ObjectOwnerOverrideToBucketOwner" &lt;br&gt;
       ], &lt;br&gt;
       "Effect": "Allow", &lt;br&gt;
       "Resource": [ &lt;br&gt;
         "&amp;lt;accountA-S3-Bucket-ARN&amp;gt;", &lt;br&gt;
         "&amp;lt;accountA-S3-Bucket-ARN&amp;gt;/*" &lt;br&gt;
       ] &lt;br&gt;
     }, &lt;br&gt;
     { &lt;br&gt;
       "Action": [ &lt;br&gt;
         "s3:ReplicateObject", &lt;br&gt;
         "s3:ReplicateDelete", &lt;br&gt;
         "s3:ReplicateTags", &lt;br&gt;
         "s3:GetObjectVersionTagging", &lt;br&gt;
         "s3:ObjectOwnerOverrideToBucketOwner" &lt;br&gt;
       ], &lt;br&gt;
       "Effect": "Allow", &lt;br&gt;
       "Resource": "&amp;lt;accountB-S3-Bucket-ARN&amp;gt;/*" &lt;br&gt;
     }, &lt;br&gt;
     { &lt;br&gt;
       "Action": [ &lt;br&gt;
         "kms:Decrypt" &lt;br&gt;
       ], &lt;br&gt;
       "Effect": "Allow", &lt;br&gt;
       "Resource": "&amp;lt;accountA-KMS-Key-ARN&amp;gt;" &lt;br&gt;
     }, &lt;br&gt;
     { &lt;br&gt;
       "Action": [ &lt;br&gt;
         "kms:Encrypt" &lt;br&gt;
       ], &lt;br&gt;
       "Effect": "Allow", &lt;br&gt;
       "Resource": "&amp;lt;accountB-KMS-Key-ARN&amp;gt;" &lt;br&gt;
     } &lt;br&gt;
   ] &lt;br&gt;
 }&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3.&lt;/strong&gt;&lt;br&gt;
Set up replication configuration on S3 bucket and add replication rule through AWS console UI or IAC.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Configuration needed on account B:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Configure KMS key policy to allow S3 service to encrypt data in accountB bucket during replication &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;code&gt;{ &lt;br&gt;
   "Version": "2012-10-17", &lt;br&gt;
   "Statement": [ &lt;br&gt;
     { &lt;br&gt;
       "Sid": "VisualEditor0", &lt;br&gt;
       "Effect": "Allow", &lt;br&gt;
       "Principal": { &lt;br&gt;
         "AWS": [ &lt;br&gt;
           "&amp;lt;accountA-IAM-Role-ARN&amp;gt;" &lt;br&gt;
         ] &lt;br&gt;
       }, &lt;br&gt;
       "Action": [ &lt;br&gt;
         "kms:Encrypt", &lt;br&gt;
         "kms:ReEncrypt*", &lt;br&gt;
         "kms:GenerateDataKey*", &lt;br&gt;
         "kms:DescribeKey" &lt;br&gt;
       ], &lt;br&gt;
       "Resource": [ &lt;br&gt;
         "*" &lt;br&gt;
       ] &lt;br&gt;
     }, &lt;br&gt;
     { &lt;br&gt;
       "Effect": "Allow", &lt;br&gt;
       "Principal": { &lt;br&gt;
         "AWS": [ &lt;br&gt;
           "arn:aws:iam::&amp;lt;accountB-AWS-AccountID&amp;gt;:root" &lt;br&gt;
         ] &lt;br&gt;
       }, &lt;br&gt;
       "Action": [ &lt;br&gt;
         "kms:*" &lt;br&gt;
       ], &lt;br&gt;
       "Resource": [ &lt;br&gt;
         "*" &lt;br&gt;
       ] &lt;br&gt;
     } &lt;br&gt;
   ] &lt;br&gt;
 }&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2.&lt;/strong&gt;Configure S3 bucket policy to grant accountA permissions to perform replication actions&lt;/p&gt;

&lt;p&gt;&lt;code&gt;{ &lt;br&gt;
   "Version": "2012-10-17", &lt;br&gt;
   "Statement": [ &lt;br&gt;
     { &lt;br&gt;
       "Sid": "VisualEditor0", &lt;br&gt;
       "Effect": "Allow", &lt;br&gt;
       "Principal": { &lt;br&gt;
         "AWS": [ &lt;br&gt;
           "arn:aws:iam::&amp;lt;accountA-AWS-AccountID&amp;gt;:root" &lt;br&gt;
         ] &lt;br&gt;
       }, &lt;br&gt;
       "Action": [ &lt;br&gt;
         "s3:GetBucketVersioning", &lt;br&gt;
         "s3:PutBucketVersioning", &lt;br&gt;
         "s3:ReplicateObject", &lt;br&gt;
         "s3:ObjectOwnerOverrideToBucketOwner" &lt;br&gt;
       ], &lt;br&gt;
       "Resource": [ &lt;br&gt;
         "&amp;lt;accountB-S3-Bucket-ARN&amp;gt;", &lt;br&gt;
         "&amp;lt;accountB-S3-Bucket-ARN&amp;gt;/*" &lt;br&gt;
       ] &lt;br&gt;
     } &lt;br&gt;
   ] &lt;br&gt;
 }&lt;/code&gt; &lt;/p&gt;

&lt;p&gt;This way, the objects can be replicated across different accounts.&lt;/p&gt;

</description>
      <category>aws</category>
      <category>s3</category>
      <category>crossaccount</category>
      <category>s3replication</category>
    </item>
    <item>
      <title>Getting started with Lambda</title>
      <dc:creator>nainarmalik</dc:creator>
      <pubDate>Mon, 09 May 2022 09:18:58 +0000</pubDate>
      <link>https://dev.to/nainarmalik/getting-started-with-lambda-362l</link>
      <guid>https://dev.to/nainarmalik/getting-started-with-lambda-362l</guid>
      <description>&lt;p&gt;Hi Everyone,&lt;/p&gt;

&lt;p&gt;Recently I came across this beginner friendly course on boto3 and lambda.&lt;/p&gt;

&lt;p&gt;You would be able to create lambda functions, create triggers and become a serverless pro. There are so many courses out there on multiple platform. I found this course economical and beginner friendly on udemy.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.udemy.com/share/101Vx03@xfFx_n_sa1T4Df_M9C4cCG_wAGrE2VhvTX9LcaefejVXI5igtWwB3X-rlFQNbzWq/"&gt;https://www.udemy.com/share/101Vx03@xfFx_n_sa1T4Df_M9C4cCG_wAGrE2VhvTX9LcaefejVXI5igtWwB3X-rlFQNbzWq/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;P.S: Always bookmark / wishlist your course on udemy and buy it when there is a great discount. You could buy the same course at 1/10th of its price. &lt;/p&gt;

&lt;p&gt;If you have any other recommendations related to serverless courses please do post on the comment.&lt;/p&gt;

&lt;p&gt;Catch you all soon on the next post.&lt;/p&gt;

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

</description>
      <category>serverless</category>
      <category>aws</category>
      <category>lambda</category>
      <category>boto3</category>
    </item>
  </channel>
</rss>
