<?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: Dan Phillips</title>
    <description>The latest articles on DEV Community by Dan Phillips (@danphilllips-cloud).</description>
    <link>https://dev.to/danphilllips-cloud</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%2F2539459%2Fc40453f3-35ea-4392-a883-731ab8be7e44.jpg</url>
      <title>DEV Community: Dan Phillips</title>
      <link>https://dev.to/danphilllips-cloud</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/danphilllips-cloud"/>
    <language>en</language>
    <item>
      <title>Building a Serverless Website on AWS (and GCP)</title>
      <dc:creator>Dan Phillips</dc:creator>
      <pubDate>Sat, 16 May 2026 12:24:45 +0000</pubDate>
      <link>https://dev.to/danphilllips-cloud/building-a-serverless-website-on-aws-and-gcp-5l</link>
      <guid>https://dev.to/danphilllips-cloud/building-a-serverless-website-on-aws-and-gcp-5l</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Multi-cloud means understanding that every provider works differently. You only really learn that by actually building on them.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The Cloud Resume Challenge is a project by Forrest Brazeal that asks you to build and deploy a resume site using cloud services. I did it on AWS, then extended it to GCP, and ended up with something that actually touches most of the services you'd use in a real production environment.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I built
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr8pnjreyhsysp5zznmt3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr8pnjreyhsysp5zznmt3.png" alt="AWS Architecture" width="761" height="881"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The AWS side uses S3 for static hosting, CloudFront for the CDN, Route 53 for DNS, API Gateway and Lambda for the backend API, and DynamoDB for storage. Infrastructure is managed with CloudFormation and SAM. Deployments are automated with Ansible and GitHub Actions.&lt;/p&gt;

&lt;p&gt;The GCP side mirrors the architecture: Cloud Storage for static hosting, a Cloud CDN in front of it, Cloud Functions for the backend, and Firestore for storage. That's managed with Terraform.&lt;/p&gt;

&lt;h3&gt;
  
  
  Frontend
&lt;/h3&gt;

&lt;p&gt;S3 hosts the static files. CloudFront sits in front of it and handles HTTPS, caching, and routing. The S3 bucket is private -- CloudFront accesses it using an Origin Access Control (OAC), so nothing is exposed directly.&lt;/p&gt;

&lt;p&gt;Route 53 handles DNS. The site runs on &lt;code&gt;danphillips.cloud&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Backend
&lt;/h3&gt;

&lt;p&gt;The visitor counter is a Lambda function behind API Gateway. It reads and increments a count in DynamoDB, then returns the value to the frontend via a fetch call.&lt;/p&gt;

&lt;p&gt;CloudFormation and SAM manage the AWS infrastructure as code. GitHub Actions handles CI/CD -- on push to main, it syncs files to S3 and invalidates the CloudFront cache.&lt;/p&gt;

&lt;h2&gt;
  
  
  GCP
&lt;/h2&gt;

&lt;p&gt;The GCP implementation uses the same architecture pattern. Cloud Storage hosts the static files, a load balancer with Cloud CDN handles distribution, Cloud Functions replaces Lambda, and Firestore replaces DynamoDB. Terraform manages all of it.&lt;/p&gt;

&lt;p&gt;The interesting part is seeing where the two providers diverge. The concepts are the same but the implementation details are different enough that you can't just copy your AWS config and expect it to work.&lt;/p&gt;

&lt;h2&gt;
  
  
  What bit me
&lt;/h2&gt;

&lt;h3&gt;
  
  
  CORS in two places
&lt;/h3&gt;

&lt;p&gt;The API Gateway needs CORS configured, and so does the Lambda function response. Getting one right and missing the other wastes a lot of time.&lt;/p&gt;

&lt;h3&gt;
  
  
  Regional vs Edge endpoint attributes
&lt;/h3&gt;

&lt;p&gt;CloudFormation attribute names differ depending on whether you're using a Regional or Edge-optimized API Gateway endpoint. Use &lt;code&gt;DistributionDomainName&lt;/code&gt; instead of &lt;code&gt;RegionalDomainName&lt;/code&gt;, or &lt;code&gt;CertificateArn&lt;/code&gt; instead of &lt;code&gt;RegionalCertificateArn&lt;/code&gt;, and your deployment breaks in non-obvious ways.&lt;/p&gt;

&lt;h3&gt;
  
  
  Never manually delete CloudFormation resources
&lt;/h3&gt;

&lt;p&gt;I did this once. The stack drifted and subsequent deployments failed. The only fix was deleting the whole stack and redeploying. CloudFormation manages its own state, don't touch resources outside of it.&lt;/p&gt;

&lt;h3&gt;
  
  
  Check .gitignore before your first commit
&lt;/h3&gt;

&lt;p&gt;I committed vault files with credentials. Had to scrub them from git history. Won't happen again.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I'd do differently
&lt;/h2&gt;

&lt;p&gt;Automate CloudFront cache invalidation from the first deploy, not as an afterthought. Use OAC over OAI from day one since OAI is the legacy option. And set WWW as the primary domain upfront -- it keeps your bucket structure clean and leaves the apex free for subdomains.&lt;/p&gt;

&lt;h2&gt;
  
  
  Worth doing?
&lt;/h2&gt;

&lt;p&gt;Yes. One project that touches storage, CDN, serverless compute, a NoSQL database, DNS, IaC, and deployment automation is genuinely useful for understanding how AWS services connect in a real architecture. For a job search it's something concrete you built and can walk through, not just another cert.&lt;/p&gt;




&lt;p&gt;Full project on GitHub with AWS and GCP implementations, CloudFormation templates, Terraform config, and Ansible playbooks: &lt;a href="https://github.com/danphillips-cloud/danphillips-aws" rel="noopener noreferrer"&gt;danphillips-cloud/danphillips-aws&lt;/a&gt;&lt;/p&gt;

</description>
      <category>aws</category>
      <category>cloud</category>
      <category>devops</category>
      <category>serverless</category>
    </item>
  </channel>
</rss>
