<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Cloud With David]]></title><description><![CDATA[Notes, tutorials, and reflections from my cloud journey—labs, builds, and clear write-ups as I build toward Cloud / AI architecture.]]></description><link>https://cloudwithdavid.hashnode.dev</link><image><url>https://cdn.hashnode.com/uploads/logos/69289cc604ffaa314693ccaf/e85d4d2a-efe0-4c12-abae-b8a4c2006eed.png</url><title>Cloud With David</title><link>https://cloudwithdavid.hashnode.dev</link></image><generator>RSS for Node</generator><lastBuildDate>Sat, 17 Oct 2026 12:46:09 GMT</lastBuildDate><atom:link href="https://cloudwithdavid.hashnode.dev/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[Looking Beneath Managed Services]]></title><description><![CDATA[Building an AI assistant on AWS was one of the most engaging exercises I’ve done so far, right alongside building scalable infrastructure. I had worked through similar material before, but this time, ]]></description><link>https://cloudwithdavid.hashnode.dev/looking-beneath-managed-services</link><guid isPermaLink="true">https://cloudwithdavid.hashnode.dev/looking-beneath-managed-services</guid><category><![CDATA[AWS]]></category><category><![CDATA[Amazon Bedrock]]></category><category><![CDATA[RAG ]]></category><category><![CDATA[mcp]]></category><category><![CDATA[ai agents]]></category><category><![CDATA[Cloud Engineering ]]></category><dc:creator><![CDATA[David Rodriguez]]></dc:creator><pubDate>Tue, 13 Oct 2026 18:15:43 GMT</pubDate><enclosure url="https://cdn.hashnode.com/uploads/covers/69289cc604ffaa314693ccaf/ea8d1e0b-3e01-4e9b-9f60-d4798ffa16d5.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Building an AI assistant on AWS was one of the most engaging exercises I’ve done so far, right alongside building scalable infrastructure. I had worked through similar material before, but this time, for much of the systems setup and configuration I kept stopping to understand what was happening underneath.</p>
<p>The lab centered on an HR assistant designed to reduce repetitive HR work, retrieving company policy information and handling employee requests, including leave and benefits submissions. That meant connecting an agent to both a knowledge base and tools that could invoke Lambda functions and persist requests in DynamoDB.</p>
<p>The full lab write-up lives here: <a href="https://github.com/cloudwithdavid/aws-restart/tree/main/agentic-ai">aws-restart/agentic-ai</a></p>
<p>AI already pulls at my curiosity. Having more AWS knowledge to bring into this exercise gave my curiosity somewhere to go.</p>
<h2>Revisiting “increased significantly”</h2>
<p>In an earlier post about the AWS Generative AI Practitioner work, I wrote that my understanding of “RAG and MCP, along with how the surrounding components let an AI system retrieve information and actually take action, had increased significantly.”</p>
<p>Coming back to this material, I kept thinking: I can’t believe I used the words “increased significantly.” I knew that of course there was so so much more to learn, but there was so much underneath those concepts that I hadn’t even yet known how to question.</p>
<p>My broader understanding of AWS and IT had grown in the meantime. The relationships between services and their different levels of management were becoming clearer, so familiar configuration steps started raising new questions. I could look at a setting and begin recognizing some of the work it represented—and that there is so, so much I am incapable of recognizing.</p>
<h2>Seeing the engineering behind the console</h2>
<p>That led to a recurring thought while working in the console:</p>
<p><strong>“There’s no way it’s actually this simple.”</strong></p>
<p>Pointing one service at another can take very little effort. But what enables that connection? How much of that would I have to implement myself without the managed service?</p>
<p>I could start seeing how configuration fields represented substantial engineering: hosting, retrieval, tool integration, and access control. A few fields in the console can configure access to capabilities that would otherwise require substantial implementation and operational work — with AWS having already abstracted much of the machinery.</p>
<p>I now better understand the relationship between the simplicity of the interface and how much work sits underneath it. I pondered how understanding what had been provided would make the configuration itself more meaningful: why it existed, what it enabled, and which decisions remained mine.</p>
<p>Each answer gave me enough context to ask something I couldn’t have asked a few minutes earlier. I found myself spending as much attention on the questions emerging from a configuration as on completing the configuration itself.</p>
<h2>Following the system beneath the settings</h2>
<h3>RAG: from question to answer</h3>
<p>RAG became a particularly satisfying example. I worked through retrieval-augmented generation until I could follow a basic semantic retrieval path in my head:</p>
<p><strong>Query text (question) → embedding model → query vector → vector store / search → relevant text chunks → question + retrieved context → language model → answer.</strong></p>
<p>The embedding model converts the question's meaning into a numerical representation, called a vector, that can then be mathematically compared to vectors of document chunks. The search retrieves relevant text, and that text becomes context for the language model’s response. The embedding model and the language model have different jobs in that process.</p>
<p>That immediately opened another set of questions. How did the documents become searchable in the first place? Why split them into chunks? Where are the embeddings stored? What happens when the source documents change?</p>
<p>Following those questions took me into chunking, vector storage, and synchronization. When I wondered how synchronization worked—how the knowledge base could stay current as source documents changed—I could already picture an event-driven process for detecting those changes and updating its indexed content: detect a source-document change, trigger ingestion, and update the vector index. My earlier AWS learning was giving me enough context to reason through a system I hadn’t built myself.</p>
<p>I could now connect what happened when documents entered the knowledge base with what happened when someone asked the assistant a question. Amazon Bedrock Knowledge Bases was managing much of that workflow, which helped explain why the console steps could be so short.</p>
<h3>MCP: connecting the agent to actions</h3>
<p>MCP gives the agent a common interface to discover and call tools. AgentCore Gateway provided that interface to the backend: the agent could call a Lambda function to save an employee request in DynamoDB. Testing showed me the agent retrieving policy information, invoking action tools, and declining requests outside its HR scope. Seeing a submitted request appear in DynamoDB let me verify the action beyond the assistant’s reply.</p>
<p>With AWS managing retrieval, tool access, and agent hosting, I could focus on how the system fit together and the choices I still owned: its information, tools, permissions, instructions, and tests.</p>
<h2>Understanding earlier work differently</h2>
<p>That understanding has also started reaching backward into earlier work. I can think about serverless labs I don’t remember particularly well and still understand their architecture better now. Events, function execution, permissions, and data moving between services make more sense because I have more context for their relationships. Even when the individual steps have faded, newer knowledge helps me reconstruct what was happening.</p>
<p>This is part of why returning to the AI exercise felt so rewarding. The AWS knowledge I had gained elsewhere enabled deeper questions here, and working through those questions gave me another way to interpret systems I had already built.</p>
<h2>Answers make new questions possible</h2>
<p>There’s a progression here that I can now recognize in my own learning. An answer changes what I’m able to notice. What I notice raises another question, sometimes one I couldn’t have formulated before because I was missing the knowledge needed to even see it.</p>
<p>That’s what gives the earlier “increased significantly” wording its meaning to me now. My understanding had increased, and continuing to build on it eventually let me see how much more there was underneath RAG, MCP, and the surrounding system. I expect that to keep happening as I learn more.</p>
<p>I’m eager to return to this kind of build again with even more knowledge and see what discoveries are revealed, enabled by the questions I’ll be capable of asking.</p>
<p>I understand how little I know and how much more there is to know. I plan to close the gap day by day.</p>
]]></content:encoded></item><item><title><![CDATA[Revisiting SSH Into EC2 From WSL]]></title><description><![CDATA[I revisited SSH into an EC2 instance from WSL. I had written about my first time doing this before, when the process was mostly about getting through the steps: launching an EC2 instance, downloading ]]></description><link>https://cloudwithdavid.hashnode.dev/revisiting-ssh-into-ec2-from-wsl</link><guid isPermaLink="true">https://cloudwithdavid.hashnode.dev/revisiting-ssh-into-ec2-from-wsl</guid><category><![CDATA[AWS]]></category><category><![CDATA[ec2]]></category><category><![CDATA[ssh]]></category><category><![CDATA[WSL]]></category><category><![CDATA[Linux]]></category><category><![CDATA[networking]]></category><dc:creator><![CDATA[David Rodriguez]]></dc:creator><pubDate>Wed, 13 May 2026 11:30:00 GMT</pubDate><enclosure url="https://cdn.hashnode.com/uploads/covers/69289cc604ffaa314693ccaf/424310a2-e0ce-4516-b119-2058cd9346a0.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>I revisited SSH into an EC2 instance from WSL. I had <a href="https://medium.com/@cloudwithdavid/my-first-ssh-into-ec2-from-wsl-a2a4b44b8375">written about my first time doing this before</a>, when the process was mostly about getting through the steps: launching an EC2 instance, downloading a .pem file, moving it into WSL, fixing permissions, and finally connecting.</p>
<p>At the time, it worked, but the process still felt fragile. I was following the steps, but I did not have understanding of the system underneath them. Launching a basic EC2 instance and connecting to it with SSH is a beginner cloud task. The workflow itself is not advanced, but the way I experienced the task changed a lot, so this time it felt way different.</p>
<p>The first time, I was trying to keep track of several unfamiliar things at once: the EC2 console, key pairs, .pem files, WSL paths, chmod, public DNS names and IPv4 addresses... This time, those pieces had more context behind them, so the SSH took closer to two minutes than twenty.</p>
<p>That was the part that made the progress noticeable. The task had not become more complex. I had simply built more of the background knowledge needed to understand what was happening.</p>
<h2>Linux CLI Navigation and Permissions</h2>
<p>One of the biggest differences this time was that the local side of the SSH flow felt less confusing.</p>
<p>The command I used followed this general shape:</p>
<pre><code class="language-shell">ssh -i ~/.ssh/ssh-practice-key.pem ec2-user@public-address
</code></pre>
<p>Earlier in my learning, a command like this felt more like something to copy carefully than something to understand. This time, I could read the parts more clearly.</p>
<p>When I first did this, even getting the .pem file into the right place felt like part of the mystery. The file downloaded to Windows, but I was connecting from WSL, so I had to understand where that file was from the Linux side and how to move it into the right location.</p>
<p>This time, that part was much easier. I understood that ~ refers to my Linux user’s home directory, and that ~/.ssh is the conventional place for user-specific SSH files. Moving the key there was not just “following a tutorial.” It made sense because my WSL environment was the client initiating the SSH connection, so the private key needed to live somewhere my Linux SSH client could use it cleanly.</p>
<p>That also made the permission step clearer.</p>
<pre><code class="language-shell">chmod 400 ~/.ssh/ssh-practice-key.pem
</code></pre>
<p>The first time, a command like that felt like a magic fix. This time, I understood what it was doing. <strong>The .pem file is a private key, and OpenSSH will refuse to use a private key if its permissions are too open.</strong> The private key is proof of access, so it should not be readable by other users.</p>
<p>This go-round, I understood where and how to locate the downloaded file inside of Windows, and use it in my Linux environment, this orientation made the SSH setup feel less fragile because I was not just copying commands.</p>
<p>Not just knowing individual commands like cp, ls, or chmod, but understanding how to move through the filesystem, where files live, and how paths point from one place to another.</p>
<h2>Networking Fundamentals Paid Off</h2>
<p>I remember looking at the EC2 instance details and wondering why AWS showed IPv4 and IPv6 addresses, why some addresses were public and others were private, and why there was also a public DNS name.</p>
<p>This time, that part was clearer.</p>
<p><strong>A public IP address or public DNS name is what my local machine can use to reach the instance from outside AWS.</strong> The private IP address is how the instance is identified inside its AWS VPC. DNS is a naming system that lets me use a name that resolves to an IP address instead of typing the address directly.</p>
<p>This also explains something that can look strange at first: I connected to the EC2 instance using a public address, but once I was inside the instance, the terminal prompt showed a hostname based on the private IP.</p>
<p>From outside AWS, I need a public route to reach the instance. Inside the AWS network, the instance has its own private identity.</p>
<p>Understanding that distinction made the address portion of the SSH command feel much less mysterious.</p>
<h2>Seeing Both Sides of the SSH Relationship</h2>
<p>The most clarifying part that helped make the key-pair model more concrete came when I looked around both sides of the connection.</p>
<p>On my WSL machine, my ~/.ssh directory contained files like the private key and known_hosts. On the EC2 instance, the ec2-user account had its own .ssh directory, and inside it was an authorized_keys file, which stored the matching public key.</p>
<p>When I connect, my SSH client uses the private key to prove that it matches one of the public keys authorized for that remote user.</p>
<p>The known_hosts file has a different role. It lives on the client side and records SSH servers that my machine has connected to before. That is why SSH shows a prompt the first time I connect to a new host. It is not asking whether my private key is valid. It is asking whether I want to trust and remember that server’s host identity.</p>
<p>That distinction helped the SSH trust model click:</p>
<pre><code class="language-shell">Client side:
private key  -&gt; proves I am allowed to log in
known_hosts  -&gt; remembers servers I have trusted before

Server side:
authorized_keys -&gt; lists public keys allowed to log in as that user
</code></pre>
<p>This helped me understand SSH beyond being an important tool for secure connection across systems, to a system with understandable parts.</p>
<h3>Reusing the Same Key on a New Instance</h3>
<p>The next morning, I launched another EC2 instance and connected using the same private key from the previous practice run. That helped confirm another part of the model.</p>
<p><strong>The private key is not limited to one specific instance forever.</strong> It can work with any instance launched with the matching AWS key pair, because AWS places the matching public key on that instance during setup.</p>
<p>In that second connection, the instance was new and the public address was different, so SSH created a new known_hosts entry. But the authentication still worked because the key pair relationship was the same.</p>
<p>The instance changed. The address changed. The host identity was new. The key relationship still worked.</p>
<p>That distinction helped separate two ideas that are easy to blur together: the key used to authenticate me, and the host identity my machine remembers after connecting.</p>
<h2>What Actually Changed</h2>
<p>My ability to understand the pieces around the process.</p>
<p>The main thing that changed was not the SSH process itself. The process was still straightforward: launch an instance, make sure SSH is allowed, use the correct user, point SSH to the private key, and connect to a reachable address. But this time, supporting concepts were less foreign.</p>
<p>I understand the CLI better now, not just individual commands, but how to move through and understand where I am, and what is in the filesystem. I understand file permissions better, so chmod 400 no longer feels like a magic fix. I understand DNS, IP addresses, and the difference between public and private networking better. I also have a clearer mental model of private keys, public keys, authorized_keys, and known_hosts.</p>
<p>That is why this attempt felt so much easier.</p>
<p>The first time, SSH felt like it had too many moving parts: the EC2 instance, the .pem file, WSL paths, chmod, public addresses, private addresses, DNS, usernames, and host prompts. Because each piece was unfamiliar, the whole process felt larger than it actually was.</p>
<p>This time, those pieces grouped together more clearly. There was the machine I wanted to reach, the address my computer could use to reach it, the user I wanted to log in as, the private key I used to authenticate, and the local and remote SSH files that made the connection work.</p>
<p>Once I understood those parts, the task felt like a system I could reason through instead of a black box.</p>
<hr />
<p><em>Originally published on LinkedIn on May 13, 2026.</em></p>
]]></content:encoded></item><item><title><![CDATA[Passing the AWS Certified Cloud Practitioner Exam]]></title><description><![CDATA[These are the only resources I’d use:

freeCodeCamp AWS Certified Cloud Practitioner course

Tutorials Dojo (Jon Bonso) AWS CCP Practice Exams

Official AWS CCP Practice Question Set

An LLM (Like Cha]]></description><link>https://cloudwithdavid.hashnode.dev/passing-the-aws-certified-cloud-practitioner-exam</link><guid isPermaLink="true">https://cloudwithdavid.hashnode.dev/passing-the-aws-certified-cloud-practitioner-exam</guid><category><![CDATA[AWS]]></category><category><![CDATA[Certification]]></category><category><![CDATA[#Cloud Practitioner]]></category><category><![CDATA[AWSCertified  ]]></category><dc:creator><![CDATA[David Rodriguez]]></dc:creator><pubDate>Sun, 10 May 2026 11:30:00 GMT</pubDate><enclosure url="https://cdn.hashnode.com/uploads/covers/69289cc604ffaa314693ccaf/1cd220b1-2bd3-4da6-8fd1-0e34e61e46d8.webp" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h3>These are the only resources I’d use:</h3>
<ul>
<li><p><a href="https://www.youtube.com/watch?v=NhDYbskXRgc&amp;t=7888s"><strong>freeCodeCamp AWS Certified Cloud Practitioner course</strong></a></p>
</li>
<li><p><a href="https://portal.tutorialsdojo.com/product/aws-certified-cloud-practitioner-practice-exams/"><strong>Tutorials Dojo (Jon Bonso) AWS CCP Practice Exams</strong></a></p>
</li>
<li><p><a href="https://skillbuilder.aws/learn/E4W52ZKK6P/official-practice-question-set-aws-certified-cloud-practitioner-clfc02--english/RJSZKD3MG3"><strong>Official AWS CCP Practice Question Set</strong></a></p>
</li>
<li><p>An LLM (Like <a href="https://chatgpt.com/"><strong>ChatGPT</strong></a>, or <a href="https://claude.ai/new"><strong>Claude</strong></a>)</p>
</li>
</ul>
<h3>The System</h3>
<p>1. Use the freeCodeCamp course as an outline, and use an LLM in parallel as you go through each topic.</p>
<p><strong>Course loop:</strong> learn topic -&gt; test/clarify -&gt; simplify -&gt; next topic</p>
<p>2. Take the Official AWS CCP Practice Question Set for the very first benchmark.</p>
<p>3. After each practice exam, review weak areas through Jon Bonso’s topic-based exams.</p>
<p><strong>Testing loop:</strong> practice test -&gt; review -&gt; weak area drill -&gt; retest -&gt; repeat</p>
<p>Keep repeating until you can score 80%+ in each domain.</p>
<p>4. Retake the Official AWS CCP Practice Question Set as your final benchmark.</p>
<p><strong>My rule of thumb: 800/1000+ is a strong readiness signal.</strong></p>
<ul>
<li><p>If you score below 800/1000, go back to step 3 and focus the weak areas.</p>
</li>
<li><p>If you score 800/1000 or higher, you are probably ready. At that point, do not overthink it.</p>
</li>
</ul>
<hr />
<h2>My Approach</h2>
<p>When I passed the AWS Certified Cloud Practitioner exam, the biggest difference was not just the resources I used. It was the system I built around them.</p>
<p>The AWS CCP is an entry-level exam, but that can be misleading. There are still a lot of services, pricing concepts, security ideas, cloud terms, and shared responsibility details to sort through. If you study passively, it is easy to feel like you recognize the material without actually being able to explain it or apply it under exam conditions.</p>
<p>That was the main problem I wanted to avoid. I did not want to just watch a course, take notes, and hope enough of it stuck. I wanted a study process that kept the course active while I was learning, then exposed weak areas quickly once I moved into practice testing.</p>
<p>This is the breakdown of what I used, how I moved through the course, how I used ChatGPT, how I tested, and what actually got me across the line.</p>
<h2>Resources I Used</h2>
<p>My study stack was straightforward:</p>
<ul>
<li><p>freeCodeCamp AWS Certified Cloud Practitioner course</p>
</li>
<li><p>Tutorials Dojo (Jon Bonso) AWS CCP Practice Exams</p>
</li>
<li><p>Official AWS CCP Practice Question Set</p>
</li>
<li><p>ChatGPT (for structured quizzing, review, and reasoning support)</p>
</li>
</ul>
<p>I used the freeCodeCamp course as my main outline. It gave me the broad map of the exam: cloud concepts, AWS global infrastructure, compute, storage, databases, networking, security, billing, pricing, support plans, and the shared responsibility model. That structure helped me move through the material without constantly wondering what to study next.</p>
<p>The Tutorials Dojo / Jon Bonso practice exams became the real testing and feedback layer. That was where I started seeing the difference between topics I actually understood and topics I only recognized.</p>
<p>The official AWS CCP Practice Question Set was also valuable, but I used it later than I should have. In hindsight, I would have used it both at the beginning and near the end of the process because it felt very close to the real exam.</p>
<h2>The Study System</h2>
<p>The most important part of my process was that I did not use the course, practice exams, and ChatGPT as separate resources. I used them as parts of one study system.</p>
<p>That system had two phases.</p>
<p>The first phase was for moving through the course:</p>
<ol>
<li><p>Learn a topic from the course.</p>
</li>
<li><p>Use ChatGPT to test and clarify the topic.</p>
</li>
<li><p>Convert complex topics into simple mental models.</p>
</li>
<li><p>Move to the next topic.</p>
</li>
</ol>
<p>This kept the course from becoming passive. Instead of only watching the material, I used ChatGPT to check my understanding, simplify confusing concepts, and turn important ideas into language I could remember.</p>
<p>The second phase started after the course, when I moved into practice exams:</p>
<ol>
<li><p>Take a practice test.</p>
</li>
<li><p>Review weak areas.</p>
</li>
<li><p>Separate true knowledge from lucky guesses.</p>
</li>
<li><p>Use ChatGPT to reason through weak topics.</p>
</li>
<li><p>Convert weak topics into simple mental models.</p>
</li>
<li><p>Retest.</p>
</li>
</ol>
<p>The course is the map. Practice testing exposes areas that require reinforcement.</p>
<h2>How I Used the LLM</h2>
<p>ChatGPT was not a replacement for studying. It was the tool that made the process engaging and harder to fake.</p>
<p>That distinction matters because it is easy to read an explanation and think, “Yeah, that makes sense.” But recognizing an explanation is different from being able to recall the concept or reason through a question under pressure.</p>
<p>During the course, I mainly used ChatGPT for topic triage, quizzing, and compact mental models. After the course, I used it more for review: breaking down missed questions, clarifying confusing services, and understanding why one answer was better than another.</p>
<h3>Topic Triage</h3>
<p>This was most useful while I was moving through the course.</p>
<p>When I was studying a service or concept, I would ask ChatGPT to classify how important it was for the exam. The categories were simple: Essential, Less-essential, Optional, and Skip.</p>
<p>“Skip” was rare, but the classification helped me avoid treating every detail equally. That matters because AWS has a lot of services. For the CCP, the goal is not deep implementation mastery. The goal is foundational understanding: what services do, when they are used, and how they relate to cost, security, reliability, and cloud value.</p>
<p>The prompt was very simple — looked something like this:</p>
<pre><code class="language-plaintext">I am studying for the AWS Certified Cloud Practitioner CLF-C02 exam.

For the topic below, classify its exam importance as:
Essential / Less-essential / Optional / Skip.
Then explain why, and generate a few beginner-friendly exam-style questions.

Topic:
[insert topic]
</code></pre>
<p>This helped me allocate attention better. Not every service deserved the same amount of study time. Some topics needed real repetition. Others only needed basic familiarity. That distinction made the process more efficient.</p>
<h3>Delayed Reveal Quizzing</h3>
<p>During the course, one of the most useful habits was delayed reveal quizzing. Instead of letting ChatGPT immediately explain the answer, I had it ask one multiple-choice question at a time and wait until I committed to A, B, C, or D.</p>
<p>The prompt looked something like this:</p>
<pre><code class="language-plaintext">Ask one multiple-choice question at a time.

Do not reveal the correct answer until I choose A, B, C, or D.

After I answer, briefly explain why the correct answer is right
and why the other options are wrong.
</code></pre>
<p>This kept me honest. When the answer is revealed too early, it is easy to mistake understanding the explanation for knowing the answer. Delayed reveal made me choose before I could benefit from the explanation, which allowed me to better encode the information.</p>
<p>That exposed weak reasoning quickly. Sometimes I got the answer right for the wrong reason. Sometimes I narrowed it down to two choices but could not clearly explain the difference. Sometimes I realized I recognized a service name but did not actually understand what problem the service solved.</p>
<p>That kind of feedback was more useful than just reading another explanation.</p>
<h3>Confidence Tagging</h3>
<p>Once I started taking practice exams, I did not only mark answers as right or wrong. I also tagged my correct answers based on confidence:</p>
<ul>
<li><p>Confident</p>
</li>
<li><p>Unsure</p>
</li>
<li><p>Guessed</p>
</li>
</ul>
<p>This mattered because a correct answer can hide a weak concept. Sometimes I guessed between two options. Sometimes one answer sounded more familiar. Sometimes I eliminated choices without fully understanding the service being tested.</p>
<p>Those answers can inflate the score without proving that the concept is stable. So after each practice exam, I treated “unsure” and “guessed” answers almost like wrong answers.</p>
<p>This made review much more useful because it showed me what still needed work, even when the score looked better.</p>
<h3>Compact Mental Models</h3>
<p>Compact mental models helped in both parts of the process. During the course, they helped me simplify new topics. During practice review, they helped me rebuild concepts I had missed or guessed on.</p>
<p>These were short phrases or simple explanations that helped me remember what a service does, when it is used, and what it is commonly confused with.</p>
<p>The prompt looked something like this:</p>
<pre><code class="language-plaintext">Create a compact mental model for this AWS service or concept.

Make it short, memorable, and exam-focused.
Also include:
- what it is
- when to use it
- what it is commonly confused with
- one exam-style clue that points to it

Topic:
[insert topic]
</code></pre>
<p>As I questioned each topic, and went through more and more topics, ChatGPT gradually learned to create mental models that are particularly useful for my thinking style.</p>
<p>This was especially useful for services that sounded similar at first. The real benefit came from typing these mental models into my own notes. Thinking about how to write the note forced me to process the concept instead of only reading it.</p>
<p>The typing mattered because it turned review into active recall. I was not just collecting explanations. I was compressing them into language I could actually remember.</p>
<h2>How I Used Practice Exams</h2>
<p>Practice exams were where the system became measurable. I used Tutorials Dojo / Jon Bonso practice exams to find weak areas and track progress, but the key was not just taking tests repeatedly. The key was using each test as a diagnostic tool.</p>
<p>After each practice exam, I reviewed what I got wrong, what I got right but guessed, what I got right but felt unsure about, which domains were repeatedly weak, and which services or concepts kept showing up. Then I went back into focused review.</p>
<p>The loop became: practice test -&gt; review -&gt; weak area drill -&gt; repeat</p>
<p>This made a big difference because practice exams can be misleading if you only care about the final percentage. A score can go up while parts of your understanding remain weak. Confidence tagging helped prevent that by forcing me to look underneath the score.</p>
<h2>Score Progression</h2>
<p>Here is what my progression looked like:</p>
<ul>
<li><p>First Jon Bonso randomized timed test: <strong>57%</strong></p>
</li>
<li><p>After section-based loops: <strong>74%</strong></p>
</li>
<li><p>After timed practice loops: <strong>78%</strong></p>
</li>
<li><p>After notes and test review: <strong>86%</strong></p>
</li>
<li><p>Official AWS CCP Practice Question Set: <strong>724/1000</strong></p>
</li>
<li><p>Official exam: <strong>PASS — 837/1000</strong></p>
</li>
</ul>
<p>The score jump did not come from one magic resource. It came from repeated feedback. The first score showed me where I actually was. The later scores showed that the review loop was working.</p>
<p>By the time I took the official practice exam, I had already improved significantly. But I still think I took it too late. The official AWS CCP Practice Question Set felt very similar to the actual exam, so I would have gotten more value from using it earlier as a baseline and then again near the end as a final readiness check.</p>
<h2>What I Would Do Differently</h2>
<p><strong>If I could redo the process, I would take the official AWS CCP Practice Question Set twice: once early as a baseline and once near the end as a final benchmark.</strong></p>
<p>That would have given me a cleaner comparison point. Instead of only using third-party practice tests to measure improvement, I would have had an official reference point from the start.</p>
<p>I also would have adhered more to ChatGPT’s topic prioritization judgement, and not over-study low-value details. AWS has a lot of services, with an exam like this it is easy to fall into the trap of trying to memorize everything. For the CCP, the better move is to understand the major service categories, the common use cases, the pricing and billing concepts, the shared responsibility model, and the basic cloud value propositions.</p>
<p>The exam is broad, not deep, so prioritization matters.</p>
<h2>What Made the Difference</h2>
<p>Feedback.</p>
<p>The course helped me build the foundation. Topic-based practice exams showed me precisely what still needed work. ChatGPT helped me review that feedback, simplify difficult concepts, and turn them into explanations I could effectively encode.</p>
<p><strong>The system kept me asking better questions:</strong></p>
<ul>
<li><p>Do I actually understand this?</p>
</li>
<li><p>Can I explain why this answer is right?</p>
</li>
<li><p>Can I explain why the other answers are wrong?</p>
</li>
<li><p>Can I simplify the concept?</p>
</li>
</ul>
<h2>My Recommended Study Plan</h2>
<p>If someone were starting AWS CCP prep from the beginning, I would keep the plan simple.</p>
<p>First, use a full, free course like freeCodeCamp to build the map. Do not try to master every service on the first pass. The goal is to understand the main domains: cloud concepts, AWS global infrastructure, compute, storage, databases, networking, security, billing and pricing, support plans, and the shared responsibility model.</p>
<p>Second, start using an LLM for simple practice questions earlier than feels. Practice questions are how you find out what “ready” actually means. Do not wait until you feel fully prepared, because the practice itself is part of the preparation.</p>
<p>Third, review intelligently. Do not only review wrong answers. Review guessed correct answers and unsure correct answers too. Those are the areas where hidden weakness lives.</p>
<p>Fourth, turn weak areas into compact mental models that work for you. For each weak service or concept, ask: what is it, what problem does it solve, when would AWS expect me to choose it, what is it commonly confused with, what related services does it usually appear near, and what clue in a question points toward it?</p>
<p>Finally, immediately take the <a href="https://skillbuilder.aws/learn/E4W52ZKK6P/official-practice-question-set-aws-certified-cloud-practitioner-clfc02--english/RJSZKD3MG3"><strong>Official AWS CCP Practice Question Set</strong></a> upon completing the course, iterate primarily using Jon Bonsos topic-based exams, and then use the official AWS CCP Practice Question Set as a final benchmark. Use the last review cycle to clean up weak areas before exam day.</p>
<h2>Final Takeaway</h2>
<p>The AWS Certified Cloud Practitioner is not a deep technical architecture exam, but it is still valuable if you use it correctly.</p>
<p>For me, it was a quick win that helped me build momentum while giving me a clearer foundation around AWS services, cloud value, billing, security, and the shared responsibility model. More importantly, it helped me build a study system I can reuse.</p>
<p>The real lesson was learning how to turn a certification into an active study process.</p>
<hr />
<p>O<em>riginally published on Medium on May 11, 2026.</em></p>
]]></content:encoded></item><item><title><![CDATA[Troubleshooting .pem File Permissions for WSL SSH into Amazon EC2]]></title><description><![CDATA[TL;DR: If you SSH from WSL, keep your .pem key inside the WSL filesystem (~/.ssh), not under /mnt/c. WSL maps Windows permissions in a way that can make the key look “too open,” and SSH will refuse to use it. Copy it into ~/.ssh, lock permissions (ch...]]></description><link>https://cloudwithdavid.hashnode.dev/troubleshooting-pem-file-permissions-for-wsl-ssh-into-amazon-ec2</link><guid isPermaLink="true">https://cloudwithdavid.hashnode.dev/troubleshooting-pem-file-permissions-for-wsl-ssh-into-amazon-ec2</guid><category><![CDATA[AWS]]></category><category><![CDATA[ssh]]></category><category><![CDATA[ssh-keys]]></category><category><![CDATA[WSL]]></category><category><![CDATA[Linux]]></category><category><![CDATA[Cloud Computing]]></category><category><![CDATA[ec2]]></category><dc:creator><![CDATA[David Rodriguez]]></dc:creator><pubDate>Tue, 30 Dec 2025 04:36:54 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1767167236683/20c1c5e1-c40b-4fee-8870-2502c861a580.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><strong>TL;DR:</strong> If you SSH from WSL, keep your <code>.pem</code> key inside the WSL filesystem (<code>~/.ssh</code>), not under <code>/mnt/c</code>. WSL maps Windows permissions in a way that can make the key look “too open,” and SSH will refuse to use it. Copy it into <code>~/.ssh</code>, lock permissions (<code>chmod 400</code>), then connect.</p>
<h2 id="heading-context">Context</h2>
<p>Goal: SSH into an Amazon Linux EC2 instance from <strong>WSL Ubuntu</strong>, following AWS docs:</p>
<p>Expected workflow:</p>
<ol>
<li><p>Launch EC2 (Amazon Linux)</p>
</li>
<li><p>Download <code>.pem</code> key pair</p>
</li>
<li><p>SSH as <code>ec2-user</code></p>
</li>
</ol>
<h2 id="heading-symptoms-i-hit-run-1">Symptoms I hit (Run #1)</h2>
<p>From WSL, SSH failed with errors like:</p>
<ul>
<li><p><code>identity file ... not accessible</code> (wrong path / file not where I thought)</p>
</li>
<li><p><code>Permission denied (publickey)</code> (key not usable or didn’t get presented)</p>
</li>
</ul>
<h2 id="heading-root-cause">Root cause</h2>
<p>I was running the SSH client inside <strong>WSL (Linux)</strong> but pointing it at a private key stored on the <strong>Windows filesystem</strong> via <code>/mnt/c/...</code>.</p>
<p>Why this matters:</p>
<ul>
<li><p><code>/mnt/c</code> is a Windows mount (NTFS)</p>
</li>
<li><p>Windows permissions (ACLs) get translated/mapped when accessed from WSL</p>
</li>
<li><p>SSH requires the private key file to be <strong>not accessible</strong> to group/others</p>
</li>
<li><p>If SSH decides your key file is “too open,” it <strong>ignores the key</strong> and authentication fails</p>
</li>
</ul>
<p>In other words: the key wasn’t reliably “Linux-private” while sitting under <code>/mnt/c</code>.</p>
<h2 id="heading-the-fix-consistent">The fix (consistent)</h2>
<h3 id="heading-1-copy-key-into-wsl-filesystem">1) Copy key into WSL filesystem</h3>
<pre><code class="lang-bash">mkdir -p ~/.ssh
cp /mnt/c/Users/Administrator/Documents/projects/l2c/&lt;key-name&gt;.pem ~/.ssh/
</code></pre>
<h3 id="heading-2-lock-permissions">2) Lock permissions</h3>
<pre><code class="lang-bash">chmod 400 ~/.ssh/&lt;key-name&gt;.pem
</code></pre>
<p>Confirm permissions look right:</p>
<pre><code class="lang-bash">ls -l ~/.ssh/&lt;key-name&gt;.pem
<span class="hljs-comment"># expect: -r-------- ...</span>
</code></pre>
<h3 id="heading-3-ssh-in">3) SSH in</h3>
<pre><code class="lang-bash">ssh -i ~/.ssh/&lt;key-name&gt;.pem ec2-user@&lt;public-dns&gt;
</code></pre>
<p>Success looks like:</p>
<pre><code class="lang-bash">[ec2-user@ip-172-31-xx-xx ~]$
</code></pre>
<h2 id="heading-run-2-unprotected-private-key-file-confirmation">Run #2: “UNPROTECTED PRIVATE KEY FILE” confirmation</h2>
<p>When I intentionally tried to use the key directly from <code>/mnt/c</code> again to test my understanding, I hit:</p>
<ul>
<li><p><code>WARNING: UNPROTECTED PRIVATE KEY FILE!</code></p>
</li>
<li><p><code>Permissions ... are too open</code></p>
</li>
</ul>
<p>That warning is SSH explicitly saying: “I will not use this key.”<br />Copying into <code>~/.ssh</code> + <code>chmod 400</code> resolved it immediately.</p>
<h2 id="heading-quick-notes-on-chmod-400-vs-chmod-600">Quick notes on <code>chmod 400</code> vs <code>chmod 600</code></h2>
<ul>
<li><p><code>chmod 400</code> = read-only for you (<code>-r--------</code>)</p>
<ul>
<li>Ideal for <code>.pem</code> keys (SSH only needs to read it)</li>
</ul>
</li>
<li><p><code>chmod 600</code> = read/write for you (<code>-rw-------</code>)</p>
<ul>
<li>Useful for sensitive config files you edit (e.g., <code>~/.aws/credentials</code>)</li>
</ul>
</li>
</ul>
<h2 id="heading-what-i-learned">What I learned</h2>
<p><strong>Tools run inside an environment. Files are governed by that environment’s permission model.</strong><br />If SSH is running in WSL (Linux), your key needs to be a Linux-private file (best: in <code>~/.ssh</code>) with Linux permissions.</p>
<h3 id="heading-references">References</h3>
<ul>
<li><p>AWS EC2: Connect to your Linux instance using SSH — <a target="_blank" href="https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/connect-linux-inst-ssh.html">https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/connect-linux-inst-ssh.html</a></p>
</li>
<li><p>Cloudflare: What is SSH? — <a target="_blank" href="https://www.cloudflare.com/learning/access-management/what-is-ssh/">https://www.cloudflare.com/learning/access-management/what-is-ssh/</a></p>
</li>
</ul>
]]></content:encoded></item></channel></rss>