<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Brian H. Hough</title>
    <description>The latest articles on DEV Community by Brian H. Hough (@brianhhough).</description>
    <link>https://dev.to/brianhhough</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%2F259541%2Fe120922d-fc41-49cb-8bb0-d9331af3554f.png</url>
      <title>DEV Community: Brian H. Hough</title>
      <link>https://dev.to/brianhhough</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/brianhhough"/>
    <language>en</language>
    <item>
      <title>Thankful for the AWS Community Builders Program &amp; Building</title>
      <dc:creator>Brian H. Hough</dc:creator>
      <pubDate>Fri, 15 Dec 2023 20:27:01 +0000</pubDate>
      <link>https://dev.to/brianhhough/thankful-for-the-aws-community-builders-program-building-19bi</link>
      <guid>https://dev.to/brianhhough/thankful-for-the-aws-community-builders-program-building-19bi</guid>
      <description>&lt;p&gt;As the saying goes, "If you want to go fast, go alone. If you want to go far, go together." &lt;/p&gt;

&lt;p&gt;Over the last few years, I've benefited so much from being a part of the &lt;a href="https://aws.amazon.com/developer/community/community-builders/" rel="noopener noreferrer"&gt;AWS Community Builders Program&lt;/a&gt; - a global community, network, and program. From meeting super talented, smart, and amazing mentors and peers, to receiving exclusive trainings and insights from the teams building the cutting edge technologies powering modern software, I have immense appreciation for this program and everyone who makes it so meaningful.&lt;/p&gt;

&lt;p&gt;There are SO many benefits for Community Builders! Here are my top 5:&lt;br&gt;
🌎 Global network&lt;br&gt;
🏋️ Exclusive trainings&lt;br&gt;
💡 Amazing mentors/peers&lt;br&gt;
🗣️ Speaking opportunities&lt;br&gt;
👕 Super cool swag&lt;/p&gt;

&lt;p&gt;If you like building, sharing what you learn, and contributing to a great community, then you should definitely consider applying to the AWS Community Builders program! You can add your name to the &lt;a href="https://aws.amazon.com/developer/community/community-builders/" rel="noopener noreferrer"&gt;waitlist here&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now, since we are in the holiday spirit, we thought it would be fun to create holiday-themed AWS Step Function state machines that model a tree as a thank you to all of the amazing AWS Leaders who make the AWS Community Builders Program so special 🎄🥳 So, let's analyze what goes into a Step Machine and build one together while we thank our incredible AWS Leaders for all that they do...&lt;/p&gt;
&lt;h2&gt;
  
  
  Step 1: Go to Amazon Step Functions in the console
&lt;/h2&gt;

&lt;p&gt;You will want to search for "Step Functions" in the top search bar. Click on the first AWS service in the dropdown. &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%2Fyda8ie2sbku2f3pa5kv4.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%2Fyda8ie2sbku2f3pa5kv4.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This will direct you to the Step Functions page, where you'll either see a list of your currently active Step Functions or nothing listed out in which you'll be able to click that Orange button in the top right to make your very first Step Function state machine on AWS:&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%2Fqyqgansvdnt9wtnmimxd.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%2Fqyqgansvdnt9wtnmimxd.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Step 2: Pick a template or start from scratch
&lt;/h2&gt;

&lt;p&gt;While we are going to start from scratch by selecting "Blank", there are so many options for very cool Step function flows if you want to architect something more complicated. We are making a tree design, so it is not going to involve that many services or features.&lt;/p&gt;

&lt;p&gt;Here's a few of the cool ones:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Distributed Map to process a CSV file in S3: Use Distributed Map to iterate over the rows of a generated CSV file in S3. Each row has order and shipping information. The distributed map item processor iterates over a batch of these rows to detect delayed order using a Lambda function. It then send a message to SQS queue for every delayed order&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Generate invoices using Stripe: Use the HTTP task to call Stripe APIs for an invoice-generation workflow. Retrieves a list of customers, summarizes their payment methods, and either generates invoices or reports missing/expired credit cards.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Perform AI prompt-chaining with Amazon Bedrock:&lt;br&gt;
Use AI prompt-chaining with Amazon Bedrock to build high-quality chatbots. By chaining prompts, the LLM can use conversation history to provide more relevant responses.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Call a microservice with API Gateway: Make a call to an API Gateway endpoint that fronts an ECS container microservice. (Amazon API Gateway, Amazon ECS)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;ETL job in Amazon Redshift: This sample project demonstrates how to use Step Functions and the Amazon Redshift Data API to run an ETL/ELT workflow that loads data into the Amazon Redshift data warehouse.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Tune a machine learning model: Tune hyperparameters of a machine learning model and batch transform a test dataset (Amazon SageMaker, AWS Lambda, Amazon S3)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;... The list just truly goes on from there.&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%2Fipjgphrpzvs8sa6r9xje.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%2Fipjgphrpzvs8sa6r9xje.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Step 3: Setup your Step Function workspace for success
&lt;/h2&gt;

&lt;p&gt;When you create your first state machine, there will be 2 main views to develop within:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;A drag-and-drop UI&lt;/strong&gt;: this view is helpful to search for various services and simply add them as steps into your state machine.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A JSON editor&lt;/strong&gt;: this is the view I prefer the most because I find that the code is easier to think about, especially with how steps chain together.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For this blog post, we are going to look at the JSON code editor view.&lt;/p&gt;
&lt;h2&gt;
  
  
  Step 4: Write your Step Function Logic
&lt;/h2&gt;

&lt;p&gt;Thanks to the amazing &lt;a class="mentioned-user" href="https://dev.to/jennworks40"&gt;@jennworks40&lt;/a&gt; - we were able to start building a template for our state machine very rapidly with her initial Step Function template.&lt;/p&gt;

&lt;p&gt;Here is my finished code if you want to check it out:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"Comment"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Building a tree is fun!"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"StartAt"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"I'm grateful to learn and grow"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"States"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"I'm grateful to learn and grow"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"Type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Pass"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"Next"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"From webinars to IRL community events"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"From webinars to IRL community events"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"Type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Task"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"Resource"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"arn:aws:lambda:us-east-1:xxxxxxxxxx:function:Thankful"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"Catch"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"ErrorEquals"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="s2"&gt;"States.TaskFailed"&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"Next"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"All run by amazing AWS leaders and visionaries..."&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"Next"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"All run by amazing AWS leaders and visionaries..."&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"All run by amazing AWS leaders and visionaries..."&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"Type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Pass"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"Next"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Who care about the AWS Community and make sure we are content."&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"Who care about the AWS Community and make sure we are content."&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"Type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Parallel"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"Branches"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"StartAt"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"AWS leaders who help,"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"States"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"AWS leaders who help,"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
              &lt;/span&gt;&lt;span class="nl"&gt;"Type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Succeed"&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"StartAt"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"AWS leaders who care,"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"States"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"AWS leaders who care,"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
              &lt;/span&gt;&lt;span class="nl"&gt;"Type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Task"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
              &lt;/span&gt;&lt;span class="nl"&gt;"Resource"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"arn:aws:lambda:us-east-1:xxxxxxxxxx:function:Thankful"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
              &lt;/span&gt;&lt;span class="nl"&gt;"Catch"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
                  &lt;/span&gt;&lt;span class="nl"&gt;"ErrorEquals"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
                    &lt;/span&gt;&lt;span class="s2"&gt;"States.TaskFailed"&lt;/span&gt;&lt;span class="w"&gt;
                  &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
                  &lt;/span&gt;&lt;span class="nl"&gt;"Next"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"We ❤️‍🔥 you all!"&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
              &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
              &lt;/span&gt;&lt;span class="nl"&gt;"End"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"We ❤️‍🔥 you all!"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
              &lt;/span&gt;&lt;span class="nl"&gt;"Type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Pass"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
              &lt;/span&gt;&lt;span class="nl"&gt;"Result"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Love em"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
              &lt;/span&gt;&lt;span class="nl"&gt;"End"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"StartAt"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"And AWS leaders who are always there."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"States"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"And AWS leaders who are always there."&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
              &lt;/span&gt;&lt;span class="nl"&gt;"Type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Succeed"&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"Next"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"It's no small task, the immense work they do"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"It's no small task, the immense work they do"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"Type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Parallel"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"Next"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Thank you for all that you do. We all love you!"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"Branches"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"StartAt"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Helping us reach for the stars,"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"States"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"Helping us reach for the stars,"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
              &lt;/span&gt;&lt;span class="nl"&gt;"Type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Pass"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
              &lt;/span&gt;&lt;span class="nl"&gt;"End"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"StartAt"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Climb to new heights,"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"States"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"Climb to new heights,"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
              &lt;/span&gt;&lt;span class="nl"&gt;"Type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Task"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
              &lt;/span&gt;&lt;span class="nl"&gt;"Resource"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"arn:aws:lambda:us-east-1:xxxxxxxxxx:function:Thankful"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
              &lt;/span&gt;&lt;span class="nl"&gt;"Catch"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
                  &lt;/span&gt;&lt;span class="nl"&gt;"ErrorEquals"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
                    &lt;/span&gt;&lt;span class="s2"&gt;"States.TaskFailed"&lt;/span&gt;&lt;span class="w"&gt;
                  &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
                  &lt;/span&gt;&lt;span class="nl"&gt;"Next"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"We ❤️‍🔥 the ☁️"&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
              &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
              &lt;/span&gt;&lt;span class="nl"&gt;"End"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"We ❤️‍🔥 the ☁️"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
              &lt;/span&gt;&lt;span class="nl"&gt;"Type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Pass"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
              &lt;/span&gt;&lt;span class="nl"&gt;"Result"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Beautiful"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
              &lt;/span&gt;&lt;span class="nl"&gt;"End"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"StartAt"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Believe in ourselves,"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"States"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"Believe in ourselves,"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
              &lt;/span&gt;&lt;span class="nl"&gt;"Type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Pass"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
              &lt;/span&gt;&lt;span class="nl"&gt;"End"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"StartAt"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Always work hard,"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"States"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"Always work hard,"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
              &lt;/span&gt;&lt;span class="nl"&gt;"Type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Task"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
              &lt;/span&gt;&lt;span class="nl"&gt;"Resource"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"arn:aws:lambda:us-east-1:xxxxxxxxxx:function:Thankful"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
              &lt;/span&gt;&lt;span class="nl"&gt;"Catch"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
                  &lt;/span&gt;&lt;span class="nl"&gt;"ErrorEquals"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
                    &lt;/span&gt;&lt;span class="s2"&gt;"States.TaskFailed"&lt;/span&gt;&lt;span class="w"&gt;
                  &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
                  &lt;/span&gt;&lt;span class="nl"&gt;"Next"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"We ❤️‍🔥 to build!"&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
              &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
              &lt;/span&gt;&lt;span class="nl"&gt;"End"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"We ❤️‍🔥 to build!"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
              &lt;/span&gt;&lt;span class="nl"&gt;"Type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Pass"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
              &lt;/span&gt;&lt;span class="nl"&gt;"Result"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Good company"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
              &lt;/span&gt;&lt;span class="nl"&gt;"End"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"StartAt"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"And share some cool swag, always something new."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"States"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"And share some cool swag, always something new."&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
              &lt;/span&gt;&lt;span class="nl"&gt;"Type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Pass"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
              &lt;/span&gt;&lt;span class="nl"&gt;"End"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"Thank you for all that you do. We all love you!"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"Type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Pass"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"End"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&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%2Fps0qe8qw88f9vx903dt1.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%2Fps0qe8qw88f9vx903dt1.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In case you are wondering where the &lt;code&gt;arn&lt;/code&gt;'s come from, check out Step 5 below.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 5: Create a Lambda Function
&lt;/h2&gt;

&lt;p&gt;Creating a Lambda function — a serverless script that can run in AWS and connect to various AWS resources, apps, and more —  is very easy. First, search for "Lambda" in the search bar at the top and you should click on the first item that shows up in the dropdown:&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%2Fgw84dacnpj5um3iwa3um.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%2Fgw84dacnpj5um3iwa3um.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Next, we'll decide to create a lambda function with the orange button. This will bring up the Lambda function setup screen to select all the options, including a name and runtime, which we will select Python 3.11:&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%2Fmdhtkhgwgag34o4mimp3.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%2Fmdhtkhgwgag34o4mimp3.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After we select to create the Lambda function, we'll then be redirected to the Lambda console with our new function:&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%2Fux7fjb2rd1imvbq0qgtz.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%2Fux7fjb2rd1imvbq0qgtz.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Notice the code that was auto-generated for us. It's not much, but we love to see it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;lambda_handler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="c1"&gt;# TODO implement
&lt;/span&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;statusCode&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;body&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dumps&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Hello from Lambda!&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pay particularly close notice to the &lt;code&gt;arn&lt;/code&gt; that is generated for the function. This &lt;code&gt;arn&lt;/code&gt; is like it's identification tag in AWS - we will use this in our step function flow in the above. &lt;/p&gt;

&lt;p&gt;ARNs follow a specific format like this (yours will look a bit different with the variables): &lt;code&gt;arn:aws:lambda:REGION:ACCOUNT_ID:function:FUNCTION_NAME&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;We will drop our arn's into the step function to correspond to the Lambda function we want to run. I just made one Lambda function, but you may have more and want to configure those in each of the state machine's places&lt;/p&gt;

&lt;p&gt;This is what it looks like:&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%2Ffk6grlyp8u90zns1t7vw.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%2Ffk6grlyp8u90zns1t7vw.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 6: Light it up! 🎄
&lt;/h2&gt;

&lt;p&gt;To create our state machine, we will need to create some IAM permissions to allow the state machine to interact with Lambd and also do some xray tracing. Approve these automatically suggested changes:&lt;/p&gt;

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

&lt;p&gt;We will wait a second and then we should see the confirmation green banner notification saying that the IAM role was created successfully. We may need to wait up to 1-2 minutes for the role to be fully updated.&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%2Fn1m0l7ju483gsv8em8dh.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%2Fn1m0l7ju483gsv8em8dh.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That was easy! Now our role is configured with all the right permissions for the step function flow. &lt;/p&gt;

&lt;p&gt;Now for the fun part! Let's run our step function with a custom comment like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"Comment"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Thank you so much amazing AWS Leaders!!❤️‍🔥"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&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%2Ft3hljs3ubonj9o1x157p.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%2Ft3hljs3ubonj9o1x157p.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now, when the function runs, we'll see green, meaning it worked 🎄&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%2Fsfox1cv17r3xeydyob6n.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%2Fsfox1cv17r3xeydyob6n.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The state machine will go from blueprint mode...&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%2F08sulkrpxzk6bk1oyc2e.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%2F08sulkrpxzk6bk1oyc2e.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To lights on mode... &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%2Fk524oowgdfh67c4c6xmg.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%2Fk524oowgdfh67c4c6xmg.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What Step Functions have to do with the AWS Community Builders Program
&lt;/h2&gt;

&lt;p&gt;While you might be thinking that Step Functions is "just another AWS service", it embodies many of the attributes that makes the AWS Community Builders program so strong. Step Functions at their core link complex, powerful, or intricate processes together in a chain so that they all flow together and achieve synchronized movement. When working together, the parts create a well oiled machine that can deliver performance. Let's see how:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Orchestrated Processes and Orchestrated Learning: the ability to orchestrate complex systems and events is a powerful skill, and we are lucky to have amazing leaders and mentors who can orchestrate transformative career growth for us all. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;State Management and Growth: growth and transformation should not be stagnant, and the AWS Leaders make sure to keep us dynamic, engaged, and on top of the latest trends and opportunities. State machines are always triaging new events down the flow of the pipeline to where they need to go, and the AWS Leaders make sure that we are moving forward in our careers and lives just like step functions.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Error Handling and Support Systems: like a good QA engineer, we need to have a safe space to test, debug, and work out the code before we ship it live. The Community Builders Program is such a space, where we can all feel comfortable supporting one another, testing out pitches and talks, and being there for each other through job interviews, major projects, and more.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Infinite Scalability: with a global community, you have an ever replenishing support community and circle from all around the globe. It is an incredible feeling to have friends from almost all parts of the world, and especially getting the chance to meet up with the AWS Community at various events like re:Invent, Summits, and meetups are truly so special.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Networking and Collaboration: just like we had to provision that IAM role to connect all of the various services and components of the step function flow together, the AWS Leaders who support the AWS Community Builders program serve this very important role too. By being able to bring leaders, product managers, and mentors together for us to build, learn, and co-create together, the AWS Leadership becomes this very glue, like IAM, that unites all of us together.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I am so thankful to have been a part of the AWS Community Builders program for the past few years, and while I am now an AWS DevTools Hero, I still champion the AWS Community Builders program whenever I can. It is truly what got me into myh development career and helped accelerate where my career has taken me so far. I am so thankful and grateful to everyone I have met through the AWS Community Builders program and the banner of this blog post is just a small sample of the many photos I have with folks I am honored to call friends, colleagues, mentors, and role models. Thank you, AWS Community Builders, for serving and continuing to serve such an important support community to me and everyone in the Community Builders program. &lt;/p&gt;

&lt;p&gt;We ❤️‍🔥 and appreciate you all.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Brian&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>communitybuilders</category>
      <category>thankfulforest2024</category>
      <category>aws</category>
      <category>firevalleyrocks</category>
    </item>
    <item>
      <title>Stacking Serverless Data Structures for a Pomodoro App on AWS</title>
      <dc:creator>Brian H. Hough</dc:creator>
      <pubDate>Thu, 20 Apr 2023 03:19:18 +0000</pubDate>
      <link>https://dev.to/aws-builders/stacking-serverless-data-structures-for-a-pomodoro-app-on-aws-2622</link>
      <guid>https://dev.to/aws-builders/stacking-serverless-data-structures-for-a-pomodoro-app-on-aws-2622</guid>
      <description>&lt;h1&gt;
  
  
  BuiltWithAmplify #BuiltWithAppSync
&lt;/h1&gt;

&lt;p&gt;Hello friends! Welcome back to another blog post on the Tech Stack Playbook post, your guide to apps, software, and tech (but in a fun way I promise)!&lt;/p&gt;

&lt;p&gt;In this post and video linked below, I'm going to discuss the Pomodoro app I built for AWS' AppSync x Amplify Hackathon, as well as some of the key learnings I found along the way building this full-stack application. One of the coolest elements of this project for me, was the data structure manipulations needed to create a pomodoro stream of events chain together, and then the lift of making my local stack example work in the cloud across many users. I certainly learned a lot from this project, so I hope you get a lot out of this blog post and video too! Without further ado, let's dive in 🚀&lt;/p&gt;

&lt;h2&gt;
  
  
  YouTube Video + Demo:
&lt;/h2&gt;

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

&lt;h2&gt;
  
  
  Application page:
&lt;/h2&gt;

&lt;p&gt;Link: &lt;a href="https://prod.d1hzn1hof27la1.amplifyapp.com/"&gt;https://prod.d1hzn1hof27la1.amplifyapp.com/&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Step 1: Quick Design Mockup (aka map it out)
&lt;/h1&gt;

&lt;p&gt;Something I try to get into the habit of is designing at the most basic level what it is I want to build. It's easy to let code dictate the design, but I think pausing to envision the outcome you want first helps you (1.) arrive at the destination more quickly, and (2.) ensure you are working towards the outcome clearly and efficiently.&lt;/p&gt;

&lt;p&gt;This is certainly not a masterpiece, but it helped me start to think about the data structures that would be involved and what I would need:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--1wYx7gkG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6l7w83ydd0y5wr786gyx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--1wYx7gkG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6l7w83ydd0y5wr786gyx.png" alt="Image description" width="800" height="570"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Step 2: Architect the Tech Stack
&lt;/h1&gt;

&lt;p&gt;This is another important preliminary step that is needed to ensure a smooth outcome for your project or software. When determining the tools you will use, there are about 3 important criteria to consider:&lt;br&gt;
(1.) &lt;strong&gt;bandwidth&lt;/strong&gt; - how much time, how many people, how quickly?&lt;br&gt;
(2.) &lt;strong&gt;expertise&lt;/strong&gt; - how much do I know, how much needed to learn?&lt;br&gt;
(3.) &lt;strong&gt;flow&lt;/strong&gt; - how can this be done easily, efficiently, correctly?&lt;/p&gt;

&lt;p&gt;The below are the technologies I used to build this application. You don't necessarily need to use all of them, but I have a strong preference for using Next.js/TypeScript for it's excellent server side rendering (SSR) functionalities, lightning fast build/render time, and it's integration with Styled Components for building customized front-ends. For AWS, the AppSync, DynamoDB, Lambda, S3, Amplify stack is one I am particularly partial for. By using the Amplify CLI, we can coordinate all of our AWS resources for our CloudFormation stack and make sure everything is packaged up cleanly before we send to the cloud and eventually our users.&lt;/p&gt;

&lt;p&gt;Here is a list of the technologies I used to build this app:&lt;/p&gt;
&lt;h3&gt;
  
  
  📲 Front-End:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Next.js:&lt;/strong&gt; modern app development with Server Side Rendering, dynamic routing, and more&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;TypeScript:&lt;/strong&gt; to enforce type safety throughout functions and API requests&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Styled Components:&lt;/strong&gt; for fast component development and scaling UIs&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Material UI:&lt;/strong&gt; React component library&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  ⚙️ Back-End:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;🚦 API: GraphQL &amp;lt;&amp;gt; AWS AppSync:&lt;/strong&gt; managed API service and GraphQL transformer based on written schema&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;🗃️ DATABASE: Amazon DynamoDB:&lt;/strong&gt; lightning fast NoSQL database optimized for web apps and fast READS/WRITES&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;💻 HOSTING: Amplify Hosting:&lt;/strong&gt; managed service optimized for Next.js v13's features and deployment requirements&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;💾 STORAGE: Amazon S3&lt;/strong&gt; highly inexpensive and highly scalable storage solution for images and app hosting&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;🔐 AUTH: Amazon Cognito:&lt;/strong&gt; managed authentication service that neatly wraps into fine-grained-access-controls around the API&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;
  
  
  Step 3: Figuring out numeric sort querying using GraphQL of NoSQL DynamoDB data
&lt;/h1&gt;

&lt;p&gt;This was probably the hardest step for me in this project because at the highest level, when you are running a data stream with chaining, you affect one item and it means you must alter the other elements in the chain accordingly.&lt;/p&gt;

&lt;p&gt;TL;DR: you edit one item, so you must edit the others accordingly.&lt;/p&gt;

&lt;p&gt;For example, consider the following where we will move an item from the 3rd position at index[2] in the stack to the 1st position at index[0] to re-order the stack and everything pushes down.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;ORIGINAL     —&amp;gt;   FINAL
[ITEM#1]          [ITEM#3]
[ITEM#2]          [ITEM#1]
[ITEM#3]          [ITEM#2]
[ITEM#4]          [ITEM#4]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This made perfect sense on paper, but the implementation of this as stack manipulation got even more confusing when I tried to model an abridged NoSQL data structure to emulate how DynamoDB would be interpreting this.&lt;/p&gt;

&lt;p&gt;I would be using AppSync to query the Pomodoro items so that I could do a LIST of those items for each user based on the &lt;code&gt;order&lt;/code&gt; variable. I figured it would be wise to create a separate &lt;code&gt;order&lt;/code&gt; integer value in my schema so that I could track a value that would be mutating regularly as the user drag-and-dropped their tasks in their READY stack.&lt;/p&gt;

&lt;p&gt;When new items get created, their order would increment by +1 relative to the last item index's order. However, as items get moved around, their order will be updated while the ID of course stays the same. Something like the below was what I needed to solve for:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;      ORIGINAL         —&amp;gt;             FINAL
[id: 1111; order: 1]          [id: 3333; order: 1] 
[id: 2222; order: 2]          [id: 1111; order: 2] 
[id: 3333; order: 3]          [id: 2222; order: 3]
[id: 4444; order: 4]          [id: 4444; order: 4]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In the above example, we have unique a &lt;code&gt;id&lt;/code&gt; for each project, but the order is changing as &lt;code&gt;id:3333&lt;/code&gt; goes from &lt;code&gt;order:3&lt;/code&gt; to &lt;code&gt;order:1&lt;/code&gt; meanwhile the other 3 items in the stack all have updated order values as well.&lt;/p&gt;

&lt;p&gt;This was the big data structures and algorithms conundrum I had to figure out, specifically how AppSync could process these batch updates at once to update many items in DynamoDB at once. &lt;/p&gt;

&lt;h3&gt;
  
  
  The solution:
&lt;/h3&gt;

&lt;p&gt;I tested out a number of different implementations and ended up going with a Global Secondary Index (GSI) on a value &lt;code&gt;orderList&lt;/code&gt; that takes in a String value and has as its sortKeyField &lt;code&gt;order&lt;/code&gt; as a integer value.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="p"&gt;...&lt;/span&gt;
&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;ID&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;
&lt;span class="nx"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;String&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;
&lt;span class="nx"&gt;order&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Int&lt;/span&gt;
  &lt;span class="c1"&gt;// ❌ This GSI didn't work&lt;/span&gt;
  &lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;index&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;ItemsByUserID&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
    &lt;span class="nx"&gt;queryField&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;listItemsByOrder&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
    &lt;span class="nx"&gt;sortKeyFields&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;timestamp&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
  &lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nx"&gt;orderList&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;String&lt;/span&gt; &lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;default&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;CURRENT&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="c1"&gt;// ✅ This GSI worked!&lt;/span&gt;
  &lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;index&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;OrderItemsByUserID&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
      &lt;span class="nx"&gt;queryField&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;listOrderItemsByUserID&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
      &lt;span class="nx"&gt;sortKeyFields&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;order&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
  &lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I found that if all of the DynamoDB objects maintain this structure of an &lt;code&gt;order&lt;/code&gt; number value and an &lt;code&gt;orderList&lt;/code&gt; string  value, I could do a list query that I named &lt;code&gt;listOrderItemsByUserID&lt;/code&gt; where I find all of the items that have &lt;code&gt;orderList === "CURRENT"&lt;/code&gt; and then sort it in ascending order, this then allowed me to list the items in incrementing order numerically even though I was doing a query off of a string value. &lt;/p&gt;

&lt;p&gt;This query looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;query&lt;/span&gt; &lt;span class="nx"&gt;MyQuery&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;listOrderItemsByUserID&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="nx"&gt;orderList&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;CURRENT&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
    &lt;span class="nx"&gt;sortDirection&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;ASC&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;items&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;id&lt;/span&gt;
      &lt;span class="nx"&gt;order&lt;/span&gt;
      &lt;span class="nx"&gt;title&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  Step 4: Stacking/Re-Stacking the Pomodoro Data Structure
&lt;/h1&gt;

&lt;p&gt;Once I figured out that we could use that type of query pattern to get the data listing correctly with the numeric sort, I needed to figure out how to serve &lt;code&gt;order&lt;/code&gt; changes from the client to AWS.&lt;/p&gt;

&lt;p&gt;I was using a JSON test data structure, which was considerably easier to test and troubleshoot with, but I was not familiar with how to do batch-writing to DynamoDB where mutating one item  in the stack spikes mutations of all the other items in the stack and then this is automatically served to the cloud and saved in real time. I was a bit skeptical about this type of set-up given I had realized I've mainly worked on saving items individually or in a queue, rather than a for loop to to batch through client-side updates. &lt;/p&gt;

&lt;p&gt;This is why this project turned into a very rich learning lesson because I was able to find out a way that you can use AppSync to serve updates to DynamoDB that almost feels like a websocket but significantly less bandwith since we are just doing update mutations rather than instantiating a whole websocket to serve the updates.&lt;/p&gt;

&lt;p&gt;I learned about this TypeScript method for batch iterating with these components:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;(1.) &lt;strong&gt;A &lt;code&gt;for...of&lt;/code&gt; loop:&lt;/strong&gt; to iterate through the items in the array. We want to run a function across many different items for AppSync to communicate to DynamoDB.&lt;/li&gt;
&lt;li&gt;(2.) &lt;strong&gt;The &lt;code&gt;.entries()&lt;/code&gt; method:&lt;/strong&gt; ** for spotlighting the various items in the stack. We call this method over the &lt;code&gt;reorderedItems&lt;/code&gt; array so that we can use this method to get back an &lt;code&gt;IterableIterator&lt;/code&gt; of &lt;code&gt;[index, element]&lt;/code&gt; for all of the items in the stack, which in our data model is &lt;code&gt;[number, ItemDDB]&lt;/code&gt;. &lt;/li&gt;
&lt;li&gt;(3.) &lt;strong&gt;&lt;code&gt;Tuple Desctructuring&lt;/code&gt;:&lt;/strong&gt; We need to assign new values to the &lt;code&gt;[index, element]&lt;/code&gt; base structure of the &lt;code&gt;IterableIterator&lt;/code&gt; into variables, so this is a method that will let us make and track those changes.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;updateItemsOrder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;reorderedItems&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;ItemDDB&lt;/span&gt;&lt;span class="p"&gt;[])&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;index&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nx"&gt;reorderedItems&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;entries&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;input&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
              &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
              &lt;span class="na"&gt;order&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;index&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="p"&gt;};&lt;/span&gt;
            &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;API&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;graphql&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;graphqlOperation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;updatePomodoroItem&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;input&lt;/span&gt; &lt;span class="p"&gt;}));&lt;/span&gt;
          &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Error updating item order:&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
          &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;⚠️ Important note with TypeScript: This &lt;code&gt;IterableIterator&lt;/code&gt; is an advanced iteration feature specific to ES6 (ECMAScript 2015), and not usable or callable in previous ES versions. TS will default to using ES5, which then means that it won't support the iteration we want to use, so we need to do one of two things:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;1.) Switch to ES6 in our &lt;code&gt;tsconfig.json&lt;/code&gt; file to change &lt;code&gt;"target": "es2015",&lt;/code&gt; under the &lt;code&gt;compilerOptions&lt;/code&gt; object, or&lt;/li&gt;
&lt;li&gt;2.) Add the &lt;code&gt;--downlevelIteration&lt;/code&gt; compiler flag by adding &lt;code&gt;"downlevelIteration": true,&lt;/code&gt; to the &lt;code&gt;compilerOptions&lt;/code&gt; object.&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Step 5: Hard-Typing with GraphQL and TypeScript
&lt;/h1&gt;

&lt;p&gt;There are numerous reasons for using TypeScript in an enterprise applications, from ensuring error-free and bug-free build code when it goes to production, as well as a consistent and reliable framework for how your data structures should be used or get called in your application.&lt;/p&gt;

&lt;p&gt;For this hackathon project, I wanted to practice typing my functions, data structures, and API calls. It was either going to be a great learning experience, or a horrible decision that I would regret forever. Even though this was a hackathon project, we must either go big or go home, as they say. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/l4FGvN3n3IQi4xZNS/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/l4FGvN3n3IQi4xZNS/giphy.gif" width="400" height="225"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Type Guards
&lt;/h2&gt;

&lt;p&gt;When we are working with AppSync, we will be making requests to get either one item (GET), or many items (LIST), so we will need to ensure we have an interface that can cross-check the data object and make sure what you expect to get is really what you get in your call.&lt;/p&gt;

&lt;p&gt;An example of this is my &lt;code&gt;getItemsFromDDB&lt;/code&gt; async function which queries my global secondary index for my schema, passing in the &lt;code&gt;orderList&lt;/code&gt; string variable, a request to get the data in ascending (ASC) order, and a filter around the status, as I only want the items that are non-COMPLETED, aka "RUNNING" in my case.&lt;/p&gt;

&lt;p&gt;Then I want to make sure that I check against an interface, which I named &lt;code&gt;isGraphQLResultForGetItemsFromDDB&lt;/code&gt; which accepts the &lt;code&gt;fetchedItems&lt;/code&gt; I receive and make sure that it matches up with this structure:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;ItemDDB&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;status&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;timeBlock&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;minutesLeft&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;colorDefault&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;itemStatus&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;order&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;isGraphQLResultForGetItemsFromDDB&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;fetchedItems&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;any&lt;/span&gt;
  &lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nx"&gt;fetchedItems&lt;/span&gt; &lt;span class="k"&gt;is&lt;/span&gt; &lt;span class="nx"&gt;GraphQLResult&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;listOrderItemsByUserID&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;items&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;ItemDDB&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;fetchedItems&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;fetchedItems&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;listOrderItemsByUserID&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;fetchedItems&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;listOrderItemsByUserID&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;items&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The whole function, useEffect hook, and type guards looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;getItemsFromDDB&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;fetchedItems&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;API&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;graphql&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
        &lt;span class="na"&gt;variables&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="na"&gt;orderList&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;CURRENT&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
          &lt;span class="na"&gt;sortDirection&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;ASC&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="na"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="na"&gt;status&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
              &lt;span class="na"&gt;eq&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;RUNNING&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
          &lt;span class="p"&gt;}}&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="na"&gt;query&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;listOrderItemsByUserID&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;authMode&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;AMAZON_COGNITO_USER_POOLS&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
      &lt;span class="p"&gt;})&lt;/span&gt;

      &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;isGraphQLResultForGetItemsFromDDB&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;fetchedItems&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nb"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Unexpected response from API&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;

      &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;fetchedItems&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nb"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;No data found&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;

      &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;returnedItems&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;fetchedItems&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;listOrderItemsByUserID&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;items&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;returnedItems&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="nx"&gt;setItems&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;returnedItems&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Error running getItemsFromDDB:&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="nx"&gt;useEffect&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;getItemsFromDDB&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;[])&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  Step 6: Shipping Your Project Live
&lt;/h1&gt;

&lt;p&gt;Unsurprisingly enough, Amplify's managed hosting prevents you from pushing error-ridden code into production (I guess this is for better and not worse). What is good about a thorough review like this is that AWS will not push or update just-pushed changes if there are type errors or anything that causes breaks in the code deployment pipeline. &lt;/p&gt;

&lt;p&gt;I thinks this is a great benefit to make sure that you do not push buggy or error-prone code to your users at any given time. This is a great benefit for a clean CI/CD pipeline.&lt;/p&gt;

&lt;p&gt;Also, Amplify's way that it seamlessly integrates Server Side Rendering out of the box for deploys is phenomenal. &lt;/p&gt;

&lt;p&gt;Further, as you work on your AppSync schema, you can configure and push your code for the back-end outside of the front-end. This decoupling allows you to start branching out beyond a monorepo and start turning Lambdas (this project has a couple lambda functions updating the public data table based on lambda triggers), Authentication, Databases, and storage into microservices that can be worked on and streamed to the front-end via APIs, Amplify's routing service, and AWS service identifiers in AWS Amplify's &lt;code&gt;aws-exports.js&lt;/code&gt; file with an authorized IAM role.&lt;/p&gt;

&lt;p&gt;Did you learn something new about AWS and the cloud? 💭&lt;/p&gt;

&lt;p&gt;Let me know in the comments below! ⬇️&lt;/p&gt;

&lt;h2&gt;
  
  
  Subscribe to the Tech Stack Playbook on YouTube:
&lt;/h2&gt;

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

&lt;p&gt;Let me know if you found this post helpful! And if you haven't yet, make sure to check out these free resources below:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Sign up for my newsletter: &lt;a href="https://brianhhough.mykajabi.com/newsletter-signup" rel="noopener noreferrer"&gt;Email List&lt;/a&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Follow my Instagram for more: &lt;a href="https://instagram.com/brianhhough" rel="noopener noreferrer"&gt;@BrianHHough&lt;/a&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Watch my latest &lt;a href="https://youtube.com/brianhhough" rel="noopener noreferrer"&gt;YouTube video for more&lt;/a&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;
&lt;b&gt;Listen to my Podcast on &lt;a href="https://podcasts.apple.com/us/podcast/tech-stack-playbook/id1553712082" rel="noopener noreferrer"&gt;Apple Podcasts&lt;/a&gt; and &lt;a href="https://open.spotify.com/show/01bHbabSyBmPfbc3ORMZa9?si=av_16aPbQEqL_bVu3RnO0g" rel="noopener noreferrer"&gt;Spotify&lt;/a&gt;&lt;/b&gt; &lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>aws</category>
      <category>nextjs</category>
      <category>typescript</category>
      <category>dynamodb</category>
    </item>
    <item>
      <title>Wrangling GraphQL Data Schemas with AWS AppSync</title>
      <dc:creator>Brian H. Hough</dc:creator>
      <pubDate>Thu, 06 Apr 2023 21:34:50 +0000</pubDate>
      <link>https://dev.to/aws-builders/wrangling-graphql-data-schemas-with-aws-appsync-24mj</link>
      <guid>https://dev.to/aws-builders/wrangling-graphql-data-schemas-with-aws-appsync-24mj</guid>
      <description>&lt;h3&gt;
  
  
  What to Do When Your GraphQL Queries &amp;amp; Mutations Won't Auto-Build with AWS AppSync
&lt;/h3&gt;

&lt;p&gt;How's it going everyone? 👋 This is Brian and welcome back to the Tech Stack Playbook, your guide to apps, software and tech (but in a fun way I promise).&lt;/p&gt;

&lt;p&gt;In today's blog post, we are going to look at AWS AppSync, GraphQL, and debug an interesting issue I came across last night trying to build my API endpoint for a blog app.&lt;/p&gt;

&lt;p&gt;While it's important to know how things work, I continue to be reminded that it is even more important to know why things don't work, and even more so, knowing how to fix issues when they arise.&lt;/p&gt;

&lt;p&gt;Here’s a glance at what you’ll learn in this blog post:&lt;br&gt;
👉  How AWS Amplify, AppSync, and GraphQL Transformer work&lt;br&gt;
👉  What to do if you GraphQL queries/mutations won't auto-build&lt;br&gt;
👉  How to test and push your data schema and API to the cloud&lt;/p&gt;
&lt;h2&gt;
  
  
  What is the AWS Amplify Framework?
&lt;/h2&gt;

&lt;p&gt;One of my absolute favorite frameworks for building full-stack cloud applications is the AWS Amplify Framework. Not only does it support core AWS services across:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Authentication: AWS Cognito&lt;/li&gt;
&lt;li&gt;Database: DynamoDB&lt;/li&gt;
&lt;li&gt;Storage: AWS S3&lt;/li&gt;
&lt;li&gt;API: AWS AppSync&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;...But it also supports a powerful way to work with GraphQL - the &lt;strong&gt;GraphQL Transformer&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;AppSync will help you auto-build your queries and mutations based on the schema you define in your &lt;code&gt;schema.graphql&lt;/code&gt; file. Not only does this reduce the possibility of errors in production, but it also increases your ability to turn code around faster with code generation (codegen) and auto-build sequences to configure the database, storage, and authentication privileges in the cloud based on your API endpoint in a matter of minutes.&lt;/p&gt;

&lt;p&gt;So what happens if you come across an issue where you don't see the /graphql folder in your application?&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%2Ffyoy714kmw8gj3f35v9n.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%2Ffyoy714kmw8gj3f35v9n.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;For reference, I am using the NEXTjs framework, which is why the &lt;code&gt;graphql&lt;/code&gt; folder is in the &lt;code&gt;/src&lt;/code&gt; folder.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This is the solve for this issue if you aren't getting the queries and mutations in your &lt;code&gt;/src&lt;/code&gt; folder...&lt;/p&gt;
&lt;h2&gt;
  
  
  ⚠️ Issue: The GraphQL Mutations and Queries aren't building in your app's root folder.
&lt;/h2&gt;

&lt;p&gt;So after some debugging, I found out that in the /amplify/backend/api/blogapp/cli-inputs.json file, this is where your .json file will point to the schema path.&lt;/p&gt;

&lt;p&gt;❌ Initially, I had it pointing to the Trash folder...most likely because I was working on a previous project, put it in the trash, but the amplify pointer was still set to follow where the root project went:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"serviceConfiguration"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"apiName"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"blogapp"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"serviceName"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"AppSync"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"gqlSchemaPath"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/Users/USERNAME/.Trash/blogapp/amplify/backend/api/blogapp/schema.graphql"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"defaultAuthType"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"mode"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"API_KEY"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"expirationTime"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✅ To fix this, I re-directed the &lt;code&gt;gqlSchemaPath&lt;/code&gt; to the location of the schema.graphql file below (the correct link).&lt;/p&gt;

&lt;p&gt;This works so long as it's pointing to the right directory of the project:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"serviceConfiguration"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"apiName"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"blogapp"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"serviceName"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"AppSync"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"gqlSchemaPath"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/Users/USERNAME/Documents/GitHub/AWSAmplify_GraphQL_Blog/blogapp/amplify/backend/api/blogapp/schema.graphql"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"defaultAuthType"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"mode"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"API_KEY"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"expirationTime"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  ⚠️ There was no &lt;code&gt;graphqlconfig.yml&lt;/code&gt; file in the root folder of the project
&lt;/h2&gt;

&lt;p&gt;By configuring your project to generate code with codegen, you need a place to store the configuration. The &lt;code&gt;graphqlconfig.yml&lt;/code&gt; file is auto-built in the root folder and when generating the types defined in your &lt;code&gt;schema.graphql&lt;/code&gt; file, codegen takes in GraphQL statements (inputs) and generates types that can be used based on the schema (outputs).&lt;/p&gt;

&lt;p&gt;I initially had a placeholder file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;projects&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;blogapp&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;schemaPath&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;src/graphql/schema.json&lt;/span&gt;
    &lt;span class="na"&gt;includes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;src/graphql/**/*.js&lt;/span&gt;
    &lt;span class="na"&gt;excludes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;./amplify/**&lt;/span&gt;
    &lt;span class="na"&gt;extensions&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;amplify&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;codeGenTarget&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;javascript&lt;/span&gt;
        &lt;span class="na"&gt;generatedFileName&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;'&lt;/span&gt;
        &lt;span class="na"&gt;docsFilePath&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;src/graphql&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When I run &lt;code&gt;amplify push&lt;/code&gt; later, this auto-generates the file below:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;projects&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;blogapp&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;schemaPath&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;src/graphql/schema.json&lt;/span&gt;
    &lt;span class="na"&gt;includes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;src/graphql/**/*.js&lt;/span&gt;
    &lt;span class="na"&gt;excludes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;./amplify/**&lt;/span&gt;
    &lt;span class="na"&gt;extensions&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;amplify&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;codeGenTarget&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;javascript&lt;/span&gt;
        &lt;span class="na"&gt;generatedFileName&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;'&lt;/span&gt;
        &lt;span class="na"&gt;docsFilePath&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;src/graphql&lt;/span&gt;
&lt;span class="na"&gt;extensions&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;amplify&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;3&lt;/span&gt;
&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%2Ffruiyqvrpso9oueplwnz.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%2Ffruiyqvrpso9oueplwnz.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once you have updated your schema and want to update your schema.graphql file, you can run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;amplify api-gql-compile
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  🛠 Testing
&lt;/h2&gt;

&lt;p&gt;Of course, where would we be without implementing test-driven-development in our development lifecycle?&lt;/p&gt;

&lt;p&gt;A recommended flow would be:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Create/edit the GraphQL schema&lt;/li&gt;
&lt;li&gt;Test the data schema via mocking&lt;/li&gt;
&lt;li&gt;Ensure all specifications and requirements are met&lt;/li&gt;
&lt;li&gt;Push to the cloud and auto-build&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;With the AWS Amplify framework, testing a GraphQL API endpoint is as easy as running a single command in the terminal:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;amplify mock api
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Did you learn something new about AWS and the cloud? 💭&lt;/p&gt;

&lt;p&gt;Let me know in the comments below! ⬇️&lt;/p&gt;

&lt;h2&gt;
  
  
  Subscribe to the Tech Stack Playbook on YouTube:
&lt;/h2&gt;

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

&lt;p&gt;Let me know if you found this post helpful! And if you haven't yet, make sure to check out these free resources below:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Sign up for my newsletter: &lt;a href="https://brianhhough.mykajabi.com/newsletter-signup" rel="noopener noreferrer"&gt;Email List&lt;/a&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Follow my Instagram for more: &lt;a href="https://instagram.com/brianhhough" rel="noopener noreferrer"&gt;@BrianHHough&lt;/a&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Watch my latest &lt;a href="https://youtube.com/brianhhough" rel="noopener noreferrer"&gt;YouTube video for more&lt;/a&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;
&lt;b&gt;Listen to my Podcast on &lt;a href="https://podcasts.apple.com/us/podcast/tech-stack-playbook/id1553712082" rel="noopener noreferrer"&gt;Apple Podcasts&lt;/a&gt; and &lt;a href="https://open.spotify.com/show/01bHbabSyBmPfbc3ORMZa9?si=av_16aPbQEqL_bVu3RnO0g" rel="noopener noreferrer"&gt;Spotify&lt;/a&gt;&lt;/b&gt; &lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>aws</category>
      <category>graphql</category>
      <category>javascript</category>
      <category>react</category>
    </item>
    <item>
      <title>Why you should be learning cloud in 2023 | AWS Community Builders Program</title>
      <dc:creator>Brian H. Hough</dc:creator>
      <pubDate>Mon, 23 Jan 2023 04:08:30 +0000</pubDate>
      <link>https://dev.to/aws-builders/why-you-should-be-learning-cloud-in-2023-aws-community-builders-program-4b37</link>
      <guid>https://dev.to/aws-builders/why-you-should-be-learning-cloud-in-2023-aws-community-builders-program-4b37</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fv8nelz4zuhffdcrzizfp.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%2Fv8nelz4zuhffdcrzizfp.png" alt="Why you should be learning cloud in 2023 | AWS Community Builders Program cover photo" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Why should you learn cloud in 2023? 👨‍💻💭&lt;/p&gt;

&lt;p&gt;In this episode of the &lt;a href="https://www.youtube.com/watch?v=QJQTXC92q5Q" rel="noopener noreferrer"&gt;Tech Stack Playbook&lt;/a&gt;, I'm diving into how I built my career in tech and explain how the AWS Community Builders program allowed me to really dive deep into the tech ecosystem. Today's episode focuses on AWS, the community, the core benefits of the program, and how it has helped me level up as a software engineer and developer a few years ago. &lt;/p&gt;

&lt;p&gt;For anyone who is looking to get a job, searching for a new role, looking to upskill and level up, switching careers, or pivoting career directions, this episode will be a deep dive into what I did to get into tech and how the steps I took might be able to help you on your journey as well. &lt;/p&gt;

&lt;p&gt;📝 Applications for the AWS Community Builders Program close on Jan 23, 2023, so please reach out if you have any questions about the program and be sure to apply by the deadline here: &lt;a href="https://amazonmr.au1.qualtrics.com/jfe/form/SV_bJwBQXrT2LhBawS" rel="noopener noreferrer"&gt;https://amazonmr.au1.qualtrics.com/jfe/form/SV_bJwBQXrT2LhBawS&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here’s a glance at what you’ll learn in this blog post:&lt;br&gt;
👉 3 Ways to increase your chances of getting hired&lt;br&gt;
👉 How social media led me to the AWS Community Builders Program&lt;br&gt;
👉 Why learning cloud will future-proof your skills/career&lt;br&gt;
👉 The 3 core benefits of the AWS Community Builders Program&lt;br&gt;
👉 How you can future-proof yourself and your skills&lt;br&gt;
👉 What to learn in 2023&lt;/p&gt;

&lt;p&gt;Looking to skip right to a specific chapter? Check them out:&lt;br&gt;
&lt;a href="https://www.youtube.com/watch?v=QJQTXC92q5Q&amp;amp;t=0s" rel="noopener noreferrer"&gt;00:00:00&lt;/a&gt; Why should you learn cloud in 2023?&lt;br&gt;
&lt;a href="https://www.youtube.com/watch?v=QJQTXC92q5Q&amp;amp;t=69s" rel="noopener noreferrer"&gt;00:01:09&lt;/a&gt; 3 Ways to increase your chances of getting hired&lt;br&gt;
&lt;a href="https://www.youtube.com/watch?v=QJQTXC92q5Q&amp;amp;t=199s" rel="noopener noreferrer"&gt;00:03:19&lt;/a&gt; How social media led me to the AWS Community Builders Program&lt;br&gt;
&lt;a href="https://www.youtube.com/watch?v=QJQTXC92q5Q&amp;amp;t=323s" rel="noopener noreferrer"&gt;00:05:23&lt;/a&gt; Why learning cloud will future-proof your skills/career&lt;br&gt;
&lt;a href="https://www.youtube.com/watch?v=QJQTXC92q5Q&amp;amp;t=593s" rel="noopener noreferrer"&gt;00:09:53&lt;/a&gt; The 3 core benefits of the AWS Community Builders Program&lt;br&gt;
&lt;a href="https://www.youtube.com/watch?v=QJQTXC92q5Q&amp;amp;t=1147s" rel="noopener noreferrer"&gt;00:19:07&lt;/a&gt; How you can future-proof yourself and your skills&lt;br&gt;
&lt;a href="https://www.youtube.com/watch?v=QJQTXC92q5Q&amp;amp;t=1310s" rel="noopener noreferrer"&gt;00:21:50&lt;/a&gt; What to learn in 2023&lt;/p&gt;

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

&lt;p&gt;Are you thinking of applying this year? 💭&lt;/p&gt;

&lt;p&gt;Let me know in the comments below! ⬇️&lt;/p&gt;

&lt;h2&gt;
  
  
  Check out the full recording below:
&lt;/h2&gt;

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

&lt;p&gt;Let me know if you found this post helpful! And if you haven't yet, make sure to check out these free resources below:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Follow my Instagram for more: &lt;a href="https://instagram.com/brianhhough" rel="noopener noreferrer"&gt;@BrianHHough&lt;/a&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Watch my latest &lt;a href="https://youtube.com/brianhhough" rel="noopener noreferrer"&gt;YouTube video for more&lt;/a&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;
&lt;b&gt;Listen to my Podcast on &lt;a href="https://podcasts.apple.com/us/podcast/tech-stack-playbook/id1553712082" rel="noopener noreferrer"&gt;Apple Podcasts&lt;/a&gt; and &lt;a href="https://open.spotify.com/show/01bHbabSyBmPfbc3ORMZa9?si=av_16aPbQEqL_bVu3RnO0g" rel="noopener noreferrer"&gt;Spotify&lt;/a&gt;&lt;/b&gt; &lt;/li&gt;
&lt;li&gt;&lt;b&gt;Join my FREE &lt;a href="https://discord.gg/dp86DpQMBN" rel="noopener noreferrer"&gt;Tech Stack Playbook Discord Server&lt;/a&gt;&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Let's digitize the world together! 🚀&lt;/p&gt;

&lt;p&gt;-- Brian&lt;/p&gt;

</description>
      <category>techtalks</category>
      <category>webdev</category>
      <category>community</category>
    </item>
    <item>
      <title>AWS Amplify CLI Installation Guide (M1/M2 2022 Mac Edition)</title>
      <dc:creator>Brian H. Hough</dc:creator>
      <pubDate>Sun, 16 Oct 2022 06:40:06 +0000</pubDate>
      <link>https://dev.to/aws-builders/aws-amplify-cli-installation-guide-m1m2-2022-mac-edition-3cm2</link>
      <guid>https://dev.to/aws-builders/aws-amplify-cli-installation-guide-m1m2-2022-mac-edition-3cm2</guid>
      <description>&lt;h2&gt;
  
  
  💭 What is the AWS Amplify Framework?
&lt;/h2&gt;

&lt;p&gt;One of my absolute favorite frameworks for building cloud-based, serverless applications is the &lt;a href="https://docs.amplify.aws/" rel="noopener noreferrer"&gt;AWS Amplify framework&lt;/a&gt;. I have been spending the better part of this past year learning the ins-and-outs of the framework, as well as extending each of the tools in the tech stack to incorporate new integrations, data models, front-end experiences, and event-driven architectures.&lt;/p&gt;

&lt;p&gt;This framework, to me, really conceptualizes what makes serverless applications so powerful. Within the framework, you leverage the &lt;code&gt;@aws-amplify&lt;/code&gt; CLI (command line interface) to provision resources in the cloud right from the command line. Most importantly, these resources are deployed with the right IAM (Identity and Access Management) authorization rules and abide by the AWS principle of &lt;a href="https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html" rel="noopener noreferrer"&gt;"Least Privileged Access"&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Some examples of these great CLI commands include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;amplify add auth&lt;/code&gt;:&lt;/strong&gt; configure an AWS Cognito User Pool and methods for signing-in, including email/password and/or social federation (i.e. Facebook, Apple, OpenID, SAML, etc.)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;amplify add api&lt;/code&gt;:&lt;/strong&gt; configure an AppSync API via REST or GraphQL that configures directly to a NoSQL DynamoDB database to read/write from the front-end to your back-end.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;amplify add storage&lt;/code&gt;:&lt;/strong&gt; configure AWS S3 file upload/download capabilities for files, such as images, videos, PDFs, music files, etc.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;amplify add hosting&lt;/code&gt;:&lt;/strong&gt; configure a manual deployment or CI/CD (continuous integration/continuous deployment) pipeline to deploy your app's code to an amplify URL or your own custom domain.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;amplify status&lt;/code&gt;:&lt;/strong&gt; review your locally deployed AWS resources before you deploy them.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;amplify push&lt;/code&gt;:&lt;/strong&gt; run a cloudformation script to deploy your locally created AWS resources to your cloud environment.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Case in point, the AWS Amplify framework is a great wrapper around core AWS services and their functionalities to help you build faster, without compromising security or scalability.&lt;/p&gt;

&lt;h2&gt;
  
  
  ⚠️ 2022 Update on Installing the AWS Amplify CLI
&lt;/h2&gt;

&lt;p&gt;Migrating to new technology, like a new laptop or OS, can be a very daunting process. Setting up my new M1 Max laptop this year was a process that took a couple weeks, myself. You will find out how many CLIs, SDKs, softwares, systems, and tools that installed once and forgotten 😊 &lt;/p&gt;

&lt;p&gt;What can be especially frustrating when moving from one OS to another, such as the 2019 MacBook Pro to the 2022 M1 Max, is when the tools you use on the previous device don't work the same on the new one. This happened with installing the @aws-amplify CLI.&lt;/p&gt;

&lt;p&gt;I ran into a core issue where I needed to use &lt;code&gt;sudo&lt;/code&gt; in front of all of the AWS Amplify CLI commands, which meant I would have to put in my password EVERY SINGLE TIME I ran &lt;code&gt;amplify something&lt;/code&gt; 🙃&lt;/p&gt;

&lt;p&gt;I hope that this guide helps you get up and running with AWS Amplify, especially if you run into the &lt;code&gt;Error: EACCES: permission denied&lt;/code&gt; errors that I ran into.&lt;/p&gt;

&lt;h2&gt;
  
  
  Installation Guide
&lt;/h2&gt;

&lt;p&gt;For reference, the AWS Amplify steps referenced below are also viewable on the &lt;a href="https://docs.amplify.aws/cli/start/install/" rel="noopener noreferrer"&gt;Amplify Docs here&lt;/a&gt; should there be any differences or modifications since the writing of this blog.&lt;/p&gt;

&lt;h2&gt;
  
  
  🧑‍💻 Step 1: Installing Node.js and npm
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://nodejs.org/en/" rel="noopener noreferrer"&gt;Node.js&lt;/a&gt;, also referred to NodeJS or just Node, is an open-sourced and widely adopted JavaScript runtime environment. When you are running a JavaScript server, NodeJS is often what is being referenced. &lt;/p&gt;

&lt;p&gt;On the homepage, NodeJS will attempt to read the type of device you have and then present two download options for you: &lt;br&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%2F6j1ntusbtx73n37s089s.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%2F6j1ntusbtx73n37s089s.png" alt="Image description" width="800" height="555"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I've found that the LTS version is the one that works most of the time, so I installed that one.&lt;/p&gt;

&lt;p&gt;When you install NodeJS, you will also have the option to install npm (Node Package Manager) as well. Make sure that option is selected if there is an option, as you will need npm when installing dependencies in your projects or running node scripts.&lt;/p&gt;

&lt;p&gt;⚠️ IMPORTANT: if you have any issues installing NodeJS or npm on your Mac, Homebrew.sh may be &lt;a href="https://treehouse.github.io/installation-guides/mac/node-mac.html" rel="noopener noreferrer"&gt;helpful&lt;/a&gt; to you. When you install &lt;a href="https://brew.sh/" rel="noopener noreferrer"&gt;Homebrew&lt;/a&gt;, it helps you package your installations into their own directory and them symlinks them to &lt;code&gt;usr/local&lt;/code&gt; on your Mac.&lt;/p&gt;
&lt;h2&gt;
  
  
  🧑‍💻 Step 2: Set up an AWS Account
&lt;/h2&gt;

&lt;p&gt;On the &lt;a href="https://aws.amazon.com/" rel="noopener noreferrer"&gt;AWS homepage&lt;/a&gt; you will see a bright orange button in the top right that says "Create an AWS Account." &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%2Fwsm0z3od7nz4hhrxkliu.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%2Fwsm0z3od7nz4hhrxkliu.png" alt="Image description" width="800" height="551"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To set up an account, you will need an email and a credit card, but don't worry, you will only be charged a temporary ~$1 (or less) hold to verify your card. It will be refunded to you within 1-3 business days.&lt;/p&gt;
&lt;h2&gt;
  
  
  🧑‍💻 Step 3: Installing the Amplify CLI
&lt;/h2&gt;

&lt;p&gt;The AWS Amplify CLI (command line interface) is a set of programmable terminal scripts to create/deploy AWS services for any application, website, or system.&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%2Fe0gy3pvhyqkxm88fdjjo.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%2Fe0gy3pvhyqkxm88fdjjo.png" alt="Image description" width="800" height="550"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;There are 3 core ways to install the &lt;code&gt;@aws-amplify&lt;/code&gt; CLI:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;npm (for NodeJS users):&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; @aws-amplify/cli
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;cURL (for Mac/Linux):&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-sL&lt;/span&gt; https://aws-amplify.github.io/amplify-cli/install | bash &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nv"&gt;$SHELL&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;cURL (Windows-only):&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-sL&lt;/span&gt; https://aws-amplify.github.io/amplify-cli/install-win &lt;span class="nt"&gt;-o&lt;/span&gt; install.cmd &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; install.cmd
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;The immediate go-to since we just installed NodeJS/npm would be to install via the &lt;code&gt;npm install...&lt;/code&gt; command.&lt;/p&gt;

&lt;p&gt;So let's do that!&lt;/p&gt;
&lt;h2&gt;
  
  
  🧑‍💻 Step 3.5: If you receive &lt;code&gt;Error: EACCES: permission denied&lt;/code&gt; errors after running the above.
&lt;/h2&gt;

&lt;p&gt;In the latest models of the Apple M1/M2 Macbook Pro/Max's, there is well documented issues around installing system-wide software and tools where the Mac will reject installing it, claiming access permission issues.&lt;/p&gt;

&lt;p&gt;This is what that might look like if you receive this error after running: &lt;code&gt;npm install -g @aws-amplify/cli&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm WARN config global &lt;span class="sb"&gt;`&lt;/span&gt;&lt;span class="nt"&gt;--global&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;, &lt;span class="sb"&gt;`&lt;/span&gt;&lt;span class="nt"&gt;--local&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt; are deprecated. Use &lt;span class="sb"&gt;`&lt;/span&gt;&lt;span class="nt"&gt;--location&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;global&lt;span class="sb"&gt;`&lt;/span&gt; instead.
npm ERR! code EACCES
npm ERR! syscall rename
npm ERR! path /usr/local/lib/node_modules/@aws-amplify/cli
npm ERR! dest /usr/local/lib/node_modules/@aws-amplify/.cli-XXXXXXXX
npm ERR! errno &lt;span class="nt"&gt;-13&lt;/span&gt;
npm ERR! Error: EACCES: permission denied, rename &lt;span class="s1"&gt;'/usr/local/lib/node_modules/@aws-amplify/cli'&lt;/span&gt; -&amp;gt; &lt;span class="s1"&gt;'/usr/local/lib/node_modules/@aws-amplify/.cli-XXXXXXXX'&lt;/span&gt;
npm ERR!  &lt;span class="o"&gt;[&lt;/span&gt;Error: EACCES: permission denied, rename &lt;span class="s1"&gt;'/usr/local/lib/node_modules/@aws-amplify/cli'&lt;/span&gt; -&amp;gt; &lt;span class="s1"&gt;'/usr/local/lib/node_modules/@aws-amplify/.cli-XXXXXXXX'&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
npm ERR!   errno: &lt;span class="nt"&gt;-13&lt;/span&gt;,
npm ERR!   code: &lt;span class="s1"&gt;'EACCES'&lt;/span&gt;,
npm ERR!   syscall: &lt;span class="s1"&gt;'rename'&lt;/span&gt;,
npm ERR!   path: &lt;span class="s1"&gt;'/usr/local/lib/node_modules/@aws-amplify/cli'&lt;/span&gt;,
npm ERR!   dest: &lt;span class="s1"&gt;'/usr/local/lib/node_modules/@aws-amplify/.cli-XXXXXXXX'&lt;/span&gt;
npm ERR! &lt;span class="o"&gt;}&lt;/span&gt;
npm ERR! 
npm ERR! The operation was rejected by your operating system.
npm ERR! It is likely you &lt;span class="k"&gt;do &lt;/span&gt;not have the permissions to access this file as the current user
npm ERR! 
npm ERR! If you believe this might be a permissions issue, please double-check the
npm ERR! permissions of the file and its containing directories, or try running
npm ERR! the &lt;span class="nb"&gt;command &lt;/span&gt;again as root/Administrator.

npm ERR! A &lt;span class="nb"&gt;complete &lt;/span&gt;log of this run can be found &lt;span class="k"&gt;in&lt;/span&gt;:
npm ERR!     /Users/MYUSER/.npm/_logs/2022-10-15T17_42_00_235Z-debug-0.log
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✅ PART 1: A temporary workaround is install the amplify CLI with sudo if you can't install with just npm. Sudo is an admin-only command to install something globally&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; @aws-amplify/cli
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In the long-term if left like this, it will present a nightmare of permission issues where you will have to enter your admin password every single time you want to run an amplify command (after a month of this madness, I needed to figure out how to stop the madness). So continue to the following step on how to switch the amplify CLI to be accessible by your device user.&lt;/p&gt;

&lt;p&gt;✅ PART 2: Now that the amplify CLI is installed via sudo, we now must configure the CLI to be accessible to our specific user. What we did in the above was make the amplify cli accessible only to our &lt;code&gt;root&lt;/code&gt; user, not our device user. &lt;/p&gt;

&lt;p&gt;We will use a bit of linux to change the owner for our amplify CLI toolchain. In a new terminal window, run the following commands one by one, and make sure to replace &lt;code&gt;MYUSER&lt;/code&gt; with the user of your device. You can find out what the name is by opening a separate terminal window and running &lt;code&gt;whoami&lt;/code&gt; and what is printed out is your device name.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# invoke a root shell by logging in as the root user&lt;/span&gt;
&lt;span class="nb"&gt;sudo&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt;

&lt;span class="c"&gt;# change directory into your specific user you want to adjust&lt;/span&gt;
&lt;span class="nb"&gt;cd&lt;/span&gt; ~MYUSER

&lt;span class="c"&gt;# change ownership of the `.amplify` file to MYUSER&lt;/span&gt;
&lt;span class="nb"&gt;chown&lt;/span&gt; &lt;span class="nt"&gt;-R&lt;/span&gt; MYUSER .amplify
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;What we just did was change the ownership of the hidden directory &lt;code&gt;.amplify&lt;/code&gt; installed under our user. If you want to find where this is, run &lt;code&gt;ls -al&lt;/code&gt; and you should see a list of directories, including &lt;code&gt;.amplify&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;✅ PART 3: Test&lt;br&gt;
In a separate terminal window, check if you can run &lt;code&gt;amplify help&lt;/code&gt;. If you get a response back and the CLI is running the help command, then you are all installed correctly!&lt;/p&gt;

&lt;h2&gt;
  
  
  🧑‍💻 Subscribe to the Tech Stack Playbook for more:
&lt;/h2&gt;

&lt;p&gt;Let me know if you found this post helpful! And if you haven't yet, make sure to check out these free resources below:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Follow my Instagram for more: &lt;a href="https://instagram.com/brianhhough" rel="noopener noreferrer"&gt;@BrianHHough&lt;/a&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;I'm also on Tik Tok too: &lt;a href="https://www.tiktok.com/@brianhhough" rel="noopener noreferrer"&gt;@BrianHHough&lt;/a&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Watch my latest &lt;a href="https://youtube.com/brianhhough" rel="noopener noreferrer"&gt;YouTube video for more&lt;/a&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Listen to my Podcast on &lt;a href="https://podcasts.apple.com/us/podcast/tech-stack-playbook/id1553712082" rel="noopener noreferrer"&gt;Apple Podcasts&lt;/a&gt; and &lt;a href="https://open.spotify.com/show/01bHbabSyBmPfbc3ORMZa9?si=av_16aPbQEqL_bVu3RnO0g" rel="noopener noreferrer"&gt;Spotify&lt;/a&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Join my FREE &lt;a href="https://facebook.com/groups/techstackplaybook" rel="noopener noreferrer"&gt;Tech Stack Playbook Facebook Group&lt;/a&gt;&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Let's digitize the world together! 🚀&lt;/p&gt;

&lt;p&gt;-- Brian&lt;/p&gt;

</description>
      <category>aws</category>
      <category>cloud</category>
      <category>serverless</category>
      <category>node</category>
    </item>
    <item>
      <title>Learn how to Dynamically Add App Features with AWS AppConfig Feature Flags (+ Linux 101)</title>
      <dc:creator>Brian H. Hough</dc:creator>
      <pubDate>Mon, 13 Jun 2022 03:58:00 +0000</pubDate>
      <link>https://dev.to/aws-builders/learn-how-to-dynamically-add-app-features-with-aws-appconfig-feature-flags-linux-101-4cai</link>
      <guid>https://dev.to/aws-builders/learn-how-to-dynamically-add-app-features-with-aws-appconfig-feature-flags-linux-101-4cai</guid>
      <description>&lt;p&gt;How's it going everyone? 👋 Welcome back to the &lt;b&gt;Tech Stack Playbook&lt;/b&gt;, your guide to apps, software, and tech (but in a fun way I promise).&lt;/p&gt;

&lt;p&gt;This past week, I attended a really eye-opening AWS workshop put on for AWS Community Builders on a very interesting service I had not used before, called AppConfig. As described in the documentation, &lt;a href="https://docs.aws.amazon.com/appconfig/latest/userguide/what-is-appconfig.html" rel="noopener noreferrer"&gt;AWS AppConfig&lt;/a&gt; is a service that lets developers create, manage, and quickly deploy application changes, modifications, features, or patches which are running on Amazon EC2 (Elastic Cloud Compute), AWS Lambda, containers, mobile apps, or IoT devices. &lt;/p&gt;

&lt;p&gt;In this blog post, I'll go through the workshop, the code I used to run everything, screenshots of the deployment process, and I will also go through how to use Linux and an Amazon EC2 instance to deploy all of the code in a VM (virtual machine).&lt;/p&gt;

&lt;p&gt;What we will build is a simple Airbnb-for-Cribs home rental application and switch in an image viewer carousel for each listed home via AWS AppConfig. Here's what it will look like (unfortunately, IRL mansions are not included):&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%2Fzcyldsnymlt6i5nnavoq.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%2Fzcyldsnymlt6i5nnavoq.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I have the starter repo that AWS created linked on my GitHub here under the branch &lt;code&gt;initial&lt;/code&gt;. I also have the &lt;code&gt;final&lt;/code&gt; branch code for reference as well.&lt;br&gt;
&lt;/p&gt;
&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/BrianHHough" rel="noopener noreferrer"&gt;
        BrianHHough
      &lt;/a&gt; / &lt;a href="https://github.com/BrianHHough/AWSAppConfigWorkshop" rel="noopener noreferrer"&gt;
        AWSAppConfigWorkshop
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Exploration of the AWS AppConfig service for dynamic feature changes to a web application. The workshop uses AWS AppSync, AWS Amplify, AWS EC2, DynamoDB. The app's tech stack is: HTML, CSS, JavaScript.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/4a0bb462a830dceb6e23519c80f082bd89a58793d62358d6763134cf9e823b9d/68747470733a2f2f6465762d746f2d75706c6f6164732e73332e616d617a6f6e6177732e636f6d2f75706c6f6164732f61727469636c65732f667a6d32796c6e716f6e30303868706d68726a302e706e67"&gt;&lt;img src="https://camo.githubusercontent.com/4a0bb462a830dceb6e23519c80f082bd89a58793d62358d6763134cf9e823b9d/68747470733a2f2f6465762d746f2d75706c6f6164732e73332e616d617a6f6e6177732e636f6d2f75706c6f6164732f61727469636c65732f667a6d32796c6e716f6e30303868706d68726a302e706e67" alt="AWS AppConfig Workshop"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;AWS AppConfig Workshop Repo&lt;/h1&gt;

&lt;/div&gt;
&lt;p&gt;Exploration of the AWS AppConfig service for dynamic feature changes to a web application. The workshop uses AWS AppSync, AWS Amplify, AWS EC2, DynamoDB. The app's tech stack is: HTML, CSS, JavaScript.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;There are 2 branches:&lt;/h2&gt;

&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;final&lt;/code&gt; = includes the script calling the AWS Lambda function connected to AWS AppConfig&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;initial&lt;/code&gt; = is the starter repo (if you are following along, start on this branch)&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Follow along to the following blog post for steps on how to proceed:&lt;/h2&gt;

&lt;/div&gt;
&lt;p&gt;&lt;a href="https://dev.to/aws-builders/learn-how-to-dynamically-add-app-features-with-aws-appconfig-feature-flags-linux-101-4cai" rel="nofollow"&gt;DEV.to: Learn how to Dynamically Add App Features with AWS AppConfig Feature Flags (+ Linux 101)&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;



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


&lt;p&gt;If you're excited, read on!&lt;/p&gt;

&lt;h2&gt;
  
  
  ☁️ Building for Scale (in the Cloud)
&lt;/h2&gt;

&lt;p&gt;Let's take a step back, to talk about scale. "Building for scale" is something a lot of people talk about, but very seldom do we ever plan for scale to happen in the ways we want. Becoming an "overnight success" could take months, years, or even decades in some cases. We rarely ever know when "hitting scale" will take place, so we have to future-proof tech so that it will scale with our needs, when we need them. &lt;/p&gt;

&lt;p&gt;Imagine releasing a feature to a million plus member base. What if the feature includes a breaking change with a bug that decreases use by 60% per week per user. That could be disastrous. We want to get ahead of these issues, which is why AWS AppConfig can help us analyze a feature pushed to a select (but growing) number of users over time so that we can adapt to the change, see what it does to our user base, and adjust accordingly.&lt;/p&gt;

&lt;p&gt;When you think about "building for scale," of course one of the top companies that comes to my mind is Facebook (...I mean, Meta...still not used to saying that). In Meta's 2022 Q1 2022 Earnings Report, the company reported a whopping 2.94 billion Monthly Active Users as of March 31, 2022 (&lt;a href="https://investor.fb.com/investor-events/event-details/2022/Q1-2022-Earnings/default.aspx" rel="noopener noreferrer"&gt;Meta Q1 2022 Earnings Report&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;One of the interviews that stands out in my mind in particular is Reid Hoffman's Masters of Scale interview with Meta CEO Mark Zuckerberg. Back in 2017, Mark Zuckerberg shared a bit more of the context behind his "move fast and break things" mantra that has allowed him to build the largest social media platform on the planet.&lt;/p&gt;

&lt;p&gt;Mark shared that:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"At any given point in time, there isn't just one version of Facebook running, there are probably 10,000. Any engineer at the company can basically decide that they want to test something. There are some rules on sensitive things, but in general, an engineer can test something, and they can launch a version of Facebook not to the whole community, but maybe to 10,000 people or 50,000 people—whatever is necessary to get a good test of an experience. (&lt;a href="https://www.entrepreneur.com/article/294242" rel="noopener noreferrer"&gt;Entrepreneur&lt;/a&gt;)"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Check out the interview here:
&lt;/h3&gt;


&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
      &lt;div class="c-embed__cover"&gt;
        &lt;a href="https://art19.com/shows/masters-of-scale/episodes/83f96210-9287-4cca-a4db-6a5b518942f9" class="c-link s:max-w-50 align-middle" rel="noopener noreferrer"&gt;
          &lt;img alt="" src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcontent.production.cdn.art19.com%2Fimages%2F2a%2F8b%2F40%2Fe5%2F2a8b40e5-d38e-42bd-bdfa-169516ffe654%2Fc8d24a15892747d9571e2746b7578fc0360b07f56af6e854b917aa15eb0a4de660cf47bd49c1cf56bf1412102c016b3ab8dc9dbcd3d73248282479f44f31bcc0.jpeg" height="auto" class="m-0"&gt;
        &lt;/a&gt;
      &lt;/div&gt;
    &lt;div class="c-embed__body"&gt;
      &lt;h2 class="fs-xl lh-tight"&gt;
        &lt;a href="https://art19.com/shows/masters-of-scale/episodes/83f96210-9287-4cca-a4db-6a5b518942f9" rel="noopener noreferrer" class="c-link"&gt;
          Imperfect is perfect, w/Facebook's Mark Zuckerberg
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;p class="truncate-at-3"&gt;
          If you’re Steve Jobs, you can wait for your product to be perfect. For the rest of us, If you’re not embarrassed by your first product release, you’ve released it too late. Imperfect is perfect. Why? Because your assumptions about what people want are never exactly right. Most entrepreneurs create great products through a tight feedback loop with real customers using a real product. So don’t fear imperfections; they won’t make or break your company. What will make or break you is speed. And no one knows this better than Facebook’s Mark Zuckerberg. He shares the origin story of his mantra “move fast and break things” and how this ethos applied as Facebook evolved from student project to tech giant.

Read a transcript of this episode: https://mastersofscale.com

Subscribe to the Masters of Scale weekly newsletter: https://mastersofscale.com/subscribe
        &lt;/p&gt;
      &lt;div class="color-secondary fs-s flex items-center"&gt;
          &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwebapp.production.cdn.art19.com%2Fember-app%2Fassets%2Fimages%2Ffavicons%2Ffavicon-32x32-0b27c861c231edaca0794e8b27175509.png"&gt;
        art19.com
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;You might think, why would you want something like this? All the users have different user experiences? Isn't that counter-intuitive to UI/UX testing, agile development, and scaling?&lt;/p&gt;

&lt;p&gt;Not necessarily... because, let's say you are testing the incorporation of a feature or experience. Sure you can test it in controlled environments, but those are still, controlled. What is more optimal is to test real people, using your app in a real way, without the impression of being under a microscope, so you can really understand if the feature "hits" or resonates with the expected user base at the expected time.&lt;/p&gt;

&lt;p&gt;To this day, I have always wondered how dynamic feature adds or dynamic user testing actually works in production. Thanks to the AWS Community Builders Program, I was able to see something like this in action, which is what I will be sharing with you today.&lt;/p&gt;

&lt;h2&gt;
  
  
  ☁️ Intro to AWS AppConfig
&lt;/h2&gt;

&lt;p&gt;With AWS AppConfig, we are going to add in a feature called "Photo Slider" which will allow users to switch between photos in the app for each crib. However, it will not be visible to everyone all at once as soon as the feature is pushed. &lt;/p&gt;

&lt;p&gt;AWS AppConfig allows us to set the launch deployment details, where we can release to 1% of users, then 5%, then 10%, and so on. It can be risky to release a new feature to users all at once, so we need to account for that. AWS AppConfig has a feature called "Feature Flags" that can allow us to pull the switch on a feature if something unexpected or disastrous happens in the app and allow us to revert back near-instantly.&lt;/p&gt;

&lt;h2&gt;
  
  
  ☁️ Where does AWS AppConfig fit?
&lt;/h2&gt;

&lt;p&gt;In this architecture diagram provided by the AWS team, it outlines where everything "lives." &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Deployment; via AWS Amplify&lt;/li&gt;
&lt;li&gt;Database: via DynamoDB&lt;/li&gt;
&lt;li&gt;Front-end: via HTML, CS, and JS&lt;/li&gt;
&lt;li&gt;AppConfig: connected via a AWS Lambda function to the front-end&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%2F8g7r0a9i1e6kgzcwzeq0.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%2F8g7r0a9i1e6kgzcwzeq0.png" alt="Image description"&gt;&lt;/a&gt;&lt;br&gt;
Source: AWS &lt;/p&gt;
&lt;h2&gt;
  
  
  ☁️ Set up a Feature Flag
&lt;/h2&gt;

&lt;p&gt;In the AWS Console, you will navigate over to the &lt;strong&gt;AWS AppConfig&lt;/strong&gt; service.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Click &lt;strong&gt;Get Started&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;In "Create Application" page, name your app: &lt;code&gt;AWSomeCribRentals&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Add a description: &lt;code&gt;This is for feature flags related to the AWSomeCribRentals app&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Create application&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This will be our container for all flags related to our application. Think of it like a wrapper.&lt;/p&gt;

&lt;p&gt;We then must create a &lt;strong&gt;configuration profile&lt;/strong&gt; within the AppConfig application. This lets us define the Feature Flag type and set-up. You can think of it as an element within the wrapper (i.e. you could have multiple Configuration Profiles, perhaps even multiple feature flags within the same profile, which all sits within the AppConfig Application).&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Let's name the config profile of our feature addition of a card: &lt;code&gt;CardFeatureFlag&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Add a description: &lt;code&gt;related to card&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We will then add a new flag by clicking &lt;strong&gt;Add new flag&lt;/strong&gt; which will be a short-term flag, as we will deprecate it in the future granted everything is a success:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Name: &lt;code&gt;showcarousel&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Description: &lt;code&gt;this will let users swipe through images than only showing them one per Crib&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Select: &lt;code&gt;short-term-flag&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Create flag&lt;/strong&gt; to create our first Feature Flag with AWS AppConfig&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Save new version&lt;/strong&gt; to proceed.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  ☁️ Update the Photo Pagination for the Feature Flag
&lt;/h2&gt;

&lt;p&gt;Navigate to the &lt;strong&gt;CardFeatureFlag&lt;/strong&gt; that we just created and click &lt;strong&gt;Add new flag&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Name: &lt;code&gt;pagination&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Description: &lt;code&gt;change how many homes returned on the page&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Attributes: &lt;code&gt;number&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Type: &lt;code&gt;number&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Value: &lt;code&gt;8&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Required Value: [✅]&lt;/li&gt;
&lt;li&gt;Constraint: &lt;code&gt;5 minumum&lt;/code&gt; and &lt;code&gt;12 maximum&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Create flag&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Turn the pagination flag &lt;strong&gt;on&lt;/strong&gt; with the switch and then press &lt;strong&gt;save new version&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  ☁️ Deploy the Feature Flag
&lt;/h2&gt;

&lt;p&gt;You should see something like this, which tells us we have two Feature Flags (&lt;strong&gt;pagination&lt;/strong&gt; which is switched on, and &lt;strong&gt;showcarousel&lt;/strong&gt; which is turned off) added to the Configuration Profile &lt;strong&gt;CardFeatureFlag&lt;/strong&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%2Fre9n1geszp6moqzkss3r.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%2Fre9n1geszp6moqzkss3r.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We want to deploy this, so here is what we will do:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Click &lt;strong&gt;Start deployment&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Create Environment&lt;/strong&gt; &lt;/li&gt;
&lt;li&gt;Name the environment: &lt;code&gt;Beta&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Next we will want to create a Deployment Strategy. It's important to consider factors like the &lt;strong&gt;Bake time:&lt;/strong&gt; the amount of time AppConfig monitors for CloudWatch alarms before advancing to the next deployment or step, such as rolling back a feature.&lt;/p&gt;

&lt;p&gt;There are 3 pre-defined options available: &lt;code&gt;AppConfig.AllAtOnce&lt;/code&gt; — instant deployment to all, &lt;code&gt;AppConfig.Linear50PercentEvery30Seconds&lt;/code&gt; — deploys to half of target every 30 seconds and deploy time is 1 minute (i.e. useful for testing or demos), and &lt;code&gt;AppConfig.Canary10Percent20Minutes (AWS Recommended)&lt;/code&gt; — deploys slowly over time (i.e. useful for production workload).&lt;/p&gt;

&lt;p&gt;We will, however, &lt;strong&gt;Create deployment strategy&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Name: &lt;code&gt;FFWorkshop_Deployment&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Type: &lt;code&gt;Linear&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Step percentage: &lt;code&gt;10&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Deployment time: &lt;code&gt;1 minute&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Bake time: &lt;code&gt;1 minute&lt;/code&gt;g&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Select &lt;strong&gt;Create deployment strategy&lt;/strong&gt; and then &lt;strong&gt;Start deployment&lt;/strong&gt; which will take about a couple of minutes to fully release. It will ultimately look like this when it's been deployed fully:&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%2Fd6ng18jrmv1fvuhe997c.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%2Fd6ng18jrmv1fvuhe997c.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  ☁️ Configure AWS Lambda
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://aws.amazon.com/lambda/" rel="noopener noreferrer"&gt;AWS Lambda&lt;/a&gt; functions&lt;/strong&gt; are private functions that run in the cloud and allow you to run code without the need to run a server. You simply need to call a script to connect with them and then you can run compute without needing to provision a back-end for it.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;For some background context on AWS Lambda, check out Parts 1 and 2 of my "Serverless Workflows with Step Functions and Lambda" here:&lt;/p&gt;

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


&lt;/blockquote&gt;

&lt;p&gt;To set up Lambda for our project, we will:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Navigate to &lt;strong&gt;AWS Lambda&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Create Function&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Name: &lt;code&gt;FF_Lambda&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Runtime: &lt;code&gt;Node.js 14.x&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Create function&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In the code editor, add this code (generously provided to us by AWS) which allows us to toggle the Feature Flag on and off:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;http&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;http&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;AWS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;aws-sdk&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;docClient&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;AWS&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;DynamoDB&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;DocumentClient&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="nx"&gt;exports&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;handler&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Promise&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;reject&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;http&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;http://localhost:2772/applications/AWSomeCribRentals/environments/Beta/configurations/CardFeatureFlag&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="nx"&gt;resolve&lt;/span&gt;
        &lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;

    &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;configData&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Promise&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;reject&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;on&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;data&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;chunk&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="nx"&gt;chunk&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;on&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;error&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;err&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;reject&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
        &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;on&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;end&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;

    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;parsedConfigData&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;configData&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;DynamoParams&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;TableName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;AWSCribsRentalMansions&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="c1"&gt;//Fetching the listings from DynamoDB&lt;/span&gt;

    &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;listItems&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;docClient&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;scan&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;DynamoParams&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;promise&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;//Checking for the Caraousel Feature Flag&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;parsedConfigData&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;showcarousel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;enabled&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;returnhtml&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;``&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

        &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

            &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;listItems&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

            &lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nx"&gt;parsedConfigData&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;pagination&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;number&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="nx"&gt;returnhtml&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="s2"&gt;`&amp;lt;div class="col-md-4 mt-4"&amp;gt;
                &amp;lt;div class="card profile-card-5"&amp;gt;
                    &amp;lt;div class="card-img-block"&amp;gt;

                        &amp;lt;div class="slideshow-container"&amp;gt;`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

                &lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;j&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;j&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Items&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;Image&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;j&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                    &lt;span class="nx"&gt;returnhtml&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="s2"&gt;`&amp;lt;div class="mySlides`&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s2"&gt;`"&amp;gt;
                    &amp;lt;img class="card-img-top" style="height: 300px;" src="`&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Items&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;Image&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;j&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s2"&gt;`" style="width:100%"&amp;gt;
                  &amp;lt;/div&amp;gt;`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
                &lt;span class="p"&gt;}&lt;/span&gt;

                &lt;span class="nx"&gt;returnhtml&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="s2"&gt;`&amp;lt;/div&amp;gt;`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

                &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Items&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;Image&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                    &lt;span class="nx"&gt;returnhtml&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="s2"&gt;`&amp;lt;a class="prev" onclick="plusSlides(-1, `&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s2"&gt;`)"&amp;gt;&amp;amp;#10094;&amp;lt;/a&amp;gt;
                            &amp;lt;a class="next" onclick="plusSlides(1, `&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s2"&gt;`)"&amp;gt;&amp;amp;#10095;&amp;lt;/a&amp;gt;`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
                &lt;span class="p"&gt;}&lt;/span&gt;

                    &lt;span class="nx"&gt;returnhtml&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="s2"&gt;`&amp;lt;/div&amp;gt;
                    &amp;lt;div class="card-body pt-0"&amp;gt;
                    &amp;lt;h5 class="card-title"&amp;gt;`&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Items&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;Name&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s2"&gt;` &amp;lt;span style="font-size: 0.7em;color:rgb(255, 64, 64)"&amp;gt;(`&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Items&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;Location&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s2"&gt;`)&amp;lt;/span&amp;gt;&amp;lt;/h5&amp;gt;
                    &amp;lt;p class="card-text"&amp;gt;`&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Items&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;Description&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s2"&gt;`&amp;lt;/p&amp;gt;
                    &amp;lt;a class="btn btn-primary"style="display: inline" href="#"&amp;gt;Check Availability&amp;lt;/a&amp;gt;
                    &amp;lt;span style="float: right;cursor: pointer;" onclick="favoriteStar(this)"&amp;gt;&amp;lt;span class="fa fa-star"&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;
                  &amp;lt;/div&amp;gt;
                &amp;lt;/div&amp;gt;
            &amp;lt;/div&amp;gt;`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;

            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="na"&gt;statusCode&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="na"&gt;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;returnhtml&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="p"&gt;};&lt;/span&gt;

        &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="na"&gt;error&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;err&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

        &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;returnhtml&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;``&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

        &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

            &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;listItems&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
            &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;dynamo db data: &lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;//Checking for Pagination Numbers&lt;/span&gt;
            &lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nx"&gt;parsedConfigData&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;pagination&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;number&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="nx"&gt;returnhtml&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="s2"&gt;`&amp;lt;div class="col-md-4 mt-4"&amp;gt;
                &amp;lt;div class="card profile-card-5"&amp;gt;
                    &amp;lt;div class="card-img-block"&amp;gt;
                    &amp;lt;img class="card-img-top" style="height: 300px;" src="`&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Items&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;Image&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s2"&gt;`" style="width:100%"
                        alt="Card image cap" style="height: 300px;"&amp;gt;
                    &amp;lt;/div&amp;gt;
                    &amp;lt;div class="card-body pt-0"&amp;gt;
                    &amp;lt;h5 class="card-title"&amp;gt;`&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Items&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;Name&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s2"&gt;` &amp;lt;span style="font-size: 0.7em;color:rgb(255, 64, 64)"&amp;gt;(`&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Items&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;Location&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s2"&gt;`)&amp;lt;/span&amp;gt;&amp;lt;/h5&amp;gt;
                    &amp;lt;p class="card-text"&amp;gt;`&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Items&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;Description&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s2"&gt;`&amp;lt;/p&amp;gt;
                    &amp;lt;a class="btn btn-primary"style="display: inline" href="#"&amp;gt;Check Availability&amp;lt;/a&amp;gt;
                    &amp;lt;span style="float: right;cursor: pointer;" onclick="favoriteStar(this)"&amp;gt;&amp;lt;span class="fa fa-star"&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;
                  &amp;lt;/div&amp;gt;
                &amp;lt;/div&amp;gt;
            &amp;lt;/div&amp;gt;`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;

            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="na"&gt;statusCode&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="na"&gt;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;returnhtml&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="p"&gt;};&lt;/span&gt;

        &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="na"&gt;error&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;err&lt;/span&gt;
            &lt;span class="p"&gt;};&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

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

&lt;/div&gt;



&lt;p&gt;Now we will want to add a layer to our Lambda Function (scroll to the bottom of the page and find &lt;strong&gt;Add a layer&lt;/strong&gt;)&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Select &lt;code&gt;AWS-AppConfig-Extension&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Add&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If all goes well, it should look like this:&lt;br&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%2Fs3asabluhej5b9ne91jr.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%2Fs3asabluhej5b9ne91jr.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  ⚠️ Warning
&lt;/h4&gt;

&lt;p&gt;If you do not see &lt;code&gt;AWS-AppConfig-Extension&lt;/code&gt; in the drop-down of AWS-provided layers...make sure you are actually in Node.js 14.x version of runtime (not 16.x like below). At the time of making this blog post, Node.js 16.x has not been configured to allow for the AppConfig extension yet.&lt;br&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%2Fv0naf5k30r5m6s7od8of.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%2Fv0naf5k30r5m6s7od8of.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  ☁️ Set up the AWS Lambda Function URL
&lt;/h2&gt;

&lt;p&gt;One of the amazing benefits of AWS Lambda is the ability to add HTTPS endpoints to any serverless function we launch in Lambda, as well as configure CORS headers if we wish.&lt;/p&gt;

&lt;p&gt;Under the function overview:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Click &lt;strong&gt;Configuration&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Function URL&lt;/strong&gt; and then &lt;strong&gt;Create Function URL&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Auth Type: &lt;code&gt;NONE&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Configure cross-origin resource sharing (CORS) [✅]&lt;/li&gt;
&lt;li&gt;We will include the wildcat &lt;code&gt;*&lt;/code&gt; for this demo for &lt;code&gt;Allow origin&lt;/code&gt;, &lt;code&gt;Expose headers&lt;/code&gt;, &lt;code&gt;Allow headers&lt;/code&gt;, and &lt;code&gt;Allow methods&lt;/code&gt;...but you would want to configure more secure methods of connection for origin/headers in production.&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Save&lt;/strong&gt; and save the Function URL for later.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Next, we need to update the Execution Role to ensure our Lambda function has the right IAM permissions to access AppConfig using the AWS best practice and principle of "least privilege." Basically, don't allow more permissions than are required for the need/resource.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Go to &lt;strong&gt;IAM (Identity and Access Management)&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Select &lt;strong&gt;Policies&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Go to &lt;strong&gt;Create Policy&lt;/strong&gt;, then &lt;strong&gt;Choose a service&lt;/strong&gt; and select &lt;strong&gt;AppConfig&lt;/strong&gt;. &lt;/li&gt;
&lt;li&gt;For Actions, select &lt;strong&gt;All AppConfig actions&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;For Resources, select &lt;strong&gt;All Resources&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Next&lt;/strong&gt; to proceed through the steps and then at the end under name, write &lt;code&gt;AppConfigAllAccess&lt;/code&gt; to name this IAM role.&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%2Flnv21b4fu3g1g4ahtu7h.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%2Flnv21b4fu3g1g4ahtu7h.png" alt="Image description"&gt;&lt;/a&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%2Fhpjdjsnpufcezc28luco.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%2Fhpjdjsnpufcezc28luco.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Next, we will attach these policies to our Lambda Function: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;AmplifyFullAccess&lt;/li&gt;
&lt;li&gt;AppConfigFullAccess&lt;/li&gt;
&lt;li&gt;AppConfigAllAccess - this is the one we just made&lt;/li&gt;
&lt;li&gt;AmazonDynamoDBFullAccess&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The screen will look like this when you update the function and attached the policies successfully:&lt;br&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%2Fa2on8neuuzjtgo3y20qr.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%2Fa2on8neuuzjtgo3y20qr.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  ☁️ Create and Populate a DynamoDB Table using an EC2 Instance (VM)
&lt;/h2&gt;

&lt;p&gt;This was a very eye-opening part for me because the workshop had a lot of elements where a single user would be completing the upload/scripts from their computer. But what if you wanted to do it from a Virtual Machine because you have a different AWS Profile on your computer you don't want to overwrite/mess with? Or what if you wanted multiple people to have access to the same server files/items?&lt;/p&gt;

&lt;p&gt;You can configure an EC2 server and run all the commands as you would on your normal computer, but instead on a rented server/computer, in the cloud!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/SACoDGYTvVNhZYNb5a/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/SACoDGYTvVNhZYNb5a/giphy.gif"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is where the real fun starts...&lt;/p&gt;

&lt;p&gt;First, we'll set up an EC2 instance so that we can get a real-time server running and that we can SSH into.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Navigate to the &lt;strong&gt;EC2&lt;/strong&gt; service in the AWS list of tools&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Launch an instance&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Choose: &lt;code&gt;t2.medium&lt;/code&gt; (this will give us a little bit more power than the &lt;code&gt;t2.micro&lt;/code&gt; BUT be cognizant that the &lt;code&gt;t2.medium&lt;/code&gt; server will incur costs. If you do not want to incur costs, choose a &lt;code&gt;t2.micro&lt;/code&gt; server instead).&lt;/li&gt;
&lt;li&gt;Turn on all public access to the server (this is just for demo/testing purposes, so if you are going into production, you would want to lock down the server).&lt;/li&gt;
&lt;li&gt;Once you confirm all the settings, save your keypair to your Computer/drive (this is important that you do not lose this), and click &lt;strong&gt;Launch&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The server will look like this once it is running:&lt;br&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%2Fs0vuydjkyrp2bdz3x1ci.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%2Fs0vuydjkyrp2bdz3x1ci.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  ☁️ Create the DynamoDB Table from within an EC2 Server Using Linux
&lt;/h2&gt;

&lt;p&gt;EC2 forces you to &lt;code&gt;chmod 400&lt;/code&gt; of the keypair so only your user can read/edit the file — anyone else would need to &lt;code&gt;sudo&lt;/code&gt;. Make sure that the path does link to your terminal (Mac) or PowerShell (Windows). &lt;strong&gt;TIP&lt;/strong&gt;: You can easily drag and drop a file from the Finder or Windows Explorer into your command line to automatically generate the file path.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;chmod &lt;/span&gt;400 /User/FF_Workshop_Keypair.cer
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now we will SSH into the server with the keypair and Public DNS.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;We will use &lt;code&gt;ec2-user&lt;/code&gt; in the first part because this is an EC2 Instance&lt;/li&gt;
&lt;li&gt;We will then pull the Public IPv4 DNS of the EC2 instance which you will see in the above screenshot on the right for the Instance Summary: &lt;code&gt;ec2-3-82-148-71.compute-1.amazonaws.com&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ssh &lt;span class="nt"&gt;-i&lt;/span&gt; /User/FF_Workshop_Keypair.cer ec2-user@ec2-3-82-148-71.compute-1.amazonaws.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It will look like this if you are successfully signed into the server:&lt;br&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%2Fqkh43rfpe9bigd5rgegg.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%2Fqkh43rfpe9bigd5rgegg.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now we need to configure &lt;code&gt;aws&lt;/code&gt; inside of the server.&lt;/p&gt;

&lt;p&gt;The elements we will need to configure attributes for are: Default Region, Access Key ID, Secret Access Key, and AWS Session Token. These were generated for us via the AWS Event Bridge, but without it being set up for us, we would need to configure the aws profile (link to more about this in the &lt;a href="https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-profiles.html" rel="noopener noreferrer"&gt;AWS docs&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;We will write &lt;code&gt;aws configure&lt;/code&gt; and enter, and then copy and paste all of these values into the command line and press enter when prompted for each one. And then under output format, put &lt;code&gt;json&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;AWS_DEFAULT_REGION&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;us-east-1
&lt;span class="nv"&gt;AWS_ACCESS_KEY_ID&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;MSIA...MQ5U
&lt;span class="nv"&gt;AWS_SECRET_ACCESS_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;YI2d...JuZU
&lt;span class="nv"&gt;AWS_SESSION_TOKEN&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;IQoJ...wef4

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

&lt;/div&gt;



&lt;p&gt;It will look like this:&lt;br&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%2F8un5ph4nym4lkif2l8q5.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%2F8un5ph4nym4lkif2l8q5.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  ☁️  Next, you have to make sure the right AWS account is active for the session in the command line
&lt;/h2&gt;

&lt;p&gt;Right now, you have configured AWS above but it’s not set up to connect to anything…we know this because if we then try to do: &lt;code&gt;aws sts get-caller-identity&lt;/code&gt; we will get the following error: Or code snippet:&lt;br&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%2F4o1zj2d58ndq07xuwbex.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%2F4o1zj2d58ndq07xuwbex.png" alt="Image description"&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;An error occurred &lt;span class="o"&gt;(&lt;/span&gt;InvalidClientTokenId&lt;span class="o"&gt;)&lt;/span&gt; when calling the GetCallerIdentity operation: The security token included &lt;span class="k"&gt;in &lt;/span&gt;the request is invalid.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To fix this, we need to add in the credentials into the command line as environmental variables and export (print) them into the profile for AWS in the Linux instance (same values as before):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;AWS_DEFAULT_REGION&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;us-east-1
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;AWS_ACCESS_KEY_ID&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;MSIA...MQ5U
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;AWS_SECRET_ACCESS_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;YI2d...JuZU
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;AWS_SESSION_TOKEN&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;IQoJ...wef4
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We can verify that the environmental variables are saved to our Linux session with &lt;code&gt;printenv AWS_DEFAULT_REGION&lt;/code&gt; or &lt;code&gt;printenv AWS_ACCESS_KEY_ID&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;If the output prints what we entered in previously, then it worked!&lt;/p&gt;

&lt;p&gt;To validate that our AWS account is authenticated/synced, type &lt;code&gt;aws sts get-caller-identity&lt;/code&gt;. If this worked correctly, you should see a print out of something like the below:&lt;br&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%2F5n56eyi6848rl10ol7op.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%2F5n56eyi6848rl10ol7op.png" alt="Image description"&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"Account"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"354789352487"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; 
    &lt;/span&gt;&lt;span class="nl"&gt;"UserId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"AROAVFGYX4QT3O2UKAPLI:MasterKey"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; 
    &lt;/span&gt;&lt;span class="nl"&gt;"Arn"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"arn:aws:sts::354789352487:assumed-role/TeamRole/MasterKey"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In our AWS account, in the top right, you'll see the right Account # (the same as in "Account" in the terminal). &lt;br&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%2Fmwyklmsi39xuxgvt3w9y.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%2Fmwyklmsi39xuxgvt3w9y.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Alright we did it!&lt;/p&gt;

&lt;p&gt;To further validate this, if we use &lt;code&gt;aws ec2 describe-instances&lt;/code&gt; then we should get a print out of the instances we are running or have terminated:&lt;br&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%2Feckxhty17fjrrvc5s8i9.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%2Feckxhty17fjrrvc5s8i9.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  ☁️ Now we populate the DynamoDB Table to hold image links and home information
&lt;/h2&gt;

&lt;p&gt;While we have our SSH link open to our server and running, let's open up another terminal window. This is because we cannot upload a local file from within the server (remember, we are in a virtual machine there...so we are in a completely different computer that doesn't recognize our local directories on our computer).&lt;/p&gt;

&lt;p&gt;We need to upload a file to the server and then call it that way to communicate with DynamoDB. We will use the &lt;code&gt;scp&lt;/code&gt; (Secure Copy Protocol) command in Linux, which is used to copy/send/retrieve files securely between servers.&lt;/p&gt;

&lt;p&gt;For us, the script we will run is this below: we reference a IAM key-pair certificate file &lt;code&gt;FF_Workshop_Keypair.cer&lt;/code&gt; file on our computer and then the &lt;code&gt;AWSCribsRentalMansions.json&lt;/code&gt; file on our computer and then our EC2 AMI’s Public IPv4 DNS &lt;code&gt;ec2-3-82-148-71.compute-1.amazonaws.com&lt;/code&gt; and declare that we will put it as a loose-hanging file in the server at position: &lt;code&gt;/&lt;/code&gt; .&lt;/p&gt;

&lt;p&gt;The linux command is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;1st part is the path to the secret key file&lt;/li&gt;
&lt;li&gt;2nd part is the path to the file we want to upload&lt;/li&gt;
&lt;li&gt;3rd part is &lt;code&gt;ec2-user&lt;/code&gt; because it's an AMI EC2 "at" the Public IPv4 DNS URL &lt;code&gt;ec2-3-82-148-71.compute-1.amazonaws.com&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;4th part is a &lt;code&gt;~&lt;/code&gt; since we want to upload it as a loose-hanging file in the server.
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;scp &lt;span class="nt"&gt;-i&lt;/span&gt; /Users/FF_Workshop_Keypair.cer /Users/AWSCribsRentalMansions.json  ec2-user@ec2-3-82-148-71.compute-1.amazonaws.com:~
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;If all goes well, you should see a 100% printed below the script you entered.&lt;/p&gt;

&lt;p&gt;Now, let's test if the file was uploaded in our server. Switch back to the terminal window where we SSH'ed into the server. If we do an &lt;code&gt;ls&lt;/code&gt; from the root directory, we should now see the &lt;code&gt;json&lt;/code&gt; file!&lt;/p&gt;

&lt;p&gt;Now we will populate the DynamoDB table with our file uploaded to the EC2 instance:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;aws dynamodb batch-write-item &lt;span class="nt"&gt;--request-items&lt;/span&gt; file://AWSCribsRentalMansions.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It will look like this (don't worry that it says "Unprocessed Items" - this is normal ☺️):&lt;br&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%2F55uydqm0loczvez1er5g.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%2F55uydqm0loczvez1er5g.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Let's check if DynamoDB really did receive all of the files like our command line told us. If it worked successfully, it will look like this:&lt;br&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%2Fnjpbfmgprdt8phno1zlk.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%2Fnjpbfmgprdt8phno1zlk.png" alt="Image description"&gt;&lt;/a&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%2F95gw70lsasw73i3147q6.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%2F95gw70lsasw73i3147q6.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Nice!! The files are all there!&lt;/p&gt;
&lt;h2&gt;
  
  
  ☁️ Set up website on AWS with AWS Amplify and AWS CodeCommit
&lt;/h2&gt;

&lt;p&gt;We will need 2 specific tools to hold our code and then to push our code to the internet with a link users can access.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;AWS Amplify&lt;/strong&gt;: for delivering the front-end&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AWS CodeCommit&lt;/strong&gt;: hold the code to deploy to Amplify&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In our &lt;code&gt;index.html&lt;/code&gt; file in the repo (check out my &lt;strong&gt;&lt;a href="https://github.com/BrianHHough/AWSAppConfigWorkshop/tree/initial" rel="noopener noreferrer"&gt;starter repo here&lt;/a&gt;&lt;/strong&gt; from the code provided by AWS), we will need add the Lambda function calling AppConfig into the &lt;code&gt;&amp;lt;script&amp;gt;&lt;/code&gt; tag of the &lt;code&gt;index.html&lt;/code&gt; file.&lt;/p&gt;

&lt;p&gt;We will turn this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="c"&gt;&amp;lt;!-- api call to populate cribs --&amp;gt;&lt;/span&gt; --&amp;gt;
&lt;span class="nt"&gt;&amp;lt;script&amp;gt;&lt;/span&gt;
     &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;lamba-url-here&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
     &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;text&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
     &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;populateCribsHere&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;innerHTML&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="nf"&gt;setUI&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Into this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="c"&gt;&amp;lt;!-- api call to populate cribs --&amp;gt;&lt;/span&gt; --&amp;gt;
&lt;span class="nt"&gt;&amp;lt;script&amp;gt;&lt;/span&gt;
        &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://2v35t2ppjx4vh7ygjzip7nauji0yzmxl.lambda-url.us-east-1.on.aws/&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
     &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;text&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
     &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;populateCribsHere&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;innerHTML&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="nf"&gt;setUI&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Remember that Lambda Function URL we got from before? We will put that into the &lt;code&gt;lamba-url-here&lt;/code&gt;. We can get that here:&lt;br&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%2Fztzmju7x1fmu0dc3ixrc.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%2Fztzmju7x1fmu0dc3ixrc.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  ☁️ Use AWS CodeCommit to Host Private Git Repo
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://aws.amazon.com/codecommit/" rel="noopener noreferrer"&gt;AWS CodeCommit&lt;/a&gt; is a secure, highly scalable, managed source control service that hosts private Git repositories.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Go to &lt;strong&gt;CodeCommit&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Create a Repository&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Name: &lt;code&gt;AWSomeCribRepo&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Description: &lt;code&gt;This holds the code of my AWSomeCribRepo project&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Create&lt;/strong&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%2Fxekcxwp4rq4wl4ba3v9l.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%2Fxekcxwp4rq4wl4ba3v9l.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After the repo is created, we need to add our code to this CodeCommit repo. We will see a couple different methods for how to Connect. We will choose the &lt;code&gt;HTTPS (GRC)&lt;/code&gt; method.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;HTTPS (GRC) is the protocol to use with git-remote-codecommit (GRC). This utility provides a simple method for pushing and pulling code from CodeCommit repositories by extending Git. It is the recommended method for supporting connections made with federated access, identity providers, and temporary credentials.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;What we really want to do is &lt;code&gt;pip install git-remote-codecommit&lt;/code&gt; to install the git-remote-code-commit framework, BUT, we don't have &lt;code&gt;pip&lt;/code&gt; installed yet. We need Python to run pip so let's check if it's installed:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Run &lt;code&gt;python --version&lt;/code&gt; — for me, the output is &lt;code&gt;Python 2.7.18&lt;/code&gt; and it should be added since this is an EC2 instance.&lt;/li&gt;
&lt;li&gt;To install pip, run &lt;code&gt;sudo yum install python-pip&lt;/code&gt; &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It should look like this if it's successfully installed:&lt;br&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%2Fkg5vjiz0c359l7p6a74a.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%2Fkg5vjiz0c359l7p6a74a.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Now that pip is installed, let’s run the command we wanted to initially: &lt;code&gt;pip install git-remote-codecommit&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It should look like this if all goes well:&lt;br&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%2Fo5irrhuqb3uycz9hf2ro.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%2Fo5irrhuqb3uycz9hf2ro.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now we want to clone the repository to our EC2 instance with this command: &lt;code&gt;git clone codecommit::us-east-1://AWSomeCribRepo&lt;/code&gt;. However, we don’t have git yet in our server, so we’ll install git this way:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Run this command: &lt;code&gt;sudo yum install git&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If all goes well, it will look like this:&lt;br&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%2Fn1s69x0oku3vd5b2ltws.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%2Fn1s69x0oku3vd5b2ltws.png" alt="Image description"&gt;&lt;/a&gt;&lt;br&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%2F9dijpf6y4lzyu4ftl87i.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%2F9dijpf6y4lzyu4ftl87i.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;We will verify the installation went through with: &lt;code&gt;git --version&lt;/code&gt; — if it worked, you will see a print out like &lt;code&gt;git version 2.32.0&lt;/code&gt;&lt;br&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%2Ft1wvkquiwbju1q4i8vk7.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%2Ft1wvkquiwbju1q4i8vk7.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Now we will finally run: &lt;code&gt;codecommit::us-east-1://AWSomeCribRepo&lt;/code&gt; — this will clone the empty repo into our server. When we do ls we see the blue folder in there:&lt;br&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%2Fe31yg6g0oqsfgtr77rjv.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%2Fe31yg6g0oqsfgtr77rjv.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;✨ Amazing job! We now have a link to our AWS CodeCommit Repo (in our AWS Environment) and our EC2 server. Especially cool because this is now OUR computer, but a virtual machine.&lt;/p&gt;
&lt;h2&gt;
  
  
  ☁️ How do we upload a folder’s contents locally (our code repo) into a code repo in our EC2 instance using Linux?
&lt;/h2&gt;

&lt;p&gt;Linux can be a bit confusing here but what we essentially will be doing is using a 2nd terminal window to connect to our SSH'ed terminal window, and then use that to connect to AWS. Don't worry... we will get there 😊 &lt;/p&gt;

&lt;p&gt;We will use &lt;code&gt;scp&lt;/code&gt; to upload the file contents WITHIN our local folder and serve that content INTO the folder that is our AWS CodeCommit-connected folder.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;We will use &lt;code&gt;scp&lt;/code&gt; (secure copy protocol)&lt;/li&gt;
&lt;li&gt;We use the -r flag (to recursively go through all the files)&lt;/li&gt;
&lt;li&gt;We will input the path of our Keypair&lt;/li&gt;
&lt;li&gt;We will then input the path of our folder and because it's the contents WITHIN it, we add the wildcard &lt;code&gt;/*&lt;/code&gt; after the folder name&lt;/li&gt;
&lt;li&gt;We will then input the EC2 instance with &lt;code&gt;ec2-user&lt;/code&gt; and &lt;code&gt;@&lt;/code&gt; and then our EC2's Public IPv4 DNS value.
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;scp -r -i  /Users/FF_Workshop_Keypair.cer /Users/AWSAppConfigWorkshop/*  ec2-user@ec2-3-82-148-71.compute-1.amazonaws.com:~/AWSomeCribRepo
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;You can see how the commands work between the 1st and 2nd terminal windows. On the right (connected to our local computer), we serve the files to the server. Then on the left (connected to the EC2 instance), we check to see if the files were in fact uploaded.&lt;/p&gt;
&lt;h4&gt;
  
  
  ⚠️ NOTE: in the screenshot, it says &lt;code&gt;...amazonaws.com:~/test&lt;/code&gt; but this was taken while I was testing Linux 😊. You will want that part to read &lt;code&gt;amazonaws.com:~/AWSomeCribRepo&lt;/code&gt; like what is referenced in the above code snippet:
&lt;/h4&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%2Fqtgqq9kwi76coq1nacaz.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%2Fqtgqq9kwi76coq1nacaz.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  ☁️ Now we will push the code to AWS Code Commit
&lt;/h2&gt;

&lt;p&gt;Back in our SSH'ed terminal window, we will want to make sure we are in our &lt;code&gt;AWSomeCribRepo&lt;/code&gt; and run the commands to send the repo into AWS CodeCommit:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Run: &lt;code&gt;cd AWSomeCribRepo&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Add all the files in the directory to git with &lt;code&gt;git add -A&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Create a commit message: &lt;code&gt;git commit -m "commit from EC2"&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Push the code to AWS CodeCommit: &lt;code&gt;git push&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When you do the &lt;code&gt;git push&lt;/code&gt;, you will see output like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;Enumerating objects: 1847, &lt;span class="k"&gt;done&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt;
Counting objects: 100% &lt;span class="o"&gt;(&lt;/span&gt;1847/1847&lt;span class="o"&gt;)&lt;/span&gt;, &lt;span class="k"&gt;done&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt;
Delta compression using up to 2 threads
Compressing objects: 100% &lt;span class="o"&gt;(&lt;/span&gt;1845/1845&lt;span class="o"&gt;)&lt;/span&gt;, &lt;span class="k"&gt;done&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt;
Writing objects: 100% &lt;span class="o"&gt;(&lt;/span&gt;1847/1847&lt;span class="o"&gt;)&lt;/span&gt;, 3.99 MiB | 4.68 MiB/s, &lt;span class="k"&gt;done&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt;
Total 1847 &lt;span class="o"&gt;(&lt;/span&gt;delta 213&lt;span class="o"&gt;)&lt;/span&gt;, reused 0 &lt;span class="o"&gt;(&lt;/span&gt;delta 0&lt;span class="o"&gt;)&lt;/span&gt;, pack-reused 0
To codecommit::us-east-1://AWSomeCribRepo
 &lt;span class="k"&gt;*&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;new branch]      master -&amp;gt; master
&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%2F8zxjxcmt7vho8ny34wsv.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%2F8zxjxcmt7vho8ny34wsv.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  ⚠️ IMPORTANT: If you run into this type of error after &lt;code&gt;git push&lt;/code&gt;:
&lt;/h4&gt;

&lt;blockquote&gt;

&lt;pre class="highlight shell"&gt;&lt;code&gt;fatal: unable to access &lt;span class="s1"&gt;'https://git-codecommit.us-east-1.amazonaws.com/v1/repos/AWSomeCribRepo/'&lt;/span&gt;: The requested URL returned error: 403
&lt;/code&gt;&lt;/pre&gt;


&lt;p&gt;Or looks like this in the command line: &lt;br&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%2Fsxvqqwl25uso2gum58k4.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%2Fsxvqqwl25uso2gum58k4.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It’s probably because your configuration environmental variables aren’t set correctly in the EC2 server. &lt;/p&gt;

&lt;p&gt;These are provided to us thanks the AWS EventBridge for the workshop, but you can retrieve these as part of your AWS Account. You need to make sure you are "logged in" or authenticated in the EC2 instance for the push command to know which AWS Account's CodeCommit to push to. Imagine you push your code to a stranger's CodeCommit... (that would be so bad...). This is to make sure we are truly authenticated in the right place to then send our code to the right destination.&lt;/p&gt;


&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;AWS_DEFAULT_REGION&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;us-east-1
&lt;span class="nv"&gt;AWS_ACCESS_KEY_ID&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;MSIA...MQ5U
&lt;span class="nv"&gt;AWS_SECRET_ACCESS_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;YI2d...JuZU
&lt;span class="nv"&gt;AWS_SESSION_TOKEN&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;IQoJ...wef4
&lt;/code&gt;&lt;/pre&gt;


&lt;p&gt;Confirm that &lt;code&gt;aws sts get-caller-identity&lt;/code&gt; returns a value like this:&lt;/p&gt;


&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="s2"&gt;"Account"&lt;/span&gt;: &lt;span class="s2"&gt;"354789352487"&lt;/span&gt;, 
    &lt;span class="s2"&gt;"UserId"&lt;/span&gt;: &lt;span class="s2"&gt;"AROAVFGYX4QT3O2UKAPLI:MasterKey"&lt;/span&gt;, 
    &lt;span class="s2"&gt;"Arn"&lt;/span&gt;: &lt;span class="s2"&gt;"arn:aws:sts::354789352487:assumed-role/TeamRole/MasterKey"&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;


&lt;p&gt;Now when you do the &lt;code&gt;git push&lt;/code&gt;, you will see output like this:&lt;/p&gt;


&lt;pre class="highlight shell"&gt;&lt;code&gt;Enumerating objects: 1847, &lt;span class="k"&gt;done&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt;
Counting objects: 100% &lt;span class="o"&gt;(&lt;/span&gt;1847/1847&lt;span class="o"&gt;)&lt;/span&gt;, &lt;span class="k"&gt;done&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt;
Delta compression using up to 2 threads
Compressing objects: 100% &lt;span class="o"&gt;(&lt;/span&gt;1845/1845&lt;span class="o"&gt;)&lt;/span&gt;, &lt;span class="k"&gt;done&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt;
Writing objects: 100% &lt;span class="o"&gt;(&lt;/span&gt;1847/1847&lt;span class="o"&gt;)&lt;/span&gt;, 3.99 MiB | 4.68 MiB/s, &lt;span class="k"&gt;done&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt;
Total 1847 &lt;span class="o"&gt;(&lt;/span&gt;delta 213&lt;span class="o"&gt;)&lt;/span&gt;, reused 0 &lt;span class="o"&gt;(&lt;/span&gt;delta 0&lt;span class="o"&gt;)&lt;/span&gt;, pack-reused 0
To codecommit::us-east-1://AWSomeCribRepo
 &lt;span class="k"&gt;*&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;new branch]      master -&amp;gt; master
&lt;/code&gt;&lt;/pre&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%2Fllm1qqq508l5vz47qnim.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%2Fllm1qqq508l5vz47qnim.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Back in the AWS Console, CodeCommit will now go from this:&lt;br&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%2F1x3w7d2a0mey6smwlls8.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%2F1x3w7d2a0mey6smwlls8.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To this:&lt;br&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%2F5abeekku95g4edfvro6p.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%2F5abeekku95g4edfvro6p.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;✨ You have now created a repository for your website with files uploaded from your computer, to your EC2 instance, and now to AWS. Next, you will connect this repository to AWS Amplify to host your website with a real URL.&lt;/p&gt;
&lt;h2&gt;
  
  
  🚀 Host your Website on AWS Amplify
&lt;/h2&gt;

&lt;p&gt;One of the best benefits of &lt;a href="https://aws.amazon.com/amplify/" rel="noopener noreferrer"&gt;AWS Amplify&lt;/a&gt; when running deployments is the ability to see the various stages of the build process. This becomes very helpful when there are errors or you need to check the validation of a build, the logs include a great amount of detail, and of course you can roll in a vast amount of tools and AWS features thanks to Amplify and it's framework to abstract complexity from deployments.&lt;/p&gt;

&lt;p&gt;To accomplish this we will:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Go to the &lt;strong&gt;AWS Amplify&lt;/strong&gt; service in the AWS Console&lt;/li&gt;
&lt;li&gt;Go to &lt;strong&gt;All apps&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Select &lt;strong&gt;New App&lt;/strong&gt; and in the drop-down, select &lt;strong&gt;Host web app&lt;/strong&gt;
&amp;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%2Fhsmd7lpti5qdi28ffbob.png" alt="Image description"&gt;
&lt;/li&gt;
&lt;li&gt;Select &lt;strong&gt;AWS CodeCommit&lt;/strong&gt; and then &lt;strong&gt;Continue&lt;/strong&gt; to advance
&amp;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%2Fmdrd9gewivwpyherw9ku.png" alt="Image description"&gt;
&lt;/li&gt;
&lt;li&gt;Select &lt;code&gt;AWSomeCribRepo&lt;/code&gt;in the CodeCommit dropdown and then &lt;strong&gt;Next&lt;/strong&gt;
&amp;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%2Fhfk60pac3j49ljpdjjnt.png" alt="Image description"&gt;
&lt;/li&gt;
&lt;li&gt;In the &lt;strong&gt;Configure build settings&lt;/strong&gt; make sure to click &lt;strong&gt;✅ Allow AWS Amplify to automatically deploy all files hosted in your project root directory&lt;/strong&gt; and then press &lt;strong&gt;Next&lt;/strong&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%2Faml77p5rrtm9sk4ktae8.png" alt="Image description"&gt;
&lt;/li&gt;
&lt;li&gt;Now click &lt;strong&gt;Save and deploy&lt;/strong&gt;
&amp;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%2Fztc1ckh5wanli20xxufb.png" alt="Image description"&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;AWS Amplify will then go through it’s 4 stages of deployment automatically for us&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Provision&lt;/li&gt;
&lt;li&gt;Build&lt;/li&gt;
&lt;li&gt;Deploy&lt;/li&gt;
&lt;li&gt;Verify&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It will go from this:&lt;br&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%2Fwi344g6ulu8vzxj585rr.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%2Fwi344g6ulu8vzxj585rr.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;✨ To this: &lt;br&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%2F84y9ni4b1vi1045cua8h.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%2F84y9ni4b1vi1045cua8h.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When our site is building, it will go from this:&lt;br&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%2Fqnsitonfl3rhqfzidjyo.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%2Fqnsitonfl3rhqfzidjyo.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;✨ To this:&lt;br&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%2F3nhmx0yl657zpuyamsjh.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%2F3nhmx0yl657zpuyamsjh.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  ☁️ Using Feature Flags
&lt;/h2&gt;

&lt;p&gt;If you notice in the deployed version, it doesn't show that carousel feature we created AppConfig for in the first place... where did it go? Wasn't it supposed to appear there?&lt;/p&gt;

&lt;p&gt;We haven't turned it on yet 😊 &lt;/p&gt;

&lt;p&gt;So what we are going to now do is turn on and deploy the carousel Feature Flag to launch this feature. We will then put on an operational toggle to ensure that during spikes in usage, it will limit the number of homes displayed on the homepage. This will help to optimize our performance with fewer queries on our DynamoDB table at peak times. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Go to &lt;strong&gt;AppConfig&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Select our app &lt;code&gt;AWSomeCribRentals&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Click on the Feature Flag we created: &lt;code&gt;CardFeatureFlag&lt;/code&gt; (notice that the CardFeature Flag is OFF for the &lt;code&gt;showcarousel&lt;/code&gt; Flag as shown below)&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%2F9d81u6lkx4lvqzl410ub.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%2F9d81u6lkx4lvqzl410ub.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Toggle the &lt;code&gt;showcarousel&lt;/code&gt; flag ON and then &lt;strong&gt;Save new version&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Start Deployment&lt;/strong&gt; and configure the elements&lt;/li&gt;
&lt;li&gt;Environment: &lt;code&gt;Beta&lt;/code&gt; - we set this up earlier&lt;/li&gt;
&lt;li&gt;Hosted configuration version: 2&lt;/li&gt;
&lt;li&gt;Deployment strategy: &lt;code&gt;FFWorkshop_Deployment&lt;/code&gt; &lt;/li&gt;
&lt;li&gt;Description: &lt;code&gt;Switching showcarousel feature on gradually for users&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Start deployment&lt;/strong&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%2Fh9lb2yb8pb48bzcgcv3s.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%2Fh9lb2yb8pb48bzcgcv3s.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The deployment (this is technically Deployment #2 because we already deployed earlier on this Feature Flag) will look like this as it builds and gives you data about the deployment like so until its state reaches 100%:&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%2F0hwozcx4lgskjlcipnxk.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%2F0hwozcx4lgskjlcipnxk.png" alt="Image description"&gt;&lt;/a&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%2Faeytc0k4jr1jcgw09bke.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%2Faeytc0k4jr1jcgw09bke.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  ✨ Viola! Check out the updated changes to our app:
&lt;/h2&gt;

&lt;p&gt;Notice the carousel? This is now a feature that users will begin to see in our application:&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%2Fkbbk5mipwbtqlkyo7b2q.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%2Fkbbk5mipwbtqlkyo7b2q.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here is a video of the deployed AppConfig Feature Flag in action live on the URL:&lt;br&gt;
&lt;iframe src="https://player.vimeo.com/video/719701137" width="710" height="399"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  ☁️ Operational Feature Flags
&lt;/h2&gt;

&lt;p&gt;This above is an example of a feature add that we will definitely add to our site and keep. However, let's say we wanted to throttle the number of requests coming back to users when they search for something or want a certain type of data. &lt;/p&gt;

&lt;p&gt;Remember our &lt;code&gt;pagination&lt;/code&gt; Feature Flag in &lt;code&gt;CardFeatureFlag&lt;/code&gt; that we configured earlier? Well, if we want to adjust how many results are returned in the pagination results (i.e. to improve performance when there is a lot of traffic), we can do this by:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Navigate to &lt;strong&gt;AppConfig&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Click on the &lt;strong&gt;CardFeatureFlag&lt;/strong&gt; that we set up&lt;/li&gt;
&lt;li&gt;Select the &lt;strong&gt;pagination&lt;/strong&gt; flag&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Edit&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Change the number in the &lt;strong&gt;value&lt;/strong&gt; to: 6&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Confirm&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Ensure this flag's toggle is turned &lt;strong&gt;ON&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Save new version&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Start deployment&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Keep the same settings as you did in Deployment #2 above, and especially make sure the Deployment Strategy says: &lt;code&gt;FFWorkshop_Deployment&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Start deployment&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;✨ When you navigate to your URL, you should now see 6 crib results! This means we can adjust this feature manually from AWS AppConfig without needing to delete or comment out the code and push a new version.&lt;/p&gt;

&lt;h2&gt;
  
  
  🧹 Clean up Release Flags
&lt;/h2&gt;

&lt;p&gt;If you need to clean up a release flag — for example, let's say the feature add was a big success and there's no reason for you to revert or roll-back the changes — it's important to know what to do.&lt;/p&gt;

&lt;p&gt;If you do not need to have a Feature Flag for one of your released features, you can simply delete that short-term flag since it's no longer needed. We already marked the &lt;code&gt;showcarousel&lt;/code&gt; as a short-term flag&lt;/p&gt;

&lt;p&gt;To delete a flag, we will:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Go to &lt;strong&gt;AppConfig&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Select our app: &lt;strong&gt;AWSomeCribRentals&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Click on the Feature Flag: &lt;code&gt;CardFeatureFlag&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;On the &lt;code&gt;showcarousel&lt;/code&gt; Feature Flag, click &lt;strong&gt;Delete&lt;/strong&gt; and re-confirm &lt;strong&gt;Delete&lt;/strong&gt; on the pop-up.&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Save new version&lt;/strong&gt; to reflect this change&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In a real life situation, we would want to clean up the code to reflect this feature add, but since this was a workshop setting, we did not do that here. For example, in &lt;strong&gt;line 39&lt;/strong&gt; of the Lambda Function, you would need to make sure that the Crib carousel feature is not conditionally turned on via AppConfig.&lt;/p&gt;

&lt;h2&gt;
  
  
  🧹 Clean Up Our AWS Resources:
&lt;/h2&gt;

&lt;p&gt;Congrats on making it through! Since you are probably running these services on your own AWS account, it is important to make sure you delete instances of the services so that you do not incur costs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;EC2:&lt;/strong&gt; terminate/delete the running instance&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AWS Lambda:&lt;/strong&gt; delete the function&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DynamoDB:&lt;/strong&gt; delete the &lt;code&gt;AWSCribsRentalMansions&lt;/code&gt; table&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Amplify:&lt;/strong&gt; delete the app we created&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CodeCommit:&lt;/strong&gt; delete the repository we created&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AppConfig:&lt;/strong&gt; delete each Feature Flag, the configuration profile, and in environments, delete Beta, as well as the AWSomeCribRentals application&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;WOW! That was a lot! Hopefully you enjoyed going through this AWS workshop with me and the steps I took. Let me know what you think below and if you have any questions on any of the AWS tools I used, feel free to let me know what you thought 😊&lt;/p&gt;

&lt;h2&gt;
  
  
  🧑‍💻 Subscribe to the Tech Stack Playbook for more:
&lt;/h2&gt;

&lt;p&gt;Let me know if you found this post helpful! And if you haven't yet, make sure to check out these free resources below:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Follow my Instagram for more: &lt;a href="https://instagram.com/brianhhough" rel="noopener noreferrer"&gt;@BrianHHough&lt;/a&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;I'm also on Tik Tok too: &lt;a href="https://www.tiktok.com/@brianhhough" rel="noopener noreferrer"&gt;@BrianHHough&lt;/a&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Watch my latest &lt;a href="https://youtube.com/brianhhough" rel="noopener noreferrer"&gt;YouTube video for more&lt;/a&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Listen to my Podcast on &lt;a href="https://podcasts.apple.com/us/podcast/tech-stack-playbook/id1553712082" rel="noopener noreferrer"&gt;Apple Podcasts&lt;/a&gt; and &lt;a href="https://open.spotify.com/show/01bHbabSyBmPfbc3ORMZa9?si=av_16aPbQEqL_bVu3RnO0g" rel="noopener noreferrer"&gt;Spotify&lt;/a&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Join my FREE &lt;a href="https://facebook.com/groups/techstackplaybook" rel="noopener noreferrer"&gt;Tech Stack Playbook Facebook Group&lt;/a&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Join entrepreneurs and developers in the &lt;a href="https://bit.ly/HelpMeDevDiscordLink" rel="noopener noreferrer"&gt;HelpMeDev Discord Server&lt;/a&gt;&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Let's digitize the world together! 🚀&lt;/p&gt;

&lt;p&gt;-- Brian&lt;/p&gt;

</description>
      <category>aws</category>
      <category>linux</category>
      <category>javascript</category>
      <category>cloud</category>
    </item>
    <item>
      <title>How to Connect Your Local Project’s Codebase to a GitHub Repository Fast!</title>
      <dc:creator>Brian H. Hough</dc:creator>
      <pubDate>Fri, 21 Jan 2022 17:47:09 +0000</pubDate>
      <link>https://dev.to/brianhhough/how-to-connect-your-local-projects-codebase-to-a-github-repository-fast-2l7h</link>
      <guid>https://dev.to/brianhhough/how-to-connect-your-local-projects-codebase-to-a-github-repository-fast-2l7h</guid>
      <description>&lt;p&gt;GitHub is one of the most powerful tools for developers, whether you are working on your project solo or working amongst members of a team. Git and GitHub adds a version control layer to your code so anyone can see the change history, the edits, and also see various branches of the codebase. &lt;/p&gt;

&lt;p&gt;In this episode of the &lt;a href="https://www.youtube.com/watch?v=uanVkqI2YHw"&gt;Tech Stack Playbook&lt;/a&gt;, we are going to review the process of uploading a local codebase repository from a computer to GitHub from the command line.&lt;/p&gt;

&lt;p&gt;This episode is packed with content, so here's a glance at what you'll learn about below, and a series of sections further down in this blog post highlighting the important topics we discussed:&lt;/p&gt;

&lt;p&gt;Time stamps:&lt;br&gt;
&lt;a id="NUMBER_1" href="https://www.youtube.com/watch?v=uanVkqI2YHw&amp;amp;t=0s"&gt;00:00&lt;/a&gt; GitHub 101 &lt;br&gt;
&lt;a id="NUMBER_2" href="https://www.youtube.com/watch?v=uanVkqI2YHw&amp;amp;t=135s"&gt;02:15&lt;/a&gt; Set up your code project locally&lt;br&gt;
&lt;a id="NUMBER_3" href="https://www.youtube.com/watch?v=uanVkqI2YHw&amp;amp;t=200s"&gt;03:20&lt;/a&gt; Create an empty repository in GitHub&lt;br&gt;
&lt;a id="NUMBER_4" href="https://www.youtube.com/watch?v=uanVkqI2YHw&amp;amp;t=287s"&gt;04:47&lt;/a&gt; Initialize your GitHub connection locally&lt;br&gt;
&lt;a id="NUMBER_5" href="https://www.youtube.com/watch?v=uanVkqI2YHw&amp;amp;t=628s"&gt;10:28&lt;/a&gt; Review the pushed changes in GitHub&lt;br&gt;
&lt;a id="NUMBER_6" href="https://www.youtube.com/watch?v=uanVkqI2YHw&amp;amp;t=653s"&gt;10:53&lt;/a&gt; Set up GitHub Desktop to manage our repository&lt;br&gt;
&lt;a id="NUMBER_7" href="https://www.youtube.com/watch?v=uanVkqI2YHw&amp;amp;t=693s"&gt;11:33&lt;/a&gt; Push new changes via GitHub Desktop to GitHub&lt;br&gt;
&lt;a id="NUMBER_8" href="https://www.youtube.com/watch?v=uanVkqI2YHw&amp;amp;t=777s"&gt;12:57&lt;/a&gt; Wrap-up and reflection on what we set up with GitHub&lt;/p&gt;

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

&lt;h2&gt;
  
  
  👨‍💻 GitHub 101
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com"&gt;&lt;br&gt;
GitHub&lt;/a&gt; is one of the most powerful tools for developers, whether you are working on your project solo or working amongst members of a team. Git and GitHub adds a version control layer to your code so anyone can see the change history, the edits, and also see various branches of the codebase. &lt;/p&gt;

&lt;p&gt;I like to think of GitHub as the code-version of Google Docs. You can switch back to a previous version of your document, make edits and push those in real time, and also collaborate with others on the same version of the document. &lt;/p&gt;

&lt;p&gt;Another major benefit to GitHub is branching, allowing you to have different states of your codebase for different reasons. A common practice for codebases involves 3 core branches: dev, stage, and prod. The dev branches is what you will use to build from and test, debug, and add in new features. The stage branch is for new additions that are ready for review ahead of going to prod - the reason being, you need to thoroughly test the addition to make sure it is ready for users and so you don’t mess with the client-facing build. The prod, or production, version of your codebase is what is running live for your clients or customers or users. This (hopefully) is free of bugs and errors because of the previous two steps to push code to this stage. &lt;/p&gt;

&lt;p&gt;However, if you are working on your project solo, you might only need 2 core branches: main, a version for you to build/test your app, and prod, a version in production that is always live.&lt;/p&gt;

&lt;p&gt;In today’s tutorial, we are going to review the process of uploading a local codebase repository from a computer to GitHub from the command line. In each of these below steps, I denote which ones are things you do (local) - on your computer, or (web) - on the GitHub website.&lt;/p&gt;
&lt;h2&gt;
  
  
  👨‍💻 Step 1: Set up your code project folder (local)
&lt;/h2&gt;

&lt;p&gt;For this example, I have created a ReactJS Soundcloud Clone application with the create-react-app framework and implemented the AWS Amplify framework with Cognito identity and access management, DynamoDB NoSQL database storage, S3 object oriented storage for media items, and AppSync to help us manage a GraphQL API. The app allows users to create an account that then allows them to upload songs to the cloud through the app and then play those media files through the built-in player. Stay tuned for a full-tutorial on this build coming soon ☺️&lt;/p&gt;

&lt;p&gt;If you do have a local codebase on your computer that you want to push to GitHub, feel free to jump right into Step 2 below.&lt;/p&gt;

&lt;p&gt;If you do not have a local codebase on your computer to push to GitHub, you can spin up a practice repo with either a React.js or NEXT.js template below to get started: &lt;/p&gt;

&lt;p&gt;For React, run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npx create-react-app techstackplaybookpracticerepo
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For Next, run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npx create-next-app --example with-tailwindcss techstackplaybookpracticerepo
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once you have a folder for your app created with one of these frameworks, move onto Step 2 below.&lt;/p&gt;

&lt;h2&gt;
  
  
  👨‍💻 Step 2: Create an empty repository in GitHub (web)
&lt;/h2&gt;

&lt;p&gt;When you go to &lt;a href="https://github.com"&gt;https://github.com&lt;/a&gt;, at the top right, when you click on your profile avatar, there is a drop-down of menu items. &lt;/p&gt;

&lt;p&gt;Click on the drop-down item that says “Your Repositories” which will bring you to a page that lists out all of the repositories in your GitHub account. There will be a green button that says “New” - make sure to click that to pull up the create repository flow.&lt;/p&gt;

&lt;p&gt;There will be a number of options to select, but here’s a quick guide:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Repository template: (keep default option)&lt;/li&gt;
&lt;li&gt;Repository name: TechStackPlaybookPracticeRepo&lt;/li&gt;
&lt;li&gt;Description: (optional)&lt;/li&gt;
&lt;li&gt;Public/Private: Public&lt;/li&gt;
&lt;li&gt;Initialize this repository with: (keep these options unchecked)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When you are ready, click “Create repository” to finalize the setup of an empty repository in GitHub.&lt;/p&gt;

&lt;p&gt;When the empty repository page loads, the link will look something like this: &lt;a href="https://github.com/YourGitHubHandle/TechStackPlaybookPracticeRepo"&gt;https://github.com/YourGitHubHandle/TechStackPlaybookPracticeRepo&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You will notice on this page, there is a URL that will be to the right of the HTTPS button. It will look like this: &lt;code&gt;https://github.com/YourGitHubHandle/TechStackPlaybookPracticeRepo.git&lt;/code&gt;. You will want to copy this URL down as we will need it in Step 3 later on.&lt;/p&gt;

&lt;h2&gt;
  
  
  👨‍💻 Step 3: Initialize your GitHub connection (local)
&lt;/h2&gt;

&lt;p&gt;From the root of your project folder (the outermost folder that wraps everything, for me this is called &lt;code&gt;soundcloud&lt;/code&gt; which contains my /amplify folder, /public folder, /src folder, etc.), make sure that your terminal window is set at this level.&lt;/p&gt;

&lt;p&gt;You will initialize an empty git repository with a branch called main 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;git init -b main
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This will create a hidden folder called &lt;code&gt;.git&lt;/code&gt; which will actually save and store all of our version control changes. It’s almost like a cookie that connects our local repository to the GitHub version.&lt;/p&gt;

&lt;p&gt;Next, we add our locally created files to this .git file 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;git add .
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We then want to commit these files we’ve added onto main to our specific repository that we are initializing for GitHub with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git commit -m “First Commit to GitHub”
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This will probably add a lot of files listed out. Make sure that .gitignore is included in this list of added files and includes &lt;code&gt;node_modules&lt;/code&gt; so that you don’t upload a gazillion &lt;code&gt;node_modules&lt;/code&gt; files to GitHub ☺️&lt;/p&gt;

&lt;p&gt;In the github.com page with the URL that we copied down in Step 2, we will now use this to send our github files to this URL endpoint:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;make sure to change &lt;code&gt;YourGitHubHandle&lt;/code&gt; to your actual account:&lt;/li&gt;
&lt;li&gt;make sure to change &lt;code&gt;TechStackPlaybookPracticeRepo&lt;/code&gt; to the name of your actual repo you created on GitHub
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git remote add origin https://github.com/YourGitHubHandle/TechStackPlaybookPracticeRepo.git
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;What this is effectively doing is telling git that, from the remote local version of our repository, we are going to add all of those files to the origin of this empty GitHub repository link online on the web.&lt;/p&gt;

&lt;p&gt;We will now set the new remote with this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git remote -v
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You will then see that there are 2 lines printed in the terminal, one that ends with (fetch) and one that ends with (push). We are calling this GitHub repository and pushing our code locally from the remote to GitHub in the cloud. &lt;/p&gt;

&lt;p&gt;Now that we’ve initialized the connection, we will push our code locally to the origin main which we’ve set as the destination in GitHub:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git push -u origin main
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This will enumerate all the objects we want to push, it will then get compressed into threads to push them and will push to this GitHub link which is the one we want for this repository and the branch is set as one called &lt;code&gt;main&lt;/code&gt; and sets it to track it from origin.&lt;/p&gt;

&lt;h2&gt;
  
  
  👨‍💻 Step 4: Review the pushed changes in GitHub (web)
&lt;/h2&gt;

&lt;p&gt;On our GitHub repository page (&lt;a href="https://github.com/YourGitHubHandle/TechStackPlaybookPracticeRepo"&gt;https://github.com/YourGitHubHandle/TechStackPlaybookPracticeRepo&lt;/a&gt;), what was once empty, upon refreshing the page, should now show our codebase that we had locally on our computer now on this web page.&lt;/p&gt;

&lt;p&gt;What we have done is create a synced pair between our local repository (remote) and our GitHub repository (origin). However, this is just for our most recent changes on our local repository. What if we want to create ongoing pushes to our GitHub repository and do regular pushes as a backup to GitHub? We will review this with a tool called GitHub Desktop in the next step below.&lt;/p&gt;

&lt;h2&gt;
  
  
  👨‍💻 Step 5: Set up GitHub Desktop to manage our repository (local)
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://desktop.github.com"&gt;&lt;br&gt;
GitHub Desktop&lt;/a&gt;, a Microsoft-created GitHub manager, is a GUI (graphical user interface) client/platform that creates an easy and efficient way to manage our GitHub repository right from our computer without needing to worry about typing the right command line scripts and sequences in the terminal.&lt;/p&gt;

&lt;p&gt;While it is very important to understand what is happening behind the scenes at the terminal level, for us to move fast, we need tools and ways to expedite and automate our work flow processes. When you are typing in the terminal, spelling errors and human error can cause us to make mistakes, errors, or lose precious time. GitHub Desktop helps developers move faster with their repositories and has been an amazing tool in my workflow.&lt;/p&gt;

&lt;p&gt;As a side note, there are other GUIs for Git and SCM (source control management) tooling, such as Kraken which is optimized for Azure DevOps, as well as GitLab.&lt;/p&gt;

&lt;p&gt;We will need to create a new repository in our GitHub Desktop client because while the repository is synced with github.com, our GitHub Desktop client wouldn’t have been updated to track this repository yet until we allow it.&lt;/p&gt;

&lt;p&gt;In the “Add” drop-down on the button to the right of the text field in the GitHub Desktop client, you will select the drop-down option: &lt;code&gt;Add Local Repository&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;When we have the option to “Choose” a folder, we will want to select the outermost folder container for our project. For you, this might look like: &lt;code&gt;/user/Documents/GitHub/TechStackPlaybookPracticeRepo&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Once the outermost folder is selected, we will click &lt;code&gt;Add Repository&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;This will now connect to our hidden &lt;code&gt;.git&lt;/code&gt; file and anytime we make changes and save them in our code editor, GitHub Desktop will show those changes reflected in the GUI.&lt;/p&gt;
&lt;h2&gt;
  
  
  👨‍💻 Step 6: Push new changes via GitHub Desktop to GitHub (local)
&lt;/h2&gt;

&lt;p&gt;In GitHub Desktop, we should see 1 or more file changes reflected in the list of “changed files” on the left half of the app. In this video, I updated the README.md file, so that is why it has a check-mark next to &lt;code&gt;README.md&lt;/code&gt; and the app says &lt;code&gt;1 changed file&lt;/code&gt; at the top.&lt;/p&gt;

&lt;p&gt;In the bottom right, we will give our commit a name, which can be anything you wish. I said: &lt;code&gt;Updated Readme for YouTube!&lt;/code&gt;. You can also write a description if you want, but it is optional.&lt;/p&gt;

&lt;p&gt;At the top, you will see I have the current branch set to &lt;code&gt;main&lt;/code&gt;, as I only have 1 branch created for this video.&lt;/p&gt;

&lt;p&gt;When everything looks good, you will click the blue bottom at the bottom left that says “Commit to main`&lt;/p&gt;

&lt;p&gt;The bottom right button should now say &lt;code&gt;Push origin&lt;/code&gt;, and once you select this, it will send those updated changes committed to our local remote branch to the main GitHub branch on the web.&lt;/p&gt;
&lt;h2&gt;
  
  
  👨‍💻 Step 7: Review the pushed changes in GitHub (web)
&lt;/h2&gt;

&lt;p&gt;On our GitHub repository page (&lt;a href="https://github.com/YourGitHubHandle/TechStackPlaybookPracticeRepo"&gt;https://github.com/YourGitHubHandle/TechStackPlaybookPracticeRepo&lt;/a&gt;), upon refreshing the page, you should see your changes reflected in the online version of the codebase, matching your changes locally as well. &lt;/p&gt;

&lt;p&gt;In this example, the README.md file reflects the change and in the file/folder list, you will see that all the folders/files have the commit message &lt;code&gt;First Commit to GitHub from Local&lt;/code&gt; except for one, which is that README.md file. It has a message that reads the same message we put into GitHub desktop: &lt;code&gt;Update Readme for YouTube!&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;...&lt;/p&gt;

&lt;p&gt;Check out the full recording below:&lt;/p&gt;

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

&lt;p&gt;Let me know if you found this post helpful! And if you haven't yet, make sure to check out these free resources below:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Follow my Instagram for more: &lt;a href="https://instagram.com/brianhhough"&gt;@BrianHHough&lt;/a&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;I'm also on Tik Tok too: &lt;a href="https://www.tiktok.com/@brianhhough"&gt;@BrianHHough&lt;/a&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Watch my latest &lt;a href="https://youtube.com/brianhhough"&gt;YouTube video for more&lt;/a&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Listen to my Podcast on &lt;a href="https://podcasts.apple.com/us/podcast/tech-stack-playbook/id1553712082"&gt;Apple Podcasts&lt;/a&gt; and &lt;a href="https://open.spotify.com/show/01bHbabSyBmPfbc3ORMZa9?si=av_16aPbQEqL_bVu3RnO0g"&gt;Spotify&lt;/a&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Join my FREE &lt;a href="https://facebook.com/groups/techstackplaybook"&gt;Tech Stack Playbook Facebook Group&lt;/a&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Join entrepreneurs and developers in the &lt;a href="https://bit.ly/HelpMeDevDiscordLink"&gt;HelpMeDev Discord Server&lt;/a&gt;&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Let's digitize the world together! 🚀&lt;/p&gt;

&lt;p&gt;-- Brian&lt;/p&gt;

</description>
      <category>git</category>
      <category>github</category>
      <category>tutorial</category>
      <category>javascript</category>
    </item>
    <item>
      <title>AWS Just Announced that the Future is Serverless at re:Invent — Day 3</title>
      <dc:creator>Brian H. Hough</dc:creator>
      <pubDate>Wed, 01 Dec 2021 19:10:27 +0000</pubDate>
      <link>https://dev.to/aws-builders/aws-just-announced-that-the-future-is-serverless-at-reinvent-day-3-14pe</link>
      <guid>https://dev.to/aws-builders/aws-just-announced-that-the-future-is-serverless-at-reinvent-day-3-14pe</guid>
      <description>&lt;p&gt;We just wrapped up Day 3 of Amazon Web Services (AWS) re:Invent and there were a ton of announcements! AWS CEO Adam Selipsky delivered the opening keynote and announced a number of exciting updates and announcements, including Amazon Private 5G (imagine building your own 5G network - how cool is that?!)...Amazon SageMaker Canvas for low-code machine learning in the cloud...and a great analysis of what a modern data strategy looks like.&lt;/p&gt;

&lt;p&gt;Additionally, I share insights from AWS' David Yanacek about how he builds operational excellence for his teams in an agile way for developers and DevOps engineers at Amazon. Finally, I go through a theme park app I built at one of the workshops 😊 &lt;/p&gt;

&lt;p&gt;In this episode of the &lt;a href="https://www.youtube.com/watch?v=IOwKhN4Q49s" rel="noopener noreferrer"&gt;Tech Stack Playbook&lt;/a&gt;, I'll be sharing more about AWS re:Invent - the year's largest global tech conference that brings together leaders, builders, innovators, and creators from cloud, DevOps, serverless, app development, and software engineering from all around the world.&lt;/p&gt;

&lt;p&gt;In this blog post and the blog posts to come this week, my hope is to vlog through the entire week and share all that I'm learning and building with you all so whether you are attending virtually or in person, this AWS re:Invent series on the Tech Stack Playbook will help you gain skills, level up in tech, and boost your software engineering abilities from the sessions I'm attending throughout the conference.&lt;/p&gt;

&lt;p&gt;Here’s a glance at what you’ll learn in this blog post:&lt;br&gt;
👉  What AWS re:Invent is all about&lt;br&gt;
👉  Traveling to Las Vegas for the year's largest tech conference&lt;br&gt;
👉  What I'll be learning about and building this week&lt;/p&gt;

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

&lt;p&gt;It's going to be a major week for cloud and tech in general, so I am so excited to bring you along for the ride.&lt;/p&gt;

&lt;p&gt;What do you want to know about AWS, serverless, and DevOps? 💭&lt;/p&gt;

&lt;p&gt;Let me know in the comments below! ⬇️&lt;/p&gt;

&lt;h2&gt;
  
  
  Check out the full recording below:
&lt;/h2&gt;

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

&lt;p&gt;Let me know if you found this post helpful! And if you haven't yet, make sure to check out these free resources below:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Follow my Instagram for more: &lt;a href="https://instagram.com/brianhhough" rel="noopener noreferrer"&gt;@BrianHHough&lt;/a&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Watch my latest &lt;a href="https://youtube.com/brianhhough" rel="noopener noreferrer"&gt;YouTube video for more&lt;/a&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;
&lt;b&gt;Listen to my Podcast on &lt;a href="https://podcasts.apple.com/us/podcast/tech-stack-playbook/id1553712082" rel="noopener noreferrer"&gt;Apple Podcasts&lt;/a&gt; and &lt;a href="https://open.spotify.com/show/01bHbabSyBmPfbc3ORMZa9?si=av_16aPbQEqL_bVu3RnO0g" rel="noopener noreferrer"&gt;Spotify&lt;/a&gt;&lt;/b&gt; &lt;/li&gt;
&lt;li&gt;&lt;b&gt;Join my FREE &lt;a href="https://facebook.com/groups/techstackplaybook" rel="noopener noreferrer"&gt;Tech Stack Playbook Facebook Group&lt;/a&gt;&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Let's digitize the world together! 🚀&lt;/p&gt;

&lt;p&gt;-- Brian&lt;/p&gt;

</description>
      <category>aws</category>
      <category>cloud</category>
      <category>cloudskills</category>
      <category>devops</category>
    </item>
    <item>
      <title>I built an AI-Powered Image Processor at AWS re:Invent 😱 - Day 2</title>
      <dc:creator>Brian H. Hough</dc:creator>
      <pubDate>Tue, 30 Nov 2021 20:16:53 +0000</pubDate>
      <link>https://dev.to/aws-builders/i-built-an-ai-powered-image-processor-at-aws-reinvent-day-2-2hh6</link>
      <guid>https://dev.to/aws-builders/i-built-an-ai-powered-image-processor-at-aws-reinvent-day-2-2hh6</guid>
      <description>&lt;p&gt;Just wrapped up Day 2 of Amazon Web Services (AWS) re:Invent and from the Midnight Madness concert, to building an AI-Powered Image Processor during Talia Nassi's workshop, to catching up with the amazing Adrienne Tacke from MongoDB....there is a TON going on Vegas! &lt;/p&gt;

&lt;p&gt;In this episode of the &lt;a href="https://www.youtube.com/watch?v=kJV-OD_VAJk" rel="noopener noreferrer"&gt;Tech Stack Playbook&lt;/a&gt;, I'll be sharing more about AWS re:Invent - the year's largest global tech conference that brings together leaders, builders, innovators, and creators from cloud, DevOps, serverless, app development, and software engineering from all around the world.&lt;/p&gt;

&lt;p&gt;Also, I built an AI-Powered image processing application that can take images and analyze certain features about the uploaded images…so that was pretty cool 😱&lt;/p&gt;

&lt;p&gt;In this blog post and the blog posts to come this week, my hope is to vlog through the entire week and share all that I'm learning and building with you all so whether you are attending virtually or in person, this AWS re:Invent series on the Tech Stack Playbook will help you gain skills, level up in tech, and boost your software engineering abilities from the sessions I'm attending throughout the conference.&lt;/p&gt;

&lt;p&gt;Here’s a glance at what you’ll learn in this blog post:&lt;br&gt;
👉  What AWS re:Invent is all about&lt;br&gt;
👉  Traveling to Las Vegas for the year's largest tech conference&lt;br&gt;
👉  What I'll be learning about and building this week&lt;/p&gt;

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

&lt;p&gt;It's going to be a major week for cloud and tech in general, so I am so excited to bring you along for the ride.&lt;/p&gt;

&lt;p&gt;What do you want to know about AWS, serverless, and DevOps? 💭&lt;/p&gt;

&lt;p&gt;Let me know in the comments below! ⬇️&lt;/p&gt;

&lt;h2&gt;
  
  
  Check out the full recording below:
&lt;/h2&gt;

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

&lt;p&gt;Let me know if you found this post helpful! And if you haven't yet, make sure to check out these free resources below:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Follow my Instagram for more: &lt;a href="https://instagram.com/brianhhough" rel="noopener noreferrer"&gt;@BrianHHough&lt;/a&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Watch my latest &lt;a href="https://youtube.com/brianhhough" rel="noopener noreferrer"&gt;YouTube video for more&lt;/a&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;
&lt;b&gt;Listen to my Podcast on &lt;a href="https://podcasts.apple.com/us/podcast/tech-stack-playbook/id1553712082" rel="noopener noreferrer"&gt;Apple Podcasts&lt;/a&gt; and &lt;a href="https://open.spotify.com/show/01bHbabSyBmPfbc3ORMZa9?si=av_16aPbQEqL_bVu3RnO0g" rel="noopener noreferrer"&gt;Spotify&lt;/a&gt;&lt;/b&gt; &lt;/li&gt;
&lt;li&gt;&lt;b&gt;Join my FREE &lt;a href="https://facebook.com/groups/techstackplaybook" rel="noopener noreferrer"&gt;Tech Stack Playbook Facebook Group&lt;/a&gt;&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Let's digitize the world together! 🚀&lt;/p&gt;

&lt;p&gt;-- Brian&lt;/p&gt;

</description>
      <category>ai</category>
      <category>machinelearning</category>
      <category>aws</category>
      <category>cloud</category>
    </item>
    <item>
      <title>Join me at AWS re:Invent - Level Up as a Developer and Software Engineer with me - DAY 1</title>
      <dc:creator>Brian H. Hough</dc:creator>
      <pubDate>Mon, 29 Nov 2021 17:43:12 +0000</pubDate>
      <link>https://dev.to/aws-builders/join-me-at-aws-reinvent-level-up-as-developer-and-software-engineer-with-me-day-1-292e</link>
      <guid>https://dev.to/aws-builders/join-me-at-aws-reinvent-level-up-as-developer-and-software-engineer-with-me-day-1-292e</guid>
      <description>&lt;p&gt;I have an exciting announcement friends!! I just touched down in Las Vegas for day 1 of AWS' re:Invent 2021 conference 🌄 and I cannot wait to share this week's exciting updates, announcements, learnings, and opportunities to level up in cloud computing, serverless, and DevOps with you all. &lt;/p&gt;

&lt;p&gt;In this episode of the &lt;a href="https://www.youtube.com/watch?v=kJV-OD_VAJk" rel="noopener noreferrer"&gt;Tech Stack Playbook&lt;/a&gt;, I'll be sharing more about AWS re:Invent - the year's largest global tech conference that brings together leaders, builders, innovators, and creators from cloud, DevOps, serverless, app development, and software engineering from all around the world. I was so fortunate to win an All Builders Grant to attend this year's event, so thank you SO much AWS for this incredible opportunity. 🎉 &lt;/p&gt;

&lt;p&gt;In this blog post and the blog posts to come this week, my hope is to vlog through the entire week and share all that I'm learning and building with you all so whether you are attending virtually or in person, this AWS re:Invent series on the Tech Stack Playbook will help you gain skills, level up in tech, and boost your software engineering abilities from the sessions I'm attending throughout the conference.&lt;/p&gt;

&lt;p&gt;Here’s a glance at what you’ll learn in this blog post:&lt;br&gt;
👉  What AWS re:Invent is all about&lt;br&gt;
👉  Traveling to Las Vegas for the year's largest tech conference&lt;br&gt;
👉  What I'll be learning about and building this week&lt;/p&gt;

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

&lt;p&gt;It's going to be a major week for cloud and tech in general, so I am so excited to bring you along for the ride.&lt;/p&gt;

&lt;p&gt;What do you want to know about AWS, serverless, and DevOps? 💭&lt;/p&gt;

&lt;p&gt;Let me know in the comments below! ⬇️&lt;/p&gt;

&lt;h2&gt;
  
  
  Check out the full recording below:
&lt;/h2&gt;

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

&lt;p&gt;Let me know if you found this post helpful! And if you haven't yet, make sure to check out these free resources below:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Follow my Instagram for more: &lt;a href="https://instagram.com/brianhhough" rel="noopener noreferrer"&gt;@BrianHHough&lt;/a&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Watch my latest &lt;a href="https://youtube.com/brianhhough" rel="noopener noreferrer"&gt;YouTube video for more&lt;/a&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;
&lt;b&gt;Listen to my Podcast on &lt;a href="https://podcasts.apple.com/us/podcast/tech-stack-playbook/id1553712082" rel="noopener noreferrer"&gt;Apple Podcasts&lt;/a&gt; and &lt;a href="https://open.spotify.com/show/01bHbabSyBmPfbc3ORMZa9?si=av_16aPbQEqL_bVu3RnO0g" rel="noopener noreferrer"&gt;Spotify&lt;/a&gt;&lt;/b&gt; &lt;/li&gt;
&lt;li&gt;&lt;b&gt;Join my FREE &lt;a href="https://facebook.com/groups/techstackplaybook" rel="noopener noreferrer"&gt;Tech Stack Playbook Facebook Group&lt;/a&gt;&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Let's digitize the world together! 🚀&lt;/p&gt;

&lt;p&gt;-- Brian&lt;/p&gt;

</description>
      <category>aws</category>
      <category>cloud</category>
      <category>cloudskills</category>
      <category>devops</category>
    </item>
    <item>
      <title>Learn How to Code, Get Started in Tech, and Enter the Matrix — Welcome to the Tech Stack Playbook</title>
      <dc:creator>Brian H. Hough</dc:creator>
      <pubDate>Wed, 22 Sep 2021 05:02:52 +0000</pubDate>
      <link>https://dev.to/brianhhough/learn-how-to-code-get-started-in-tech-and-enter-the-matrix-welcome-to-the-tech-stack-playbook-52gl</link>
      <guid>https://dev.to/brianhhough/learn-how-to-code-get-started-in-tech-and-enter-the-matrix-welcome-to-the-tech-stack-playbook-52gl</guid>
      <description>&lt;p&gt;Welcome to the &lt;a href="https://www.youtube.com/brianhhough"&gt;Tech Stack Playbook&lt;/a&gt; — your guide to apps, software, and tech (but in a fun way I promise!) &lt;/p&gt;

&lt;p&gt;I’m especially excited to kick off this first episode because this channel is inspired by so many of the other innovative content creators, programmers, and entrepreneurs I have watched over the past couple of years. Other creators, experts, educators, professors, entrepreneurs, and builders are the reasons why I got started in tech, and my goal is to use this channel to inspire, to motivate, to educate, and to share the vast world of technology, while providing a window into this exciting space.&lt;/p&gt;

&lt;p&gt;GAIN ACCESS to the full show notes for this episode and access to more biz tech, branding, full stack development, and digital transformation insights from Brian H. Hough here: &lt;a href="https://brianhhough.com/techstackplaybook"&gt;https://brianhhough.com/techstackplaybook&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here’s a glance at what you’ll learn in this episode:&lt;br&gt;
&lt;a href="https://www.youtube.com/watch?v=8DPYOm7gkNo&amp;amp;t=0s"&gt;00:00&lt;/a&gt; Welcome to the Tech Stack Playbook — your guide to apps, software, and tech&lt;br&gt;
&lt;a href="https://www.youtube.com/watch?v=8DPYOm7gkNo&amp;amp;t=23s"&gt;00:23&lt;/a&gt; My motivation for starting this channel&lt;br&gt;
&lt;a href="https://www.youtube.com/watch?v=8DPYOm7gkNo&amp;amp;t=58s"&gt;00:58&lt;/a&gt; How I got started in tech&lt;br&gt;
&lt;a href="https://www.youtube.com/watch?v=8DPYOm7gkNo&amp;amp;t=140s"&gt;02:20&lt;/a&gt; When I started learning how to code&lt;br&gt;
&lt;a href="https://www.youtube.com/watch?v=8DPYOm7gkNo&amp;amp;t=236s"&gt;03:56&lt;/a&gt; Why there isn’t a better time to get started in tech&lt;br&gt;
&lt;a href="https://www.youtube.com/watch?v=8DPYOm7gkNo&amp;amp;t=401s"&gt;06:41&lt;/a&gt; Future ideas on the growth of the channel&lt;br&gt;
&lt;a href="https://www.youtube.com/watch?v=8DPYOm7gkNo&amp;amp;t=491s"&gt;08:11&lt;/a&gt; How you can get involved in The Tech Stack Playbook&lt;br&gt;
&lt;a href="https://www.youtube.com/watch?v=8DPYOm7gkNo&amp;amp;t=648s"&gt;10:48&lt;/a&gt; The opportunity for content creation in a digital age&lt;br&gt;
&lt;a href="https://www.youtube.com/watch?v=8DPYOm7gkNo&amp;amp;t=696s"&gt;11:36&lt;/a&gt; Let’s digitize the world with the Tech Stack Playbook 🚀&lt;/p&gt;

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

&lt;h2&gt;
  
  
  If you are interested in being a part of The Tech Stack Playbook, collaborating, or contributing to the growth of this channel, let’s connect:
&lt;/h2&gt;

&lt;p&gt;📲 Let’s connect on the ‘Gram: &lt;a href="https://instagram.com/brianhhough%E2%80%8B%E2%80%8B"&gt;https://instagram.com/brianhhough​​&lt;/a&gt;&lt;br&gt;
🤝 Let’s connect on LinkedIn: &lt;a href="https://linkedin.com/in/brianhhough"&gt;https://linkedin.com/in/brianhhough​​&lt;/a&gt;&lt;br&gt;
💻 Join my FREE Tech/Coding Facebook Group: &lt;a href="https://www.facebook.com/groups/techstackplaybook"&gt;https://www.facebook.com/groups/techstackplaybook&lt;/a&gt;&lt;br&gt;
🌟 Check out my other episodes: &lt;a href="https://www.brianhhough.com/techstackplaybook"&gt;https://www.brianhhough.com/techstackplaybook&lt;/a&gt;&lt;br&gt;
&lt;br&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  👇👇👇 MY AFFILIATE DISCOUNT CODES TO LEARN HOW TO CODE:
&lt;/h2&gt;

&lt;p&gt;🌴 Team Treehouse — get a FREE MONTH with my referral code: &lt;a href="http://referrals.trhou.se/brianhough2%E2%80%8B"&gt;http://referrals.trhou.se/brianhough2​&lt;/a&gt;&lt;br&gt;
👨‍💻 Codecademy — get a FREE MONTH of a Pro membership with my referral code: &lt;a href="http://ssqt.co/mQgVi7z"&gt;http://ssqt.co/mQgVi7z​&lt;/a&gt;&lt;br&gt;
&lt;br&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Check out the full recording below:
&lt;/h2&gt;

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

&lt;p&gt;Let me know if you found this post helpful! And if you haven't yet, make sure to check out these free resources below:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Follow my Instagram for more: &lt;a href="https://instagram.com/brianhhough"&gt;@BrianHHough&lt;/a&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Watch my latest &lt;a href="https://youtube.com/brianhhough"&gt;YouTube video for more&lt;/a&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Listen to my Podcast on &lt;a href="https://youtube.com/brianhhough"&gt;Apple Podcasts&lt;/a&gt; and &lt;a href="https://youtube.com/brianhhough"&gt;Spotify&lt;/a&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Join my free &lt;a href="https://facebook.com/groups/techstackplaybook"&gt;Facebook Group&lt;/a&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Join my new &lt;a href="https://facebook.com/groups/techstackplaybook"&gt;Discord Server&lt;/a&gt;&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>programming</category>
      <category>devops</category>
      <category>cloud</category>
      <category>react</category>
    </item>
    <item>
      <title>How to Level Up as a Software Engineer | AWS Community Builders Program</title>
      <dc:creator>Brian H. Hough</dc:creator>
      <pubDate>Tue, 31 Aug 2021 18:14:28 +0000</pubDate>
      <link>https://dev.to/brianhhough/how-to-level-up-as-a-software-engineer-aws-community-builders-program-55g4</link>
      <guid>https://dev.to/brianhhough/how-to-level-up-as-a-software-engineer-aws-community-builders-program-55g4</guid>
      <description>&lt;p&gt;Wondering what you can do to level up as a software engineer, developer or programmer this year? 👨‍💻💭 &lt;/p&gt;

&lt;p&gt;In this episode of the &lt;a href="https://youtu.be/hFvGrvCpEsg"&gt;Tech Stack Playbook&lt;/a&gt;, I'm diving into the program that has single-handedly helped me the most in my tech career thus far: the AWS Community Builders Program. Today's episode focuses on AWS, the community, the core benefits of the program, and how it has helped me level up as a software engineer and developer this year.&lt;/p&gt;

&lt;p&gt;📝 Quick plug: Applications close on August 30, 2021, so please reach out if you have any questions about the program and be sure to apply by the deadline here: &lt;a href="https://amazonmr.au1.qualtrics.com/jfe/form/SV_dajuY7uPsH3NSTk"&gt;https://amazonmr.au1.qualtrics.com/jfe/form/SV_dajuY7uPsH3NSTk&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here’s a glance at what you’ll learn in this episode:&lt;/p&gt;

&lt;p&gt;Time stamps:&lt;br&gt;
&lt;a href="https://www.youtube.com/watch?v=hFvGrvCpEsg&amp;amp;t=0s"&gt;00:00&lt;/a&gt; How the AWS Community Builders Program has helped me level up&lt;br&gt;
&lt;a href="https://www.youtube.com/watch?v=hFvGrvCpEsg&amp;amp;t=43s"&gt;00:43&lt;/a&gt; Benefit #1: Being a Part of a Vibrant Community&lt;br&gt;
&lt;a href="https://www.youtube.com/watch?v=hFvGrvCpEsg&amp;amp;t=215s"&gt;03:35&lt;/a&gt; Benefit #2: Being Surrounded by Constant Education and Learning&lt;br&gt;
&lt;a href="https://www.youtube.com/watch?v=hFvGrvCpEsg&amp;amp;t=306s"&gt;05:06&lt;/a&gt; Benefit #3: An Immense Amount of Resources and Tools&lt;br&gt;
&lt;a href="https://www.youtube.com/watch?v=hFvGrvCpEsg&amp;amp;t=383s"&gt;06:23&lt;/a&gt; Benefit #4: Get Connected to Conferences, Events, and Workshops&lt;br&gt;
&lt;a href="https://www.youtube.com/watch?v=hFvGrvCpEsg&amp;amp;t=420s"&gt;07:00&lt;/a&gt; Why constant learning is key &amp;amp; how community/mentors can help&lt;br&gt;
&lt;a href="https://www.youtube.com/watch?v=hFvGrvCpEsg&amp;amp;t=575s"&gt;09:35&lt;/a&gt; Reflecting on the past year of growth and development in software engineering&lt;/p&gt;

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

&lt;h2&gt;
  
  
  👨‍💻 What are the Benefits of the AWS Community Builder's Program for Developers?
&lt;/h2&gt;

&lt;p&gt;The benefits of the AWS Community Builders program knows no bounds because it’s a truly priceless program. In the beginning, you will get a welcome kit which has some amazing AWS swag like hats, water bottles, desktop accessories, $500 of AWS credits, and way more goodies and benefits. But, there are several core aspects of the program that can be so instrumental to fellow programmers, developers, and people in tech. From exclusive webinars and events, to a global Slack channel of developers, programmers, software engineers, developer advocates, CTOs, executives, and everyone in between, there is so much value packed into this program for all involved.&lt;/p&gt;

&lt;p&gt;So what are the key highlights from this program? I'll walk through for key benefits of the program and explain why this program has been so valuable to me.&lt;br&gt;
&lt;br&gt;&lt;br&gt;
&lt;br&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  👨‍💻 BENEFIT #1: Being a Part of a Vibrant Community
&lt;/h2&gt;

&lt;p&gt;When you are starting out in your developer journey, whether at the executive or technical levels, whether you are a freelancer or employed by a software company, you always need to think about your community.&lt;/p&gt;

&lt;p&gt;Who are the people you surround yourself? Who do you turn to and talk to when you have questions or comments about tech, your job, your career etc.?&lt;/p&gt;

&lt;p&gt;During the COVID-19 pandemic and even beforehand, I was constantly thinking about how I can build my network of friends, colleagues, mentors, and guides in technology. As a self-taught programmer, I have done bootcamps and courses and programs, but I don’t have a degree in computer science, so I needed to surround myself with people who went down similar paths and different paths to learn what set them up for success.&lt;/p&gt;

&lt;p&gt;And joining a highly-engaged and inspiring community of software engineers and developers from around the world building on the same tools and frameworks is one of the best ways to accomplish this. It all goes back to joining a community. The AWS Community Builders program is full of some of the most selfless, smart, caring, and supportive people I have ever met. People who go out of their way to answer questions, help people when they have questions, and work on helping the rest of the community level up as well. AWS leaders, AWS Heroes, experts in tech, and senior leaders of the industry are all a part of this program along with early career and young software engineers like me. The community is so rich with so many different types of technology people, all sharing a passion for serverless frameworks, cloud-based software, and of course, AWS! &lt;/p&gt;

&lt;p&gt;If you are looking for a highly engaged and active family of developers and programmers who constantly will push you to be better, smarter, faster, and stronger than you were the day before, look no further than the AWS Community Builders Program, especially to be around people who inspire you to constantly level up.&lt;br&gt;
&lt;br&gt;&lt;br&gt;
&lt;br&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  👨‍💻 BENEFIT #2: Being Surrounded by Constant Education and Learning
&lt;/h2&gt;

&lt;p&gt;How are you constantly thinking about how you will level up as a developer or programmer? Are you learning new things or just doing the same-old-same-old.&lt;/p&gt;

&lt;p&gt;The AWS staff puts on incredible exclusive events, workshops, talks, and meetings on cutting-edge serverless tools like SageMaker and Hugging Face for artificial intelligence and machine learning (AI &amp;amp; ML), database best practices like DynamoDB or Neptune, messaging services like SNS and SES and PinPoint, as well as networking and compute services like EC2, VPC, etc. &lt;/p&gt;

&lt;p&gt;There is so much high level content that exists on the Internet, and it can leave you wondering…so how does this tech actually work? If I wanted to actually use these tools, what do I need to do? Well thanks to the these exclusive events and workshops, you get to have leading technology experts, AWS staff, and tech visionaries walk you through implementation, code, walkthroughs, and more. You get architecture diagrams, roadmaps, how-to-guides, and a plethora of resources.&lt;br&gt;
&lt;br&gt;&lt;br&gt;
&lt;br&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  👨‍💻 BENEFIT #3:  An Immense Amount of Resources and Tools
&lt;/h2&gt;

&lt;p&gt;The third biggest benefit that I think makes the AWS Community Builders Program so valuable is the resources and tools Community Builders have at their disposal. I’ve benefited a lot from having a subscription to Cloud Academy and having access to classes and guides and lessons.&lt;/p&gt;

&lt;p&gt;By going through classes and education online, on-demand, and on the topics you are most curious on, this makes it so easy to get the skills you need for your job, for your passion project, and for your company. Online education is only going to increase in importance and value in the months and years to come, and especially during these remote months, being able to attend virtual classes and webinars right from your computer makes it that much easier to upskill and level up.&lt;br&gt;
&lt;br&gt;&lt;br&gt;
&lt;br&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  👨‍💻 BENEFIT #4:  Get Connected to Conferences, Events, and Workshops
&lt;/h2&gt;

&lt;p&gt;The fourth largest benefit has to be the connection to conferences, events, and workshops. Being able to jump into a conference session or be invited to a Brown Bag lunch workshop on a certain AWS or serverless tool….and also be invited to speak at events like this…has such an immense amount of value for anyone looking to get more presentation and conference experience under their belt.&lt;/p&gt;

&lt;p&gt;As a young professional, opportunities like this can be difficult to come by, so having people that can put you in touch with event organizers and leaders can make all the difference for sharing the insights you’re learning on the job, in your side projects, or generally sharing insights based on what you are working on.&lt;/p&gt;

&lt;p&gt;One of the opportunities I was able to earn was giving a 2 hour master class on the &lt;a href="https://datasaturdays.com/2021-09-04-datasaturday0014/"&gt;9 AWS Serverless Databases all Programmers and Software Engineers Should Know&lt;/a&gt;. Additionally, this upcoming Saturday, my talk on AWS Serverless Databases was accepted for &lt;a href="https://datasaturdays.com/2021-09-04-datasaturday0014/"&gt;Data Saturday Oslo&lt;/a&gt;, which I am super excited about. &lt;/p&gt;

&lt;p&gt;Not only do you get amazing experience by presenting technology to global audiences, but you also get to inspire and empower other developers to learn new tools, solutions, strategies, and methodologies. By bringing people into the fold of cutting-edge technology, you never know who you might empower in the “virtual stands.” Or in the audience, there might be someone who goes on to implement what you talked about or builds a solution that has a large impact on the world. The possibilities are truly limitless and you never know what your talk might do to impact people and get people started in their serverless, full-stack, and AWS journeys. &lt;br&gt;
&lt;br&gt;&lt;br&gt;
&lt;br&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  👨‍💻 How to Become an AWS Community Builder?
&lt;/h2&gt;

&lt;p&gt;If this interests you and you want join this incredible program and community, I highly recommend that you apply! The deadline is August 30th, so make sure to apply via the application link here: &lt;a href="https://amazonmr.au1.qualtrics.com/jfe/form/SV_dajuY7uPsH3NSTk"&gt;https://amazonmr.au1.qualtrics.com/jfe/form/SV_dajuY7uPsH3NSTk&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you have any questions about the application process, please reach out over social media or drop a comment below and I will respond!&lt;/p&gt;

&lt;p&gt;Check out the full recording below:&lt;/p&gt;

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

&lt;p&gt;Let me know if you found this post helpful! And if you haven't yet, make sure to check out these free resources below:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Follow my Instagram for more: &lt;a href="https://instagram.com/brianhhough"&gt;@BrianHHough&lt;/a&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Watch my latest &lt;a href="https://youtube.com/brianhhough"&gt;YouTube video for more&lt;/a&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Listen to my Podcast on &lt;a href="https://youtube.com/brianhhough"&gt;Apple Podcasts&lt;/a&gt; and &lt;a href="https://youtube.com/brianhhough"&gt;Spotify&lt;/a&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Join my FREE &lt;a href="https://facebook.com/groups/techstackplaybook"&gt;Tech Stack Playbook Facebook Group&lt;/a&gt;&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Let's digitize the world together! 🚀&lt;/p&gt;

&lt;p&gt;-- Brian&lt;/p&gt;

</description>
      <category>aws</category>
      <category>javascript</category>
      <category>react</category>
      <category>cloud</category>
    </item>
  </channel>
</rss>
