<?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: Travis Mohr Blog</title>
    <description>The latest articles on DEV Community by Travis Mohr Blog (@travis_c61e9296f9ffc32970).</description>
    <link>https://dev.to/travis_c61e9296f9ffc32970</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4070099%2F87d5e209-2be1-49b3-8408-c676da6ca000.png</url>
      <title>DEV Community: Travis Mohr Blog</title>
      <link>https://dev.to/travis_c61e9296f9ffc32970</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/travis_c61e9296f9ffc32970"/>
    <language>en</language>
    <item>
      <title>My CRC Journal - an AWS CRC Cloud Journey</title>
      <dc:creator>Travis Mohr Blog</dc:creator>
      <pubDate>Sun, 23 Aug 2026 21:42:54 +0000</pubDate>
      <link>https://dev.to/travis_c61e9296f9ffc32970/my-crc-journal-an-aws-crc-cloud-journey-34n2</link>
      <guid>https://dev.to/travis_c61e9296f9ffc32970/my-crc-journal-an-aws-crc-cloud-journey-34n2</guid>
      <description>&lt;p&gt;CRC Journal (text)&lt;/p&gt;

&lt;p&gt;The “Why”:&lt;/p&gt;

&lt;p&gt;My reasoning for wanting to enter into the field of Cloud Computing stems from my fascination with Cloud Architecture and the multi-faceted benefits of the incorporation of Cloud-facilitated instantiation into the business and operation models of virtually any organization. Serverless architecture, for example, provides the simplicity and operational ease that any organization can use to its advantage. The “as needed” instantiation of these serverless structures gives the cost-effectiveness, precision, and extraordinarily limited attack surface that organizations need to stay safe from malicious actors in our current and forward-moving cyber environments. The high availability and fault tolerance that a full or hybrid cloud environment provides offers the stability and dependability that organizations worldwide can benefit from. Furthermore, the potentials offered by Cloud computing are virtually limitless, spanning far beyond the scope of the CRC, and my intrigue regarding these potentials has guided me to seeking my certifications (the Comptia Trifecta, the AWS-CCP, and the AWS-SAA), and now the practical experience offered by working through and completing the Cloud Resume Challenge (and beyond). &lt;/p&gt;

&lt;p&gt;The “What”: &lt;/p&gt;

&lt;p&gt;While completing the Cloud Resume Challenge, I have built many structures that intertwine in AWS Cloud environments as well as with external structures: I built an HTML/CSS resume that I hosted in an S3 bucket and cached on CloudFront, I utilized a functional URL, created and implemented a Lambda function to correlate between my URL and a DynamoDB visitor counter, and made use of GitHub to keep everything in line for both the front end and back end CI/CD functionality… and more. &lt;/p&gt;

&lt;p&gt;Below is a look into the process that I followed to complete the CRC: &lt;/p&gt;

&lt;p&gt;The Beginning of the Cloud Resume Challenge: &lt;/p&gt;

&lt;p&gt;The first part of the challenge (which, frankly, isn’t an important part of the challenge itself) was to get my resume into and HTML formatted file (which i called “index.html” as per website/S3 configuration default conventions) and to have it formatted with CSS (a separate file that I called, simply, “style.css”). The process for formatting and styling my resume in HTML was not complicated in its functionality, but for the sake of efficiency and focus on what matters about the challenge, I used an online tool for this formatting and it’s adjustments, fully knowing that I would have some edits later that would be very easy to integrate. &lt;/p&gt;

&lt;p&gt;With my two resume files in tow (and in the same folder on my workstation which is very important), I then logged into my AWS account and created an S3 bucket cogently named “travismohr.com” where I stored my HTML and CSS files. I made sure that my region was “us-east-1” for simplicity sake and for facilitation of later steps, and I didn’t bother with any versioning since this website would be static. I made sure to block any public access to the S3 bucket for a few reasons: if anyone could access my S3 bucket, they could do what they wanted with the files in it. And, because the public could then subsequently access the bucket “a la brute force” and rack up my AWS usage charges. This would be very unlikely to occur, but for me it was a practice in cloud security to block all public access while implementing a bucket policy that would grant access to my CloudFront via the indication of its “Distribution ID”. &lt;/p&gt;

&lt;p&gt;(A DULY NOTED POINT: In the above, I originally had my Bucket Policy and ACL’s set to allow public access to the bucket. I thought, “Of course it’s public, the whole world should be able to see my CRC resume if they want to.” But once I got to the CloudFront step below, I realized the err of my ways on this part. I had to change my CloudFront “Origen Access” from “Public” to “Origin access control settings” to cause my bucket to restrict access to only CloudFront. Then after creating the OAC, or “origin access control” with my S3 bucket “Object URL”, my resume appeared without any problems when I refreshed the URL.)&lt;/p&gt;

&lt;p&gt;With my S3 bucket set up, I needed to create a distribution in CloudFront to both cache the contents of my CRC files in my S3 bucket and allow access to that content via its caching mechanism. Once created, I simply pointed the origin to the S3 bucket via the dropdown menu and made sure the the bucket policy would be updated through doing so. With similar simplicity, I allowed this CloudFront distribution to make the transmission of this data to the end user secure by indicating that HTTP would be redirected to HTTPS. &lt;/p&gt;

&lt;p&gt;At this point, I registered my domain (travismohr.com) through porkbun.com. Next, I created a hosted zone in Route 53 for the URL and replaced Porkbun’s NS Records with the ones provided in Route 53, thereby assigning the DNS Delegation to Route 53. I then created an alias record in 53 to route my domain traffic to my CloudFront distribution. To secure the URL, I requested a public certificate in the AWS Certificate Manager and then selected the certificate from the dropdown menu in CloudFront. Doing all of this transferred authoritative control of my URL from Porkbun to AWS, mapped my aliases (both my root and subdomain) to Cloudfront, and validated my ownership of travismohr.com with the SSL certificate that I created in “AWS Certificate Manager”. I made another quick stop at Route 53 to create the A and AAAA records to correlate toward my URL, and I was done with Route 53 for the time being. &lt;/p&gt;

&lt;p&gt;And with this, I completed the public-facing network architecture of the CRC.&lt;/p&gt;

&lt;p&gt;Visitor Counter and Back-End Connectivity: &lt;/p&gt;

&lt;p&gt;(This part loops around and gets a bit complicated, but bear with me.)&lt;/p&gt;

&lt;p&gt;At this point, I went to DynamoDB in AWS to create a table where my resume visitor count would be stored (as opposed to an S3 bucket which is for static data, or at the most, versioned objects). In DynamoDB, I created a table appropriately called “MyCRCresumeViewCount”, with a string called “id” for simplicity's sake. Under this attribute, I create a linked value of “views” which would ultimately keep track of how many times my resume URL had been visited. With the counter set up as a storable resource in DynamoDB, I had to then create a function using Lambda to pull the numerical view count data from DynamoDB, modify it (“+1” to whatever is in the view counter in DynamoDB), send the new number to the resume URL, and store the new number in DynamoDB. &lt;/p&gt;

&lt;p&gt;I called the Lambda function “CRC_COUNT_UPDATER” and pasted in some Python code sampled from the boto3 library. I made sure that my region was modified to the “us-east-1” region. This Python code targeted my DynamoDB database and established a connection to the table “MyCRCResumeViewCount”. This numerical value would be added “atomically” (as expressed in the previous paragraph, meaning that even if two URL requests happened at the same time, the storing of view count would taken out of the Lambda function’s hands all together and simply aggregated appropriately to whatever was in the DynamoDB viewer, removing any chance of data overwriting or race conditions). DynamoDB would then be prompted to send back the updated view count value, pull the count number out of the dictionary that DynamoDB just returned, and then send that number back to the API Gateway (relying on the permission granted by the CORS Header to allow info to the API Gateway). With the count data, the Lambda function would then be directed to update the view count in the JSON object so that the view number could be updated in the URL counter (having been read by the frontend JavaScript). &lt;/p&gt;

&lt;p&gt;But before any of this could happen, I had to assign permissions for the Lambda function to gain access to the DynamoDB database in the first place. So, I went to IAM and selected the policy “AmazonDynamoDBFullAccess” which grants the Lambda function “list, read, write” access to the table, and added this policy to the IAM permissions.  &lt;/p&gt;

&lt;p&gt;From there, I went back to the Lambda function to test it with a simple “ “keyX: “valueX” “ function. I hit “test” and all went through beautifully. The view count worked. &lt;/p&gt;

&lt;p&gt;So, in order to access this data from the frontend, I would normally set up a REST API to connect the relevant parts… but in the case of the CRC URL resume that uses a simple “GET” function, a smoother and sleeker “Function URL” would do the trick nicely. I simply went to the Lambda “Configuration” section for my function and selected “Function URL” from the menu, chose “NONE” as the “auth type” since there was no need to give the function anything but fully public access, and then tested the Function URL by clicking on the link which then opened a new window showing the augmented view count. Success. From there, I added the Function URL into my “index.html” file and reloaded the file back up into my S3 bucket after deleting the old version. I made sure to invalidate my CloudFront cache at this point (inputting a simple “ /* ” would do the trick) to allow for the updated S3 object to be cached in its place. &lt;/p&gt;

&lt;p&gt;From there, I had to get all of my Python code to be uploaded from my VSCode to my GitHub repository to accommodate all IaC changes for the front end and the back end of my CRC project. (NOTE: At this stage in the project, I encountered a significant roadblock with the backend upload to GitHub. After several hours of troubleshooting, I finally discovered that the problem was that my front end and back end code needed to be separated into two different folders within my VSCode. Once I did this, the upload went smoothly and functioned beautifully.) Once I had all of my Python transferred to my two github repositories (one for the front end and one for the back end), I went back into AWS to IAM to create a new user called “github-actions-deployer” and granted this user “AmazonS3FullAccess” and “AWSLambda_FullAccess” permissions. After creating the access keys (both the access key and the secret access key), I copied and pasted these into my Github repositories for both the front end and the back end sections by going to: Settings, Secrets and Variables, Actions, and then editing each the two access keys and pasting in the codes. NOTE: I created this user specifically for my GitHub CI/CD repository AFTER having used the access keys for my “CloudAdmin” user, but then I realized that it would not be best practices to use the keys for the “CloudAdmin” user even though GitHub encrypts these codes by default and doesn’t even allow me to see them once they are saved. But in the interest of best practices and least privileges, I decided to create the “github-actions-deployer” with access only to S3 and Lambda for the CI/CD pipeline. &lt;/p&gt;

&lt;p&gt;Afterthoughts: &lt;/p&gt;

&lt;p&gt;Completing the CRC was a great experience where I learned so much about the functionality and the moving parts of AWS and the associated external features highlighted here. After studying for the AWS Solutions Architect exam and passing it on the first attempt, it was great to put some of what I learned to use. I am more energized to continue learning and implementing new skills and features with AWS Cloud than ever before. &lt;/p&gt;

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

&lt;p&gt;– Travis Mohr&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>aws</category>
      <category>cloud</category>
      <category>learning</category>
    </item>
    <item>
      <title>Building and Testing an AWS CloudWatch Monitoring Lab</title>
      <dc:creator>Travis Mohr Blog</dc:creator>
      <pubDate>Sun, 09 Aug 2026 19:49:07 +0000</pubDate>
      <link>https://dev.to/travis_c61e9296f9ffc32970/building-and-testing-an-aws-cloudwatch-monitoring-lab-29m</link>
      <guid>https://dev.to/travis_c61e9296f9ffc32970/building-and-testing-an-aws-cloudwatch-monitoring-lab-29m</guid>
      <description>&lt;p&gt;Here I'll be setting up an alarm for CPU utilization on an EC2 instance (and taking it down once it worked).&lt;/p&gt;

&lt;p&gt;First things first, I go to the EC2 tab in AWS and create an instance (name it, select the default Amazon Linux OS, and the default free t3.micro instance type).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fuser-attachments%2Fassets%2F1ef4989b-f628-48bf-a367-1e8e27526fac" class="article-body-image-wrapper"&gt;&lt;img width="760" height="475" alt="1 Naming the Alarm" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fuser-attachments%2Fassets%2F1ef4989b-f628-48bf-a367-1e8e27526fac"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fuser-attachments%2Fassets%2Fde7accd7-a837-471e-8832-ca7b34c7869e" class="article-body-image-wrapper"&gt;&lt;img width="760" height="475" alt="2 Selecting the OS" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fuser-attachments%2Fassets%2Fde7accd7-a837-471e-8832-ca7b34c7869e"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fuser-attachments%2Fassets%2F5fcdb222-6833-4aad-8816-bb7a04f77ec0" class="article-body-image-wrapper"&gt;&lt;img width="760" height="475" alt="3 Select t3 micro" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fuser-attachments%2Fassets%2F5fcdb222-6833-4aad-8816-bb7a04f77ec0"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I scroll down a bit and make sure the VPC is set to default, that the "auto-assign IP" is enabled, and that the security group for this EC2 has an obvious name. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fuser-attachments%2Fassets%2Fdb1913b0-fe3e-4dc3-b3ff-3c29300a439f" class="article-body-image-wrapper"&gt;&lt;img width="760" height="475" alt="4 set VPC to default, make sure auto-assign public IP is enabled, give the security group a name" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fuser-attachments%2Fassets%2Fdb1913b0-fe3e-4dc3-b3ff-3c29300a439f"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For this test, I won't be SSH'ing into the EC2 instance so I won't be needing a keypair. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fuser-attachments%2Fassets%2Fc905c6b9-72c6-4e36-9f09-4236c1c4b409" class="article-body-image-wrapper"&gt;&lt;img width="760" height="475" alt="5 no keypair needed " src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fuser-attachments%2Fassets%2Fc905c6b9-72c6-4e36-9f09-4236c1c4b409"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I launch the instance at this point, wait to see that it launched successfully, then head to my list of EC2 instances.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fuser-attachments%2Fassets%2F964eeb59-a062-43ef-b69e-c230a0803820" class="article-body-image-wrapper"&gt;&lt;img width="760" height="475" alt="6 success and  view all instances  " src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fuser-attachments%2Fassets%2F964eeb59-a062-43ef-b69e-c230a0803820"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After a bit I can see that the EC2 instance is running and that it has passed all three status checks.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fuser-attachments%2Fassets%2F2394f832-dbaa-4cd0-8be6-8c7cb8803fa6" class="article-body-image-wrapper"&gt;&lt;img width="760" height="475" alt="7 the instance i running and status checked" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fuser-attachments%2Fassets%2F2394f832-dbaa-4cd0-8be6-8c7cb8803fa6"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now that the EC2 instance is set up and running, I go to CloudWatch and click on "create alarm" and then click on "metric" to find the "EC2" metrics list and the select the "per-instance metrics" category to see all of the metrics for my specific EC2 instances.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fuser-attachments%2Fassets%2Fa4928d28-158f-42e4-80cd-a9cb86889b66" class="article-body-image-wrapper"&gt;&lt;img width="760" height="475" alt="8 create alarm" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fuser-attachments%2Fassets%2Fa4928d28-158f-42e4-80cd-a9cb86889b66"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fuser-attachments%2Fassets%2Ff94cf498-c6c7-4656-89bc-26358be26ca7" class="article-body-image-wrapper"&gt;&lt;img width="760" height="475" alt="9 select metric" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fuser-attachments%2Fassets%2Ff94cf498-c6c7-4656-89bc-26358be26ca7"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fuser-attachments%2Fassets%2Fe5e03ed9-3407-47ee-875a-47fe3523504c" class="article-body-image-wrapper"&gt;&lt;img width="760" height="475" alt="10 go to EC2 metrics" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fuser-attachments%2Fassets%2Fe5e03ed9-3407-47ee-875a-47fe3523504c"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fuser-attachments%2Fassets%2Fd44861fd-cc6d-471b-b23c-05c0f98601b5" class="article-body-image-wrapper"&gt;&lt;img width="760" height="475" alt="11 select per-instance metrics" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fuser-attachments%2Fassets%2Fd44861fd-cc6d-471b-b23c-05c0f98601b5"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I go back to the EC2 instance page to take note of the test EC2 instance that I just created and take note of the instance ID (last for characters: "0fa4")...&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fuser-attachments%2Fassets%2F98dfa6df-d8ce-4c5a-aa21-5bf244d51998" class="article-body-image-wrapper"&gt;&lt;img width="760" height="475" alt="11 take note of the EC2 instance ID" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fuser-attachments%2Fassets%2F98dfa6df-d8ce-4c5a-aa21-5bf244d51998"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;... and then find the "CPU Utilization" metric that coincides with this particular EC2 test instance in my CloudWatch tab back under "per-instance metrics" (for the instance ending in "0fa4", of course). I check the box next to the metric and then hit "select metric". &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fuser-attachments%2Fassets%2F72b142f6-dc8b-48ff-b973-e43b5500cfbf" class="article-body-image-wrapper"&gt;&lt;img width="760" height="475" alt="12 select the metric for this EC2 and hit  select metric" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fuser-attachments%2Fassets%2F72b142f6-dc8b-48ff-b973-e43b5500cfbf"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;From there, I scroll down to set the metric that I want to test: Static (to monitor a specific, unchanging metric), "greater/equal" to "20" % CPU utilization. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fuser-attachments%2Fassets%2Fbe25f7a0-dd3c-4698-95f0-1e591d302faa" class="article-body-image-wrapper"&gt;&lt;img width="760" height="475" alt="13 set metric" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fuser-attachments%2Fassets%2Fbe25f7a0-dd3c-4698-95f0-1e591d302faa"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After clicking on next, I go ahead and "remove" the SNS topic option (which would be useful in a production situation, but not needed for testing a CloudWatch alarm). &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fuser-attachments%2Fassets%2F3f6b80bc-8f7e-41d3-a7a5-13d05d526e93" class="article-body-image-wrapper"&gt;&lt;img width="760" height="475" alt="14 remove SNS option " src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fuser-attachments%2Fassets%2F3f6b80bc-8f7e-41d3-a7a5-13d05d526e93"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Click on next again and then name the alarm something that makes sense. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fuser-attachments%2Fassets%2Fd3be1b1c-eae2-43f3-9b1f-efdee02b1daf" class="article-body-image-wrapper"&gt;&lt;img width="760" height="475" alt="14 name the metric" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fuser-attachments%2Fassets%2Fd3be1b1c-eae2-43f3-9b1f-efdee02b1daf"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After clicking next again, I am presented with a summary of the metric that I just created, and then click "create alarm" after seeing that everything checks out. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fuser-attachments%2Fassets%2Fcaf82ff7-e974-4805-8c3e-218250308c1b" class="article-body-image-wrapper"&gt;&lt;img width="760" height="475" alt="15 create alarm" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fuser-attachments%2Fassets%2Fcaf82ff7-e974-4805-8c3e-218250308c1b"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And I can then see that the alarm has been created.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fuser-attachments%2Fassets%2F9b172bea-af8b-40e0-91ee-52881488c1e4" class="article-body-image-wrapper"&gt;&lt;img width="760" height="475" alt="16 the alarm has been created!" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fuser-attachments%2Fassets%2F9b172bea-af8b-40e0-91ee-52881488c1e4"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now that the alarm for this test EC2 instance is in place, I want to test it by causing the EC2 instance to use some compute. In order to do that, I go to the EC2 instance, right click on it, and select "connect", leave everything as default, and click on "connect" again. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fuser-attachments%2Fassets%2F5151bac6-bcbb-432a-81b1-ea8e2f101718" class="article-body-image-wrapper"&gt;&lt;img width="760" height="475" alt="17  connect to the EC2 instance" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fuser-attachments%2Fassets%2F5151bac6-bcbb-432a-81b1-ea8e2f101718"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fuser-attachments%2Fassets%2F067b0624-6720-4b23-a2e0-6fc9f8bcb8b9" class="article-body-image-wrapper"&gt;&lt;img width="760" height="475" alt="18 click on  connect  again" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fuser-attachments%2Fassets%2F067b0624-6720-4b23-a2e0-6fc9f8bcb8b9"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This will take us to a new tab where I the the Amazon Linux 2023 CLI. Since I want to test my 20% CPU utilization alarm for my EC2 instance, I download an app called "stress" with the prompt "sudo yum install stress -y" (the "-y" confirming "yes, we want to install it" so we aren't prompted to confirm): &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fuser-attachments%2Fassets%2F3c7277ee-4aa6-4dfa-9ad4-b5359c194ad5" class="article-body-image-wrapper"&gt;&lt;img width="760" height="475" alt="19 download  stress" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fuser-attachments%2Fassets%2F3c7277ee-4aa6-4dfa-9ad4-b5359c194ad5"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now that I have "stress" downloaded, I type in "stress --help" to see what my options are for bombarding my EC2 instance with compute. After taking a look at my options, I run the command "stress -c 1 -t 3600" to run the compute through one CPU ("-c 1") for a total of one hour or 3600 seconds ("-t 3600"). &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fuser-attachments%2Fassets%2F5c691759-faea-4cbb-b547-588dfe7be1ad" class="article-body-image-wrapper"&gt;&lt;img width="760" height="475" alt="20 get a list of commands then set the stress function " src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fuser-attachments%2Fassets%2F5c691759-faea-4cbb-b547-588dfe7be1ad"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now that I have set the stress test to hit the EC2 instance with compute load, I go back to the alarm in CloudWatch and select it to watch the CPU utilization for the EC2 instance start to tick up...&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fuser-attachments%2Fassets%2F56efdde8-e553-419c-9a2c-1616c4f26b0e" class="article-body-image-wrapper"&gt;&lt;img width="760" height="475" alt="21 CPU utilization going up" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fuser-attachments%2Fassets%2F56efdde8-e553-419c-9a2c-1616c4f26b0e"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;... and after a few moments I hit "refresh" to see that the compute used by this EC2 instance (thanks to it being bombarded by the stress app) has exceeded 20% and that the alarm that I created has in fact been set off: &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fuser-attachments%2Fassets%2F1c2f1424-c5c2-4388-a93d-e0f1a53ee8fb" class="article-body-image-wrapper"&gt;&lt;img width="760" height="475" alt="22 the alarm has been set off" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fuser-attachments%2Fassets%2F1c2f1424-c5c2-4388-a93d-e0f1a53ee8fb"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Since my test was successful, I go ahead and turn off the stress test by typing "control+C" in the CLI. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fuser-attachments%2Fassets%2F7c00140f-f3ae-4150-a379-d3fb03e53895" class="article-body-image-wrapper"&gt;&lt;img width="760" height="475" alt="23 turn off the stress test with  control+C" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fuser-attachments%2Fassets%2F7c00140f-f3ae-4150-a379-d3fb03e53895"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And at that point, I go back to my test alarm and see that the compute has dropped below my 20% threshold and that the alarm has shut off:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fuser-attachments%2Fassets%2F0d237ebc-979f-4b35-ab87-35d3e43edfcf" class="article-body-image-wrapper"&gt;&lt;img width="760" height="475" alt="24 CPU usage goes down and alarm shuts off" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fuser-attachments%2Fassets%2F0d237ebc-979f-4b35-ab87-35d3e43edfcf"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This confirms that the CloudWatch alarm did in fact function as intended. So at this point, I want to be sure to delete: the CloudWatch Alarm, the EC2 instance, and the EC2 Instance Security Group: &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fuser-attachments%2Fassets%2F47446e7d-a5e3-4f44-9e44-eae2eb350c25" class="article-body-image-wrapper"&gt;&lt;img width="760" height="475" alt="25 delete the alarm" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fuser-attachments%2Fassets%2F47446e7d-a5e3-4f44-9e44-eae2eb350c25"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fuser-attachments%2Fassets%2Fc2a79af0-9d9c-41e6-862d-07105ba83523" class="article-body-image-wrapper"&gt;&lt;img width="760" height="475" alt="26 delete the EC2 instance" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fuser-attachments%2Fassets%2Fc2a79af0-9d9c-41e6-862d-07105ba83523"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fuser-attachments%2Fassets%2F7aba4a5e-b26c-42f1-b899-e77597000a47" class="article-body-image-wrapper"&gt;&lt;img width="760" height="475" alt="27 delete the EC2 security group" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fuser-attachments%2Fassets%2F7aba4a5e-b26c-42f1-b899-e77597000a47"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After all has been deleted from the successful test, my AWS account is back to the way it was (and not charging me for services that I don't need to use). &lt;/p&gt;

</description>
      <category>aws</category>
      <category>cloudcomputing</category>
      <category>devops</category>
      <category>cloudwatch</category>
    </item>
  </channel>
</rss>
