<?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: Aaron Brighton</title>
    <description>The latest articles on DEV Community by Aaron Brighton (@aaronbrighton).</description>
    <link>https://dev.to/aaronbrighton</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%2F645465%2Fb40f53f7-5cae-43cc-8d4d-1f5b27e9592e.jpg</url>
      <title>DEV Community: Aaron Brighton</title>
      <link>https://dev.to/aaronbrighton</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/aaronbrighton"/>
    <language>en</language>
    <item>
      <title>Pandemic-driven bubble tea availability w/ Amazon Pinpoint, Location Service, Lambda, EventBridge, Step Functions, and more…</title>
      <dc:creator>Aaron Brighton</dc:creator>
      <pubDate>Wed, 15 Sep 2021 20:42:19 +0000</pubDate>
      <link>https://dev.to/aws-builders/pandemic-driven-bubble-tea-availability-w-amazon-pinpoint-location-service-lambda-eventbridge-step-functions-and-more-41b8</link>
      <guid>https://dev.to/aws-builders/pandemic-driven-bubble-tea-availability-w-amazon-pinpoint-location-service-lambda-eventbridge-step-functions-and-more-41b8</guid>
      <description>&lt;p&gt;In the Toronto area when the COVID-19 pandemic hit last year (spring 2020) one of the consequences (benefits?) was that all businesses where employees could reasonably work from home ended up being forced to do so.&lt;/p&gt;

&lt;p&gt;This had an interesting effect on restaurants and the food service industry. In the suburbs food establishments saw a huge increase in sales, people were buying lunch near their homes instead of in downtown Toronto. Unfortunately, this also meant long lines for take out that would normally have taken a mere 5 minutes.&lt;/p&gt;

&lt;p&gt;Some food stores went purely to online-ordering only, one of those was a Bubble Tea franchise named “Chatime”, you’ve probably heard of it, it’s apparently &lt;a href="https://en.wikipedia.org/wiki/Chatime" rel="noopener noreferrer"&gt;the biggest&lt;/a&gt; in the world. This actually caused a really frustrating problem for those wanting to order, my wife and I included.&lt;/p&gt;

&lt;p&gt;Given the increased volume of orders, the Chatime near us would “turn-on” their online ordering system for a few minutes, wait for it to fill up with orders, and then turn it off again, in a desperate effort for them to keep up (orders apparently still took upwards of an hour to be made). For a week my wife and I tried many times to order, and each time we got to the order submission page… Uber Eats would give up and say the store is no longer open and would happily wipe out our cart at the same time (thanks). Frustrating puts it mildly.&lt;/p&gt;

&lt;p&gt;So what do we do? Keep hitting F5 until it’s balled hoping to catch the store when it opens it’s online ordering again? Thankfully no.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Enter AWS.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Situations like this are one of the reasons I love the cloud, and specifically Serverless technologies. In roughly a day, I was able to put together a quick and dirty serverless app that would (effectively) hit F5 for us and then send an SMS message to let us know the moment online ordering opened back up.&lt;/p&gt;

&lt;p&gt;It worked! First time we got the SMS message, we succeeded at placing an order!&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%2Fam4xc370s7qo5pm8qxs5.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fam4xc370s7qo5pm8qxs5.jpg" alt="Google Images “Bubble Tea Meme”"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Enter 2021.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It’s time I clean-up what I had built and put it out there for others to learn from, repurpose, etc…&lt;/p&gt;

&lt;p&gt;For those that aren’t interested in a wordy walk-through and explanation, feel free to skip the rest and jump right into the code (a clap and follow would be nice though before you leave, if you’re also feeling generous :)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;cdk-serverless-chatime-ordering-helper&lt;/strong&gt; — &lt;a href="https://github.com/aaronbrighton/cdk-serverless-chatime-ordering-helper" rel="noopener noreferrer"&gt;https://github.com/aaronbrighton/cdk-serverless-chatime-ordering-helper&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For the rest of you, let’s dive into it!&lt;/p&gt;




&lt;h1&gt;
  
  
  Amazon Pinpoint for Two-way SMS
&lt;/h1&gt;

&lt;p&gt;Last spring, for whatever reason (maybe the feature actually wasn’t available yet, someone please correct me in the comments) I couldn’t find a way to cost-effectively handle in-bound SMS on AWS. So the initial implementation actually leveraged Twilio’s SMS w/ Webhooks and API for the SMS interfacing.&lt;/p&gt;

&lt;p&gt;As I was cleaning up the code this past week, I realized I can cut Twilio and use Amazon Pinpoint directly. Which drastically simplifies the setup and explanation.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="https://aws.amazon.com/pinpoint/" rel="noopener noreferrer"&gt;Amazon Pinpoint is…&lt;/a&gt;&lt;/strong&gt; a flexible and scalable outbound and inbound marketing communications service. You can connect with customers over channels like email, SMS, push, or voice.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Pinpoint is the one piece I wasn’t able to automate using IaC (Infrastructure as Code), so if you’re following along, you’ll have to provision an SMS enabled long code phone number manually. This is pretty straight forward in the the AWS Management Console.&lt;/p&gt;

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




&lt;h1&gt;
  
  
  Subscriber Lambda and Amazon Location Service
&lt;/h1&gt;

&lt;p&gt;Once an SMS message is received by the phone number in Amazon Pinpoint, it is relayed to some custom logic by way of an &lt;a href="https://aws.amazon.com/sns/" rel="noopener noreferrer"&gt;Amazon SNS&lt;/a&gt; (Simple Notification Service) topic. This is &lt;a href="https://docs.aws.amazon.com/pinpoint/latest/userguide/channels-sms-two-way.html#channels-sms-two-way-configure" rel="noopener noreferrer"&gt;how&lt;/a&gt; Two-way SMS is integrated with downstream services in Pinpoint.&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%2Fqzrzf3jap3vzwi37e4ls.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%2Fqzrzf3jap3vzwi37e4ls.png" alt="Excerpt from full architecture diagram"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Amazon Location Service&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Another external service that I ended up replacing as part of this cleanup was the Google Maps API. One of the things the app needs to do is convert a users Postal Code (&lt;strong&gt;Canadian&lt;/strong&gt;) to LAT/LONG Coordinates. In the initial implementation I used Google Maps for this. At re:Invent 2020, Amazon announced Amazon Location service — so time to leverage this as well.&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%2Finfl6t4efsn474yd42xh.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%2Finfl6t4efsn474yd42xh.png" alt="Excerpt from full architecture diagram"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The first SMS message the end-user sends to this app will be their Postal Code. As you can see from the above diagram we then hit an external API hosted by Chatime. Their API expects a user to provide LAT/LONG Coordinates, so first we do the translation with Amazon Location service and then POST to Chatime’s Location API. We get back a list of Chatime locations near the user’s coordinates, as well as information like the Uber Eats online ordering URL. Code excerpt below:&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%2Fxdjt7b8qdhrf3qjq0fd5.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%2Fxdjt7b8qdhrf3qjq0fd5.png" alt="TypeScript / AWS SDK for Javascript / Amazon Location Service “searchPlaceIndexForText”"&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%2Fpqhjq3v62hou79t1939p.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%2Fpqhjq3v62hou79t1939p.png" alt="TypeScript / Axios / Chatime Location API"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Registering the store for monitoring&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;There’s a second exchange to be had between the app and the end-user before we start monitoring. We return them a list of the 3 closest Chatime locations that have an Uber Eats online store. They then have to respond back with the Store ID for the store they want to monitor / order from.&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%2Fdh8f0mt7vv9ogtfxljdh.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%2Fdh8f0mt7vv9ogtfxljdh.png" alt="Excerpt from full architecture diagram"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once the selected Store ID is received by the app (it will get thrown at the Subscriber Lambda as well). We create an Amazon SNS topic for that Chatime store, with the Uber Eats URL as a tag (for “safe keeping”). Lastly, we subscribe the end-user to this SNS topic using “sms” as the protocol.&lt;/p&gt;




&lt;h1&gt;
  
  
  Probing Part 1: Amazon EventBridge and Populator Lambda
&lt;/h1&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%2Fmsh2aoxc4dxvxycagi2l.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%2Fmsh2aoxc4dxvxycagi2l.png" alt="Excerpt from full architecture diagram"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The next part of our application is the first half of the monitoring piece. We want to probe Uber Eats Chatime store pages at least once a minute. Therefore, we use our trusty “serverless cron” AKA &lt;a href="https://aws.amazon.com/eventbridge/" rel="noopener noreferrer"&gt;Amazon EventBridge&lt;/a&gt; (formerly CloudWatch Rules).&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%2F7go6mbb97eh0gevkd9yv.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%2F7go6mbb97eh0gevkd9yv.png" alt="TypeScript / CDK / EventBridge"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Populator Lambda&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The populator Lambda will scan the previously created SNS topics representing Chatime stores to be monitored, and will populate an &lt;a href="https://aws.amazon.com/sqs/" rel="noopener noreferrer"&gt;Amazon SQS&lt;/a&gt; (Simple Queuing Service) queue with messages containing the Uber Eats URL (from the SNS Topic tags), and the SNS Topic ARN itself.&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%2F4omenf8izxeihk052yzi.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%2F4omenf8izxeihk052yzi.png" alt="TypeScript / AWS SDK for Javascript / SQS “sendMessage”"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h1&gt;
  
  
  Probing Part 2: Amazon SQS and Worker Lambda
&lt;/h1&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%2F6imjwyloj7zjvpxlo5jp.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%2F6imjwyloj7zjvpxlo5jp.png" alt="Excerpt from full architecture diagram"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In the final steps, our Amazon SQS is configured to “fan-out” messages to a Worker Lambda with a batch size of 1 (meaning only 1 SQS message at a time will be sent to the Lambda — we don’t want to overload ;) the external Uber Eats store pages.&lt;/p&gt;

&lt;p&gt;Our Worker Lambda throws a GET for the store page, and checks to see if there are any occurrences of the word “Currently unavailable” — this is what happens when a store shuts off their online ordering capability.&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%2Faur78ryrlasldzo9h7dn.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%2Faur78ryrlasldzo9h7dn.png" alt="TypeScript / AWS SDK for Javascript / SNS “publish”"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If the occurrence &lt;strong&gt;is&lt;/strong&gt; found, the Lambda simply exits to try again ~60 seconds later. If the occurrence &lt;strong&gt;is not&lt;/strong&gt;* found then we publish to the SNS topic we created earlier — which will result in an SMS message being sent to anyone who wanted to be notified if this store’s online order came online.&lt;/p&gt;




&lt;h1&gt;
  
  
  Probing Part 3: AWS Step Functions and Unsubscriber Lambda
&lt;/h1&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%2Ffkco86lbywodzxplo7tl.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%2Ffkco86lbywodzxplo7tl.png" alt="Excerpt from full architecture diagram"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Lastly, we want to remove the end-user’s subscription as we’ve now done our part. One of the “gotchas” of SNS Topics is that if you publish to them and then immediately try to delete those topics, there’s a chance not all of the notifications will be sent-out.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Deleting a topic might prevent some messages previously sent to the topic from being delivered to subscribers. — AWS SDK for Javascript (“&lt;a href="https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/SNS.html#deleteTopic-property" rel="noopener noreferrer"&gt;deleteTopic&lt;/a&gt;”)&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;So we have a couple options:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Sleep the Worker Lambda for ~30 seconds&lt;/li&gt;
&lt;li&gt;&lt;a href="https://aws.amazon.com/about-aws/whats-new/2020/12/aws-lambda-changes-duration-billing-granularity-from-100ms-to-1ms/" rel="noopener noreferrer"&gt;AWS Step Functions&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Sleeping the Lambda is probably the first thought someone would have, but it’s not great for a number of reasons. One of those is you’re &lt;a href="https://aws.amazon.com/about-aws/whats-new/2020/12/aws-lambda-changes-duration-billing-granularity-from-100ms-to-1ms/" rel="noopener noreferrer"&gt;paying every ms&lt;/a&gt; the Lambda is running… so that’s just financially wasteful.&lt;/p&gt;

&lt;p&gt;With Step Functions we can define a “Wait” step, say 30 seconds, before executing additional custom logic (our unsubscriber Lambda).&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%2Fqr2tl6g9im8g7d1djgup.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%2Fqr2tl6g9im8g7d1djgup.png" alt="TypeScript / CDK / Step Functions / State Machine “Wait” step"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Unsubscriber Lambda&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Our final step of this app is to remove the SNS topic completely along with all of it’s subscriptions, that’s what this Lambda does, the code is very simple.&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%2Flb07zj8m38ul87iu75ab.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%2Flb07zj8m38ul87iu75ab.png" alt="TypeScript / AWS SDK for Javascript / SNS “deleteTopic”"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  How do I deploy this myself?
&lt;/h1&gt;

&lt;p&gt;I won’t go into too much detail, as it’s largely already documented in the &lt;a href="https://github.com/aaronbrighton/cdk-serverless-chatime-ordering-helper" rel="noopener noreferrer"&gt;cdk-serverless-chatime-ordering-helper&lt;/a&gt; repo’s README.md.&lt;/p&gt;

&lt;p&gt;If you have experience working with CDK (AWS Cloud Development Kit), then it should be fairly straightforward. If you don’t have experience with CDK, I highly recommend you familiar yourself with it! It’s a game changer for cloud development, especially serverless architectures.&lt;/p&gt;

&lt;p&gt;There’s a really awesome low time-investment CDK workshop here: &lt;a href="https://cdkworkshop.com/" rel="noopener noreferrer"&gt;https://cdkworkshop.com/&lt;/a&gt;&lt;/p&gt;




&lt;h1&gt;
  
  
  To conclude… what does it look like for the end-user?
&lt;/h1&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%2Ffd51kkv9i8fglvxuh1vq.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%2Ffd51kkv9i8fglvxuh1vq.png" alt="SMS conversation with app"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Thanks for reading!&lt;/p&gt;

&lt;p&gt;If you found the content valuable, please press that heart button and follow, comment what you liked or didn’t like and let me know what I should cover next!&lt;/p&gt;

</description>
      <category>cloud</category>
      <category>aws</category>
      <category>serverless</category>
      <category>eventdriven</category>
    </item>
    <item>
      <title>Is it possible to PASS an AWS Exam without studying?</title>
      <dc:creator>Aaron Brighton</dc:creator>
      <pubDate>Tue, 15 Jun 2021 19:19:58 +0000</pubDate>
      <link>https://dev.to/aws-builders/is-it-possible-to-pass-an-aws-exam-without-studying-l2n</link>
      <guid>https://dev.to/aws-builders/is-it-possible-to-pass-an-aws-exam-without-studying-l2n</guid>
      <description>&lt;p&gt;TL;DR: Yes. Do I recommend it? No. Do you need actual experience in the subject matter area? Of course. Do the exams still validate knowledge? Yes!&lt;/p&gt;




&lt;p&gt;Even with our best of intentions, life sometimes gets in the way and things don’t go according to plan. If you’re like me, there’s a million things you’d rather be doing than studying, and so I tell myself, tomorrow, I’ll study tomorrow… and so on, procrastination. Next thing you know, your exam starts in 5 minutes, and you’ve suddenly become the creature in the picture above.&lt;/p&gt;

&lt;p&gt;That creature was me yesterday at 9:25 AM, and this is my story of prepping for re-certification of my &lt;strong&gt;AWS Certified Solutions Architect — Professional&lt;/strong&gt; certification.&lt;/p&gt;

&lt;h2&gt;
  
  
  What‘s on the AWS-PSA exam?
&lt;/h2&gt;

&lt;p&gt;Like many professional certification exams, you’re required to agree to an NDA before starting the exam. Essentially dis-allowing you from sharing specifics about the exam questions with others, for obvious reasons. Therefore, I’ll be purposefully vague…&lt;/p&gt;

&lt;h4&gt;
  
  
  Abilities Validated by the Certification
&lt;/h4&gt;

&lt;p&gt;(copied from &lt;a href="https://aws.amazon.com/certification/certified-solutions-architect-professional/" rel="noopener noreferrer"&gt;AWS Certification Site&lt;/a&gt;)&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Design and deploy dynamically scalable, highly available, fault-tolerant, and reliable applications on AWS&lt;/li&gt;
&lt;li&gt;Select appropriate AWS services to design and deploy an application based on given requirements&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Migrate complex, multi-tier applications on AWS&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Design and deploy enterprise-wide scalable operations on AWS&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Implement cost-control strategies&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I’ve highlighted a couple of the points above, as the questions that stood out to me on the exam seemed to be heavily skewed towards these two areas.&lt;/p&gt;

&lt;p&gt;Everyone who takes the exam gets a set of questions randomly chosen from a large pool, and therefore, this was my experience, YMMV.&lt;/p&gt;

&lt;h3&gt;
  
  
  Migrate complex, multi-tier applications on AWS
&lt;/h3&gt;

&lt;p&gt;There was a significant number of questions focused on strategies for migrating on-premise workloads to AWS.&lt;/p&gt;

&lt;p&gt;Focus was on how to migrate workloads in the most cost-effective way and/or with the little to-no impact to end-users of the applications/workloads.&lt;/p&gt;

&lt;h3&gt;
  
  
  Design and deploy enterprise-wide scalable operations on AWS
&lt;/h3&gt;

&lt;p&gt;A good number of questions were about large (enterprise?) AWS environments, with multi-account strategies with 100s or 1000s of AWS accounts.&lt;/p&gt;

&lt;p&gt;Often these questions were fixated around services like AWS Organizations, AWS Control Tower, and surprisingly AWS Direct Connect.&lt;/p&gt;

&lt;h3&gt;
  
  
  Overall content and comparison to prior exams / versions
&lt;/h3&gt;

&lt;p&gt;Coming out of the exam I was surprised by how much of it was focused on large enterprise and organizational strategies and data migrations.&lt;/p&gt;

&lt;p&gt;In the past I’ve certified under &lt;strong&gt;AWS Certified Solutions Architect — Associate&lt;/strong&gt;, &lt;strong&gt;AWS Certified Security — Specialty&lt;/strong&gt;. I’ve also wrote this &lt;strong&gt;AWS-PSA&lt;/strong&gt; exam previously (older version), three years ago.&lt;/p&gt;

&lt;p&gt;Comparing this experience to those prior exams:&lt;/p&gt;

&lt;p&gt;While it’s been a while since I wrote the previous AWS-PSA and AWS-ASA exams, if my memory serves (which it probably doesn’t), it seems that AWS may be differentiating the AWS-ASA and AWS-PSA exams not necessarily based on more advanced expertise but rather on a different set of problems.&lt;/p&gt;

&lt;p&gt;This exam was almost assuredly more focused on big enterprise problems than the exams in the past. It’s possible AWS-ASA is more focused on smaller/medium sized company problems and AWS-PSA is for larger enterprises. If you disagree with this assessment I’d love to hear it in the comments!&lt;/p&gt;




&lt;h2&gt;
  
  
  My exam experience
&lt;/h2&gt;

&lt;p&gt;One of the nice things to have become more common due to the reality of the pandemic is being able to write certification exams from your home instead of a stressful exam center.&lt;/p&gt;

&lt;p&gt;This necessitates a proctor “investigation” of your room via webcam before they release the exam to you.&lt;/p&gt;

&lt;p&gt;Prior to the exam I made sure to remove any questionable items from my desk, and thought this would be good enough:&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%2Fw19uwt146ploj88tidl4.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%2Fw19uwt146ploj88tidl4.png" alt="Exam desk ready to go! Not."&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Turns out I was wrong, the first 30 minutes prior to the exam was spent dismantling my desk.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Plants had to go.&lt;/li&gt;
&lt;li&gt;Keys had to go.&lt;/li&gt;
&lt;li&gt;Cables and USB adapter for my keyboard &amp;amp; mouse had to go.&lt;/li&gt;
&lt;li&gt;Monitors had to be completely unplugged.&lt;/li&gt;
&lt;li&gt;Even my water had to go.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;After the exam, I double checked the list of rules for the environment where you write the exam, and sure enough… &lt;strong&gt;Beverages are listed as prohibited.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In a prior exam I had wrote from home, I remember being interrupted middle of the exam and being told not to cover my mouth with my hand (I think they use facial recognition tech to flag whether you’ve left view of the webcam during the exam).&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%2Ffyfu5spj7j99nx8hssox.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%2Ffyfu5spj7j99nx8hssox.png" alt="Thinking with your hand is prohibited!"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Time limit
&lt;/h3&gt;

&lt;p&gt;One major part of the experience that if I could warn others about is the time limit! I was given 75 questions, and 3 hours (180 minutes) to answer them, which sounds like a lot of time, but it can disappear quickly! I ended up only getting through 73 questions, and no time left to review the questions I flagged throughout.&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%2Fwbgquo1spiehf3jww31x.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwbgquo1spiehf3jww31x.jpg" alt="“running out of time on exam meme” — Google Images"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In the past I’ve heard others recommend using time strategically, and I probably should have followed the advice:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Read the answers first.&lt;/li&gt;
&lt;li&gt;Read the “ask” part of the question second.&lt;/li&gt;
&lt;li&gt;If you still need additional context, read the actual scenario third.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;On the AWS-PSA exam, majority of the questions are scenario based (similar to the practice exams), and you can easily waste time overthinking and trying to visualize/comprehend the scenario when the ask/options don’t require you to.&lt;/p&gt;




&lt;h2&gt;
  
  
  How did I pass without studying, and why does this still make the exams valuable?
&lt;/h2&gt;

&lt;p&gt;Certification exams validate one thing: &lt;strong&gt;knowledge&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;There are two ways to acquire knowledge, &lt;strong&gt;studying&lt;/strong&gt; and &lt;strong&gt;experience&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;I had a couple things going for me heading into this exam:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;I passed this exam previously (earlier version).&lt;/li&gt;
&lt;li&gt;I’ve been working closely with AWS for more than 6 years.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Value of the exams
&lt;/h3&gt;

&lt;p&gt;If you think about it fundamentally, the exam is there to validate your knowledge and mindset.&lt;/p&gt;

&lt;p&gt;If you’ve worked closely with AWS across a range of services successfully for years, it’s likely you’d have soaked up the knowledge and experience to put you in the right mindset to answer architectural questions correctly.&lt;/p&gt;

&lt;p&gt;I can prove this point thanks to my own past failings. In 2015, I rushed myself into my very first AWS exam (AWS-ASA), I had a month or two of limited hands-on experience, and I studied no-where near enough. Not surprisingly, I failed this exam. After more hands-on experience with AWS, I retried the next year, the result was much better!&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%2Ftpek9u9f7e7ny2e6r90h.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%2Ftpek9u9f7e7ny2e6r90h.png" alt="What a failure!"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Should you still study for an AWS exam, anyways?
&lt;/h2&gt;

&lt;p&gt;Regardless of your proficiency with AWS and their service offering, don’t do what I did. Instead, &lt;strong&gt;study&lt;/strong&gt;!&lt;/p&gt;

&lt;p&gt;It’s nearly impossible (unless someone can prove me wrong) to have experience with every AWS service (there are over 200 as of this writing) not to mention the broad set of features each offer. New services pop-up so frequently which means keeping up to date with the entire AWS ecosystem is darn near impossible.&lt;/p&gt;

&lt;p&gt;The end-goal of studying should not be to achieve a certification, but rather to expand the knowledge you have. In the tech industry this is especially critical, as we’re focused on optimization problems and some of the best optimization opportunities are thanks to services we aren’t yet aware of — until you study.&lt;/p&gt;

&lt;p&gt;So yes, study.&lt;/p&gt;

&lt;p&gt;If you’re planning to take an AWS exam, I’d encourage you to checkout a past article I wrote about resources I used to prep for the AWS Security — Specialty exam: &lt;a href="https://aaronbrighton.medium.com/2020-preparation-guide-for-aws-certified-security-specialty-c03075b81120" rel="noopener noreferrer"&gt;2020 Preparation Guide for AWS Certified Security — Specialty&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  In closing
&lt;/h2&gt;

&lt;p&gt;If you’re planning to maintain your AWS certifications and you’ve been working in the industry with AWS services on a daily basis, don’t stress too much.&lt;/p&gt;

&lt;p&gt;Definitely set aside time to study, but know this — AWS isn’t testing whether you know how to study effectively. They are testing to see if you know what it is you already do, and that you’re keeping yourself familiar with what’s new.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;I encourage you to post your feedback in the comments below! If you found this article insightful or helpful in anyway, feel free to reach out directly, I love hearing from people who find value in my content!&lt;/em&gt;&lt;/p&gt;

</description>
      <category>aws</category>
      <category>certifications</category>
      <category>exam</category>
      <category>cloud</category>
    </item>
  </channel>
</rss>
