{"id":80323,"date":"2026-07-08T00:03:16","date_gmt":"2026-07-07T18:33:16","guid":{"rendered":"https:\/\/www.tothenew.com\/blog\/?p=80323"},"modified":"2026-07-17T08:06:50","modified_gmt":"2026-07-17T02:36:50","slug":"modern-frontend-deployment-using-aws-amplify-s3-and-jenkins","status":"publish","type":"post","link":"https:\/\/www.tothenew.com\/blog\/modern-frontend-deployment-using-aws-amplify-s3-and-jenkins\/","title":{"rendered":"Modern Frontend Deployment Using AWS Amplify, S3, and Jenkins"},"content":{"rendered":"<p style=\"font-size: 1.2rem; color: #444; margin-bottom: 1.5rem;\"><strong>Building a scalable frontend deployment pipeline with automated CI\/CD, custom domains, and global delivery<\/strong><\/p>\n<h2 style=\"font-size: 1.75rem; margin: 2rem 0 1rem; padding-bottom: 0.35rem; border-bottom: 2px solid #e8e8e8;\"><strong>Introduction<\/strong><\/h2>\n<p style=\"margin-bottom: 1.25rem;\">Frontend applications of today need fast deployments, scalability, global reach, and low operational overhead. But plenty of organizations still use traditional server-based hosting where deployments require manual configuration, SSH access, server maintenance, SSL handling, and cache management.<\/p>\n<p style=\"margin-bottom: 1.25rem;\">As frontend applications scale across multiple environments, maintaining frontend infrastructure using EC2 instances, NGINX, and load balancers becomes increasingly difficult and expensive to maintain.<\/p>\n<p style=\"margin-bottom: 1.25rem;\">We created a frontend deployment architecture to make frontend hosting easier and deployments consistent:<\/p>\n<ul style=\"margin: 0 0 1.25rem 1.5rem;\">\n<li>AWS Amplify<\/li>\n<li>Amazon S3<\/li>\n<li>Jenkins CI\/CD<\/li>\n<li>Route53<\/li>\n<li>ACM Certificates<\/li>\n<\/ul>\n<h2 style=\"font-size: 1.75rem; margin: 2rem 0 1rem; padding-bottom: 0.35rem; border-bottom: 2px solid #e8e8e8;\"><strong>Problem Statement<\/strong><\/h2>\n<p style=\"margin-bottom: 1.25rem;\">Before we moved to Amplify-based hosting, we had a couple of operational issues with the frontend deployments:<\/p>\n<ul style=\"margin: 0 0 1.25rem 1.5rem;\">\n<li>Manual deployment tasks<\/li>\n<li>Nginx and EC2 Dependency<\/li>\n<li>Flush Cache Manually<\/li>\n<li>Complexity of SSL Certificates Management<\/li>\n<li>Scaling of infrastructure overhead<\/li>\n<li>Environment config mismatch<\/li>\n<\/ul>\n<p style=\"margin-bottom: 1.25rem;\">As deployments to multiple environments became more frequent, it became harder and more time consuming to keep things consistent.<\/p>\n<p style=\"margin-bottom: 1.25rem;\">The objective was to develop a deployment architecture that could:<\/p>\n<ul style=\"margin: 0 0 1.25rem 1.5rem;\">\n<li>Automation of Front-end Deployments<\/li>\n<li>no need to host it on a server<\/li>\n<li>Easier domain and SSL management<\/li>\n<li>Handle multiple environments cleanly<\/li>\n<li>Works well with existing Jenkins based CI\/CD workflows.<\/li>\n<\/ul>\n<h2 style=\"font-size: 1.75rem; margin: 2rem 0 1rem; padding-bottom: 0.35rem; border-bottom: 2px solid #e8e8e8;\"><strong>Why We Chose AWS Amplify<\/strong><\/h2>\n<p style=\"margin-bottom: 1.25rem;\">AWS Amplify is a fully managed service for hosting the frontend of modern web applications.<\/p>\n<p style=\"margin-bottom: 1.25rem;\">Key features include:<\/p>\n<ul style=\"margin: 0 0 1.25rem 1.5rem;\">\n<li>Front end hosting administration<\/li>\n<li>Global delivery CDN Powered<\/li>\n<li>SSL certificate installation<\/li>\n<li>Deployments from branches<\/li>\n<li>Deployment History Tracking<\/li>\n<li>Support for custom domains<\/li>\n<li>Monitor Requests and Logs<\/li>\n<\/ul>\n<p style=\"margin-bottom: 1.25rem;\">One of the big <strong>benefits<\/strong> of Amplify was that <strong>CDN management<\/strong> was handled <strong>automatically internally<\/strong>. The CloudFront distribution, cache invalidation, and SSL integration are not manually provisioned or managed separately.<\/p>\n<h2 style=\"font-size: 1.75rem; margin: 2rem 0 1rem; padding-bottom: 0.35rem; border-bottom: 2px solid #e8e8e8;\"><strong>Why We Used S3-Based Deployment Instead of Git-Based Amplify<\/strong><\/h2>\n<p style=\"margin-bottom: 1.25rem;\">AWS Amplify makes it easy to deploy directly from GitHub, GitLab, BitBucket and AWS CodeCommit. But in our case, we deliberately employed S3-based deployments integrated with Jenkins pipelines.<\/p>\n<p style=\"margin-bottom: 1.25rem;\">This approach resulted in improved control of:<\/p>\n<ul style=\"margin: 0 0 1.25rem 1.5rem;\">\n<li>Deployment to multiple environments<\/li>\n<li>Deployment of multiple accounts<\/li>\n<li>Deployment Permissions<\/li>\n<li>Custom CI \/ CD pipelines<\/li>\n<li>Managing Environment-Specific Configurations<\/li>\n<\/ul>\n<p style=\"margin-bottom: 1.25rem;\">Jenkins was already being used as the centralized CI\/CD platform so adding Amplify deployments to existing pipelines helped keep the consistency across environments.<\/p>\n<p><img decoding=\"async\" loading=\"lazy\" class=\" wp-image-80415\" src=\"https:\/\/www.tothenew.com\/blog\/wp-ttn-blog\/uploads\/2026\/07\/1-300x123.png\" alt=\"text\" width=\"770\" height=\"316\" srcset=\"\/blog\/wp-ttn-blog\/uploads\/2026\/07\/1-300x123.png 300w, \/blog\/wp-ttn-blog\/uploads\/2026\/07\/1-1024x419.png 1024w, \/blog\/wp-ttn-blog\/uploads\/2026\/07\/1-768x315.png 768w, \/blog\/wp-ttn-blog\/uploads\/2026\/07\/1-624x256.png 624w, \/blog\/wp-ttn-blog\/uploads\/2026\/07\/1.png 1482w\" sizes=\"(max-width: 770px) 100vw, 770px\" \/><\/p>\n<p><img decoding=\"async\" loading=\"lazy\" class=\" wp-image-80414\" src=\"https:\/\/www.tothenew.com\/blog\/wp-ttn-blog\/uploads\/2026\/07\/2.png\" alt=\"test\" width=\"754\" height=\"360\" srcset=\"\/blog\/wp-ttn-blog\/uploads\/2026\/07\/2.png 1816w, \/blog\/wp-ttn-blog\/uploads\/2026\/07\/2-300x143.png 300w, \/blog\/wp-ttn-blog\/uploads\/2026\/07\/2-1024x488.png 1024w, \/blog\/wp-ttn-blog\/uploads\/2026\/07\/2-768x366.png 768w, \/blog\/wp-ttn-blog\/uploads\/2026\/07\/2-1536x732.png 1536w, \/blog\/wp-ttn-blog\/uploads\/2026\/07\/2-624x298.png 624w\" sizes=\"(max-width: 754px) 100vw, 754px\" \/><img decoding=\"async\" style=\"max-width: 100%; height: auto; border: 1px solid #e0e0e0; border-radius: 6px;\" src=\"YOUR_IMAGE_URL\/image13.png\" alt=\"\" \/><\/p>\n<h2 style=\"font-size: 1.75rem; margin: 2rem 0 1rem; padding-bottom: 0.35rem; border-bottom: 2px solid #e8e8e8;\"><strong>Architecture Overview<\/strong><\/h2>\n<p style=\"margin-bottom: 1.25rem;\">The process for deployment is:<\/p>\n<ul style=\"margin: 0 0 1.25rem 1.5rem;\">\n<li>Git repositories storing source code<\/li>\n<li>Jenkins Pipelines for CI\/CD Automation<\/li>\n<li>Artefact deployment to S3 buckets<\/li>\n<li>AWS Amplify for hosting the frontend<\/li>\n<li>Route53 for DNS management<\/li>\n<li>ACM for SSL certificates<\/li>\n<\/ul>\n<p><img decoding=\"async\" loading=\"lazy\" class=\"size-large wp-image-80418\" src=\"https:\/\/www.tothenew.com\/blog\/wp-ttn-blog\/uploads\/2026\/07\/3-1024x683.png\" alt=\"test\" width=\"625\" height=\"417\" srcset=\"\/blog\/wp-ttn-blog\/uploads\/2026\/07\/3-1024x683.png 1024w, \/blog\/wp-ttn-blog\/uploads\/2026\/07\/3-300x200.png 300w, \/blog\/wp-ttn-blog\/uploads\/2026\/07\/3-768x512.png 768w, \/blog\/wp-ttn-blog\/uploads\/2026\/07\/3-624x416.png 624w, \/blog\/wp-ttn-blog\/uploads\/2026\/07\/3.png 1536w\" sizes=\"(max-width: 625px) 100vw, 625px\" \/><img decoding=\"async\" style=\"max-width: 100%; height: auto; border: 1px solid #e0e0e0; border-radius: 6px;\" src=\"YOUR_IMAGE_URL\/image2.png\" alt=\"\" \/><\/p>\n<h2 style=\"font-size: 1.75rem; margin: 2rem 0 1rem; padding-bottom: 0.35rem; border-bottom: 2px solid #e8e8e8;\"><strong>Step 1: Jenkins for CI\/CD Automation<\/strong><\/h2>\n<p style=\"margin-bottom: 1.25rem;\">A Jenkins pipeline was configured to standardize deployments across environments.<\/p>\n<p style=\"margin-bottom: 1.25rem;\">pipeline processed:<\/p>\n<ul style=\"margin: 0 0 1.25rem 1.5rem;\">\n<li>Git checkout<\/li>\n<li>getting environment config<\/li>\n<li>S3 sync for frontend build generation<\/li>\n<li>Scale deployment trigger<\/li>\n<\/ul>\n<p><img decoding=\"async\" loading=\"lazy\" class=\"size-full wp-image-80419\" src=\"https:\/\/www.tothenew.com\/blog\/wp-ttn-blog\/uploads\/2026\/07\/4.png\" alt=\"test\" width=\"688\" height=\"575\" srcset=\"\/blog\/wp-ttn-blog\/uploads\/2026\/07\/4.png 688w, \/blog\/wp-ttn-blog\/uploads\/2026\/07\/4-300x251.png 300w, \/blog\/wp-ttn-blog\/uploads\/2026\/07\/4-624x522.png 624w\" sizes=\"(max-width: 688px) 100vw, 688px\" \/><img decoding=\"async\" style=\"max-width: 100%; height: auto; border: 1px solid #e0e0e0; border-radius: 6px;\" src=\"YOUR_IMAGE_URL\/image3.png\" alt=\"\" \/><\/p>\n<p style=\"margin-bottom: 1.25rem;\">By automating this, we removed:<\/p>\n<ul style=\"margin: 0 0 1.25rem 1.5rem;\">\n<li>Manual deployment<\/li>\n<li>Deployment actions over SSH<\/li>\n<li>Manually clearing the cache<\/li>\n<\/ul>\n<p><img decoding=\"async\" loading=\"lazy\" class=\" wp-image-80420\" src=\"https:\/\/www.tothenew.com\/blog\/wp-ttn-blog\/uploads\/2026\/07\/5.png\" alt=\"test\" width=\"690\" height=\"250\" srcset=\"\/blog\/wp-ttn-blog\/uploads\/2026\/07\/5.png 1220w, \/blog\/wp-ttn-blog\/uploads\/2026\/07\/5-300x109.png 300w, \/blog\/wp-ttn-blog\/uploads\/2026\/07\/5-1024x371.png 1024w, \/blog\/wp-ttn-blog\/uploads\/2026\/07\/5-768x278.png 768w, \/blog\/wp-ttn-blog\/uploads\/2026\/07\/5-624x226.png 624w\" sizes=\"(max-width: 690px) 100vw, 690px\" \/><img decoding=\"async\" style=\"max-width: 100%; height: auto; border: 1px solid #e0e0e0; border-radius: 6px;\" src=\"YOUR_IMAGE_URL\/image4.png\" alt=\"\" \/><\/p>\n<h2 style=\"font-size: 1.75rem; margin: 2rem 0 1rem; padding-bottom: 0.35rem; border-bottom: 2px solid #e8e8e8;\"><strong>Step 2: Amplify Branches for Environment Management<\/strong><\/h2>\n<p style=\"margin-bottom: 1.25rem;\">Dedicated Amplify branches were created for each environment to keep deployments isolated and easier to manage.<\/p>\n<p style=\"margin-bottom: 1.25rem;\">Some examples are:<\/p>\n<p style=\"margin-bottom: 1.25rem;\">QA UAT Production<\/p>\n<p style=\"margin-bottom: 1.25rem;\">Each Amplify branch was a separate deployment environment, which made testing, validation, and release management easier.<\/p>\n<p style=\"margin-bottom: 1.25rem;\">This was good for:<\/p>\n<ul style=\"margin: 0 0 1.25rem 1.5rem;\">\n<li>Isolation of the environment<\/li>\n<li>Independent releases of the front-end<\/li>\n<li>Better deployment tracking<\/li>\n<li>Optimized testing workflows<\/li>\n<\/ul>\n<p><img decoding=\"async\" loading=\"lazy\" class=\" wp-image-80434\" src=\"https:\/\/www.tothenew.com\/blog\/wp-ttn-blog\/uploads\/2026\/07\/6-2-1024x484.png\" alt=\"test\" width=\"744\" height=\"351\" srcset=\"\/blog\/wp-ttn-blog\/uploads\/2026\/07\/6-2-1024x484.png 1024w, \/blog\/wp-ttn-blog\/uploads\/2026\/07\/6-2-300x142.png 300w, \/blog\/wp-ttn-blog\/uploads\/2026\/07\/6-2-768x363.png 768w, \/blog\/wp-ttn-blog\/uploads\/2026\/07\/6-2-1536x725.png 1536w, \/blog\/wp-ttn-blog\/uploads\/2026\/07\/6-2-624x295.png 624w, \/blog\/wp-ttn-blog\/uploads\/2026\/07\/6-2.png 1825w\" sizes=\"(max-width: 744px) 100vw, 744px\" \/><\/p>\n<h2 style=\"font-size: 1.75rem; margin: 2rem 0 1rem; padding-bottom: 0.35rem; border-bottom: 2px solid #e8e8e8;\"><strong>Step 3: Serving Frontend Artifacts with S3<\/strong><\/h2>\n<p style=\"margin-bottom: 1.25rem;\">One of the biggest limitations we see with S3 deployments is that there is no environment variable management from the Amplify UI.<\/p>\n<p style=\"margin-bottom: 1.25rem;\">To work around this, environment configurations were externally managed by using a single S3 configuration bucket.<\/p>\n<p style=\"margin-bottom: 1.25rem;\">The configuration files required were pulled by Jenkins dynamically during deployment.<\/p>\n<p style=\"margin-bottom: 1.25rem;\">For instance:<\/p>\n<pre style=\"background: #1e1e1e; color: #d4d4d4; padding: 1rem 1.25rem; border-radius: 6px; font-family: Consolas,Monaco,monospace; font-size: 0.9rem; line-height: 1.5; margin: 0 0 1.5rem;\">aws s3 cp s3:\/\/config-bucket\/uat\/docker\/next-app\/.env .env<\/pre>\n<p style=\"margin-bottom: 1.25rem;\">This improved:<\/p>\n<ul style=\"margin: 0 0 1.25rem 1.5rem;\">\n<li>Configuration consistency<\/li>\n<li>Security<\/li>\n<li>Isolation of the environment<\/li>\n<\/ul>\n<p style=\"margin-bottom: 1.25rem;\">Amplify deployments were triggered when frontend build artifacts were uploaded to Amazon S3.<\/p>\n<p style=\"margin-bottom: 1.25rem;\">One behavior seen during Amplify deployments was that AWS Amplify would automatically change the S3 bucket policy to allow access to the deployment artifact path for the Amplify service.<\/p>\n<p style=\"margin-bottom: 1.25rem;\">The Bucket policy allows the Amplify <code style=\"background: #f4f4f4; padding: 0.15em 0.35em; border-radius: 3px; font-family: monospace;\">specific<\/code> branch to list and read objects only from the <code style=\"background: #f4f4f4; padding: 0.15em 0.35em; border-radius: 3px; font-family: monospace;\">specific<\/code> prefix in the bucket. It also enforces secure HTTPS-only access to the bucket.<\/p>\n<p style=\"margin-bottom: 1.25rem;\">This reduced the need to manually set up additional S3 access permissions for Amplify deployments.<\/p>\n<p style=\"margin-bottom: 1.25rem;\">Using S3 also provided:<\/p>\n<ul style=\"margin: 0 0 1.25rem 1.5rem;\">\n<li>Using S3 also provided:<\/li>\n<li>Highly durable storage<\/li>\n<li>Automatic scalability<\/li>\n<li>Better cost optimization<\/li>\n<li>High uptime<\/li>\n<\/ul>\n<h2 style=\"font-size: 1.75rem; margin: 2rem 0 1rem; padding-bottom: 0.35rem; border-bottom: 2px solid #e8e8e8;\"><strong>Step 4: Deploying with AWS Amplify and managing CDN<\/strong><\/h2>\n<p style=\"margin-bottom: 1.25rem;\">We set up custom domains using Route53 instead of the Amplify generated domains.<\/p>\n<p style=\"margin-bottom: 1.25rem;\">The setup was as follows:<\/p>\n<p style=\"margin-bottom: 1.25rem;\">.com domain names .net domain names<\/p>\n<p style=\"margin-bottom: 1.25rem;\">Subdomains specific to the environment<\/p>\n<p><img decoding=\"async\" loading=\"lazy\" class=\" wp-image-80423\" src=\"https:\/\/www.tothenew.com\/blog\/wp-ttn-blog\/uploads\/2026\/07\/7-300x133.png\" alt=\"text\" width=\"764\" height=\"339\" srcset=\"\/blog\/wp-ttn-blog\/uploads\/2026\/07\/7-300x133.png 300w, \/blog\/wp-ttn-blog\/uploads\/2026\/07\/7-1024x453.png 1024w, \/blog\/wp-ttn-blog\/uploads\/2026\/07\/7-768x340.png 768w, \/blog\/wp-ttn-blog\/uploads\/2026\/07\/7-624x276.png 624w, \/blog\/wp-ttn-blog\/uploads\/2026\/07\/7.png 1521w\" sizes=\"(max-width: 764px) 100vw, 764px\" \/><\/p>\n<p style=\"text-align: center; margin: 2rem 0;\"><img decoding=\"async\" style=\"max-width: 100%; height: auto; border: 1px solid #e0e0e0; border-radius: 6px;\" src=\"YOUR_IMAGE_URL\/image7.png\" alt=\"\" \/>When setting up custom domains, Amplify will automatically create the DNS entries for domain validation and CDN routing. These needed to be added to Route53.<\/p>\n<p><img decoding=\"async\" loading=\"lazy\" class=\" wp-image-80424\" src=\"https:\/\/www.tothenew.com\/blog\/wp-ttn-blog\/uploads\/2026\/07\/8-300x150.png\" alt=\"text\" width=\"694\" height=\"347\" srcset=\"\/blog\/wp-ttn-blog\/uploads\/2026\/07\/8-300x150.png 300w, \/blog\/wp-ttn-blog\/uploads\/2026\/07\/8-768x385.png 768w, \/blog\/wp-ttn-blog\/uploads\/2026\/07\/8-624x313.png 624w, \/blog\/wp-ttn-blog\/uploads\/2026\/07\/8.png 1024w\" sizes=\"(max-width: 694px) 100vw, 694px\" \/><\/p>\n<p style=\"margin-bottom: 1.25rem;\">We can use both for integrating SSL:<\/p>\n<ul style=\"margin: 0 0 1.25rem 1.5rem;\">\n<li>Amplify-managed certificates<\/li>\n<li>Custom ACM certs<\/li>\n<\/ul>\n<p style=\"margin-bottom: 1.25rem;\">Now one thing:<\/p>\n<p style=\"margin-bottom: 1.25rem;\">Amplify custom domains (ACM certificates) need to be in us-east-1 because Amplify uses CloudFront distributions internally.<\/p>\n<p style=\"margin-bottom: 1.25rem;\">If certs are created in a different region, domain validation may still be in progress.<\/p>\n<p><img decoding=\"async\" loading=\"lazy\" class=\" wp-image-80425\" src=\"https:\/\/www.tothenew.com\/blog\/wp-ttn-blog\/uploads\/2026\/07\/9-300x168.png\" alt=\"txt\" width=\"751\" height=\"421\" srcset=\"\/blog\/wp-ttn-blog\/uploads\/2026\/07\/9-300x168.png 300w, \/blog\/wp-ttn-blog\/uploads\/2026\/07\/9-1024x573.png 1024w, \/blog\/wp-ttn-blog\/uploads\/2026\/07\/9-768x430.png 768w, \/blog\/wp-ttn-blog\/uploads\/2026\/07\/9-624x349.png 624w, \/blog\/wp-ttn-blog\/uploads\/2026\/07\/9.png 1513w\" sizes=\"(max-width: 751px) 100vw, 751px\" \/><\/p>\n<p><img decoding=\"async\" loading=\"lazy\" class=\" wp-image-80426\" src=\"https:\/\/www.tothenew.com\/blog\/wp-ttn-blog\/uploads\/2026\/07\/10-300x169.png\" alt=\"tech\" width=\"754\" height=\"425\" srcset=\"\/blog\/wp-ttn-blog\/uploads\/2026\/07\/10-300x169.png 300w, \/blog\/wp-ttn-blog\/uploads\/2026\/07\/10-1024x576.png 1024w, \/blog\/wp-ttn-blog\/uploads\/2026\/07\/10-768x432.png 768w, \/blog\/wp-ttn-blog\/uploads\/2026\/07\/10-1536x864.png 1536w, \/blog\/wp-ttn-blog\/uploads\/2026\/07\/10-624x351.png 624w, \/blog\/wp-ttn-blog\/uploads\/2026\/07\/10.png 1672w\" sizes=\"(max-width: 754px) 100vw, 754px\" \/><\/p>\n<h2 style=\"font-size: 1.75rem; margin: 2rem 0 1rem; padding-bottom: 0.35rem; border-bottom: 2px solid #e8e8e8;\"><strong>Security Headers<\/strong><\/h2>\n<p style=\"margin-bottom: 1.25rem;\">AWS Amplify also supports custom HTTP headers for additional frontend security and browser protection.<\/p>\n<p style=\"margin-bottom: 1.25rem;\">Headers may be set either:<\/p>\n<ul style=\"margin: 0 0 1.25rem 1.5rem;\">\n<li>Directly from the Amplify UI<\/li>\n<li>Using <code style=\"background: #f4f4f4; padding: 0.15em 0.35em; border-radius: 3px; font-family: monospace;\">customHttp.yml file<\/code><\/li>\n<\/ul>\n<p style=\"margin-bottom: 1.25rem;\">Example configuration:<\/p>\n<pre style=\"background: #1e1e1e; color: #d4d4d4; padding: 1rem 1.25rem; border-radius: 6px; font-family: Consolas,Monaco,monospace; font-size: 0.9rem; line-height: 1.5; margin: 0 0 1.5rem;\">customHeaders:\r\n- pattern: \"**\"\r\nheaders:\r\n- key: Strict-Transport-Security\r\nvalue: max-age=31536000; includeSubDomains\r\n- key: X-Frame-Options\r\nvalue: SAMEORIGIN\r\n- key: X-Content-Type-Options\r\nvalue: nosniff<\/pre>\n<p style=\"text-align: center; margin: 2rem 0;\"><img decoding=\"async\" style=\"max-width: 100%; height: auto; border: 1px solid #e0e0e0; border-radius: 6px;\" src=\"YOUR_IMAGE_URL\/image5.png\" alt=\"\" \/><\/p>\n<h2 style=\"font-size: 1.75rem; margin: 2rem 0 1rem; padding-bottom: 0.35rem; border-bottom: 2px solid #e8e8e8;\"><strong>Monitoring + Logs<\/strong><\/h2>\n<p style=\"margin-bottom: 1.25rem;\">AWS Amplify also gave us out-of-the-box monitoring capabilities that included:<\/p>\n<ul style=\"margin: 0 0 1.25rem 1.5rem;\">\n<li>Requests monitoring<\/li>\n<li>Data transfer monitoring<\/li>\n<li>4xx and 5xx error tracking<\/li>\n<li>Domain-wise access logs<\/li>\n<\/ul>\n<p><img decoding=\"async\" loading=\"lazy\" class=\" wp-image-80428\" src=\"https:\/\/www.tothenew.com\/blog\/wp-ttn-blog\/uploads\/2026\/07\/12-300x176.png\" alt=\"txt\" width=\"694\" height=\"407\" srcset=\"\/blog\/wp-ttn-blog\/uploads\/2026\/07\/12-300x176.png 300w, \/blog\/wp-ttn-blog\/uploads\/2026\/07\/12-1024x602.png 1024w, \/blog\/wp-ttn-blog\/uploads\/2026\/07\/12-768x452.png 768w, \/blog\/wp-ttn-blog\/uploads\/2026\/07\/12-624x367.png 624w, \/blog\/wp-ttn-blog\/uploads\/2026\/07\/12.png 1527w\" sizes=\"(max-width: 694px) 100vw, 694px\" \/><\/p>\n<p style=\"margin-bottom: 1.25rem;\">These logs were helpful for:<\/p>\n<ul style=\"margin: 0 0 1.25rem 1.5rem;\">\n<li>These logs were useful for:<\/li>\n<li>Troubleshooting Tips<\/li>\n<li>Traffic analysis<\/li>\n<li>Security Verification<\/li>\n<li>Debugging on the CDN level<\/li>\n<\/ul>\n<p><img decoding=\"async\" loading=\"lazy\" class=\" wp-image-80430\" src=\"https:\/\/www.tothenew.com\/blog\/wp-ttn-blog\/uploads\/2026\/07\/13-300x176.png\" alt=\"text\" width=\"789\" height=\"463\" srcset=\"\/blog\/wp-ttn-blog\/uploads\/2026\/07\/13-300x176.png 300w, \/blog\/wp-ttn-blog\/uploads\/2026\/07\/13-1024x602.png 1024w, \/blog\/wp-ttn-blog\/uploads\/2026\/07\/13-768x452.png 768w, \/blog\/wp-ttn-blog\/uploads\/2026\/07\/13-624x367.png 624w, \/blog\/wp-ttn-blog\/uploads\/2026\/07\/13.png 1527w\" sizes=\"(max-width: 789px) 100vw, 789px\" \/><\/p>\n<h2 style=\"font-size: 1.75rem; margin: 2rem 0 1rem; padding-bottom: 0.35rem; border-bottom: 2px solid #e8e8e8;\"><strong>Challenges and Limitations<\/strong><\/h2>\n<p style=\"margin-bottom: 1.25rem;\">While implementing Amplify hosting and integrating it with a custom domain, we faced several practical issues.<\/p>\n<h3 style=\"font-size: 1.35rem; margin: 1.5rem 0 0.75rem;\"><strong>Route53 DNS Propagation Delays<\/strong><\/h3>\n<p style=\"margin-bottom: 1.25rem;\">Incorrect DNS entries may continue propagating temporarily even after correction.<\/p>\n<p style=\"margin-bottom: 1.25rem;\">To avoid unnecessary issues:<\/p>\n<ul style=\"margin: 0 0 1.25rem 1.5rem;\">\n<li>DNS records should be validated carefully<\/li>\n<li>Multiple rapid retries should be avoided<\/li>\n<li>Domain configurations should be performed gradually<\/li>\n<\/ul>\n<p><img decoding=\"async\" loading=\"lazy\" class=\" wp-image-80431\" src=\"https:\/\/www.tothenew.com\/blog\/wp-ttn-blog\/uploads\/2026\/07\/14-300x137.png\" alt=\"text\" width=\"818\" height=\"372\" srcset=\"\/blog\/wp-ttn-blog\/uploads\/2026\/07\/14-300x137.png 300w, \/blog\/wp-ttn-blog\/uploads\/2026\/07\/14-1024x466.png 1024w, \/blog\/wp-ttn-blog\/uploads\/2026\/07\/14-768x350.png 768w, \/blog\/wp-ttn-blog\/uploads\/2026\/07\/14-1536x699.png 1536w, \/blog\/wp-ttn-blog\/uploads\/2026\/07\/14-624x284.png 624w, \/blog\/wp-ttn-blog\/uploads\/2026\/07\/14.png 1859w\" sizes=\"(max-width: 818px) 100vw, 818px\" \/><img decoding=\"async\" style=\"max-width: 100%; height: auto; border: 1px solid #e0e0e0; border-radius: 6px;\" src=\"YOUR_IMAGE_URL\/image9.png\" alt=\"\" \/><\/p>\n<h3 style=\"font-size: 1.35rem; margin: 1.5rem 0 0.75rem;\"><strong>ACM Certificate Region Restriction<\/strong><\/h3>\n<p style=\"margin-bottom: 1.25rem;\">A common issue occurred when ACM certificates were created outside <code style=\"background: #f4f4f4; padding: 0.15em 0.35em; border-radius: 3px; font-family: monospace;\">us-east-1<\/code>.<\/p>\n<p style=\"margin-bottom: 1.25rem;\">Because Amplify internally uses CloudFront:<\/p>\n<ul style=\"margin: 0 0 1.25rem 1.5rem;\">\n<li>Certificates must exist in <code style=\"background: #f4f4f4; padding: 0.15em 0.35em; border-radius: 3px; font-family: monospace;\">us-east-1<\/code><\/li>\n<li>Otherwise SSL validation may remain pending<\/li>\n<\/ul>\n<h3 style=\"font-size: 1.35rem; margin: 1.5rem 0 0.75rem;\"><strong>Limitations of S3-Based Deployments<\/strong><\/h3>\n<p style=\"margin-bottom: 1.25rem;\">With deployment workflows built around S3:<\/p>\n<ul style=\"margin: 0 0 1.25rem 1.5rem;\">\n<li>Amplify UI does not support native environment variable management<\/li>\n<li>Configuration management must be done externally<\/li>\n<\/ul>\n<p style=\"margin-bottom: 1.25rem;\">This required centralized CI\/CD-driven configuration management using Jenkins and S3.<\/p>\n<h2 style=\"font-size: 1.75rem; margin: 2rem 0 1rem; padding-bottom: 0.35rem; border-bottom: 2px solid #e8e8e8;\"><strong>Alternative Approaches<\/strong><\/h2>\n<table style=\"width: 100%; border-collapse: collapse; margin: 1.5rem 0 2rem; font-size: 0.95rem;\">\n<thead>\n<tr>\n<th style=\"border: 1px solid #ddd; padding: 0.75rem 1rem; text-align: left; background: #f7f7f7; font-weight: 600;\">Approach<\/th>\n<th style=\"border: 1px solid #ddd; padding: 0.75rem 1rem; text-align: left; background: #f7f7f7; font-weight: 600;\">Advantages<\/th>\n<th style=\"border: 1px solid #ddd; padding: 0.75rem 1rem; text-align: left; background: #f7f7f7; font-weight: 600;\">Challenges<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td style=\"border: 1px solid #ddd; padding: 0.75rem 1rem;\">EC2 + NGINX<\/td>\n<td style=\"border: 1px solid #ddd; padding: 0.75rem 1rem;\">Full server control<\/td>\n<td style=\"border: 1px solid #ddd; padding: 0.75rem 1rem;\">High maintenance<\/td>\n<\/tr>\n<tr>\n<td style=\"border: 1px solid #ddd; padding: 0.75rem 1rem; background: #fafafa;\">Direct S3 Static Hosting<\/td>\n<td style=\"border: 1px solid #ddd; padding: 0.75rem 1rem; background: #fafafa;\">Cost effective<\/td>\n<td style=\"border: 1px solid #ddd; padding: 0.75rem 1rem; background: #fafafa;\">Manual CDN setup<\/td>\n<\/tr>\n<tr>\n<td style=\"border: 1px solid #ddd; padding: 0.75rem 1rem;\">ECS\/Kubernetes Hosting<\/td>\n<td style=\"border: 1px solid #ddd; padding: 0.75rem 1rem;\">Useful for SSR workloads<\/td>\n<td style=\"border: 1px solid #ddd; padding: 0.75rem 1rem;\">Higher infrastructure complexity<\/td>\n<\/tr>\n<tr>\n<td style=\"border: 1px solid #ddd; padding: 0.75rem 1rem; background: #fafafa;\">AWS Amplify<\/td>\n<td style=\"border: 1px solid #ddd; padding: 0.75rem 1rem; background: #fafafa;\">Managed frontend hosting<\/td>\n<td style=\"border: 1px solid #ddd; padding: 0.75rem 1rem; background: #fafafa;\">Limited native env management for S3 deployments<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h2 style=\"font-size: 1.75rem; margin: 2rem 0 1rem; padding-bottom: 0.35rem; border-bottom: 2px solid #e8e8e8;\"><strong>Conclusion<\/strong><\/h2>\n<p style=\"margin-bottom: 1.25rem;\">AWS Amplify together with S3 and Jenkins delivered a scalable, lightweight and operationally efficient architecture for frontend deployment.<\/p>\n<p style=\"margin-bottom: 1.25rem;\">This is better than traditional server-based hosting because:<\/p>\n<ul style=\"margin: 0 0 1.25rem 1.5rem;\">\n<li>Eliminated infrastructure management overhead<\/li>\n<li>Simple to implement<\/li>\n<li>More scalable<\/li>\n<li>Reduced Operating Expenses<\/li>\n<li>Greater reliability of deployment<\/li>\n<\/ul>\n<p style=\"margin-bottom: 1.25rem;\">For organizations that already have centralized CI\/CD pipelines in place, the S3-based Amplify deployment model offers a flexible and production-ready solution for managing modern frontend applications across multiple environments and domains.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Building a scalable frontend deployment pipeline with automated CI\/CD, custom domains, and global delivery Introduction Frontend applications of today need fast deployments, scalability, global reach, and low operational overhead. But plenty of organizations still use traditional server-based hosting where deployments require manual configuration, SSH access, server maintenance, SSL handling, and cache management. As frontend applications [&hellip;]<\/p>\n","protected":false},"author":2297,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"iawp_total_views":4},"categories":[2348],"tags":[8667,248,1892,3259,1682],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/www.tothenew.com\/blog\/wp-json\/wp\/v2\/posts\/80323"}],"collection":[{"href":"https:\/\/www.tothenew.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.tothenew.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.tothenew.com\/blog\/wp-json\/wp\/v2\/users\/2297"}],"replies":[{"embeddable":true,"href":"https:\/\/www.tothenew.com\/blog\/wp-json\/wp\/v2\/comments?post=80323"}],"version-history":[{"count":17,"href":"https:\/\/www.tothenew.com\/blog\/wp-json\/wp\/v2\/posts\/80323\/revisions"}],"predecessor-version":[{"id":80713,"href":"https:\/\/www.tothenew.com\/blog\/wp-json\/wp\/v2\/posts\/80323\/revisions\/80713"}],"wp:attachment":[{"href":"https:\/\/www.tothenew.com\/blog\/wp-json\/wp\/v2\/media?parent=80323"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.tothenew.com\/blog\/wp-json\/wp\/v2\/categories?post=80323"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.tothenew.com\/blog\/wp-json\/wp\/v2\/tags?post=80323"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}