<?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>Forem: Nandini Rajaram</title>
    <description>The latest articles on Forem by Nandini Rajaram (@nandinirajaram).</description>
    <link>https://forem.com/nandinirajaram</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%2F918884%2F2b3cac80-50d8-401c-8840-9bd14986626f.jpeg</url>
      <title>Forem: Nandini Rajaram</title>
      <link>https://forem.com/nandinirajaram</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/nandinirajaram"/>
    <language>en</language>
    <item>
      <title>Deploy Snake and Ladder Game on Amazon ECS</title>
      <dc:creator>Nandini Rajaram</dc:creator>
      <pubDate>Mon, 05 Jan 2026 07:26:02 +0000</pubDate>
      <link>https://forem.com/aws-builders/deploy-snake-and-ladder-game-on-amazon-ecs-5h5o</link>
      <guid>https://forem.com/aws-builders/deploy-snake-and-ladder-game-on-amazon-ecs-5h5o</guid>
      <description>&lt;p&gt;Now that our Snake and Ladder Docker image is available in Amazon ECR, the next step is to deploy it using Amazon ECS Express.&lt;br&gt;
ECS Express is the fastest way to run containerized applications on AWS without manually creating clusters, task definitions, or services.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is ECS Express?
&lt;/h2&gt;

&lt;p&gt;ECS Express is a simplified deployment option in Amazon ECS that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Automatically creates the ECS cluster&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Creates the task definition&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Sets up the service&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Deploys your container using AWS Fargate&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Deploying a Snake &amp;amp; Ladder Game on Amazon ECS using AWS Fargate
&lt;/h2&gt;

&lt;p&gt;Managing servers can quickly become overwhelming—even for simple applications. In this blog, we’ll deploy a Snake &amp;amp; Ladder game on Amazon ECS using AWS Fargate, where AWS handles the infrastructure while we focus on the application.&lt;/p&gt;

&lt;h2&gt;
  
  
  Create an ECS Cluster
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Open Amazon ECS Console&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Click Clusters → Create cluster&lt;/p&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fiszm34rpdtfsiadpybjq.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%2Fiszm34rpdtfsiadpybjq.png" alt=" " width="800" height="194"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Choose:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Cluster name: snake-ladder-cluster&lt;/p&gt;

&lt;p&gt;Infrastructure: AWS Fargate&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Click Create&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Fargate removes the need to manage EC2 instances—AWS takes care of scaling and capacity.&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%2Fh7ekrzfqyqq4fbeex80a.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%2Fh7ekrzfqyqq4fbeex80a.png" alt=" " width="800" height="281"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Create a Task Definition
&lt;/h2&gt;

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

&lt;p&gt;A task definition is a blueprint for running containers in ECS.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Task basics&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Family: snake-ladder-task&lt;/p&gt;

&lt;p&gt;Launch type: AWS Fargate&lt;/p&gt;

&lt;p&gt;Compute configuration&lt;/p&gt;

&lt;p&gt;CPU: 0.25 vCPU&lt;/p&gt;

&lt;p&gt;Memory: 0.5 GB or 1 GB&lt;/p&gt;

&lt;p&gt;These values are perfect for a lightweight game app.&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%2F6drii46amv4irqtc2wem.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%2F6drii46amv4irqtc2wem.png" alt=" " width="800" height="384"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Do We Need a Task Role?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When creating the ECS task definition, you might notice that we did not select a Task Role.&lt;/p&gt;

&lt;p&gt;This is intentional.&lt;/p&gt;

&lt;p&gt;The Task Role is required only when the application running inside the container needs to access AWS services such as:&lt;/p&gt;

&lt;p&gt;Amazon S3, DynamoDB, SQS, Secrets Manager, Parameter Store&lt;/p&gt;

&lt;p&gt;Our Snake &amp;amp; Ladder game is a standalone web application and does not interact with any AWS services. Therefore, assigning a task role is unnecessary.&lt;/p&gt;

&lt;p&gt;However, we did assign a &lt;strong&gt;Task Execution Role&lt;/strong&gt; , which allows ECS to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Pull the Docker image from Amazon ECR&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Push container logs to Amazon CloudWatch&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Selecting “Create default role” lets ECS automatically create the required Task Execution Role for you.&lt;/p&gt;

&lt;p&gt;When enabled, AWS:&lt;/p&gt;

&lt;p&gt;Creates the ecsTaskExecutionRole&lt;/p&gt;

&lt;p&gt;Attaches AmazonECSTaskExecutionRolePolicy&lt;/p&gt;

&lt;p&gt;Configures the trust relationship for ECS&lt;/p&gt;

&lt;p&gt;👉 No manual IAM setup required.&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%2F6guvrl7kkox6wfzsy3ls.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%2F6guvrl7kkox6wfzsy3ls.png" alt=" " width="800" height="258"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Container configuration
&lt;/h2&gt;

&lt;p&gt;Container name: snakeAndladder&lt;/p&gt;

&lt;p&gt;Image URI:&lt;/p&gt;

&lt;p&gt;.dkr.ecr..amazonaws.com/snake-ladder-game:latest&lt;/p&gt;

&lt;p&gt;Port mapping:&lt;/p&gt;

&lt;p&gt;Container port: 80(or your app’s port)&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%2F1ncburkfwt0zx18q2ler.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%2F1ncburkfwt0zx18q2ler.png" alt=" " width="800" height="404"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For Logging, Keep the default values&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%2Fnguihgdm047emtdd7ovc.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%2Fnguihgdm047emtdd7ovc.png" alt=" " width="800" height="259"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Click Create button to create the Task Definition&lt;/p&gt;

&lt;h2&gt;
  
  
  Create ECS Service (Fargate)
&lt;/h2&gt;

&lt;p&gt;Now we connect everything together.&lt;/p&gt;

&lt;p&gt;Open ECS → Clusters → snake-ladder-cluster&lt;/p&gt;

&lt;p&gt;Click Create service&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%2Fmh895i33w9pjpnh5mh2u.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%2Fmh895i33w9pjpnh5mh2u.png" alt=" " width="800" height="292"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Service settings&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Task definition: Choose the Task definition created in the above step&lt;/p&gt;

&lt;p&gt;Service name: snake-ladder-service&lt;/p&gt;

&lt;p&gt;Desired tasks: 1&lt;br&gt;
Leave the rest to default values&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%2Fnrzb4cc34q5mm838bxjl.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%2Fnrzb4cc34q5mm838bxjl.png" alt=" " width="800" height="231"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can use a Load Balancer if needed, Here I am proceeding without a Load Balancer as  I have only 1 desired task&lt;/p&gt;

&lt;p&gt;Click Create service 🚀&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%2Fz4fq3kez1yrxbprsy7qo.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%2Fz4fq3kez1yrxbprsy7qo.png" alt=" " width="800" height="163"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Wait for task deployment to complete, Navigate to Task Tab, You should be able to see the task &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%2Fvap5l3422g378fvlhbmg.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%2Fvap5l3422g378fvlhbmg.png" alt=" " width="800" height="184"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once the Task is opened,  Go to networking tab and click on the public IP to  open the application&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%2Fi4r2oqqrdloqbwlqolc6.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%2Fi4r2oqqrdloqbwlqolc6.png" alt=" " width="800" height="266"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Access the Snake &amp;amp; Ladder Game 🎉
&lt;/h2&gt;

&lt;p&gt;🎮 Your Snake &amp;amp; Ladder game is now live on AWS!&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%2F0wh2230i9kglvt7mwzhn.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%2F0wh2230i9kglvt7mwzhn.png" alt=" " width="800" height="415"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>productivity</category>
      <category>containers</category>
      <category>aws</category>
    </item>
    <item>
      <title>Pushing Snake and Ladder Docker Image to Container Registry</title>
      <dc:creator>Nandini Rajaram</dc:creator>
      <pubDate>Sat, 03 Jan 2026 18:40:22 +0000</pubDate>
      <link>https://forem.com/aws-builders/pushing-snake-and-ladder-docker-image-to-container-registry-305m</link>
      <guid>https://forem.com/aws-builders/pushing-snake-and-ladder-docker-image-to-container-registry-305m</guid>
      <description>&lt;p&gt;So far, we have successfully Dockerized the Snake and Ladder game and verified that it runs perfectly on our local machine. That’s a great first milestone.&lt;/p&gt;

&lt;p&gt;But running a Docker image only on one machine isn’t enough.&lt;/p&gt;

&lt;p&gt;In real-world applications, we need a place where our Docker images can be stored, shared, and reused—so they can be pulled by servers, cloud services, or container platforms like ECS and Kubernetes.&lt;/p&gt;

&lt;p&gt;In this next step, we will push our Docker image to a container registry, making it accessible beyond our local system. We’ll also understand the two most commonly used Docker repositories:&lt;/p&gt;

&lt;p&gt;Docker Hub – for public and learning use cases&lt;/p&gt;

&lt;p&gt;Amazon ECR (Elastic Container Registry) – for secure, production-ready AWS deployments&lt;/p&gt;

&lt;h2&gt;
  
  
  What Is Docker Hub?
&lt;/h2&gt;

&lt;p&gt;Docker Hub is a cloud-based repository where you can store, share, and download Docker images.&lt;/p&gt;

&lt;p&gt;Think of Docker Hub as GitHub for Docker images.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Docker Hub Does?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Stores Docker images online&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Lets you push your images&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Lets others pull and use them&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Hosts thousands of pre-built images like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;nginx, mysql, node, python&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;🔹 Key Features&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Public and private repositories&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Easy to use for beginners&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Free public image hosting&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Widely used for learning and open-source projects&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Creating a Repository in Docker Hub
&lt;/h2&gt;

&lt;p&gt;First, We need to create a Repository to DockerHub. If you already have an account in Dockerhub. You can simply Sign In else do a Sign Up&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%2Fqkpg6fovccfcf57hbyse.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%2Fqkpg6fovccfcf57hbyse.png" alt=" " width="800" height="275"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I am Signing In, and Next step is to create a repository&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%2Fc0i7gvq0kkjobg73xehk.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%2Fc0i7gvq0kkjobg73xehk.png" alt=" " width="800" height="173"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Click Create Repository button, Provide a name and a short description and &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%2Furn4vf7vqz4k09451eqq.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%2Furn4vf7vqz4k09451eqq.png" alt=" " width="800" height="335"&gt;&lt;/a&gt;&lt;br&gt;
Click Create button. Remember, we have chosen a public repository&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%2Frqd07nxdxakk5798azh7.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%2Frqd07nxdxakk5798azh7.png" alt=" " width="800" height="272"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We have successfully created a repository in Docker Hub&lt;/p&gt;

&lt;h2&gt;
  
  
  Push the Snake and Ladder Docker Image to Repository in Docker Hub
&lt;/h2&gt;

&lt;p&gt;Lets come back to ec2 console,&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%2Fe38l7uzsxbklxsdit6uq.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%2Fe38l7uzsxbklxsdit6uq.png" alt=" " width="797" height="264"&gt;&lt;/a&gt;&lt;br&gt;
Come back to your EC2 instance and connect to it using EC2 Instance Connect.&lt;br&gt;
Type &lt;code&gt;docker images&lt;/code&gt; command to see the available images.&lt;br&gt;
Now Authenticate Docker with Docker Hub using the EC2 command line.&lt;br&gt;
Run the following command:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;docker login&lt;/code&gt;&lt;br&gt;
When prompted, enter your Docker Hub username and password.&lt;/p&gt;

&lt;p&gt;After a successful login, you will see a confirmation message indicating that Docker is now authenticated with Docker Hub.&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%2Fxvuj405x8lslnsz9wx09.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%2Fxvuj405x8lslnsz9wx09.png" alt=" " width="800" height="230"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now, let’s tag the Snake and Ladder Docker image so it can be pushed to Docker Hub.&lt;/p&gt;

&lt;p&gt;Docker Hub requires images to follow a specific naming format:&lt;br&gt;
&lt;code&gt;docker-username/repository-name:tag&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;In our case, we will tag the image as:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;nandinivijayr/snake-ladder-game:latest&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Run the following command:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;docker image tag snake-ladder-game:latest nandinivijayr/snake-ladder-game:latest&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;By tagging the image in this format, Docker knows which Docker Hub repository the image belongs to, making it ready to be pushed to Docker Hub in the next step.&lt;br&gt;
Now lets verify if the image is tagged properly by using &lt;code&gt;Docker images&lt;/code&gt; command&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%2F8nez0r0sk7yab0dj25gn.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%2F8nez0r0sk7yab0dj25gn.png" alt=" " width="800" height="83"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now lets push the image to Docker hub using the below command&lt;br&gt;
&lt;code&gt;docker push nandinivijayr/snake-ladder-game&lt;/code&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%2F8okporvc2gut38rjzl7y.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%2F8okporvc2gut38rjzl7y.png" alt=" " width="800" height="355"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;h2&gt;
  
  
  Push the Docker Image to Amazon ECR
&lt;/h2&gt;

&lt;p&gt;Amazon ECR (Elastic Container Registry) is a fully managed container image registry service provided by AWS. It is used to store, manage, and secure Docker container images so they can be easily deployed on AWS services like ECS, EKS, and Fargate.&lt;/p&gt;

&lt;p&gt;In simple terms:&lt;br&gt;
👉 ECR is AWS’s private Docker image repository.&lt;br&gt;
&lt;strong&gt;Why Do We Need ECR?&lt;/strong&gt;&lt;br&gt;
When applications are containerized using Docker, the images need a secure place to live so cloud services can pull and run them. Amazon ECR provides that storage inside AWS, with built-in security and scalability.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key Features of Amazon ECR&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Secure by Default&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Repositories are private by default&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Access is controlled using IAM roles and policies&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;No usernames or passwords required&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Deep AWS Integration&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Works seamlessly with: Amazon ECS, Amazon EKS, AWS Fargate&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Images can be pulled directly by AWS services&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Fully Managed&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;No servers to manage&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Automatically scales&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Highly available and reliable&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Image Management&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Version images using tags&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Scan images for vulnerabilities&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Store multiple versions safely&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Now, Lets see how we can push image to ECR&lt;/p&gt;

&lt;h2&gt;
  
  
  Create an ECR Repository
&lt;/h2&gt;

&lt;p&gt;Go to home page of aws console and Navigate to the  ECR service&lt;/p&gt;

&lt;p&gt;Create a private ECR repository using AWS Console by clicking  Create Repository button&lt;/p&gt;

&lt;p&gt;Provide a repository name and scroll down&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%2F8pnw51ewkrofo38qcwjn.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%2F8pnw51ewkrofo38qcwjn.png" alt=" " width="800" height="286"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Go with the default values and click create button&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%2Ff3if4bo9p1v3avb2mai9.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%2Ff3if4bo9p1v3avb2mai9.png" alt=" " width="800" height="222"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Wait for a couple of minutes, You can see the new repository entry under Private Repositories&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%2Ffefjugjhm4yhq9r8d7ir.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%2Ffefjugjhm4yhq9r8d7ir.png" alt=" " width="800" height="249"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Come back to your EC2 instance and connect to it using EC2 Instance Connect.&lt;/p&gt;

&lt;p&gt;Now Lets Authenticate Docker to ECR using the below command&lt;/p&gt;

&lt;p&gt;&lt;code&gt;aws ecr get-login-password --region &amp;lt;region&amp;gt; | \&lt;br&gt;
docker login --username AWS --password-stdin &amp;lt;account-id&amp;gt;.dkr.ecr.&amp;lt;region&amp;gt;.amazonaws.com&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Authenticate Docker with Amazon ECR from EC2
&lt;/h2&gt;

&lt;p&gt;Before pushing a Docker image to Amazon ECR, Docker must be authenticated with AWS.&lt;br&gt;
The recommended and secure way is to use an IAM role attached to the EC2 instance.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Create an IAM Role for EC2&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Go to IAM → Roles → Create role&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%2F2t89naaqnp9azhuwh4ji.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%2F2t89naaqnp9azhuwh4ji.png" alt=" " width="800" height="92"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Choose AWS service → EC2&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%2Ffb5okvfgwqv0oxawevf1.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%2Ffb5okvfgwqv0oxawevf1.png" alt=" " width="800" height="298"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Attach the policy:&lt;/p&gt;

&lt;p&gt;AmazonEC2ContainerRegistryFullAccess&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%2Fqmyoi81nff4i5s2fz0yp.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%2Fqmyoi81nff4i5s2fz0yp.png" alt=" " width="800" height="185"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Create the role by providing a role name and clicking Create Role button&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Attach the Role to EC2&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Go to EC2 → Instances&lt;/p&gt;

&lt;p&gt;Select your instance&lt;/p&gt;

&lt;p&gt;Actions → Security → Modify IAM role&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%2Fkoipglus0vlsrl1ek4v3.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%2Fkoipglus0vlsrl1ek4v3.png" alt=" " width="800" height="187"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here Select the I A M role that was created in the previous step and click Update IAM Role button&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%2F1cww6llo667jddkypq04.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%2F1cww6llo667jddkypq04.png" alt=" " width="800" height="201"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Wait 1–2 minutes for changes to apply.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Verify the Role&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;On the EC2 instance, run:&lt;/p&gt;

&lt;p&gt;aws sts get-caller-identity&lt;/p&gt;

&lt;p&gt;Sample output:&lt;/p&gt;

&lt;p&gt;{&lt;br&gt;
  "Account": "123456789",&lt;br&gt;
  "Arn": "arn:aws:sts::123456789:assumed-role//i-0fea76487ea9663b1"&lt;br&gt;
}&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Login to Amazon ECR&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Docker uses a temporary token generated by AWS.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;aws ecr get-login-password --region ap-south-1 | \&lt;br&gt;
docker login --username AWS --password-stdin \&lt;br&gt;
123456789.dkr.ecr.ap-south-1.amazonaws.com&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Expected Output&lt;br&gt;
Login Succeeded&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%2Fro1eyc7j7695wsgfpes7.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%2Fro1eyc7j7695wsgfpes7.png" alt=" " width="628" height="151"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Note: Replace 123456789 with your own AWS Account ID.&lt;br&gt;
Do not change the username or password values — the username must be AWS, and the password is automatically passed using --password-stdin.&lt;/p&gt;

&lt;p&gt;Now push the image to ecr respository that was created&lt;/p&gt;

&lt;h2&gt;
  
  
  Push Docker Image to Amazon ECR Repository
&lt;/h2&gt;

&lt;p&gt;Now that Docker authentication is successful, the next step is to push the Docker image to the Amazon ECR repository created earlier. This makes the container image available for deployment using AWS services such as Amazon ECS, App Runner, or EKS.&lt;/p&gt;

&lt;p&gt;Let’s tag the Snake and Ladder Docker image with the ECR repository URI so it’s ready to be pushed.&lt;/p&gt;

&lt;p&gt;Use the following command to tag &lt;br&gt;
&lt;code&gt;docker tag &amp;lt;IMAGE NAME&amp;gt; &amp;lt;ECR Repository URI&amp;gt;&lt;/code&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%2F7o6dgr9c7m5zwq4huwhz.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%2F7o6dgr9c7m5zwq4huwhz.png" alt=" " width="800" height="242"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;IMAGE NAME is snake-ladder-game which we built earlier. You can get it using &lt;code&gt;docker images&lt;/code&gt; command&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%2Fxjospzdbsit0hph5u06a.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%2Fxjospzdbsit0hph5u06a.png" alt=" " width="800" height="195"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now let us push the tagged image using docker push command&lt;br&gt;
&lt;code&gt;docker push &amp;lt;ECR Repository URI&amp;gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Docker will upload the image layers to Amazon Elastic Container Registry (ECR). Depending on the image size, this process may take a few moments.&lt;/p&gt;

&lt;p&gt;Verify the Image in Amazon ECR&lt;/p&gt;

&lt;p&gt;After the push completes:&lt;/p&gt;

&lt;p&gt;Open the AWS Management Console&lt;/p&gt;

&lt;p&gt;Navigate to Amazon ECR → Repositories&lt;/p&gt;

&lt;p&gt;Select your repository&lt;/p&gt;

&lt;p&gt;Confirm that the image with the latest tag is listed&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%2Frxoy0exwaa8y7i9bzukx.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%2Frxoy0exwaa8y7i9bzukx.png" alt=" " width="800" height="215"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>programming</category>
      <category>tutorial</category>
      <category>devops</category>
      <category>aws</category>
    </item>
    <item>
      <title>Dockerize a Snake and Ladder Game Application in EC2</title>
      <dc:creator>Nandini Rajaram</dc:creator>
      <pubDate>Fri, 02 Jan 2026 19:29:46 +0000</pubDate>
      <link>https://forem.com/aws-builders/dockerize-a-snake-and-ladder-game-application-in-ec2-12i1</link>
      <guid>https://forem.com/aws-builders/dockerize-a-snake-and-ladder-game-application-in-ec2-12i1</guid>
      <description>&lt;h2&gt;
  
  
  Prerequisite
&lt;/h2&gt;

&lt;p&gt;Refer &lt;a href="https://dev.to/aws-builders/docker-fundamentals-on-amazon-ec2-a-practical-introduction-2l60"&gt;https://dev.to/aws-builders/docker-fundamentals-on-amazon-ec2-a-practical-introduction-2l60&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The html code which is used can be accessed here &lt;a href="https://github.com/nandinicloudpractioner/snakeandladdergamewebapplication/blob/main/snake-and-ladder.html" rel="noopener noreferrer"&gt;https://github.com/nandinicloudpractioner/snakeandladdergamewebapplication/blob/main/snake-and-ladder.html&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Lets Dockerize the snake and ladder game application&lt;/p&gt;

&lt;p&gt;I have the html file snake and ladder.html file which  I have created using Amazon Q cli &lt;/p&gt;

&lt;p&gt;Now Lets Dockerize that&lt;/p&gt;

&lt;p&gt;Lets begin with creating the directories and storing the code&lt;/p&gt;

&lt;h2&gt;
  
  
  Create a folder in ec2 instance and store the code files
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;mkdir snake-ladder-game&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Move into the folder&lt;br&gt;
&lt;code&gt;cd snake-ladder-game&lt;/code&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%2Fwwykhxx131kqz9ouhcas.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%2Fwwykhxx131kqz9ouhcas.png" alt=" " width="800" height="415"&gt;&lt;/a&gt;&lt;br&gt;
Now we need to create two files and store it inside our folder&lt;br&gt;
&lt;code&gt;snake-ladder-game/&lt;br&gt;
│── snake-and-ladder.html&lt;br&gt;
│── Dockerfile&lt;br&gt;
&lt;/code&gt;&lt;br&gt;
To create a file in ec2, Lets use a nano editor&lt;br&gt;
&lt;strong&gt;&lt;u&gt;Lets first create snake-and-ladder.html&lt;/u&gt;&lt;/strong&gt;&lt;br&gt;
Type the command to open nano editor&lt;br&gt;
&lt;code&gt;nano snake-and-ladder.html&lt;/code&gt;&lt;br&gt;
Copy the code which is available in &lt;a href="https://github.com/nandinicloudpractioner/snakeandladdergamewebapplication/blob/main/snake-and-ladder.html" rel="noopener noreferrer"&gt;https://github.com/nandinicloudpractioner/snakeandladdergamewebapplication/blob/main/snake-and-ladder.html&lt;/a&gt; and press&lt;br&gt;
&lt;code&gt;Ctrl + O&lt;/code&gt;&lt;br&gt;
Nano will ask:&lt;/p&gt;

&lt;p&gt;File Name to Write: snake-and-ladder.html&lt;/p&gt;

&lt;p&gt;👉 Just press Enter to confirm.&lt;br&gt;
 Exit nano by pressing&lt;/p&gt;

&lt;p&gt;&lt;code&gt;_Ctrl + X_&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Now,  Create a Dockerfile for the HTML Game&lt;br&gt;
&lt;strong&gt;&lt;u&gt;Create a Dockerfile:&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;nano Dockerfile&lt;/code&gt;&lt;br&gt;
Add the below content&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Use lightweight Nginx image
FROM nginx:alpine

# Remove default nginx website
RUN rm -rf /usr/share/nginx/html/*

# Copy our game HTML file to nginx web directory
COPY snake-and-ladder.html /usr/share/nginx/html/index.html

# Expose port 80
EXPOSE 80

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

&lt;/div&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%2F2h7tyfyf1nz213ceh0et.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%2F2h7tyfyf1nz213ceh0et.png" alt=" " width="800" height="271"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Copy the code and press&lt;br&gt;
&lt;code&gt;Ctrl + O&lt;/code&gt;&lt;br&gt;
Nano will ask:&lt;/p&gt;

&lt;p&gt;File Name to Write: Dockerfile&lt;/p&gt;

&lt;p&gt;👉 Just press Enter to confirm.&lt;/p&gt;

&lt;p&gt;Exit nano by pressing&lt;/p&gt;

&lt;p&gt;&lt;code&gt;_Ctrl + X_&lt;/code&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Explanation of the Dockerfile
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;nginx:alpine&lt;/strong&gt; – lightweight web server image&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;COPY&lt;/strong&gt; – moves your HTML file into the container&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;EXPOSE 80&lt;/strong&gt; – opens the web server port&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This Dockerfile turns your HTML file into a runnable web application.&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%2Fz54gdrctrbdevxtz9p1q.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%2Fz54gdrctrbdevxtz9p1q.png" alt=" " width="800" height="437"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Build the Docker Image
&lt;/h2&gt;

&lt;p&gt;Run the following command from the project directory:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;docker build -t snake-ladder-game .&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;This creates a Docker image named &lt;code&gt;snake-ladder-game&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Lets check if the image is ready by using the command&lt;br&gt;
&lt;code&gt;docker images&lt;/code&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%2Fcoi64a6bgpwthcr56rwb.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%2Fcoi64a6bgpwthcr56rwb.png" alt=" " width="800" height="379"&gt;&lt;/a&gt;&lt;br&gt;
 Yes, &lt;strong&gt;snake-ladder-game&lt;/strong&gt; image is ready&lt;/p&gt;
&lt;h1&gt;
  
  
  Run the Docker Container
&lt;/h1&gt;

&lt;p&gt;Start the container using:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;docker run -d -p 80:80 snake-ladder-game&lt;/code&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;80&lt;/code&gt; is the local port&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;80&lt;/code&gt; is the container port&lt;/li&gt;
&lt;/ul&gt;



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

&lt;p&gt;Lets check the run the command &lt;/p&gt;

&lt;p&gt;docker ps &lt;br&gt;
to see active containers&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%2F9h48xaw86ibo3e9gkccp.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%2F9h48xaw86ibo3e9gkccp.png" alt=" " width="800" height="60"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Open your browser using:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;http://&amp;lt;EC2-PUBLIC-IP&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Make sure your EC2 security group allows inbound traffic on port 80.&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%2Fa3htysvhmycjxjndavp7.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%2Fa3htysvhmycjxjndavp7.png" alt=" " width="800" height="427"&gt;&lt;/a&gt;&lt;/p&gt;

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




</description>
      <category>webdev</category>
      <category>programming</category>
      <category>aws</category>
      <category>docker</category>
    </item>
    <item>
      <title>Docker Fundamentals on Amazon EC2: A Practical Introduction</title>
      <dc:creator>Nandini Rajaram</dc:creator>
      <pubDate>Thu, 01 Jan 2026 13:51:16 +0000</pubDate>
      <link>https://forem.com/aws-builders/docker-fundamentals-on-amazon-ec2-a-practical-introduction-2l60</link>
      <guid>https://forem.com/aws-builders/docker-fundamentals-on-amazon-ec2-a-practical-introduction-2l60</guid>
      <description>&lt;p&gt;Lets Start with a simple story&lt;br&gt;
Imagine this.&lt;/p&gt;

&lt;p&gt;A developer builds an application on their laptop. It runs perfectly. Feeling confident, they send it to the testing team.&lt;/p&gt;

&lt;p&gt;But then comes the message:&lt;/p&gt;

&lt;p&gt;“The app is not working on our server.”&lt;/p&gt;

&lt;p&gt;The developer checks everything and replies:&lt;/p&gt;

&lt;p&gt;“But it works on my machine!”&lt;/p&gt;

&lt;p&gt;If this sounds familiar, you’ve just met one of the biggest problems in software development.&lt;/p&gt;

&lt;h1&gt;
  
  
  What Actually Went Wrong?
&lt;/h1&gt;

&lt;p&gt;The application depended on:&lt;/p&gt;

&lt;p&gt;A specific version of a programming language&lt;/p&gt;

&lt;p&gt;Certain libraries and tools&lt;/p&gt;

&lt;p&gt;Configuration files set up on the developer’s laptop&lt;/p&gt;

&lt;p&gt;The server had a slightly different setup—and that was enough to break the app.&lt;br&gt;
🐳 Enter Docker&lt;/p&gt;

&lt;p&gt;Docker steps in like a smart packaging system.&lt;/p&gt;

&lt;p&gt;Instead of sending just the application code, Docker packs the app together with everything it needs to run—the runtime, libraries, and configurations—into a single unit called a container.&lt;/p&gt;

&lt;p&gt;Now when the app moves:&lt;/p&gt;

&lt;p&gt;From laptop → test server&lt;/p&gt;

&lt;p&gt;From test server → production&lt;/p&gt;

&lt;p&gt;From local system → cloud&lt;/p&gt;

&lt;p&gt;…it behaves exactly the same everywhere.&lt;/p&gt;

&lt;h1&gt;
  
  
  Think of Docker Like This
&lt;/h1&gt;

&lt;p&gt;Imagine you’re sending a homemade dish to a friend.&lt;br&gt;
Instead of sending just the recipe and hoping they have the right ingredients and stove, you send the entire ready-to-eat meal in a sealed box.&lt;/p&gt;

&lt;p&gt;That’s Docker&lt;/p&gt;




&lt;h2&gt;
  
  
  Install Docker on ec2
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Launch an Ec2 Instance with Amazon AMI and do an instance connect to get connected to terminal &lt;/li&gt;
&lt;li&gt;Execute the following commands
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo yum update -y
sudo yum install docker -y
sudo systemctl start docker
sudo systemctl enable docker
sudo usermod -aG docker ec2-user  # Allow running Docker without sudo

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

&lt;/div&gt;



&lt;h2&gt;
  
  
  Verify Docker Installation
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;docker --version&lt;br&gt;
Exit and reconnect to ec2 Instance connect and Run the below command&lt;br&gt;
docker ps  # Should return an empty list&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Running a Container
&lt;/h2&gt;

&lt;p&gt;The Docker run command creates and starts a container from a specified image. For example, to start an redis container, simply execute:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;docker run redis&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;If the redis image already exists on your host, Docker immediately starts a new container. However, if the image is not present, Docker will pull it from Docker Hub. Once the image is downloaded, any subsequent run command will use the cached image. &lt;/p&gt;

&lt;h2&gt;
  
  
  To count the total number of containers running on the host
&lt;/h2&gt;

&lt;p&gt;Run the command &lt;br&gt;
&lt;code&gt;docker ps&lt;/code&gt;&lt;br&gt;
You can view running containers using the docker ps command. This command provides an overview, including container IDs, image names, statuses, and container names. &lt;/p&gt;

&lt;p&gt;Run the command&lt;br&gt;
&lt;code&gt;docker ps -a&lt;/code&gt; to list all containers, including those that have stopped or exited&lt;/p&gt;

&lt;h2&gt;
  
  
  To stop the container
&lt;/h2&gt;

&lt;p&gt;Run the command&lt;/p&gt;

&lt;p&gt;&lt;code&gt;docker stop &amp;lt;container_name&amp;gt;&lt;br&gt;
&lt;/code&gt;&lt;br&gt;
or &lt;/p&gt;

&lt;p&gt;&lt;code&gt;docker stop &amp;lt;container_id&amp;gt;&lt;/code&gt; (first few letters of container id that can uniquely identify the container would be good)&lt;/p&gt;

&lt;h2&gt;
  
  
  To remove the container
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;docker rm &amp;lt;container_id&amp;gt;&lt;/code&gt;(first few letters of container id that can uniquely identify the container would be good)&lt;br&gt;
Note: Containers should be stopped before removing them&lt;/p&gt;

&lt;h2&gt;
  
  
  To count the number of images available on the host
&lt;/h2&gt;

&lt;p&gt;Run the command&lt;br&gt;
&lt;code&gt;docker images&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  To pull an  image
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;docker pull &amp;lt;image_name&amp;gt;:&amp;lt;tag_name&amp;gt;&lt;br&gt;
&lt;/code&gt;&lt;br&gt;
Note: if tag not mentioned, image with latest tag will be pulled&lt;/p&gt;

&lt;h2&gt;
  
  
  To delete an image
&lt;/h2&gt;

&lt;p&gt;To delete an image no longer needed, ensure no container is using it.&lt;br&gt;
Stop and remove all the containers created from that image and then&lt;br&gt;
 Run the command.&lt;br&gt;
 &lt;code&gt;docker rmi &amp;lt;image_name&amp;gt;&lt;/code&gt;&lt;br&gt;
or&lt;br&gt;
&lt;code&gt;docker rmi &amp;lt;image_id&amp;gt;&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  To run the container in detached mode
&lt;/h2&gt;

&lt;p&gt;To run the web application in detached (background) mode, add the -d option&lt;/p&gt;

&lt;p&gt;&lt;code&gt;docker run -d &amp;lt;image_name&amp;gt;&lt;/code&gt;&lt;br&gt;
&lt;code&gt;docker run -d --name=webapp1 nginx:1.14-alpine&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  To host a local registry
&lt;/h2&gt;

&lt;p&gt;`docker run -d --name my-registry -p 80:5000 --restart always registry:2'&lt;/p&gt;

&lt;h2&gt;
  
  
  To pull ngnix image
&lt;/h2&gt;

&lt;p&gt;docker pull nginx:latest&lt;/p&gt;

&lt;h2&gt;
  
  
  To tag the image with a new name
&lt;/h2&gt;

&lt;p&gt;docker image tag nginx:latest localhost:80/nginx:latest&lt;/p&gt;

&lt;h2&gt;
  
  
  To push the image
&lt;/h2&gt;

&lt;p&gt;docker push localhost:80/nginx:latest&lt;/p&gt;

&lt;h2&gt;
  
  
  To verify image pushed
&lt;/h2&gt;

&lt;p&gt;curl -X GET localhost/v2/_catalog&lt;/p&gt;

&lt;h2&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%2Ftxbdy8jejqnd46lmj4fc.png" alt=" " width="800" height="203"&gt;
&lt;/h2&gt;

&lt;h2&gt;
  
  
  Port mapping the containers for Webapplications
&lt;/h2&gt;

&lt;p&gt;To expose the application externally, you must map a free host port to the container’s port using the &lt;strong&gt;-p&lt;/strong&gt; parameter.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;docker run -d --name=flask -p 80:80 nandinivijayr/myflaskapplication&lt;/code&gt;&lt;br&gt;
The above command will map the container port 80 to host port 80 and -d indicates that we are running the container in a detached mode&lt;/p&gt;

&lt;h2&gt;
  
  
  Inspecting the containers and images
&lt;/h2&gt;

&lt;p&gt;For detailed information about a particular container or an Image  the docker inspect command provides comprehensive configuration details in JSON format. &lt;br&gt;
&lt;code&gt;docker inspect container_id/ container_name&lt;/code&gt; will give details about the container&lt;br&gt;
&lt;code&gt;docker inspect image_id / image_name&lt;/code&gt; will give details about the image&lt;/p&gt;

&lt;h2&gt;
  
  
  To retrive container logs
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;docker logs &amp;lt;container_name/ container_id &amp;gt;&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Question time?
&lt;/h2&gt;

&lt;p&gt;Run a container with mysql image and name it&lt;/p&gt;




</description>
      <category>beginners</category>
      <category>aws</category>
      <category>containers</category>
      <category>docker</category>
    </item>
    <item>
      <title>From Data to Magic: Generative BI with Amazon Quick Suite Integrated with Amazon Q</title>
      <dc:creator>Nandini Rajaram</dc:creator>
      <pubDate>Mon, 08 Dec 2025 18:54:06 +0000</pubDate>
      <link>https://forem.com/aws-builders/amazon-quicksight-modern-bi-in-the-cloud-4jop</link>
      <guid>https://forem.com/aws-builders/amazon-quicksight-modern-bi-in-the-cloud-4jop</guid>
      <description>&lt;h2&gt;
  
  
  Amazon Quick Suite
&lt;/h2&gt;

&lt;p&gt;Amazon QuickSuite is a powerful cloud-based analytics tool that makes data access and visualisation easy and accessible for everyone.&lt;/p&gt;

&lt;p&gt;&lt;u&gt;Preview of Quicksuite once Signed In&lt;/u&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%2F99jozg64ssf1ip2med31.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%2F99jozg64ssf1ip2med31.png" alt=" " width="800" height="390"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Creation of Data set&lt;/strong&gt;&lt;br&gt;
In Amazon QuickSuite, a dataset is the collection of data you import or connect to—such as files, databases, or applications—that you prepare and use to create analyses and visuals.&lt;/p&gt;

&lt;p&gt;Let’s get hands-on with AWS Quick Suite by starting with the creation of our first dataset.&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%2F3bpt0j6v68oc5d7cmr1m.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%2F3bpt0j6v68oc5d7cmr1m.png" alt=" " width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You can upload a csv file by clicking upload file&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;You can create a dataset by uploading a file, or you can set up a data source, which connects Quick Suite to data from external applications or databases.&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%2Fl0mjxzjrv7e9y8plheet.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%2Fl0mjxzjrv7e9y8plheet.png" alt=" " width="800" height="356"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I am uploading a simple csv file which contains data regarding Mental Health and Social Media&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%2Fgf9cwnau2z1v7d6gjnco.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%2Fgf9cwnau2z1v7d6gjnco.png" alt=" " width="800" height="363"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In order to do some alterations on the data like renaming the columns or adding new column, we need to click Edit/ preview data&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%2F25urx47gx42ae9vxowcv.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%2F25urx47gx42ae9vxowcv.png" alt=" " width="800" height="352"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here you can add calculated fields based on formulas&lt;/p&gt;

&lt;p&gt;For example, I am creating a new column user type based on age, if age greater than 30, User type  will be adult and less than 30, User type  will be Youth&lt;br&gt;
Formula is &lt;code&gt;ifelse({Age} &amp;lt; 30, "Youth", "Adult")&lt;/code&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%2F2cf2ux6sc7qq1mkh57jq.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%2F2cf2ux6sc7qq1mkh57jq.png" alt=" " width="800" height="390"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here, You can see a new column user type getting generated on preview&lt;br&gt;
based on our formula&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%2F3bxfj7yf3gm931asku89.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%2F3bxfj7yf3gm931asku89.png" alt=" " width="800" height="342"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can also perform several other operations on the dataset like renaming the column, changing the data type and so on.&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%2Fmb811a1zdi85tgz83z71.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%2Fmb811a1zdi85tgz83z71.png" alt=" " width="800" height="396"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now Lets save and publish the data set&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%2Fsivi5zo2ahfuu1lekdez.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%2Fsivi5zo2ahfuu1lekdez.png" alt=" " width="800" height="334"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Creation of Analysis&lt;/strong&gt;&lt;br&gt;
In Amazon QuickSuite, an analysis is the workspace where you explore your data—adding datasets, creating visuals (like charts and tables), applying filters, and building insights before publishing them as dashboards.&lt;/p&gt;

&lt;p&gt;Now, we have the dataset ready, its time to create analysis&lt;/p&gt;

&lt;p&gt;Click on the Quick Suite logo and come to the base page, select Analysis from the left pane&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%2Fhts3v44o338gxjnw33ss.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%2Fhts3v44o338gxjnw33ss.png" alt=" " width="800" height="397"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Click Create Analysis button and Select the Dataset that we recently created and Click Select button&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%2Ft4ul78by8kh8fx1a6528.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%2Ft4ul78by8kh8fx1a6528.png" alt=" " width="633" height="347"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here, You will be asked to create a new sheet for analysis.&lt;br&gt;
Click Create button and proceed.&lt;/p&gt;

&lt;p&gt;Now, We should be able to build visuals using Prompts&lt;/p&gt;

&lt;p&gt;Click Build Visual and give a prompt-(This is powered by Amazon Q)&lt;br&gt;
I am going to get a pie chart for the user type values indicating the percentage of Adults and Youths &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%2F6t0dp7y5cx3ekx0b49v8.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%2F6t0dp7y5cx3ekx0b49v8.png" alt=" " width="800" height="341"&gt;&lt;/a&gt;&lt;br&gt;
If satisfied with the response, You can add it to Analysis by clicking  ADD TO ANALYSIS button and It will be added to the sheet&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%2F8xbjpur3lqu18zf8yxvl.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%2F8xbjpur3lqu18zf8yxvl.png" alt=" " width="800" height="539"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can also build required charts manually by picking the charts and configuring them from the visuals pane&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%2Fyj9qvfly1ofz0q0l3x2u.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%2Fyj9qvfly1ofz0q0l3x2u.png" alt=" " width="595" height="725"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now, Let me add some more visuals&lt;/p&gt;

&lt;p&gt;You can also modify the visual using prompts.&lt;br&gt;
For example, if you want to change a vertical bar chart to a horizontal bar chart, you can simply ask through a prompt.&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%2Fqt1bwp7obx913ejmh8ki.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%2Fqt1bwp7obx913ejmh8ki.png" alt=" " width="800" height="312"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here You go, The sheet with some more visuals added&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%2F9cb5asgqaffqlr7nbc3o.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%2F9cb5asgqaffqlr7nbc3o.png" alt=" " width="800" height="537"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;u&gt;&lt;strong&gt;Manage Q &amp;amp; A&lt;/strong&gt;&lt;/u&gt;&lt;/p&gt;

&lt;p&gt;Amazon Quick suite offers a useful option called “Manage Q&amp;amp;A,” which lets you control whether users can ask natural-language questions in your analysis and choose which data source—either a dataset or a linked topic—Q&amp;amp;A should use to generate answers.&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%2Fev5wutu10jp2qupdnh3n.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%2Fev5wutu10jp2qupdnh3n.png" alt=" " width="800" height="360"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Click on Manage Q &amp;amp; A button and select  &lt;em&gt;&lt;strong&gt;Use datasets for Build visual&lt;/strong&gt;&lt;/em&gt; and Click Apply changes button &lt;/p&gt;

&lt;p&gt;By selecting this option, we are instructing the analysis to use the datasets directly attached to it for both building visuals and answering Q&amp;amp;A queries.&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%2Fk94yjo4i83ci42e6yh5q.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%2Fk94yjo4i83ci42e6yh5q.png" alt=" " width="800" height="363"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;u&gt;&lt;strong&gt;Publishing the dashboard&lt;/strong&gt;&lt;/u&gt;&lt;br&gt;
Now, Its time to publish the dashboard&lt;/p&gt;

&lt;p&gt;Click the Publish Button on the top right&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%2Fkdw2ou3taz7q3qcdkkt7.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%2Fkdw2ou3taz7q3qcdkkt7.png" alt=" " width="800" height="619"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Make necessary configurations and click publish button&lt;/p&gt;

&lt;p&gt;Now, Click on the Amazon Quick Suite Logo to navigate to the base page.&lt;br&gt;
Select Dashboards from Left pane&lt;/p&gt;

&lt;p&gt;You should be able to see the recently published dashboard&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%2Fgqwjw8sjju4ev0x3lmid.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%2Fgqwjw8sjju4ev0x3lmid.png" alt=" " width="800" height="492"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Topics in Amazon Quick Suite
&lt;/h2&gt;

&lt;p&gt;A topic is a curated data layer in Quick Suite that makes natural-language querying (Q) more accurate, secure, and easier for business users. It  help users get relevant answers through natural language queries.&lt;/p&gt;

&lt;p&gt;Note: If you want to define a Topic, A subscription to Quick Suite Author Pro is required&lt;/p&gt;

&lt;p&gt;Lets start by defining a topic for our current dataset to analyse further.&lt;br&gt;
On the Left pane, click &lt;em&gt;Topics&lt;/em&gt; and then  click &lt;em&gt;create topic&lt;/em&gt; button.&lt;br&gt;
Specify a topic name and description and Check Enable Q &amp;amp; A and Click Continue&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%2Fg2cpxiqo7f7j5meskilo.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%2Fg2cpxiqo7f7j5meskilo.png" alt=" " width="800" height="401"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now Select the dataset and click Create button&lt;/p&gt;

&lt;p&gt;Please wait for couple of minutes while our topic is getting created&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%2Fu0sprl0hi24mtq5mjewj.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%2Fu0sprl0hi24mtq5mjewj.png" alt=" " width="800" height="334"&gt;&lt;/a&gt;&lt;br&gt;
Here You go, Our topic is ready. &lt;/p&gt;

&lt;p&gt;&lt;u&gt;Refresh Schedule in Topic&lt;/u&gt;&lt;br&gt;
A Topic is built on a dataset. The refresh schedule decides how frequently that dataset is refreshed so your Topic always answers questions using the latest data.&lt;/p&gt;

&lt;p&gt;Now let us learn about how to setup refresh schedules on Topic&lt;/p&gt;

&lt;p&gt;Navigate to the corresponding topic&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%2F0remd8dfwzlzqwev405b.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%2F0remd8dfwzlzqwev405b.png" alt=" " width="800" height="523"&gt;&lt;/a&gt;&lt;br&gt;
Go to Data tab and click on Datasets&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%2Fg4l55oyqb77nc3phssyv.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%2Fg4l55oyqb77nc3phssyv.png" alt=" " width="800" height="472"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now You can create a topic refresh schedule from here&lt;/p&gt;

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

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

&lt;p&gt;You can also refresh the data manually&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%2F564q96lhm2jn6gnj7bwi.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%2F564q96lhm2jn6gnj7bwi.png" alt=" " width="800" height="144"&gt;&lt;/a&gt;&lt;br&gt;
&lt;u&gt;Data Fields in Topic&lt;/u&gt;&lt;/p&gt;

&lt;p&gt;Data fields are the columns from your dataset that you add to a Topic so Quick Suite Q can understand them.&lt;br&gt;
These fields help Q answer natural-language questions correctly.&lt;/p&gt;

&lt;p&gt;Now, Lets work on the Data fields&lt;br&gt;
Here You can select the field you want to include and add some synonyms&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%2Fdsnxbv6kibtbq3u5kl03.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%2Fdsnxbv6kibtbq3u5kl03.png" alt=" " width="800" height="351"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Synonyms are alternative words or phrases that you assign to a data field, named entity, or metric so that Quick Suite Q can understand different ways users might ask the same thing.&lt;/p&gt;

&lt;p&gt;They improve natural-language understanding.&lt;/p&gt;

&lt;p&gt;&lt;u&gt;NAMED ENTITY&lt;/u&gt;&lt;br&gt;
Named Entities are custom business terms you define inside a Topic so Quick Suite Q can understand natural language questions more accurately.&lt;/p&gt;

&lt;p&gt;They represent real-world concepts that may not exist as a single column in your dataset.&lt;/p&gt;

&lt;p&gt;For example I am creating a Survey Participant with the following basic fields&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%2Fq25p3tmbv32ue3esxb4t.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%2Fq25p3tmbv32ue3esxb4t.png" alt=" " width="800" height="337"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;u&gt;Now its Question Time&lt;/u&gt;&lt;/p&gt;

&lt;p&gt;Click on Ask about this topic and Ask some questions&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%2Fgnb2enl7tbc093m6l3gj.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%2Fgnb2enl7tbc093m6l3gj.png" alt=" " width="800" height="296"&gt;&lt;/a&gt;&lt;br&gt;
 The good thing is that You will get some questions as suggestions&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%2Fwb9i6sjmr4fn0a1kwlis.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%2Fwb9i6sjmr4fn0a1kwlis.png" alt=" " width="800" height="375"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Post some questions and verify the answer and Click the button Mark as verified. You can also change the interpretation by clicking the pencil icon&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%2F14b2scnhp0b45w97ru7t.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%2F14b2scnhp0b45w97ru7t.png" alt=" " width="800" height="491"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;Now In the suggested Questions tab, Inside Verified Tab, You will be able to view the Questions which you have posted and marked as verified&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%2Fhv80pzdmzmw633chmuyf.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%2Fhv80pzdmzmw633chmuyf.png" alt=" " width="800" height="311"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can also view the Questions came as suggestions on AI generated section&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%2Fwx1877n297vh0qvcnoas.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%2Fwx1877n297vh0qvcnoas.png" alt=" " width="800" height="246"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Quick Come back to Analysis
&lt;/h2&gt;

&lt;p&gt;Now Coming back to Analysis, We had a Manage Q &amp;amp; A button and on clicking that we get one more option &lt;strong&gt;Use a linked topic for Build visual and Q&amp;amp;A&lt;/strong&gt;. When user selects this option, Q&amp;amp;A uses Topic instead of your dataset ensuring better accuracy, cleaner data, and consistent business logic.&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%2F389kh96fwnb133mwjvc4.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%2F389kh96fwnb133mwjvc4.png" alt=" " width="800" height="432"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Scenarios in Quick Suite
&lt;/h2&gt;

&lt;p&gt;In Amazon Quick Suite, Scenarios are guided, AI-powered question prompts that help users explore data quickly using natural language.&lt;/p&gt;

&lt;p&gt;They act like predefined, business-friendly question templates that users can click on instead of typing their own queries.&lt;/p&gt;

&lt;p&gt;A Scenario is basically a:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Pre-built conversational workflow&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Designed around a specific business use case&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Powered by Q (natural language) + your dataset&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That guides the user through steps such as:&lt;br&gt;
“Analyze trends → explore causes → compare segments → generate insights → recommend actions”&lt;/p&gt;

&lt;p&gt;So instead of users typing questions freely, a scenario provides a structured set of prompts tailored to your business problem.&lt;/p&gt;

&lt;p&gt;Lets create a Scenario and Move further&lt;/p&gt;

&lt;p&gt;Click the Quick sight logo and go the base page. Click on &lt;strong&gt;Scenarios&lt;/strong&gt; from the left pane and Click &lt;strong&gt;Create Scenario&lt;/strong&gt; button&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%2Fgmvp8vwi33nv7wmijbm7.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%2Fgmvp8vwi33nv7wmijbm7.png" alt=" " width="800" height="358"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Provide a description of the business problem and add data&lt;br&gt;
Data can be added by uploading files or Selecting from Quick Sight Dashboards&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%2Fsyt8umqasdwmirxdujpf.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%2Fsyt8umqasdwmirxdujpf.png" alt=" " width="800" height="348"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now I am going to select the data from Dashboards, Let me click on the Find Data button and Select the Dashboard we published and select required visuals. Click Add button to proceed further&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%2Fxfl4e01i7o2kpkjowd74.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%2Fxfl4e01i7o2kpkjowd74.png" alt=" " width="800" height="372"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now, You can Preview the data and Select the fields you want from the dataset and click Add Data button  to proceed further&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%2F5hji86l6gi0d4oq2ffys.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%2F5hji86l6gi0d4oq2ffys.png" alt=" " width="800" height="341"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Lets wait for a couple of minutes and click Start Analysis button&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%2Ftkol6i6gwk4im1chi0av.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%2Ftkol6i6gwk4im1chi0av.png" alt=" " width="800" height="352"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Provide a prompt and click submit button  to start the thread&lt;/p&gt;

&lt;p&gt;I gave a prompt &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Identify factors affecting happiness index.&lt;br&gt;
Lets See the result&lt;/p&gt;
&lt;/blockquote&gt;

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

&lt;p&gt;It gave me a lot of information&lt;/p&gt;

&lt;p&gt;You can continue the thread by clicking the + button below the generated result and describe what you want to analyze next.&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%2F3nmichd98ozg6fp3svk3.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%2F3nmichd98ozg6fp3svk3.png" alt=" " width="800" height="483"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can also start a new thread from the top to run a fresh analysis.&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%2F1i2s982ogf5lg5phjlro.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%2F1i2s982ogf5lg5phjlro.png" alt=" " width="800" height="378"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The good thing is that you will be also getting prompt suggestions and you can use them if you want&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%2Ffiskjp6d418oda0swj1x.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%2Ffiskjp6d418oda0swj1x.png" alt=" " width="800" height="378"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Let me also Rename to Scenario from New Scenario to Social Media Overview&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%2Fhxeavar4b2m3vtqgytah.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%2Fhxeavar4b2m3vtqgytah.png" alt=" " width="800" height="404"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can Share the Scenario created to team members/ Users by clicking Share button on the top right&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%2Frsoiwd0g0dtwtkdhd8ac.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%2Frsoiwd0g0dtwtkdhd8ac.png" alt=" " width="800" height="235"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now, Its time for Story Telling&lt;/p&gt;

&lt;h2&gt;
  
  
  Stories
&lt;/h2&gt;

&lt;p&gt;A Story in Quick Suite is a curated, step-by-step presentation created from visuals in your analysis.&lt;br&gt;
It lets you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Highlight key insights&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Walk users through findings in order&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add explanations or commentary&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Turn your analysis into a narrative experience.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Lets create a story about our Mental Health and Social Media Analysis&lt;/p&gt;

&lt;p&gt;Click on the Quick Suite Logo and Navigate to Stories from Left Pane&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%2Flzxd0c5fk62h3dye8wuj.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%2Flzxd0c5fk62h3dye8wuj.png" alt=" " width="800" height="304"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Click Create Story button to proceed further&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%2Fkrvudoaxi8c5q98m8mzj.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%2Fkrvudoaxi8c5q98m8mzj.png" alt=" " width="800" height="330"&gt;&lt;/a&gt;&lt;br&gt;
 Here Describe Your story as well as add some visuals&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%2F5a7pzpp9g682hf9vebwy.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%2F5a7pzpp9g682hf9vebwy.png" alt=" " width="800" height="337"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here You should be able to add Visuals from the Dashboard you have published&lt;/p&gt;

&lt;p&gt;Click Build button to proceed further&lt;br&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%2Fb6o6h8cl1w8914fz4mga.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%2Fb6o6h8cl1w8914fz4mga.png" alt=" " width="800" height="318"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Wait for a couple of minutes to get our story served&lt;/p&gt;

&lt;p&gt;Here you go, We have a beautiful story served&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%2F0nk5rzebmweoi5k6ftd2.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%2F0nk5rzebmweoi5k6ftd2.png" alt=" " width="800" height="427"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You should be able to edit the story according to your taste and Preview it as well before getting published&lt;/p&gt;

&lt;p&gt;Lets go back to the Story editor and do some edittings&lt;br&gt;
You can customize the story theme and adjust the animations for how each block appears.&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%2Fkhtcbn60la4zxtpt7j6f.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%2Fkhtcbn60la4zxtpt7j6f.png" alt=" " width="800" height="354"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can add your own block by clicking the + button add content to it&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%2F7j8dqi318xazft6mmh3u.webp" 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%2F7j8dqi318xazft6mmh3u.webp" alt=" " width="788" height="347"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can also move the block up / down &lt;br&gt;
duplicate it or delete it&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%2Fx3whm5ng3txfxi0v0j5y.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%2Fx3whm5ng3txfxi0v0j5y.png" alt=" " width="800" height="291"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Another fantastic feature is You can alter the lines of each block to longer or shorter using edit the narrative option given by Amazon Q &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%2Fm42vu64cm0naozzmpit3.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%2Fm42vu64cm0naozzmpit3.png" alt=" " width="800" height="309"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;and Finally You should be able to publish and share the Story by clicking the Share button and selecting the users, Click Publish and Share button&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%2Fst2u9ga1b7qawkhwjrnt.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%2Fst2u9ga1b7qawkhwjrnt.png" alt=" " width="800" height="255"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>aws</category>
      <category>cloud</category>
      <category>ai</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Quickly Set Up a GraphQL API for DynamoDB CRUD operations with Just a Few Clicks Using AWS AppSync</title>
      <dc:creator>Nandini Rajaram</dc:creator>
      <pubDate>Sun, 10 Nov 2024 18:23:39 +0000</pubDate>
      <link>https://forem.com/aws-builders/quickly-set-up-a-graphql-api-for-dynamodb-with-just-a-few-clicks-using-appsync-3jac</link>
      <guid>https://forem.com/aws-builders/quickly-set-up-a-graphql-api-for-dynamodb-with-just-a-few-clicks-using-appsync-3jac</guid>
      <description>&lt;h2&gt;
  
  
  What is GraphQL?
&lt;/h2&gt;

&lt;p&gt;GraphQL is a query language for APIs and a runtime for executing those queries. It was developed by Facebook in 2012 and released publicly in 2015&lt;/p&gt;

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

&lt;p&gt;Instead of an API where you hit a URL and accept whatever data comes back, GraphQL allows you to ask for specific data, giving clients more control over what information is sent.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Practical Example
&lt;/h2&gt;

&lt;p&gt;For example, you may say, "Hey REST API, give me the titles of the books available on Cloud Tuner Online Library," in order to retrieve data from the Rest API. The way this works is that you contact a specific endpoint, or URL, in our instance the Cloud Tuner Online Library, and that URL controls the data that returns. When you retrieve a URL using the REST API, it usually returns something in the form of a Javascript object or JSON with data on it. This leads to either repeated journeys (requests) to satisfy different queries, or undesired data that we have to sift through to retrieve our needed data. But GraphQL isn't like that. &lt;br&gt;
Rather than using an API where you click a URL and consent&lt;/p&gt;
&lt;h2&gt;
  
  
  Queries and Mutations
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Query&lt;/strong&gt;&lt;br&gt;
In GraphQL, a query is used to fetch specific data from the server. You define the fields you want to retrieve, and the server returns only that data. Let's look at a typical GraphQL query example and break it down.&lt;/p&gt;

&lt;p&gt;Example Query&lt;br&gt;
Imagine you want to get a list of books, their titles, authors, and publication years from the "Cloud Tuner Online Library." Here's how you would write that query in GraphQL:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt; query {
  books {
    title
    author {
      name
    }
    publicationYear
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;query: This is the keyword that tells GraphQL you’re making a read operation to fetch data.&lt;/li&gt;
&lt;li&gt;books: This is the field you're querying. In this case, it refers to the list of books available in the library.&lt;/li&gt;
&lt;li&gt;title, author, publicationYear: These are the specific fields you want to retrieve for each book.&lt;/li&gt;
&lt;li&gt;author { name }: This is an example of requesting a nested field. Here, you're asking for the name field inside the author object associated with each book.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Mutation&lt;/strong&gt;&lt;br&gt;
A mutation in GraphQL is used to modify or create data on the server. While queries are used to fetch data, mutations are used for actions like adding, updating, or deleting records.&lt;/p&gt;

&lt;p&gt;Example Mutation&lt;br&gt;
Let’s say you want to add a new book to the "Cloud Tuner Online Library." Here’s how you would write a GraphQL mutation to do that:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;mutation {
  addBook(title: "New Book Title", author: "New Author", publicationYear: 2024) {
    id
    title
    author
    publicationYear
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;mutation: This keyword indicates that you're making a write operation, meaning you're modifying data on the server.&lt;/li&gt;
&lt;li&gt;addBook: This is the mutation operation name. It corresponds to a mutation defined on the server that handles the logic for adding a book to the library.&lt;/li&gt;
&lt;li&gt;Arguments: Inside the parentheses, you provide the necessary inputs for the mutation, such as the title, author, and publicationYear of the book.&lt;/li&gt;
&lt;li&gt;Fields: After the mutation is successful, you can request specific fields to be returned. Here, we're asking for the id, title, author, and publicationYear of the newly added book.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  CRUD APIs with AWS AppSync and DynamoDB
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;AWS AppSync&lt;/strong&gt; is a fully managed, pay-per-use GraphQL service that allows developers to create and test web and mobile applications utilizing real-time data. AppSync allows developers to construct an API that is available via a single endpoint and uses GraphQL as a unified query language. AppSync manages data requests and responses, as well as connections to one or more data sources, such as AWS Lambda, AWS DynamoDB, and HTTP APIs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Amazon DynamoDB&lt;/strong&gt; is a cloud-based NoSQL database that is ideal for anyone looking for a dependable and completely managed NoSQL solution. DynamoDB is intended to allow automated storage scaling with low latency. It is especially beneficial when your application must read and store large volumes of data while maintaining speed and dependability (Amazon uses database replicas in three separate Availability Zones). Amazon DynamoDB is completely managed. Simply select an AWS region and define the necessary indexes for each table you will create, and Amazon will handle the rest.&lt;/p&gt;

&lt;p&gt;Here We will work with the AWS AppSync interface via the AWS console to build a GraphQL API backed by DynamoDB datasource&lt;/p&gt;

&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Books Table in DynamoDB with Items added.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Please refer the below link for creating the DynamoDB table&lt;br&gt;
&lt;a href="https://dev.to/aws-builders/cook-a-recipe-with-aws-dynamo-db-table-1kn1"&gt;Cook a recipe with AWS: Dynamo DB Table&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;AWS AppSync has the capability to instantly generate a GraphQL schema and link resolvers to an already-existing data source, like an AWS DynamoDB database. Developers can first concentrate on database architecture rather than the GraphQL schema thanks to this functionality. For users who are unfamiliar with GraphQL, the automatically produced schema and resolvers can also serve as a foundation that can be readily built upon.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Navigate to Appsync Console&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;Click Create API button&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;Under Select API type, select GraphQL APIs, under GraphQL API Data Source, select &lt;em&gt;Start with a DynamoDB table&lt;/em&gt; and Click &lt;em&gt;Next&lt;/em&gt; button&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;Enter An API name (I have given BooksAPI for the API name)&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;In the Import DynamoDB Table form, configure the following, then click Next button

&lt;ul&gt;
&lt;li&gt;Region: Select US-WEST-2 from the drop-down menu&lt;/li&gt;
&lt;li&gt;Table name: Select BooksTable&lt;/li&gt;
&lt;li&gt;Create or use an existing role: You can create an new role 
A role with following permission will be created for you &lt;/li&gt;
&lt;/ul&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff4hr845g1hlmhkitulow.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%2Ff4hr845g1hlmhkitulow.png" alt="Image description" width="668" height="742"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Role grants AppSync the permissions it needs to perform create, read, update, and delete (CRUD) operations on data stored in DynamoDB.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Click next button after filling the details&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;Now On the Model information step, configure the following:

&lt;ul&gt;
&lt;li&gt;Model Name - Iam giving the name as &lt;strong&gt;BooksTable&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;The Fields section can be populated with the Table Fields, including details such as the Field Type, whether the Field is an array, and if the Field is mandatory. These details should align with the DynamoDB Books Table. The Primary Key Field is autopopulated. &lt;/li&gt;
&lt;/ul&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Faaos8rp3f617shns5d8q.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%2Faaos8rp3f617shns5d8q.png" alt="Image description" width="704" height="187"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Configure the remaining Fields aligning with Books Table of DynamoDB&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;Under Additional settings, select Velocity Template Language (VTL), then click Next, review the information and then click Create API:&lt;/li&gt;
&lt;/ul&gt;

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

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

&lt;p&gt;&lt;strong&gt;Now You can see the magic&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%2F6j7swaafvrwi19uuelwz.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%2F6j7swaafvrwi19uuelwz.png" alt="Image description" width="158" height="148"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Using this Book model, AppSync will create a GraphQL schema that includes queries, mutations, and subscriptions to handle the basic CRUD operations for your API( Creation of items into DynamoDB, Reading items from DynamoDB,Updating Item in DynamoDB and Deletion of items from DynamoDB)&lt;br&gt;
AppSync will also generate the necessary resolvers and mapping templates to manage the data flow between the client and the BooksTable data source.&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%2Fn5beloqxgbugmfxbbxd4.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%2Fn5beloqxgbugmfxbbxd4.png" alt="Image description" width="800" height="420"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here You can see the BooksAPI  created &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Click Schema and You will be navigated to the view the Schema of BooksAPI&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;Click Data sources to view the DynamoDB Books table Data source&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;Click Queries in the left navigation pane and you'll be redirected to the Queries page for BooksAPI:&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;Here You will be able to see the Query editor which can be used for  writing, validating, and testing GraphQL operations, including queries, mutations, and subscriptions.&lt;/p&gt;
&lt;h2&gt;
  
  
  Fetching The Items from BooksTable of DynamoDB using GraphQL Query
&lt;/h2&gt;

&lt;p&gt;Click Run Button and Select listBooksTables&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%2F7c1krrntvxynphrvae2p.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%2F7c1krrntvxynphrvae2p.png" alt="Image description" width="800" height="349"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This will execute the listBooksTables query which will fetch all items from BooksTable of DynamoDB as Data Objects in JSON Format&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;A data object is returned that includes an items array. This array consists of all three books stored in BooksTable. Each item has all available fields returned in the output, which is declared in the listBooks query, within items.&lt;/p&gt;
&lt;/blockquote&gt;

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

&lt;p&gt;Here You can see the Query result as data objects with all attributes as selected by the user on the left pane&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%2Fdq9m1g7wtf5qn6e17hun.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%2Fdq9m1g7wtf5qn6e17hun.png" alt="Image description" width="800" height="514"&gt;&lt;/a&gt;&lt;/p&gt;



&lt;p&gt;Specifying only the title and author fields within items will return only those two fields:&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%2Fgsviu0gpdf6wqipxert9.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%2Fgsviu0gpdf6wqipxert9.png" alt="Image description" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Click Run Button and Select listBooksTables&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%2F6asw086u407l4jvdeqzs.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%2F6asw086u407l4jvdeqzs.png" alt="Image description" width="800" height="349"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  Adding an Item to the Books Table of DynamoDB Using GraphQL Mutatation
&lt;/h2&gt;

&lt;p&gt;To add a new Book item to the table, replace the JSON object defined in the Query Variables section with the following:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
  "createbookstableinput": {
    "title": "ChatGPT for Dummies",
    "id": "fBGILBdSSSAw2aDMQo8GaS4w1ozyChos",
    "author": "ChatGPT",
    "releaseDate": "01-01-2023",
    "genre": "Education",
    "pageCount": 500,
    "price": 25
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;createbookstableinput&lt;/code&gt;is an input type defined in the API schema. During the creation process, AppSync automatically generates these input definitions for you. More examples of input types will be available as you explore the generated schema.&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%2Fos0gpd0yoiaqhsnkic69.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%2Fos0gpd0yoiaqhsnkic69.png" alt="Image description" width="800" height="424"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;createBooksTable&lt;/code&gt; mutation takes a &lt;code&gt;createbookstableinput&lt;/code&gt;argument and uses the DynamoDB PutItem action to store the new book in the BooksTable. After the operation completes, it returns the newly created object.&lt;/p&gt;

&lt;p&gt;Click Run Button and Select &lt;code&gt;createBooksTable&lt;/code&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%2Fq93nchoqxx37d7xev9x7.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%2Fq93nchoqxx37d7xev9x7.png" alt="Image description" width="800" height="464"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can see the output on right pane&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%2Fi261zky0p8h7o1cmwkxy.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%2Fi261zky0p8h7o1cmwkxy.png" alt="Image description" width="800" height="430"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can also see the item added on DynamoDB Console&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%2F5cjkqebq2hr9miuw3tke.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%2F5cjkqebq2hr9miuw3tke.png" alt="Image description" width="800" height="353"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Its Postman Time
&lt;/h2&gt;

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

&lt;p&gt;Now Lets Connect to Postman Tool&lt;/p&gt;

&lt;p&gt;To connect to postman tool we need some details from aws appsync console&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Click Settings&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Copy the GraphQL endpoint and paste to a notepad&lt;br&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%2F1bnrnwmfa7p92uvnq3do.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%2F1bnrnwmfa7p92uvnq3do.png" alt="Image description" width="800" height="294"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Scroll down and Copy API Key and paste to a notepad&lt;/p&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fh46hsibv7c8d4vzbmshs.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%2Fh46hsibv7c8d4vzbmshs.png" alt="Image description" width="800" height="325"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Now, Open Postman tool and Click &lt;code&gt;New&lt;/code&gt;to create a request&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;We need to create an http request&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Select &lt;code&gt;GraphQL&lt;/code&gt;and Proceed&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;Paste the GraphQL endpoint from notepad here&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;Click &lt;code&gt;Authorization&lt;/code&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr0g5lucjkncelogr0jjg.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%2Fr0g5lucjkncelogr0jjg.png" alt="Image description" width="800" height="617"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Select API Key from Dropdown&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Provide the valid credentials&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Type &lt;code&gt;x-api-key&lt;/code&gt; to the Key Field&lt;/li&gt;
&lt;li&gt;Paste the apikey value copied from notepad&lt;/li&gt;
&lt;/ul&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F07qvnzwv4ufeg1746y61.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%2F07qvnzwv4ufeg1746y61.png" alt="Image description" width="800" height="470"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Navigate to Query Tab &lt;/li&gt;
&lt;li&gt;Copy the below Query Mutation  and paste in Query Section and Click &lt;code&gt;Query&lt;/code&gt; Button
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
mutation MyMutation {
  deleteBooksTable(input: {title: "The Mannequin in the Mirror"}) {
    id
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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%2F4hvfg45o3rmfg19801kf.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%2F4hvfg45o3rmfg19801kf.png" alt="Image description" width="800" height="503"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You should be able to see the item deleted from DynamoDB Console as well&lt;/p&gt;

</description>
      <category>aws</category>
      <category>microservices</category>
      <category>beginners</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Taming the Testing With AWS</title>
      <dc:creator>Nandini Rajaram</dc:creator>
      <pubDate>Thu, 15 Aug 2024 06:57:21 +0000</pubDate>
      <link>https://forem.com/aws-builders/taming-the-testing-with-aws-2i4n</link>
      <guid>https://forem.com/aws-builders/taming-the-testing-with-aws-2i4n</guid>
      <description>&lt;p&gt;As a software developer in test, one of the most challenging tasks I faced was ensuring the seamless integration of multiple microservices in a cloud-based environment. The project involved a complex web application built on microservices architecture, deployed on AWS. These microservices communicated with each other through RESTful APIs. Testing these APIs manually was not only time-consuming but also prone to errors, leading to significant delays in the release cycle. To tackle this challenge, I had to automate the testing process effectively, combining the power of AWS, API testing tools, and Selenium for end-to-end testing.&lt;/p&gt;

&lt;h2&gt;
  
  
  Smoke Testing APIs with AWS Canaries: A Smooth Approach
&lt;/h2&gt;

&lt;p&gt;In a recent project, I faced the challenge of ensuring that a set of APIs powering a microservices-based application was always functional and reliable. Given the complexity and the critical role these APIs played, a failure could have far-reaching consequences. To catch potential issues early, I decided to implement smoke testing using AWS Canaries.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Challenge&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The primary challenge was maintaining confidence that the APIs were operational and performing as expected after each deployment. With frequent updates and deployments, relying solely on manual testing or scheduled test suites wasn’t feasible. We needed a way to continuously monitor the APIs, ensuring that any critical issues were detected as soon as they occurred.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Solution&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;AWS Canaries, part of the Amazon CloudWatch Synthetics, emerged as the ideal solution for this problem. Canaries are scripts that run on a schedule, simulating the actions of a user or service. They are perfect for performing smoke tests, which are quick, high-level tests to check the basic functionality of the APIs.&lt;/p&gt;

&lt;p&gt;Here’s how I implemented it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Creating the Canaries: &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I started by writing Canary scripts in Python using &lt;strong&gt;AWS CloudWatch&lt;/strong&gt; Synthetics. These scripts made HTTP requests to the API endpoints, verifying that the responses were as expected. The scripts were designed to check the most critical API functions, like retrieving data, performing searches, and handling user authentication.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Setting Up Alerts:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;After deploying the Canaries, I configured CloudWatch Alarms to trigger notifications if any of the Canary tests failed. This setup ensured that the team was immediately alerted to potential issues, allowing for rapid investigation and resolution.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Scheduling and Continuous Monitoring:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I scheduled the Canaries to run at regular intervals, such as every 5 or 15 minutes, depending on the criticality of the API. This continuous monitoring provided real-time insights into the health of the APIs and allowed us to detect issues before they could impact users.&lt;/p&gt;

&lt;h2&gt;
  
  
  Additional Links
&lt;/h2&gt;

&lt;p&gt;A step by step tutorial can be found below&lt;/p&gt;

&lt;p&gt;The following DevTo post provides a step by step tutorial to set up canaries to do smoke testing&lt;br&gt;
&lt;a href="https://dev.to/aws-builders/cook-a-recipe-with-aws-create-canaries-using-selenium-python-test-scripts-19o5"&gt;Smoke Testing using AWS Canaries&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Automating Testing with AWS, Selenium, and Java: Overcoming the Reporting Challenge
&lt;/h2&gt;

&lt;p&gt;In one of my projects,  I was tasked with testing a complex web application deployed on AWS. The application had multiple components, each interacting with different APIs and databases, making it essential to ensure that every piece functioned correctly before release. Given the scale and complexity, manual testing was quickly becoming unmanageable, and automation was the only way forward. However, the real challenge lay not just in automating the tests but also in generating comprehensive and clear test reports that the development team could easily understand and act upon.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Challenge&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The project was built using microservices, each hosted on AWS, with a mix of RESTful APIs and a dynamic user interface. Our team had chosen Selenium for automating the UI tests and Java for writing the test scripts, but as the application grew, so did the number of test cases. Running these tests manually was no longer feasible, and the lack of clear, detailed reporting made it difficult to track test results, identify issues, and communicate them effectively to the development team.&lt;/p&gt;

&lt;p&gt;The existing test reports were basic, often limited to console outputs or text files that were hard to decipher without deep technical knowledge. As a result, developers spent too much time trying to understand test failures, which slowed down the bug-fixing process and hampered the overall efficiency of the project.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Solution&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;To overcome these challenges, I decided to revamp our entire test automation framework, focusing not just on running tests but also on generating meaningful, detailed reports.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Building the Test Automation Framework:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I started by setting up a robust test automation framework using Selenium WebDriver with Java. TestNG was chosen as the testing framework due to its ability to run tests in parallel, generate HTML reports, and integrate easily with other tools. The framework was designed to be modular, with reusable components that could handle the different parts of the application.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Integrating with AWS&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Given that our application was deployed on AWS, I integrated the test automation with AWS services for better scalability and management. We used &lt;strong&gt;AWS CodeBuild&lt;/strong&gt; to run the tests in a CI/CD pipeline, ensuring that tests were automatically triggered on every code commit. This integration allowed us to run tests in parallel across different environments, significantly reducing the time required for test execution&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Enhancing Test Reporting and Storing them in S3&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The real game-changer was the implementation of an enhanced reporting system. I integrated the ExtentReports library with our TestNG framework. ExtentReports provided detailed HTML reports with visual representations of the test results, including screenshots for failed tests, detailed logs, and an intuitive interface that made it easy for developers to navigate through the results.&lt;/p&gt;

&lt;p&gt;Additionally, I set up Allure Reports, another reporting tool that offered even more detailed insights. Allure Reports were particularly useful for their interactive dashboards and the ability to track test case histories over time, which helped in identifying patterns in recurring issues.&lt;/p&gt;

&lt;p&gt;The reports were stored in &lt;strong&gt;S3&lt;/strong&gt; with unique identifiers (based on timestamp and test suite names) to ensure easy retrieval and organization.&lt;/p&gt;

&lt;p&gt;The S3 bucket was configured with appropriate permissions to ensure that only authorized team members could access the reports. Additionally, S3 versioning was enabled to maintain a history of all test reports, which was useful for tracking the evolution of test results over time.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Sending Notifications with SNS:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Once the test reports were successfully uploaded to S3, the next step was to notify the team. For this, I used &lt;strong&gt;AWS SNS&lt;/strong&gt; to send email notifications.&lt;/p&gt;

&lt;p&gt;I set up an SNS topic and subscribed all relevant team members' email addresses to this topic. Then, using the AWS SDK, I wrote a script that triggered an SNS notification as soon as the reports were uploaded to S3.&lt;/p&gt;

&lt;p&gt;The notification included a brief summary of the test results (e.g., the number of tests passed, failed, and skipped) and a direct link to the S3 bucket where the full reports could be accessed. This allowed the team to quickly review the results and take action if needed.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Integrating with CI/CD Pipeline:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;With the new reporting system in place, I also integrated these reports into our CI/CD pipeline. &lt;strong&gt;AWS CodePipeline&lt;/strong&gt; was configured to trigger the test suite, store the reports in S3, and send out the SNS notifications upon completion. This automation ensured that the entire process was hands-free and reliable, providing continuous feedback to the team. Developers could now quickly see which tests had failed, why they failed, and even view screenshots of the failure, all within minutes of the test run.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Outcome&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Implementing this solution significantly improved our workflow. The test reports were now stored in a centralized location, easily accessible to all team members at any time. The automated email notifications ensured that everyone was immediately aware of the test results, enabling faster response times to issues.&lt;/p&gt;

</description>
      <category>developerexperiencemonth</category>
      <category>testing</category>
      <category>awschallenge</category>
      <category>aws</category>
    </item>
    <item>
      <title>Let's celebrate PartyRock, an Amazon Bedrock Playground</title>
      <dc:creator>Nandini Rajaram</dc:creator>
      <pubDate>Thu, 16 Nov 2023 19:47:04 +0000</pubDate>
      <link>https://forem.com/aws-builders/lets-celebrate-partyrock-an-amazon-bedrock-playground-35f9</link>
      <guid>https://forem.com/aws-builders/lets-celebrate-partyrock-an-amazon-bedrock-playground-35f9</guid>
      <description>&lt;p&gt;Here comes a smart friend that helps you build Generative AI apps&lt;/p&gt;

&lt;h2&gt;
  
  
  PartyRock
&lt;/h2&gt;

&lt;p&gt;An Amazon Bedrock Playground is a generative AI app development playground that enables interactive experimentation with prompt engineering in an accessible and enjoyable manner.&lt;/p&gt;




&lt;h2&gt;
  
  
  Good Eats Restaurant Recommendations
&lt;/h2&gt;

&lt;p&gt;My First  Generative AI app created using PartyRock&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4jyt8p2qjczkab0a7zob.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4jyt8p2qjczkab0a7zob.png" alt="Image description" width="540" height="360"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6wsep5s1p0rt6j7g6vvq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6wsep5s1p0rt6j7g6vvq.png" alt="Image description" width="612" height="408"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Good Eats Restaurant Recommendations&lt;/strong&gt; is an app that is created using PartyRock playground that will provide restaurant recommendations based on your preferences on location, cuisine, and meal&lt;/p&gt;

&lt;p&gt;Here is the app link:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://partyrock.aws/u/Nandini/VKvXSeZHH/Good-Eats-Restaurant-Recommendations/snapshot/GoQwp-oSg" rel="noopener noreferrer"&gt;https://partyrock.aws/u/Nandini/VKvXSeZHH/Good-Eats-Restaurant-Recommendations/snapshot/GoQwp-oSg&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Features observed while building the first app
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;A code-free playground where An app can be created with just a few clicks&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Yes, Its that simple. With a few clicks, we can create our desired app. No lengthy programs &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjzvbt47j61nxldja61ce.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjzvbt47j61nxldja61ce.png" alt="Image description" width="800" height="341"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Featured apps built with PartyRock to start with&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;There are some simple AI-powered app ideas which can be used to build the apps&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F21wfcp44sy01iuq24jm4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F21wfcp44sy01iuq24jm4.png" alt="Image description" width="800" height="341"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Access to powerful foundation models from Amazon Bedrock&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Amazon Bedrock is a fully managed solution that makes foundation models (FMs) from Amazon and prominent AI firms available on AWS. It is the simplest way to construct and scale generative AI applications using foundation models. &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;PartyRock Integrates with Amazon Bedrock and can provide widgets that can be used to generate  AI-powered  images,  text, and chatbots.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyn3ecfdxqjoku324pw8d.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyn3ecfdxqjoku324pw8d.png" alt="Image description" width="800" height="140"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Remix existing apps to create new ones with a unique flavor&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You can Remix the existing apps to create your own copy of them and customize them to bring a different flavor&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sharing the app - made simple&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;With PartyRock, you can easily share apps and content you develop. You can even use the snapshot option to preserve  your inputs and outputs while sharing the app link&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4qk8kdsn4bsix0zmrz9c.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4qk8kdsn4bsix0zmrz9c.png" alt="Image description" width="800" height="195"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Build your favorite AI-powered apps using PartyRock Play Ground&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;visit &lt;a href="https://partyrock.aws/" rel="noopener noreferrer"&gt;https://partyrock.aws/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsgdtbjjs39mrgajt1ir9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsgdtbjjs39mrgajt1ir9.png" alt="Image description" width="680" height="839"&gt;&lt;/a&gt;&lt;/p&gt;




</description>
      <category>aws</category>
      <category>ai</category>
      <category>beginners</category>
      <category>partyrockplayground</category>
    </item>
    <item>
      <title>The Code Whisper Magic with Amazon Code Whisperer</title>
      <dc:creator>Nandini Rajaram</dc:creator>
      <pubDate>Thu, 26 Oct 2023 22:15:32 +0000</pubDate>
      <link>https://forem.com/aws-builders/the-code-whisper-magic-with-amazon-code-whisperer-331i</link>
      <guid>https://forem.com/aws-builders/the-code-whisper-magic-with-amazon-code-whisperer-331i</guid>
      <description>&lt;h2&gt;
  
  
  Amazon CodeWhisperer
&lt;/h2&gt;

&lt;p&gt;A coding companion that is intended to improve developer efficiency and productivity with &lt;strong&gt;AI Power&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Features of Code Whisperer
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Supports Multiple programming languages and IDEs&lt;/strong&gt;&lt;br&gt;
CodeWhisperer supports 15 programming languages and can be used in several IDEs and code editors&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Languages Supported&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Java&lt;/li&gt;
&lt;li&gt;Python&lt;/li&gt;
&lt;li&gt;Java Script&lt;/li&gt;
&lt;li&gt;Type Script&lt;/li&gt;
&lt;li&gt;C#&lt;/li&gt;
&lt;li&gt;Script&lt;/li&gt;
&lt;li&gt;Ruby&lt;/li&gt;
&lt;li&gt;Go&lt;/li&gt;
&lt;li&gt;PHP&lt;/li&gt;
&lt;li&gt;C++&lt;/li&gt;
&lt;li&gt;C&lt;/li&gt;
&lt;li&gt;Shell&lt;/li&gt;
&lt;li&gt;Scala&lt;/li&gt;
&lt;li&gt;Rust&lt;/li&gt;
&lt;li&gt;Kotlin&lt;/li&gt;
&lt;li&gt;SQL&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;IDE Supported&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;    Amazon SageMaker Studio&lt;/li&gt;
&lt;li&gt;       JupyterLab&lt;/li&gt;
&lt;li&gt;      Visual Studio Code&lt;/li&gt;
&lt;li&gt;  IDEs produced by JetBrains&lt;/li&gt;
&lt;li&gt;  AWS Cloud9&lt;/li&gt;
&lt;li&gt;AWS Lambda console&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;




&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Boost the speed of any coding process&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;CodeWhisperer can understand comments given in natural language and generate multiple code ideas in real time. This tool has the potential to dramatically increase developer productivity by offering relevant code recommendations rapidly.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;




&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;CodeWhisperer accelerates the implementation of unit tests&lt;/strong&gt; &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It effectively incorporates logic for the majority of the explicit unit tests required and also makes suggestions for edge cases that may have gone unnoticed, increasing test coverage and ensuring comprehensive testing beyond what was initially planned.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  How CodeWhisperer generate code?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Prompts&lt;/strong&gt; are the comments that you add to your code.&lt;/li&gt;
&lt;li&gt;CodeWhisperer uses your prompts to make suggestions.&lt;/li&gt;
&lt;li&gt;CodeWhisperer can create an entire function based on a comment that you add to your code in supported languages, and it adds the function to your code &lt;strong&gt;line by line&lt;/strong&gt;, where you can review each line before accepting it.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Keyboard shortcuts for Amazon Code Whisperer
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgxhiqfbs11l5wvdnax3q.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgxhiqfbs11l5wvdnax3q.png" alt="Image description" width="800" height="233"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Faey0khrod8h71bbhq4ae.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Faey0khrod8h71bbhq4ae.png" alt="Image description" width="800" height="194"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq5sp9lz1am4eltpcx4pm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq5sp9lz1am4eltpcx4pm.png" alt="Image description" width="800" height="258"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Demo : AWS CodeWhisperer integration with Cloud9 IDE
&lt;/h2&gt;

&lt;p&gt;&lt;u&gt;Prerequisite&lt;/u&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;An EC2 Environment created in Cloud9&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;u&gt;To activate CodeWhisperer in the AWS Cloud9 console code editor, complete these steps.&lt;/u&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Navigate to AWS Cloud9 Console &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpsh5pyacwya1az8h1el6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpsh5pyacwya1az8h1el6.png" alt="Image description" width="800" height="471"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Click Open link beside your Cloud9 Ec2 environment&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuc3f6vnl7cz2a59s6i9p.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuc3f6vnl7cz2a59s6i9p.png" alt="Image description" width="800" height="245"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Go to &lt;strong&gt;Preferences&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi9lo8ehfxitir7ou4w2e.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi9lo8ehfxitir7ou4w2e.png" alt="Image description" width="800" height="379"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ensure that the two options related to Code Whisperer is enabled on Project Settings --&amp;gt; AWS Toolkit&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fckhht3ohpu6l3815ijhr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fckhht3ohpu6l3815ijhr.png" alt="Image description" width="800" height="464"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;From inside your existing AWS Cloud9 environment, choose the AWS logo on the left edge of the window. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkp3f0agd8ch3zbavprwz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkp3f0agd8ch3zbavprwz.png" alt="Image description" width="800" height="423"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A panel will expand rightward.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgn08bte98vop6lv1b0gn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgn08bte98vop6lv1b0gn.png" alt="Image description" width="800" height="389"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;In the lower part of the panel, under Developer tools, open the CodeWhisperer dropdown and choose &lt;strong&gt;Enable CodeWhisperer&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2wqhypigujz3nqqkarkx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2wqhypigujz3nqqkarkx.png" alt="Image description" width="800" height="389"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;The following YouTube video illustrates the Creation of java program in Amazon Cloud9 IDE using Amazon Code Whisperer&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/Lj_B_jwvpYs"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Note: Delete the cloud9 ec2 environment after use&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>productivity</category>
      <category>ai</category>
      <category>java</category>
    </item>
    <item>
      <title>Game of Templates with AWS Cloud Formation: Simple and Templates with Intrinsic Functions, including ForEach and FindInMap</title>
      <dc:creator>Nandini Rajaram</dc:creator>
      <pubDate>Thu, 24 Aug 2023 22:35:21 +0000</pubDate>
      <link>https://forem.com/aws-builders/game-of-templates-with-aws-cloud-formation-simple-and-templates-with-intrinsic-functions-including-foreach-and-findinmap-hem</link>
      <guid>https://forem.com/aws-builders/game-of-templates-with-aws-cloud-formation-simple-and-templates-with-intrinsic-functions-including-foreach-and-findinmap-hem</guid>
      <description>&lt;h2&gt;
  
  
  AWS CloudFormation
&lt;/h2&gt;

&lt;p&gt;AWS CloudFormation is a service provided by Amazon Web Services (AWS) that allows you to define and manage your infrastructure as code.&lt;/p&gt;




&lt;h2&gt;
  
  
  Key Terms
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;CloudFormation templates&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A CloudFormation template is used to define your AWS resources in a structured text format, either YAML or JSON.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;CloudFormation stack&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A "stack" is a collection of AWS resources that may be managed as a single unit in AWS CloudFormation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;StackSet&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A named collection of stacks that have the same template but are applied to distinct accounts and regions. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Change Set&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A Change Set is a list of proposed changes that will be applied to a stack when you run an update. It serves as a preview method, allowing you to review and validate potential modifications before they are implemented in your infrastructure.&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%2Fr52jewywzn67lvt6t5rj.png" 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%2Fr52jewywzn67lvt6t5rj.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;u&gt;You are only charged for the resources you create and the API calls that CloudFormation performs on your behalf.&lt;/u&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  The Template Study
&lt;/h2&gt;

&lt;p&gt;Let's dive into the structure of an AWS CloudFormation template&lt;/p&gt;

&lt;p&gt;The following example shows an AWS CloudFormation YAML template structure and its top-level objects:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

AWSTemplateFormatVersion: 'version date' (optional) # version of the CloudFormation template. Only accepted value is '2010-09-09'

Description: 'String' (optional) # a text description of the Cloudformation template

Metadata: 'template metadata' (optional) # objects that provide additional information about the template

Parameters: 'set of parameters' (optional) # a set of inputs used to customize the template

Rules: 'set of rules' (optional) # a set of rules to validate the parameters provided at deployment/update

Mappings: 'set of mappings' (optional) # a mapping of keys and associated values

Conditions: 'set of conditions' (optional) # conditions that control whether certain resources are created

Transform: 'set of transforms' (optional) # for serverless applications

Resources: 'set of resources' (required) # a components of your infrastructure

Hooks: 'set of hooks' (optional) # Used for ECS Blue/Green Deployments

Outputs: 'set of outputs' (optional) # values that are returned whenever you view your stack's properties


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

&lt;/div&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%2Fvw3dvf024bxeqkkdlxe8.png" 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%2Fvw3dvf024bxeqkkdlxe8.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;Now, Its time for building some CloudFormation Templates and explore various features.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Lets begin the game now&lt;/em&gt;&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%2Fzidxyh2ur1qevh8brd5i.png" 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%2Fzidxyh2ur1qevh8brd5i.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Building Cloud Formation Templates
&lt;/h2&gt;




&lt;p&gt;&lt;strong&gt;&lt;u&gt;Simple Templates&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;u&gt;Template 1&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A Simple CloudFormation Template that creates an S3 Bucket&lt;/strong&gt;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

AWSTemplateFormatVersion: '2010-09-09'
Resources:
  MyS3Bucket:
    Type: 'AWS::S3::Bucket'
    Properties:
      BucketName: templateonebucket



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

&lt;/div&gt;

&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Replace &lt;u&gt;templateonebucket&lt;/u&gt; with a unique name for your S3 bucket. S3 bucket names are globally unique across all of AWS, so you may need to come up with a creative and unique name.&lt;/li&gt;
&lt;li&gt;Save this template in a &lt;strong&gt;.yaml file&lt;/strong&gt; and then use the AWS CloudFormation service to deploy it. &lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;p&gt;Lets Understand the above snippet&lt;/p&gt;

&lt;p&gt;Certainly! Let me explain each part of the CloudFormation template:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;AWSTemplateFormatVersion: '2010-09-09'&lt;/code&gt;:&lt;br&gt;
This specifies the version of the CloudFormation template format being used. In this case, it's set to the earliest version '2010-09-09'. This version indicates the overall structure and syntax of the template.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;Resources&lt;/code&gt;:&lt;br&gt;
The &lt;code&gt;Resources&lt;/code&gt; section is where you define the AWS resources you want to create or manage using this CloudFormation template. Resources can include things like EC2 instances, S3 buckets, DynamoDB tables and more. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;MyS3Bucket&lt;/code&gt;:&lt;br&gt;
This is the logical name of the resource being defined. In this case, it's an S3 bucket, and the logical name is &lt;code&gt;MyS3Bucket&lt;/code&gt;. You'll use this logical name later to refer to this resource in other parts of the template or when interacting with AWS services.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;Type: 'AWS::S3::Bucket'&lt;/code&gt;:&lt;br&gt;
This line specifies the type of AWS resource you want to create. In this case, you're creating an S3 bucket, so the &lt;code&gt;Type&lt;/code&gt; is set to &lt;code&gt;AWS::S3::Bucket&lt;/code&gt;. This tells CloudFormation that you want to create an S3 bucket resource.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;Properties&lt;/code&gt;:&lt;br&gt;
The &lt;code&gt;Properties&lt;/code&gt; section is where you provide the specific configuration for the resource you're creating. For an S3 bucket, there are various properties you can set, such as &lt;code&gt;BucketName&lt;/code&gt;, &lt;code&gt;AccessControl&lt;/code&gt;, &lt;code&gt;VersioningConfiguration&lt;/code&gt; etc&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;BucketName: templateonebucket:&lt;/code&gt;&lt;br&gt;
This is where you set the properties for the S3 bucket. In this example, you're setting the &lt;code&gt;BucketName&lt;/code&gt; property to &lt;strong&gt;templateonebucket&lt;/strong&gt;. &lt;br&gt;
Replace &lt;strong&gt;templateonebucket&lt;/strong&gt; with a unique name for your S3 bucket. As mentioned before, S3 bucket names must be globally unique across AWS, so make sure to choose a unique name.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Once you have this CloudFormation template ready, you can use the AWS CloudFormation service to deploy it. This will create an S3 bucket with the bucket name specified&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;&lt;u&gt;Template 2&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Create another s3 bucket with versioning enabled&lt;/strong&gt;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

AWSTemplateFormatVersion: '2010-09-09'
Resources:
  MyS3Bucket:
    Type: 'AWS::S3::Bucket'
    Properties:
     BucketName: mybucketname
     VersioningConfiguration:
        Status: Enabled


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

&lt;/div&gt;

&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Replace &lt;u&gt;mybucketname&lt;/u&gt; with a unique name for your S3 bucket. S3 bucket names are globally unique across all of AWS, so you may need to come up with a creative and unique name.&lt;/li&gt;
&lt;li&gt;Save this template in a &lt;strong&gt;.yaml file&lt;/strong&gt; and then use the AWS CloudFormation service to deploy it. &lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;code&gt;VersioningConfiguration&lt;/code&gt; is a property that sets the versioning configuration for the bucket.&lt;br&gt;
&lt;code&gt;Status&lt;/code&gt;is set to Enabled to enable versioning for the bucket.&lt;/p&gt;


&lt;h2&gt;
  
  
  Intrinsic functions
&lt;/h2&gt;

&lt;p&gt;Intrinsic functions are AWS CloudFormation built-in functions that you may use within CloudFormation templates to dynamically produce values, apply conditionals, and control resource characteristics. &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;You can use intrinsic functions in resource properties, outputs, metadata attributes, and update policy attributes.&lt;/p&gt;
&lt;/blockquote&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%2Fffg0khqu6bett6gtin6g.png" 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%2Fffg0khqu6bett6gtin6g.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Lets dive into some commonly used intrinsic functions in CloudFormation&lt;/strong&gt;&lt;/p&gt;



&lt;p&gt;&lt;strong&gt;&lt;u&gt;Ref&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This function is used to reference a resource declared within the same CloudFormation stack. It returns the value of the specified resource's logical name.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;u&gt;Template 3&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A simple S3 bucket with the name of the bucket getting displayed in output tab using &lt;code&gt;Ref&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

AWSTemplateFormatVersion: '2010-09-09'
Resources:
  MyS3Bucket:
    Type: 'AWS::S3::Bucket'
    Properties:
      BucketName: my-unique-bucket-name

Outputs:
  BucketNameOutput:
    Description: "Name of the S3 bucket"
    Value: !Ref MyS3Bucket



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

&lt;/div&gt;
&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Replace &lt;u&gt;my-unique-bucket-name&lt;/u&gt; with a unique name for your S3 bucket. S3 bucket names are globally unique across all of AWS, so you may need to come up with a creative and unique name.&lt;/li&gt;
&lt;li&gt;Save this template in a &lt;strong&gt;.yaml file&lt;/strong&gt; and then use the AWS CloudFormation service to deploy it. &lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;We define an output named &lt;code&gt;BucketNameOutput&lt;/code&gt; to display the name of the created S3 bucket. &lt;/li&gt;
&lt;li&gt;We use the &lt;strong&gt;!Ref&lt;/strong&gt; function to reference the &lt;code&gt;MyS3Bucket&lt;/code&gt; resource, which returns the logical name of the resource, in this case, &lt;code&gt;MyS3Bucket&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Outputs&lt;/strong&gt; in CloudFormation provide a way to make important information available after your infrastructure has been deployed. This can include resource identifiers, endpoints, URLs, and more. By defining outputs, you can make your CloudFormation stacks more flexible and interconnected, enabling you to build complex and dynamic infrastructures.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;In Summary, When you deploy this CloudFormation template, it will create an S3 bucket with the specified name, and the output &lt;code&gt;BucketNameOutput&lt;/code&gt; will display the logical name of the bucket resource (MyS3Bucket).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can View the output value on the AWS CloudFormation console , in the &lt;strong&gt;Outputs&lt;/strong&gt; tab.&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%2Fd207ju66a8r98mkb21np.png" 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%2Fd207ju66a8r98mkb21np.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;



&lt;p&gt;&lt;strong&gt;&lt;u&gt;Fn::Join&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This function joins values together using a delimiter to create a single string. It's often used to construct resource names or ARNs&lt;/p&gt;

&lt;p&gt;Every &lt;strong&gt;Fn::Join&lt;/strong&gt; object requires two parameters, &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;a string delimiter &lt;/li&gt;
&lt;li&gt;a list of strings to be joined or a function that returns a list of strings to be joined.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;&lt;u&gt;Template 4&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A simple S3 bucket with bucket  name getting generated using &lt;code&gt;Fn:Join&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

AWSTemplateFormatVersion: '2010-09-09'
Resources:
  MyS3Bucket:
    Type: 'AWS::S3::Bucket'
    Properties:
      BucketName:
        Fn::Join:
          - '-'
          - - 'my-bucket-prefix'
            -  Ref: 'AWS::Region'
            - 'unique-id'



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

&lt;/div&gt;
&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Save this template in a &lt;strong&gt;.yaml file&lt;/strong&gt; and then use the AWS CloudFormation service to deploy it. &lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;Under the &lt;strong&gt;Resources&lt;/strong&gt; section, we define an S3 bucket resource named MyS3Bucket.&lt;/li&gt;
&lt;li&gt;&lt;p&gt;We use the &lt;code&gt;Fn::Join&lt;/code&gt; intrinsic function to dynamically generate the bucket name. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;As the &lt;code&gt;Fn::Join&lt;/code&gt; function takes two arguments:&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;The delimiter to use to join the elements (in this case, a hyphen -)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;A list of elements to join together&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Inside the list of elements, we include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt; A static string 'my-bucket-prefix'.&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;Ref&lt;/strong&gt; intrinsic function referencing the AWS region. This will be replaced with the actual AWS region where the stack is being created.&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Another static string 'unique-id'.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The resulting bucket name will be something like: &lt;code&gt;my-bucket-prefix-us-east-2-unique-id&lt;/code&gt;, where &lt;strong&gt;us-east-2&lt;/strong&gt; being  the actual AWS region I use the CloudFormation service&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&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%2Fatoh0vg11jr2czce1pif.png" 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%2Fatoh0vg11jr2czce1pif.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;



&lt;p&gt;&lt;strong&gt;&lt;u&gt;Fn::Sub&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;Fn::Sub&lt;/code&gt; intrinsic function in AWS CloudFormation is used for variable substitution in strings. It allows you to create dynamic strings by substituting variables with their corresponding values from resources, parameters, or intrinsic functions&lt;/p&gt;

&lt;p&gt;Syntax:&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

Fn::Sub:
  - "string to substitute ${variable}"
  - { "variable": value }



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

&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;&lt;u&gt;Template 5 &lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A simple S3 bucket with a bucket name derived by the value of the Environment variable using &lt;code&gt;Fn::Sub&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

AWSTemplateFormatVersion: '2010-09-09'
Resources:
  MyBucket:
    Type: 'AWS::S3::Bucket'
    Properties:
      BucketName:
        Fn::Sub:
          - "my-awesome-bucket-${Environment}"
          - { "Environment": "production" }



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

&lt;/div&gt;
&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Save this template in a &lt;strong&gt;.yaml file&lt;/strong&gt; and then use the AWS CloudFormation service to deploy it. &lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Under the Resources section, we define an S3 bucket resource named &lt;strong&gt;MyBucket&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The BucketName property of the S3 bucket resource uses the &lt;code&gt;Fn::Sub&lt;/code&gt; intrinsic function to create a dynamic bucket name.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The first argument is the string template with a variable ${Environment} that needs to be replaced.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The second argument to &lt;code&gt;Fn::Sub&lt;/code&gt; is a JSON object that specifies the values of the variables used in the string template.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;In this case, &lt;code&gt;{"Environment": "production"}&lt;/code&gt; means that &lt;code&gt;${Environment}&lt;/code&gt; will be replaced with the value "production".&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;After deployment, the bucket name will be &lt;code&gt;my-awesome-bucket-production&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&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%2Fghlvbp5fjc0pbqlbbsm3.png" 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%2Fghlvbp5fjc0pbqlbbsm3.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;



&lt;p&gt;&lt;u&gt;&lt;strong&gt;Fn::GetAtt&lt;/strong&gt;&lt;/u&gt;&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;Fn::GetAtt&lt;/code&gt; intrinsic function returns the value of an attribute from a resource in the template.&lt;/p&gt;

&lt;p&gt;Syntax&lt;/p&gt;

&lt;p&gt;&lt;code&gt;!GetAtt logicalNameOfResource.attributeName&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;u&gt;Template 6 &lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Create an  S3 bucket resource, along with a few outputs being generated using &lt;code&gt;Fn::GetAtt&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

AWSTemplateFormatVersion: '2010-09-09'
Resources:
  MyS3Bucket:
    Type: AWS::S3::Bucket
    Properties:
      BucketName: my-unique-bucket-name

Outputs:
  BucketName:
    Value: !Ref MyS3Bucket
  BucketArn:
    Value: !GetAtt MyS3Bucket.Arn
  BucketDomainName:
    Value: !GetAtt MyS3Bucket.DomainName



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

&lt;/div&gt;
&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Replace &lt;u&gt;my-unique-bucket-name&lt;/u&gt; with a unique name for your S3 bucket. S3 bucket names are globally unique across all of AWS, so you may need to come up with a creative and unique name.&lt;/li&gt;
&lt;li&gt;Save this template in a &lt;strong&gt;.yaml file&lt;/strong&gt; and then use the AWS CloudFormation service to deploy it. &lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;MyS3Bucket&lt;/code&gt; is defined as an S3 bucket resource with a specified unique bucket name.&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;BucketName&lt;/strong&gt; output uses &lt;code&gt;!Ref&lt;/code&gt; to reference the bucket resource, effectively providing the name of the bucket.&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;BucketArn&lt;/strong&gt; output uses &lt;code&gt;!GetAtt&lt;/code&gt; to retrieve the Amazon Resource Name (ARN) of the bucket resource.&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;BucketDomainName&lt;/strong&gt; output uses &lt;code&gt;!GetAtt&lt;/code&gt; to retrieve the domain name of the bucket.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can View the output values on the AWS CloudFormation console , in the &lt;strong&gt;Outputs&lt;/strong&gt; tab.&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%2Fy19853wznbb5k8lyaigg.png" 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%2Fy19853wznbb5k8lyaigg.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;



&lt;p&gt;&lt;u&gt;&lt;strong&gt;Fn::Select&lt;/strong&gt;&lt;/u&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The &lt;code&gt;Fn::Select&lt;/code&gt; intrinsic function in AWS CloudFormation is used to select an element from a list based on its index. It's commonly used when you have a list of items and you want to retrieve a specific item from that list.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Syntax:&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

Fn::Select: [ index, listOfItems ]



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

&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;index&lt;/code&gt;: The zero-based index of the item you want to select from the list.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;listOfItems&lt;/code&gt;: The list of items from which you want to select an item.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;The &lt;code&gt;!Select&lt;/code&gt; function allows you to dynamically select values based on their indices, enabling you to parameterize and customize your resource properties within the template.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;&lt;u&gt;Template 7 &lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Creates an AWS S3 bucket resource named MyBucket with a specific bucket name generated using &lt;code&gt;Fn::Select&lt;/code&gt; function&lt;/strong&gt;  &lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

AWSTemplateFormatVersion: '2010-09-09'
Resources:
  MyBucket:
    Type: AWS::S3::Bucket
    Properties:
      BucketName: !Select [1, ["my-bucket-1", "my-bucket-2", "my-bucket-3"]]



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

&lt;/div&gt;
&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Replace &lt;u&gt;my-bucket-1,my-bucket-2,my-bucket-3&lt;/u&gt; with a unique name for your S3 bucket. S3 bucket names are globally unique across all of AWS, so you may need to come up with a creative and unique name.&lt;/li&gt;
&lt;li&gt;Save this template in a &lt;strong&gt;.yaml file&lt;/strong&gt; and then use the AWS CloudFormation service to deploy it. &lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;AWSTemplateFormatVersion: '2010-09-09'&lt;/code&gt;: This indicates the version of the CloudFormation template format being used. In this case, the template is using the 2010-09-09 version.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;Resources&lt;/code&gt;: This section defines the AWS resources that you want to create or manage using the CloudFormation template.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;MyBucket:&lt;/code&gt; This is the logical ID of the AWS S3 bucket resource being created.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;Type: AWS::S3::Bucket:&lt;/code&gt;This specifies the resource type as an S3 bucket. It indicates that CloudFormation should create an S3 bucket resource.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;Properties&lt;/code&gt;: This section contains the properties specific to the resource being created. In this case, it's the properties of the S3 bucket resource.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;BucketName&lt;/code&gt;: This property specifies the name of the S3 bucket. The value is retrieved using the !Select intrinsic function.&lt;/p&gt;

&lt;p&gt;-&lt;code&gt;!Select [1, ["my-bucket-1", "my-bucket-2", "my-bucket-3"]]&lt;/code&gt;: This uses the &lt;code&gt;!Select&lt;/code&gt; function to select an element from a list.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The arguments are as follows:

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;1&lt;/code&gt;: This is the index of the element to be selected. Since &lt;strong&gt;indices are zero-based&lt;/strong&gt;, 1 corresponds to the second element in the list.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;["my-bucket-1", "my-bucket-2", "my-bucket-3"&lt;/code&gt;]: This is the list of bucket names. The second element in this list is "&lt;code&gt;my-bucket-2&lt;/code&gt;".&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;When this CloudFormation template is executed, it will create an S3 bucket resource named &lt;strong&gt;MyBucket&lt;/strong&gt; with the bucket name "&lt;u&gt;my-bucket-2&lt;/u&gt;". &lt;/p&gt;
&lt;/blockquote&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%2Fxkyjycjqq0h6eypdiufb.png" 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%2Fxkyjycjqq0h6eypdiufb.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;



&lt;p&gt;&lt;u&gt;&lt;strong&gt;Fn::Split&lt;/strong&gt;&lt;/u&gt;&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;Fn::Split&lt;/code&gt; intrinsic function in AWS CloudFormation is used to split a string into a list of substrings based on a specified delimiter. &lt;/p&gt;

&lt;p&gt;Syntax:&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

Fn::Split: [ delimiter, sourceString ]



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

&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;&lt;u&gt;Template 8 &lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Add a tag for the S3 bucket resource &lt;code&gt;MyBucket&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

AWSTemplateFormatVersion: '2010-09-09'
Resources:
  MyS3Bucket:
    Type: 'AWS::S3::Bucket'
    Properties:
      BucketName: my-bucket-name
      Tags:
        - Key: Name
          Value:
            'Fn::Select':
              - 1
              - 'Fn::Split':
                  - '-'
                  - my-bucket-name




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

&lt;/div&gt;
&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Replace &lt;u&gt;my-bucket-name&lt;/u&gt; with a unique name for your S3 bucket. S3 bucket names are globally unique across all of AWS, so you may need to come up with a creative and unique name.&lt;/li&gt;
&lt;li&gt;Save this template in a &lt;strong&gt;.yaml file&lt;/strong&gt; and then use the AWS CloudFormation service to deploy it. &lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;AWSTemplateFormatVersion: '2010-09-09&lt;/code&gt;': This line specifies the version of the CloudFormation template format being used. In this case, it's the 2010-09-09 version.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;Resources:&lt;/code&gt; This section defines the AWS resources that you want to create or manage using the CloudFormation template.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;MyBucket:&lt;/code&gt; This is the logical ID of the AWS S3 bucket resource being created.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;Type: AWS::S3::Bucket:&lt;/code&gt; This line indicates that the resource type being created is an S3 bucket. The CloudFormation template will create an S3 bucket resource.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;Properties&lt;/code&gt;: This section contains the properties specific to the S3 bucket resource.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;BucketName: my-bucket-name:&lt;/code&gt; This sets the name of the S3 bucket to "my-bucket-name".&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;Tags&lt;/code&gt;: This property allows you to assign tags to the S3 bucket. &lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Tags are key-value pairs used to label and categorize resources for better organization and management.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;-&lt;code&gt;Key: Name:&lt;/code&gt; This defines a tag with the key &lt;strong&gt;"Name"&lt;/strong&gt; The key represents the label or category of the tag.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;Value:&lt;/code&gt; The value of the tag is determined using the &lt;code&gt;Fn::Select&lt;/code&gt; and &lt;code&gt;Fn::Split&lt;/code&gt; intrinsic functions.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;Fn::Split&lt;/code&gt;: This function is used to split the string "&lt;code&gt;my-bucket-name&lt;/code&gt;" into a list of substrings using the "&lt;code&gt;-&lt;/code&gt;" delimiter. The result is a list of substrings: &lt;code&gt;["my", "bucket", "name"]&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;Fn::Select:&lt;/code&gt; This function is used to select an element from the list of substrings. In this case, the second element ("&lt;strong&gt;bucket&lt;/strong&gt;") is selected using an index of &lt;strong&gt;1&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;As a result, the S3 bucket resource MyBucket will have a tag with the key "&lt;strong&gt;Name&lt;/strong&gt;" and the value "&lt;strong&gt;bucket&lt;/strong&gt;." &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;You can view the tags on the properties tab of your bucket in S3 Console&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%2Fqtxman01pc93lfxuwcf9.png" 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%2Fqtxman01pc93lfxuwcf9.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The dynamic tagging is achieved by using &lt;code&gt;Fn::Split&lt;/code&gt; to manipulate the string "&lt;u&gt;my-bucket-name&lt;/u&gt;" and &lt;code&gt;Fn::Select&lt;/code&gt; to select the desired substring for the tag value.&lt;/p&gt;
&lt;/blockquote&gt;



&lt;p&gt;&lt;u&gt;&lt;strong&gt;Fn::ForEach&lt;/strong&gt;&lt;/u&gt;&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;Fn::ForEach&lt;/code&gt; intrinsic function takes a collection and a fragment, and applies the items in the collection to the identifier in the provided fragment&lt;/p&gt;

&lt;p&gt;Syntax:&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

Fn::ForEach::UniqueLoopName:
    - Identifier
    - - Value1 # Collection
      - Value2
    - OutputKey:
        OutputValue



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

&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;UniqueLoopName&lt;/code&gt;
A name for this loop.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Identifier&lt;/code&gt;
The identifier you want to replace in the OutputKey and OutputValue parameters that represent the template fragment that is replicated&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;Collection&lt;/code&gt;&lt;br&gt;
The collection of values to iterate over. This can be an array in this parameter, or it can be a Ref to a CommaDelimitedList.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;OutputKey&lt;/code&gt;&lt;br&gt;
The key in the transformed template. ${Identifier} must be included within the OutputKey parameter.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;OutputValue&lt;/code&gt;&lt;br&gt;
The value that is replicated in the transformed template for each item in the Collection parameter&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;u&gt;You must use the &lt;code&gt;AWS::LanguageExtensions&lt;/code&gt; transform to use the Fn::ForEach intrinsic function.&lt;/u&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;&lt;u&gt;Template 9 &lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Using the &lt;code&gt;Fn::ForEach&lt;/code&gt; intrinsic function, create S3 buckets with versioning enabled,  by looping through a list of bucket names and building S3 buckets with those names&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

AWSTemplateFormatVersion: 2010-09-09
Transform: 'AWS::LanguageExtensions'
Resources:
  Fn::ForEach::Buckets:
    - BucketName
    - - my-unique-bucket-name-one
      - my-unique-bucket-name-two
    - ${BucketName}:
        Type: AWS::S3::Bucket
        Properties:
          BucketName: !Ref BucketName
          VersioningConfiguration:
             Status: Enabled


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

&lt;/div&gt;
&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Replace &lt;u&gt;my-unique-bucket-name-one &lt;/u&gt; and &lt;u&gt;my-unique-bucket-name-two&lt;/u&gt;  with a unique names for your S3 buckets. S3 bucket names are globally unique across all of AWS, so you may need to come up with a creative and unique name.&lt;/li&gt;
&lt;li&gt;Save this template in a &lt;strong&gt;.yaml file&lt;/strong&gt; and then use the AWS CloudFormation service to deploy it. &lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Transform: &lt;code&gt;AWS::LanguageExtensions:&lt;/code&gt; This indicates that you're using a custom CloudFormation transform named &lt;code&gt;AWS::LanguageExtensions&lt;/code&gt;. This transform extends the template syntax with additional capabilities, and in this case, it's used to enable the Fn::ForEach functionality.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;Resources&lt;/code&gt;: This is where you define your CloudFormation resources.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;Fn::ForEach::Buckets:&lt;/code&gt; This is the resource defined with the &lt;code&gt;Fn::ForEach&lt;/code&gt; intrinsic function. It iterates over the list of bucket names and creates S3 bucket resources for each name.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;BucketName:&lt;/code&gt; This is the logical ID for the iteration. This 
is the parameter for the iteration, representing the list of 
bucket names that you want to iterate over.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;my-unique-bucket-name-one&lt;/code&gt; and &lt;code&gt;my-unique-bucket-name-two&lt;/code&gt; : These are the actual bucket names specified in the list. Each name represents an iteration.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;${BucketName}&lt;/code&gt;: This is the dynamic reference to the iteration variable. It's used to create the logical IDs for the S3 buckets.&lt;/p&gt;

&lt;p&gt;Type: &lt;code&gt;AWS::S3::Bucket:&lt;/code&gt; This specifies that the resource type is an S3 bucket.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;BucketName: !Ref BucketName:&lt;/code&gt; This sets the name of the S3 bucket based on the value of the &lt;strong&gt;BucketName&lt;/strong&gt; parameter.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;VersioningConfiguration:&lt;/code&gt; This defines the bucket's versioning configuration.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Status: Enabled:&lt;/code&gt; This enables versioning for the S3 bucket.&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%2Fg9bbqhzaj8645bvqxjfy.png" 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%2Fg9bbqhzaj8645bvqxjfy.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt; With &lt;code&gt;Fn::ForEach&lt;/code&gt;, you can replicate parts of your templates with minimal lines of code.&lt;/li&gt;
&lt;li&gt;You can use &lt;code&gt;Fn::ForEach&lt;/code&gt; to simplify your template layout and make it easier and faster for you and your peers to review your code. &lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Fn::ForEach&lt;/code&gt; helps reduce human errors such as updating wrong properties or missing out on updating multiple target properties in your template.&lt;/li&gt;
&lt;/ul&gt;



&lt;p&gt;&lt;strong&gt;&lt;u&gt; Fn::FindInMap&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The Fn::FindInMap intrinsic function is used in AWS CloudFormation templates to retrieve a value from a predefined mapping. This function is particularly useful when you want to parameterize or customize resources based on certain conditions, such as regions or environments.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;A Mappings section is a top level section of a CloudFormation template. It is used to define maps, their keys and values which can be then referenced in your template. &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;When you include the &lt;code&gt;AWS::LanguageExtensions&lt;/code&gt; transform in an AWS CloudFormation template, you can define the fields of &lt;code&gt;Fn::FindInMap&lt;/code&gt; using intrinsic functions. so that, If no mapping is detected, you can utilize a new optional field to return a default value.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;u&gt;Template 10 &lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Create S3 buckets with names based on AWS regions, while also providing a default bucket name in case a specific region mapping is not defined. using &lt;code&gt;!FindInMap&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

AWSTemplateFormatVersion: '2010-09-09'
Transform: 'AWS::LanguageExtensions'
Mappings:
  S3BucketNames:
    us-east-1:
      BucketName: my-bucket-us-east-1
    us-west-1:
      BucketName: my-bucket-us-west-1

Resources:
  MyS3Bucket:
    Type: AWS::S3::Bucket
    Properties:
      BucketName:
        Fn::FindInMap:
          - S3BucketNames
          - !Ref AWS::Region
          - BucketName
          - DefaultValue: my-default-bucket


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

&lt;/div&gt;
&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Replace &lt;u&gt;my-default-bucket&lt;/u&gt;, &lt;u&gt;my-bucket-us-east-1 &lt;/u&gt; and &lt;u&gt;my-bucket-us-west-1&lt;/u&gt;  with a unique names for your S3 buckets. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;S3 bucket names are globally unique across all of AWS&lt;/strong&gt;&lt;br&gt;
so you may need to come up with a creative and unique name.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Save this template in a &lt;strong&gt;.yaml file&lt;/strong&gt; and then use the AWS CloudFormation service to deploy it.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Try deploying the template in &lt;code&gt;us-east-1,&lt;/code&gt; &lt;code&gt;us-west-&lt;/code&gt;1 and &lt;code&gt;us-west-2&lt;/code&gt; regions.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;p&gt;The above CloudFormation template showcases the usage of the &lt;code&gt;AWS::LanguageExtensions&lt;/code&gt; transform along with the &lt;code&gt;Fn::FindInMap&lt;/code&gt; function and a default value extension. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Transform: &lt;code&gt;'AWS::LanguageExtensions'&lt;/code&gt;: This line indicates that the CloudFormation template is using the AWS::LanguageExtensions transform, which allows the use of language extensions like default values for intrinsic functions.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;Mappings&lt;/code&gt;: Defines a mapping named S3BucketNames, which associates different S3 bucket names with different AWS regions.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;S3BucketNames&lt;/code&gt;: This key under the Mappings section contains the mapping for S3 bucket names based on regions.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;us-east-1&lt;/code&gt; and &lt;code&gt;us-west-1&lt;/code&gt;: These region keys under the S3BucketNames mapping correspond to different AWS regions. For each region, there's a sub-key &lt;code&gt;BucketName&lt;/code&gt; that holds the corresponding bucket name.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;Resources:&lt;/code&gt; Specifies the AWS resources created as part of this CloudFormation stack.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;MyS3Bucket:&lt;/code&gt; Defines an S3 bucket resource.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;Type: AWS::S3::Bucket:&lt;/code&gt; Indicates that this resource represents an S3 bucket.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Properties: Sets the properties for the &lt;code&gt;MyS3Bucket&lt;/code&gt; resource.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;BucketName&lt;/code&gt;: This property designates the bucket name of the S3 bucket. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The &lt;code&gt;Fn::FindInMap&lt;/code&gt; function is used to dynamically retrieve the bucket name based on the AWS region of the stack ( &lt;code&gt;!Ref AWS::Region&lt;/code&gt;).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There is a twist here, &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;DefaultValue: my-default-bucket:&lt;/code&gt; This extension, facilitated by the &lt;code&gt;AWS::LanguageExtensions&lt;/code&gt; transform, allows specification of a fallback value if the specific mapping key isn't found.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In this scenario, if the stack is deployed in a region not included in the &lt;code&gt;S3BucketNames&lt;/code&gt; mapping, such as a region other than &lt;code&gt;us-east-1&lt;/code&gt; or &lt;code&gt;us-west-1&lt;/code&gt;, the bucket name will default to &lt;br&gt;
&lt;code&gt;my-default-bucket&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;If you try to deploy the CloudFormation Template in regions say &lt;br&gt;
&lt;strong&gt;US West (Oregon), us-west-2&lt;/strong&gt; (which is not mentioned in mapping-S3BucketNames) The name of the bucket would be &lt;strong&gt;my-default-bucket&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you try to deploy the cloudformation Template in regions say &lt;br&gt;
&lt;strong&gt;US East (N. Virginia) us-east-1&lt;/strong&gt; The name of the bucket would be &lt;strong&gt;my-bucket-us-east-1&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you try to deploy the cloudformation Template in regions say &lt;br&gt;
&lt;strong&gt;US West (N. California) us-west-1&lt;/strong&gt; The name of the bucket would be  &lt;strong&gt;my-bucket-us-west-1&lt;/strong&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  Create CloudFormation stacks using the AWS Management Console
&lt;/h2&gt;

&lt;p&gt;The following YouTube video illustrate how you can create a CloudFormation stack using the console.&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/fcRWs8G-80Y"&gt;
&lt;/iframe&gt;
&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Deleting a CloudFormation stack will remove all resources created by that stack. So once you have finished learning, You can delete the stacks&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>aws</category>
      <category>cloud</category>
      <category>programming</category>
    </item>
    <item>
      <title>Build a Quick Game using Amazon GameLift service</title>
      <dc:creator>Nandini Rajaram</dc:creator>
      <pubDate>Sun, 28 May 2023 22:36:34 +0000</pubDate>
      <link>https://forem.com/aws-builders/build-a-quick-game-using-amazon-gamelift-service-58a0</link>
      <guid>https://forem.com/aws-builders/build-a-quick-game-using-amazon-gamelift-service-58a0</guid>
      <description>&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqgfn4ex2s3cn0lk62cgj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqgfn4ex2s3cn0lk62cgj.png" alt="Image description" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Game software&lt;/strong&gt; is created using a game engine, such as Unity, Unreal, or Lumberyard, and is then run on the player's gaming device, such as a game console, computer, phone, tablet, TV set top box, or web browser.&lt;/p&gt;

&lt;h2&gt;
  
  
  Game Server
&lt;/h2&gt;

&lt;p&gt;A game server is a piece of software that manages multi-player activities and offers accurate game state. it also communicates and provides services to the Game Software during gameplay.&lt;/p&gt;

&lt;p&gt;The Game Server software runs on an EC2 instance on AWS.&lt;/p&gt;

&lt;h1&gt;
  
  
  Game Hosting Service
&lt;/h1&gt;

&lt;p&gt;The system that provisions game server instance and manages the loading and running of the Game Server is called the Hosting Service. The minimum work that a Game Server Hosting Service performs is infrastructure Management (provisioning compute resources on which to host Game Servers)&lt;/p&gt;

&lt;p&gt;AWS Game Server hosting solutions go far beyond that. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Session Management involves staying connected to the Game Server&lt;/li&gt;
&lt;li&gt;Reporting information like the available slots in a multiplayer game. &lt;/li&gt;
&lt;li&gt;Recognizing when a game session has ended, or when a new game session is started and whether it is currently ready to receive players or not.&lt;/li&gt;
&lt;li&gt;Finding an available Game Server to host a game that is within latency tolerances and located near players (Game Session Placement)&lt;/li&gt;
&lt;li&gt;Shifting placement to different regions as availability of instances and location of player demand changes. &lt;/li&gt;
&lt;li&gt; Matchmaking where multiple players can request to play a game together on the same Game Server&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  Amazon GameLift
&lt;/h1&gt;

&lt;p&gt;Amazon GameLift is a managed service that provides Game Server hosting abstractions on top of Amazon EC2. GameLift is designed for session-based games. It has features to build multiplayer games and battle royale games with 100 or more players. And it scales to multiple Regions and globally.&lt;/p&gt;

&lt;h2&gt;
  
  
  Fleet
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Instances are grouped into fleets and are composed of identical instances.&lt;/li&gt;
&lt;li&gt;Each instance is loaded with Game Server software, which is used to start one or more Game Sessions. &lt;/li&gt;
&lt;li&gt; A fleet can be manually or automatically scaled&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;GameLift  supports for Spot Instances.&lt;/strong&gt; This can provide up to 70 percent cost savings compared to existing on-premises deployments. &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0j1pygiadplzfr0vg06t.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0j1pygiadplzfr0vg06t.png" alt="Image description" width="543" height="537"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GameLift includes a feature called FleetIQ&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  FleetIQ
&lt;/h2&gt;

&lt;p&gt;FleetIQ manages availability by backing it up with an On Demand fleet and designating the Spot fleet as unavailable to maintain the quality of the gaming experience. This minimizes Spot disruption of game sessions. &lt;/p&gt;

&lt;h2&gt;
  
  
  Queue
&lt;/h2&gt;

&lt;p&gt;Fleets are placed in a queue. When a request comes in to play a game, the system uses the queue to find an acceptable fleet and identify an available Game Session. &lt;/p&gt;

&lt;p&gt;The game software measures latency to regional endpoints and provides this information in the game request. The lowest-latency fleet is selected. If it is not available or has no open Game Sessions, the next one is chosen. The system is also aware of fleet costs, and it will choose an available lower-cost Spot fleet before an equivalent On-Demand fleet when other factors are equal. You can set up multiple queues for global Game Server hosting.&lt;/p&gt;

&lt;h2&gt;
  
  
  FlexMatch
&lt;/h2&gt;

&lt;p&gt;Amazon GameLift’s FlexMatch capabilities let you match players together based on rules you define. &lt;/p&gt;

&lt;p&gt;For example, you can have a rule for the game that the match be accepted by all the players before the Game Session is placed. &lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Lets Build a game now&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Navigate to Amazon GameLift console&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft2xg2lk4fw38j1nrdp3y.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft2xg2lk4fw38j1nrdp3y.png" alt="Image description" width="800" height="249"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;On the left pane, click &lt;strong&gt;Try a Sample game&lt;/strong&gt; link&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs4kpylcxv3zu2dwv4q9m.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs4kpylcxv3zu2dwv4q9m.png" alt="Image description" width="800" height="394"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You will be navigated to Try a sample game page where create and deploy a sample game server using Amazon GameLift.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Click &lt;strong&gt;Add build&lt;/strong&gt; button which will Create an example game build.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fescfylio1nkzsibmixvu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fescfylio1nkzsibmixvu.png" alt="Image description" width="800" height="392"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Once build is added, Click &lt;strong&gt;Create fleet&lt;/strong&gt; button to run the sample game&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Finzpz9hyund8f5m03hjx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Finzpz9hyund8f5m03hjx.png" alt="Image description" width="800" height="288"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Fleet creation might take some time to complete&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe6eyf1cpzwmscxdg8fzl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe6eyf1cpzwmscxdg8fzl.png" alt="Image description" width="800" height="332"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Once the fleet is created, &lt;strong&gt;Click Start game session&lt;/strong&gt; button &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzlu08ie35qv4t7tvi229.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzlu08ie35qv4t7tvi229.png" alt="Image description" width="800" height="309"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Now, Click &lt;strong&gt;Generate player token&lt;/strong&gt; button and connect up to 8 players to the game&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flv6gs0kp8x78g407ptis.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flv6gs0kp8x78g407ptis.png" alt="Image description" width="800" height="339"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt; You will be navigated to Connect Players screen where you need to download and open game client by clicking &lt;strong&gt;Download game client&lt;/strong&gt; button&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3ggcluzal14cvzlaxyiy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3ggcluzal14cvzlaxyiy.png" alt="Image description" width="800" height="471"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt; For every game client session,  a player token need to be generated and this need to be pasted it to the client.  Click &lt;strong&gt;Generate player token&lt;/strong&gt; button to generate Player token and copy the token by clicking copy button&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdq3y8k05nmsamykwbceq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdq3y8k05nmsamykwbceq.png" alt="Image description" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt; Extract the GameLiftClientPackage and open the Bin64vc141.Release\MultiplayerSampleLauncher.exe to launch the game&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff3fslbrlxbct86hc52vt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff3fslbrlxbct86hc52vt.png" alt="Image description" width="800" height="474"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt; Click the player session token text area, and paste the player token copied &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz3ta0wmcjsiof1lo3fru.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz3ta0wmcjsiof1lo3fru.png" alt="Image description" width="800" height="417"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Now, Click &lt;strong&gt;Connect&lt;/strong&gt; button and start playing the game&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgot49mm78xucdb2vj0gi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgot49mm78xucdb2vj0gi.png" alt="Image description" width="800" height="471"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;Now that we have successfully built a game and the take away is &lt;/p&gt;

&lt;p&gt;Amazon GameLift is an ideal solution for hosting multiplayer games with the most focus on developing the Game Server and the least work required on development operations. &lt;/p&gt;

&lt;p&gt;Quit the game and  Delete the resources once you have finished playing the game&lt;/p&gt;

</description>
      <category>gamedev</category>
      <category>beginners</category>
      <category>programming</category>
      <category>aws</category>
    </item>
    <item>
      <title>An ETL Job using AWS Glue Studio to inner join DynamoDB tables, Apply Queries and Store the result in S3</title>
      <dc:creator>Nandini Rajaram</dc:creator>
      <pubDate>Thu, 23 Mar 2023 01:27:26 +0000</pubDate>
      <link>https://forem.com/aws-builders/an-etl-job-using-aws-glue-studio-to-inner-join-dynamodb-tables-apply-queries-and-store-the-result-in-s3-5gb6</link>
      <guid>https://forem.com/aws-builders/an-etl-job-using-aws-glue-studio-to-inner-join-dynamodb-tables-apply-queries-and-store-the-result-in-s3-5gb6</guid>
      <description>&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxr4e4pllaytk3sk8gapb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxr4e4pllaytk3sk8gapb.png" alt="Image description" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  ETL Jobs
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;ETL&lt;/strong&gt; stands for &lt;strong&gt;extract, transform, and load.&lt;/strong&gt; And this is the most common paradigm for combining data from various systems into a single database, data store, or warehouse for legacy storage or analytics.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;u&gt;&lt;strong&gt;Extraction&lt;/strong&gt;&lt;/u&gt;&lt;br&gt;
Extraction is the process of retrieving data from one or more sources. Following data retrieval, ETL is to compute work that loads the data into a staging area and prepares it for the next phase.&lt;br&gt;
&lt;u&gt;&lt;strong&gt;Transformation&lt;/strong&gt;&lt;/u&gt;&lt;br&gt;
Transformation is the process of mapping, reformatting and other operations to prepare data for consumption.&lt;br&gt;
&lt;u&gt;&lt;strong&gt;Loading&lt;/strong&gt;&lt;/u&gt;&lt;br&gt;
Loading involves successfully inserting the transformed data into the target database, data store or data warehouse.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;All of this work is processed in what the business intelligent developers call an ETL job.&lt;/p&gt;




&lt;h2&gt;
  
  
  AWS Glue
&lt;/h2&gt;

&lt;p&gt;AWS Glue is the key service that integrates data over a data lake, data warehouse, and purpose-built data stores which simplifies data movements from multiple sources&lt;/p&gt;

&lt;h2&gt;
  
  
  AWS Glue Studio
&lt;/h2&gt;

&lt;p&gt;AWS Glue Studio is an easy-to-use graphical interface for creating, running, and monitoring AWS Glue extract, transform, and load (ETL) jobs.&lt;/p&gt;




&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhry0agn1pb9m9k934ngo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhry0agn1pb9m9k934ngo.png" alt="Image description" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Olive wants to purchase a finger ring with her birth stone. &lt;/p&gt;

&lt;p&gt;The details of Birth stones and  ring prices are stored in  two &lt;strong&gt;DynamoDB tables&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Now, We are going to create an &lt;strong&gt;ETL job&lt;/strong&gt; using AWS Glue Studio which &lt;strong&gt;inner join&lt;/strong&gt; two DynamoDB tables &lt;strong&gt;Birthstone&lt;/strong&gt; and &lt;strong&gt;RingsTable&lt;/strong&gt; on condition &lt;strong&gt;RingsTable.RingStoneName = Birthstone.Stone Name&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;After that,  &lt;strong&gt;apply a Query on the result table&lt;/strong&gt; to find the ring stone and its price matching to Olive's Birth Month  and then &lt;strong&gt;save the result to the s3 bucket&lt;/strong&gt; named "gemstonejobresult"&lt;/p&gt;

&lt;p&gt;We use &lt;strong&gt;git&lt;/strong&gt; for the &lt;strong&gt;source code management&lt;/strong&gt; so finally we are going to create a remote git repository on &lt;strong&gt;AWS Code Commit&lt;/strong&gt; and  &lt;strong&gt;push the job to the git repository&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Two tables created using AWS DynamoDB Service: &lt;strong&gt;Birthstone&lt;/strong&gt;, &lt;strong&gt;RingsTable&lt;/strong&gt; &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;(Recipe: &lt;a href="https://dev.to/aws-builders/cook-a-recipe-with-aws-dynamo-db-table-1kn1"&gt;https://dev.to/aws-builders/cook-a-recipe-with-aws-dynamo-db-table-1kn1&lt;/a&gt;)&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;S3 Bucket to store the result - &lt;strong&gt;gemstonejobresult&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;A git repository on AWS Code commit - &lt;strong&gt;gemstone_job_repository&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;An IAM role named  &lt;strong&gt;AWSGlueServiceRoledemo&lt;/strong&gt;- with permission to your Amazon S3 sources, targets, temporary directory, scripts, and any libraries used by the job.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Lets set up the &lt;strong&gt;Prerequisites&lt;/strong&gt; first&lt;/p&gt;

&lt;p&gt;&lt;u&gt; 1 : DynamoDB Tables&lt;/u&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Here, I have created two Tables named "Birthstone" and "Birthstone" and some items to them&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Make sure to enable &lt;strong&gt;PITR&lt;/strong&gt; on both the tables&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The Table schema details provided below&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsab022r42h9ok1n1xuzm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsab022r42h9ok1n1xuzm.png" alt="Image description" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Table Data&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc7pntmixoel5wmhf5u73.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc7pntmixoel5wmhf5u73.png" alt="Image description" width="660" height="337"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4gccefyo2b2t6lteaoaz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4gccefyo2b2t6lteaoaz.png" alt="Image description" width="413" height="409"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;u&gt; 2: S3 Bucket for Storing the Query Result &lt;/u&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Navigate to &lt;strong&gt;S3 console&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4hho8vk56sf0nqjsafkv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4hho8vk56sf0nqjsafkv.png" alt="Image description" width="800" height="597"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Click &lt;strong&gt;Create Bucket&lt;/strong&gt; button &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;You will be navigated to bucket creation page&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Specify a &lt;strong&gt;unique name&lt;/strong&gt; to the bucket, Leave the rest of the fields to default values &lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz2410wufi6x91erk327y.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz2410wufi6x91erk327y.png" alt="Image description" width="800" height="411"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Scroll down and click &lt;strong&gt;create bucket&lt;/strong&gt; button&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjwvka7k1vtyc41pijrvo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjwvka7k1vtyc41pijrvo.png" alt="Image description" width="800" height="471"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You will be navigated back to bucket list page on S3 Console and the newly created bucket will be listed here&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;u&gt; 3: A git repository on AWS Code commit &lt;/u&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AWS Code commit&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;AWS CodeCommit&lt;/strong&gt; is a &lt;strong&gt;fully-managed source control service&lt;/strong&gt; that makes it easy for companies to host secure and highly scalable private Git repositories. &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CodeCommit&lt;/strong&gt; eliminates the need to operate your own source control system or worry about scaling its infrastructure.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;u&gt;Repository&lt;/u&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;In CodeCommit, the fundamental version control object is a repository. &lt;/li&gt;
&lt;li&gt;It's where you keep your project's code and files safe. It also keeps track of your project's history, from the first commit to the most recent changes. &lt;/li&gt;
&lt;li&gt;You can collaborate on a project by sharing your repository with other users.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Before you can push changes to a CodeCommit repository, you must configure an IAM user in your Amazon Web Services account, or set up access for federated access or temporary credentials.&lt;br&gt;
&lt;strong&gt;DO NOT USE ROOT USER&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;Navigate to code commit console&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqs3rw01hstgmpp6cdzqp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqs3rw01hstgmpp6cdzqp.png" alt="Image description" width="800" height="492"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt; Click &lt;strong&gt;Create Repository&lt;/strong&gt; button to create a git repository for storing our code &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmg7wp5sjtvshucwrhp2d.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmg7wp5sjtvshucwrhp2d.png" alt="Image description" width="800" height="265"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Specify the repository name, I am naming it as "gemstone_job_repository" and click &lt;strong&gt;create repository&lt;/strong&gt; button&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3jp91n5jad5y04ioxod5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3jp91n5jad5y04ioxod5.png" alt="Image description" width="800" height="438"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Lets Create a &lt;strong&gt;Readme.md&lt;/strong&gt; file and commit it to the repository, Click Create file button&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add some data to the file and save the file as &lt;strong&gt;ReadMe.md&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The file will be saved to the &lt;strong&gt;main branch&lt;/strong&gt; &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Specify the &lt;strong&gt;Author name&lt;/strong&gt;,&lt;strong&gt;Email address&lt;/strong&gt; and &lt;strong&gt;commit message&lt;/strong&gt; (Though optional, its a good practice to provide commit message)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Click the button &lt;strong&gt;commit changes&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwv2f7fgmdu551bcauwy4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwv2f7fgmdu551bcauwy4.png" alt="Image description" width="800" height="535"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fitvcjk6k9z8neww38k9j.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fitvcjk6k9z8neww38k9j.png" alt="Image description" width="800" height="203"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;u&gt;Branches in git  &lt;/u&gt;&lt;/strong&gt;&lt;br&gt;
Branches can be used to develop new features, save a specific version of your project from a specific commit, and much more.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;When you create your first commit in aws code commit console , a default branch &lt;strong&gt;main&lt;/strong&gt; is created for you&lt;/p&gt;

&lt;p&gt;Now, we have created a repository on aws console , made a first commit to it by saving a ReadMe file to the main branch &lt;/p&gt;

&lt;p&gt;&lt;u&gt; 4: IAM role&lt;/u&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Navigate to IAM Console,&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fa79320x4c1u2jycx5ldp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fa79320x4c1u2jycx5ldp.png" alt="Image description" width="800" height="380"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Click on &lt;strong&gt;Roles&lt;/strong&gt; link on Left Pane&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsem2i85zu6g6jkw07hnw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsem2i85zu6g6jkw07hnw.png" alt="Image description" width="766" height="646"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Click &lt;strong&gt;Create Role&lt;/strong&gt; button to create a role&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqopfpelpl23mjgouw8p7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqopfpelpl23mjgouw8p7.png" alt="Image description" width="800" height="161"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Select &lt;strong&gt;AWS Service&lt;/strong&gt; as &lt;strong&gt;Trusted entity type&lt;/strong&gt; &lt;/li&gt;
&lt;li&gt;Select &lt;strong&gt;glue&lt;/strong&gt; option from &lt;strong&gt;Use cases for other services&lt;/strong&gt; dropdown&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjjgr2iao7xay3mwhj7lu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjjgr2iao7xay3mwhj7lu.png" alt="Image description" width="800" height="356"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Add the below permissions to the role and  click &lt;strong&gt;Next&lt;/strong&gt; button&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwtcup6exgy0veya3g3a3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwtcup6exgy0veya3g3a3.png" alt="Image description" width="800" height="212"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Specify a &lt;strong&gt;role name&lt;/strong&gt; "AWSGlueServiceRoledemo" and Click &lt;strong&gt;Create Role&lt;/strong&gt; button &lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Create an ETL job using AWS Glue Studio to inner join DynamoDB Tables
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Navigate to &lt;strong&gt;AWS Glue Studio&lt;/strong&gt; from aws console&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F013x3hvlhg0l0g40lw79.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F013x3hvlhg0l0g40lw79.png" alt="Image description" width="800" height="364"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Click &lt;strong&gt;Jobs&lt;/strong&gt; from Left pane&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu83ca6dti55oxkiqwnkx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu83ca6dti55oxkiqwnkx.png" alt="Image description" width="800" height="330"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You will be navigated to Jobs page, where you can create ETL Jobs&lt;/li&gt;
&lt;li&gt;&lt;p&gt;By default, &lt;strong&gt;Visual with source and target&lt;/strong&gt; option  would be selected&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Select &lt;strong&gt;Source&lt;/strong&gt; as &lt;strong&gt;DynamoDB&lt;/strong&gt; and &lt;strong&gt;Target&lt;/strong&gt; as &lt;strong&gt;Amazon S3&lt;/strong&gt; in &lt;strong&gt;Create job&lt;/strong&gt; &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Click &lt;strong&gt;Create&lt;/strong&gt; button&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F25o6n0xewuwtmenzgl8f.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F25o6n0xewuwtmenzgl8f.png" alt="Image description" width="800" height="254"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;An &lt;strong&gt;untitled job&lt;/strong&gt;  with the source as DynamoDB and target as Amazon S3 will be created for you. And You will be navigated to the page of untitled job where you will be able to edit the configuratons&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;u&gt;&lt;strong&gt;Visual Tab&lt;/strong&gt;&lt;/u&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;First You will be on the Visual tab&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Customers can create data integration jobs using the Amazon Glue API from a JSON object that displays a visual step-by-step workflow thanks to the API offered by AWS Glue. &lt;br&gt;
Clients can then work with these jobs using the visual editor in Amazon Glue Studio.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Now we are going to create a job which &lt;strong&gt;reads data from two dynamodb tables&lt;/strong&gt; BirthStone table and Ring table.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;We are going to &lt;strong&gt;inner join&lt;/strong&gt; these two tables &lt;strong&gt;based on name attribute&lt;/strong&gt; &lt;br&gt;
and &lt;strong&gt;apply a query to find birtstone suitable for Olive and its price&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;First we will add the required &lt;strong&gt;Source blocks, Action blocks and Target Blocks&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Store the &lt;strong&gt;Query result in S3 bucket&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Nodes Required:&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;Two DataSource DynamoDB (RingsTable, Birthstone)&lt;/li&gt;
&lt;li&gt; Transfrom Join (For applying inner join)&lt;/li&gt;
&lt;li&gt;SQL Query ( For querying the result table)&lt;/li&gt;
&lt;li&gt;Data target - S3 Bucket&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;/li&gt;

&lt;li&gt;&lt;p&gt;Click on the &lt;strong&gt;Source&lt;/strong&gt; and add one more &lt;strong&gt;DynamoDB table&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;Remove the ApplyMapping Block, if its already there,  since we don't need it for this job&lt;br&gt;&lt;br&gt;
(Click on the ApplyMapping Block and Click Remove)&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;From the &lt;strong&gt;Action&lt;/strong&gt;, Select &lt;strong&gt;Join&lt;/strong&gt; and Add it&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;From the &lt;strong&gt;Action&lt;/strong&gt;, Select &lt;strong&gt;SQL Query&lt;/strong&gt; and Add it&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;&lt;strong&gt;S3 bucket&lt;/strong&gt; will be there on the flow as target , leave it as it is &lt;/p&gt;&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fa1ictyao89f01n6zp4jx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fa1ictyao89f01n6zp4jx.png" alt="Image description" width="800" height="651"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Now, Lets Configure the flow&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;u&gt;Source Nodes&lt;/u&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Click on One of the Data Source DynamoDB nodes, &lt;/li&gt;
&lt;li&gt;On the Right pane, configure the node properties as shown in the picture below&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbazxzxbkc9hq0qc8taaw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbazxzxbkc9hq0qc8taaw.png" alt="Image description" width="800" height="236"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Select the option Choose  the  Dynamodb Table directly radio button for DynamoDB source&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Select the Birthstone table from the Dropdown, Make sure PITR is enabled for the Birth stone table , if not the table will not be populated on the dropdown, (If you do not see the table in the dropdown, Go to the Dynamodb service, enable PITR for the Birthstone table and  Ring Table. Then Refresh this page to get the tables on this dropdown)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Click on the  second DynamoTable Data source node, &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;On the Right pane, configure the node properties as shown in the picture below&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7a7n6zbw1j9gqhesd0ug.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7a7n6zbw1j9gqhesd0ug.png" alt="Image description" width="800" height="300"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Now, We have configured the Source Nodes successfully&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;u&gt;Action Nodes&lt;/u&gt;&lt;/p&gt;

&lt;p&gt;-&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff1inumrjeyu062o39x9d.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff1inumrjeyu062o39x9d.png" alt="Image description" width="800" height="167"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Click on the Transform join node&lt;/li&gt;
&lt;li&gt; On the Right pane,  Click on the Node Properties Tab&lt;/li&gt;
&lt;li&gt;Select the two DynamoDB tables as Node Parents&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8qtbl87yjfx8vi309439.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8qtbl87yjfx8vi309439.png" alt="Image description" width="800" height="299"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Click on the Transform Tab, Make sure Inner join is selected as Join Type, Click Add Condition button&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flbq0cdvxpeu329r4tnl4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flbq0cdvxpeu329r4tnl4.png" alt="Image description" width="800" height="287"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Specify the inner join condition as shown in the image below&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fk7q03ywk94tb51d7lgta.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fk7q03ywk94tb51d7lgta.png" alt="Image description" width="800" height="333"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Click on Transform SQL Query node&lt;/li&gt;
&lt;li&gt; On the Right pane,  Click on the Node Properties Tab&lt;/li&gt;
&lt;li&gt;Select Transform Check box from the Node Parents dropdown list, You can see Join node getting selected &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fn2t81rtlu2i2t8pdu8o0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fn2t81rtlu2i2t8pdu8o0.png" alt="Image description" width="800" height="277"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Click on the Transform Tab to specify the query on the Inner joined Table&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;As You see here, Inner Joined table is alised as  myDataSource&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Now Lets Write the SQL Query to generate the Birth Stone name and Price of the Birst stone matching to olive's Birth Month&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgf03a19hjtffx97kd3up.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgf03a19hjtffx97kd3up.png" alt="Image description" width="652" height="467"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Olive's Birth Month is December since she is born on a christmas day , Lets Create a query to get the Birth Stone gem and its price matching to the month &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;select RingStoneName, Price from myDataSource where BirthMonth = 'December' limit 1&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxujteshqzpcyk14um870.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxujteshqzpcyk14um870.png" alt="Image description" width="800" height="275"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Yes, Now we have configured Transform nodes successfully &lt;/p&gt;

&lt;p&gt;&lt;u&gt;Target Node&lt;/u&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;We need to store the query result in the s3 bucket &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0080ngkgnvc1zmb12lb6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0080ngkgnvc1zmb12lb6.png" alt="Image description" width="800" height="315"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Click on the Data target - S3 bucket node&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;On the Right pane,  Click on the Node Properties Tab and Tick SQL Query checkbox&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnc8tiyfksixk5gj54sp3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnc8tiyfksixk5gj54sp3.png" alt="Image description" width="800" height="277"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Click on Data Target Properies - S3 Tab&lt;/li&gt;
&lt;li&gt;Configure it as shown in the below image&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fth2rwobf5qbxjufc46l4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fth2rwobf5qbxjufc46l4.png" alt="Image description" width="800" height="278"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;As you see, Format should be &lt;strong&gt;Parquet&lt;/strong&gt; &lt;/li&gt;
&lt;li&gt;&lt;p&gt;The bucket location should be selected from s3 so that a Parquet file with the result data will be saved on the S3 bucket once the job execution is completed successfully&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;After all the configurations, The Visual Tab will be seen as below image&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx6yyk4c2hsyh2vjs4e7l.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx6yyk4c2hsyh2vjs4e7l.png" alt="Image description" width="800" height="557"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;u&gt;&lt;strong&gt;Script Tab&lt;/strong&gt;&lt;/u&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Based on the Job Configuration, &lt;strong&gt;Python script will be generated on the Script tab&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F76nmtm3m8umxms66l839.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F76nmtm3m8umxms66l839.png" alt="Image description" width="800" height="317"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;u&gt;&lt;strong&gt;Job details&lt;/strong&gt;&lt;/u&gt;&lt;/p&gt;

&lt;p&gt;Now, Navigate to Job details tab to specify the job details&lt;/p&gt;

&lt;p&gt;By default, Job name would be Untitled, Specify a job name in the Name Field.&lt;br&gt;
Specify a description as well&lt;/p&gt;

&lt;p&gt;Select the &lt;strong&gt;AWSGlueServiceRole-demo&lt;/strong&gt; which we already created as a part of prerequisites&lt;/p&gt;

&lt;p&gt;Leave the remaining to default settings &lt;/p&gt;

&lt;p&gt;Click &lt;strong&gt;Save&lt;/strong&gt; button to save the Job&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs8ck9ce8hwlbqzbw4xsr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs8ck9ce8hwlbqzbw4xsr.png" alt="Image description" width="800" height="346"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;u&gt;&lt;strong&gt;Version Control Tab&lt;/strong&gt;&lt;/u&gt;&lt;/p&gt;

&lt;p&gt;Navigate to &lt;strong&gt;Version Control&lt;/strong&gt; Tab&lt;/p&gt;

&lt;p&gt;Here, You need to do the git configurations&lt;br&gt;
 Select &lt;strong&gt;AWS Code commit option&lt;/strong&gt; for git service &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2snlo1enjnhotnnk9u57.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2snlo1enjnhotnnk9u57.png" alt="Image description" width="800" height="171"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In the &lt;strong&gt;Repository Configuration&lt;/strong&gt; section, choose the &lt;strong&gt;git repository&lt;/strong&gt;  that we created in aws code commit (Refer Prerequisites)&lt;/p&gt;

&lt;p&gt;Choose the branch as &lt;strong&gt;main&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft12ewpmlnk4b3lc82jzs.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft12ewpmlnk4b3lc82jzs.png" alt="Image description" width="800" height="232"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Click &lt;strong&gt;Save&lt;/strong&gt; button on the top right&lt;/p&gt;

&lt;p&gt;Click the &lt;strong&gt;Actions&lt;/strong&gt; Button, Choose &lt;strong&gt;Push to repository&lt;/strong&gt; option&lt;/p&gt;

&lt;p&gt;The job will be pushed to the repository and a &lt;strong&gt;JSON file&lt;/strong&gt; will be saved on to the code repository. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmegqrrmkyskq6e2i6pah.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmegqrrmkyskq6e2i6pah.png" alt="Image description" width="800" height="355"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnvcd4964v6ety96wkstk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnvcd4964v6ety96wkstk.png" alt="Image description" width="800" height="131"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Navigate to aws code commit and verify if files are saved on to the repository&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fts1jjz4154s8i9jzdu0z.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fts1jjz4154s8i9jzdu0z.png" alt="Image description" width="800" height="176"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Executing the ETL Job and Verifying the result in S3 bucket
&lt;/h2&gt;

&lt;p&gt;Once you have saved the job, its time to Run the job &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Click the &lt;strong&gt;Run&lt;/strong&gt; button on the Top Right pane &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs06478l7a3fdtzcltbch.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs06478l7a3fdtzcltbch.png" alt="Image description" width="800" height="225"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You will be getting the following message&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fge8coy2n1kjncm01zkdg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fge8coy2n1kjncm01zkdg.png" alt="Image description" width="800" height="107"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Navigate to &lt;strong&gt;Runs&lt;/strong&gt; Tab to see the job status&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnx8ha8v84twrbq2gki5j.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnx8ha8v84twrbq2gki5j.png" alt="Image description" width="800" height="309"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Once the Run status becomes succeeded,  Navigate to &lt;strong&gt;S3 Console&lt;/strong&gt; and click on the &lt;strong&gt;gemstonejobresult&lt;/strong&gt; bucket&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;You will be able to see the result saved as a parquet  file&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1i99gh40hqevtnpztshr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1i99gh40hqevtnpztshr.png" alt="Image description" width="800" height="377"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Download the &lt;strong&gt;Parquet&lt;/strong&gt; file and save the file locally by clicking the &lt;strong&gt;Download&lt;/strong&gt; button&lt;/li&gt;
&lt;/ul&gt;




&lt;ul&gt;
&lt;li&gt;Open the website &lt;a href="https://www.parquet-viewer.com/" rel="noopener noreferrer"&gt;https://www.parquet-viewer.com/&lt;/a&gt; to read results from parquet file&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7ufrqb47o8xxuqe974jb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7ufrqb47o8xxuqe974jb.png" alt="Image description" width="800" height="485"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Now You will be able to view the result &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fl7vkozfr731e7ebl1co3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fl7vkozfr731e7ebl1co3.png" alt="Image description" width="800" height="279"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;u&gt;Reading the Parquet File object using S3 select&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Alternatively, You can Query the Parquet file with &lt;strong&gt;S3 select&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Navigate to &lt;strong&gt;S3 Console&lt;/strong&gt; and click on the &lt;strong&gt;gemstonejobresult&lt;/strong&gt; bucket&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Click on the Parquet file name link where the result is saved&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5jkb76xjez36zt5eu4nk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5jkb76xjez36zt5eu4nk.png" alt="Image description" width="800" height="342"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Now, Click the &lt;strong&gt;Object Actions&lt;/strong&gt; button and from the list, select the &lt;strong&gt;Query With S3 Select&lt;/strong&gt; and give a click&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;You will be navigated to Query with S3 Select Page, Now by default &lt;strong&gt;Apache Parquet&lt;/strong&gt; will be chosen in input settings, Keep it as it is&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;You can choose the Format in Output settings.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;S3 Select allows you to specify how the query results are serialized in the output. You can choose formats like JSON or CSV. This determines how the data will be structured in the output files. &lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;Lets choose &lt;strong&gt;JSON&lt;/strong&gt; here so that the result of the query will be displayed in JSON Format&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F35bqiphzf2z2o5dus4hu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F35bqiphzf2z2o5dus4hu.png" alt="Image description" width="800" height="676"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;We are going to read the Parquet File using the below Select Query which is displayed in the query editor by default.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;SELECT * FROM s3object s LIMIT 5&lt;/code&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Now Click &lt;strong&gt;Run SQL query&lt;/strong&gt; button to execute the query&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwrpk2q40et0ku6brjh9i.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwrpk2q40et0ku6brjh9i.png" alt="Image description" width="800" height="289"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Once the Query is executed successfully, You will be able to view the result in JSON format (The format chosen in &lt;strong&gt;Output settings&lt;/strong&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz8vztotdou5cpwkdwvy7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz8vztotdou5cpwkdwvy7.png" alt="Image description" width="800" height="227"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You can download the result by clicking the &lt;strong&gt;Download results&lt;/strong&gt; button&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Yaay , We found it , Olive needs to purchase a &lt;strong&gt;Turquoise ring&lt;/strong&gt; and its price is &lt;strong&gt;612$&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm8srj7kj01v7thia1gea.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm8srj7kj01v7thia1gea.png" alt="Image description" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And that was Olive’s story.&lt;/p&gt;




&lt;h2&gt;
  
  
  Challenge Task
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Set up an &lt;strong&gt;ETL job&lt;/strong&gt; by following the above instructions &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Find out the month corresponding to the Birth stone which is priced highest&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Post a screenshot of the answer in comment section&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>database</category>
      <category>beginners</category>
      <category>python</category>
      <category>aws</category>
    </item>
  </channel>
</rss>
