<?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>Forem: angelomao</title>
    <description>The latest articles on Forem by angelomao (@angelomao).</description>
    <link>https://forem.com/angelomao</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%2F1324292%2F58321220-0c07-4681-814d-a817c63815fc.jpeg</url>
      <title>Forem: angelomao</title>
      <link>https://forem.com/angelomao</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/angelomao"/>
    <language>en</language>
    <item>
      <title>How to deploy MCP Servers on AWS with the Best Practices</title>
      <dc:creator>angelomao</dc:creator>
      <pubDate>Tue, 04 Nov 2025 03:06:04 +0000</pubDate>
      <link>https://forem.com/aws-builders/how-to-deploy-mcp-servers-on-aws-with-the-best-practices-538</link>
      <guid>https://forem.com/aws-builders/how-to-deploy-mcp-servers-on-aws-with-the-best-practices-538</guid>
      <description>&lt;p&gt;The Model Context Protocol (MCP) Servers become the hub between AI applications and external systems like databases, knowledge bases, and 3rd party websites during the Generative AI era for developers, which significantly increases the efficiency and effectiveness of integrating AI chatbots (like ChatGPT, Claude Desktop, Qwen) with external services or your dedicated knowledge bases.&lt;/p&gt;

&lt;p&gt;This article describes the process of hands-on steps for deploying the MCP servers onto AWS while aligning with the best practices of the Well-Architected Framework (WAF).&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frt4bnewq2i1xgiu2tpzx.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%2Frt4bnewq2i1xgiu2tpzx.png" alt=" " width="800" height="449"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The architecture implements:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;CloudFront distribution for global content delivery with WAF protection&lt;/li&gt;
&lt;li&gt;Application Load Balancer for traffic distribution and SSL termination&lt;/li&gt;
&lt;li&gt;ECS Fargate and Lambda for containerized and serverless MCP servers&lt;/li&gt;
&lt;li&gt;AWS Cognito for OAuth 2.0 authorization server functionality&lt;/li&gt;
&lt;li&gt;OAuth 2.0 Protected Resource Metadata endpoints for standards-compliant authentication&lt;/li&gt;
&lt;li&gt;StreamableHTTP transport with stateless request handling&lt;/li&gt;
&lt;li&gt;Four-stack CDK deployment: VPC, Security, CloudFront WAF, and MCP Server stacks&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The solution addresses several key challenges:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Secure hosting of MCP servers on AWS infrastructure&lt;/li&gt;
&lt;li&gt;Standards-compliant authentication using OAuth 2.0 Protected Resource Metadata (RFC9728)&lt;/li&gt;
&lt;li&gt;Remote access to MCP servers through secure StreamableHTTP transport&lt;/li&gt;
&lt;li&gt;Stateless server architecture for concurrent client support&lt;/li&gt;
&lt;li&gt;Scalable and maintainable deployment using AWS CDK&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Deployment Procedure
&lt;/h2&gt;

&lt;p&gt;A. Install AWS CDK with a program like Node.js on your terminal.&lt;br&gt;
&lt;code&gt;npm install -g aws-cdk&lt;/code&gt;&lt;br&gt;
B. Configure AWS permissions with your credentials via AWS CLI.&lt;br&gt;
&lt;code&gt;aws configure&lt;/code&gt;&lt;br&gt;
C. Set up the AWS CDK on your AWS environment.&lt;br&gt;
&lt;code&gt;cdk bootstrap&lt;/code&gt;&lt;br&gt;
D. Clone the source code into the terminal and go to the relevant directory.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git clone https://github.com/aws-solutions-library-samples/guidance-for-deploying-model-context-protocol-servers-on-aws.git
cd guidance-for-deploying-model-context-protocol-servers-on-aws
cd source/cdk/ecs-and-lambda
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;E. Install the dependencies.&lt;br&gt;
&lt;code&gt;npm install&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;F. Log in to the public AWS ECR (assume the deploy region is us-east-1).&lt;br&gt;
&lt;code&gt;aws ecr-public get-login-password --region us-east-1 | docker login --username AWS --password-stdin public.ecr.aws&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;G. Deploy the entire stack via CDK.&lt;br&gt;
&lt;code&gt;cdk deploy --all&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;H. Type "yes" to continue the deployment of the network components like VPC.&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzevdskaj19500nel0lk6.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%2Fzevdskaj19500nel0lk6.png" alt=" " width="800" height="146"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I. Type "yes" to deploy security components like CloudFront and WAF.&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fiz2itei3wepv5va25x6m.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%2Fiz2itei3wepv5va25x6m.png" alt=" " width="800" height="183"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;J. Type "yes" to deploy server components like ECS and Lambda.&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd5ki3vtgbkbf1h1try2q.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%2Fd5ki3vtgbkbf1h1try2q.png" alt=" " width="800" height="261"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;K. Update the MCP servers.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;cdk deploy MCP-Server&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;L. Now the entire MCP server stack is deployed on AWS.&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuzc6wtaxfjj9roudubks.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%2Fuzc6wtaxfjj9roudubks.png" alt=" " width="800" height="319"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;M. Go to the AWS Cognito panel and note down the value of "User pool ID". Then create a test user.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Create test user
aws cognito-idp admin-create-user --user-pool-id YOUR_USER_POOL_ID --username test

# Set permanent password (bypass temporary)
aws cognito-idp admin-set-user-password --user-pool-id YOUR_USER_POOL_ID --username test --password "TestPass123!" --permanent
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Verification Procedure
&lt;/h2&gt;

&lt;p&gt;a. On a different host from the one to deploy the MCP server, clone the source code and go to the relevant directory.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git clone https://github.com/aws-solutions-library-samples/guidance-for-deploying-model-context-protocol-servers-on-aws.git
cd guidance-for-deploying-model-context-protocol-servers-on-aws
cd source/sample-clients/simple-auth-client-python
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;b. Install the dependencies with uv.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;pip install uv
uv sync --reinstall
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;c. Export the environment variables in the shell (you need to go to AWS CloudFront and Cognito console to check the values first).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;export MCP_SERVER_URL="https://&amp;lt;your-cloudfront-endpoint&amp;gt;/weather-nodejs/mcp"
export OAUTH_CLIENT_ID="&amp;lt;your-cognito-client-id&amp;gt;"
export OAUTH_CLIENT_SECRET="&amp;lt;your-cognito-client-secret&amp;gt;"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;d. Run the MCP client.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;uv run python -m mcp_simple_auth_client.main&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;e. Input the username and password created in the above step for the authorization.&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fizfsudly8558ri6mh12j.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%2Fizfsudly8558ri6mh12j.png" alt=" " width="800" height="237"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;f. Set up MFA for the MCP client.&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvyj1n4xck4xb48szuypn.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%2Fvyj1n4xck4xb48szuypn.png" alt=" " width="800" height="521"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;g. You will see the info that indicates the successful authentication and you can close the browser.&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpqiozynbnzqes1kfo2sm.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%2Fpqiozynbnzqes1kfo2sm.png" alt=" " width="800" height="318"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;h. Back to the MCP client, and you're free to go with interacting with the deployed MCP server.&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fa9z757zojbq2i85rvqaq.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%2Fa9z757zojbq2i85rvqaq.png" alt=" " width="580" height="140"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;i. You can follow the instructions to interact with the MCP server in terms of list/call the relevant functions as below.&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhhdd4ohw4iwe8uj8re4r.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%2Fhhdd4ohw4iwe8uj8re4r.png" alt=" " width="430" height="161"&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr92ri43aooyc5ua4iy9q.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%2Fr92ri43aooyc5ua4iy9q.png" alt=" " width="800" height="571"&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fj1jjfrervfsqf8e4vjgw.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%2Fj1jjfrervfsqf8e4vjgw.png" alt=" " width="661" height="603"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Cleanup Procedure
&lt;/h2&gt;

&lt;p&gt;1). Remove the deployed stack on the host where you deploy it via AWS CDK&lt;br&gt;
&lt;code&gt;cdk destroy --all&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;2). Type "yes" to continue the decommissioning process.&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs7fpeh56xdysmleovcde.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%2Fs7fpeh56xdysmleovcde.png" alt=" " width="800" height="244"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;3). Until the time when the deployed stack is decommissioned successfully.&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpcul9l0fu8zzebyk01ea.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%2Fpcul9l0fu8zzebyk01ea.png" alt=" " width="800" height="230"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>mcp</category>
      <category>architecture</category>
      <category>ai</category>
      <category>aws</category>
    </item>
    <item>
      <title>Build a Fullstack Modern System with Kiro</title>
      <dc:creator>angelomao</dc:creator>
      <pubDate>Thu, 11 Sep 2025 01:17:15 +0000</pubDate>
      <link>https://forem.com/kirodotdev/build-a-fullstack-modern-system-with-amazon-kiro-1f3e</link>
      <guid>https://forem.com/kirodotdev/build-a-fullstack-modern-system-with-amazon-kiro-1f3e</guid>
      <description>&lt;p&gt;Thrilled to share that I have preliminarily finished my first project of building a full fledged AssetManagementSystem entirely based on Kiro which is composed of the tech stack below:&lt;/p&gt;

&lt;p&gt;Frontend: React 18 with TypeScript, Tailwind CSS, React Router, React Query&lt;br&gt;
Backend: Node.js with Express, TypeScript, JWT authentication&lt;br&gt;
Database: PostgreSQL with Prisma ORM&lt;br&gt;
Development: Docker Compose for containerized development environment&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Faiscd2r06lctwdb1z0rl.jpg" 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%2Faiscd2r06lctwdb1z0rl.jpg" alt=" " width="800" height="356"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The process is pretty straightforward:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;I described the business requirement to Kiro then it rephrases the detailed aspects.&lt;/li&gt;
&lt;li&gt;After I consent to what it understand, it starts the High Level / Low Level design which include but not limited to: Frontend, Backend, Data Models, Data Schema, Error Handling, Test Methodology, Authentication, Performance, etc.&lt;/li&gt;
&lt;li&gt;After I agree with the design, it starts to generate the task list based on the design according to the dependancy.&lt;/li&gt;
&lt;li&gt;Then I start to execute the task sequencially until they're all finished successfully.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Of course, there are a lot of issues during the task execution (even after all those tasks executed). But I've been amazed at the troubleshooting capabilities of AI model behind the scene and fast responses to carry out the solutions to clear the issues (of course it also burns out my request of the plan). &lt;/p&gt;

&lt;p&gt;This project let me witness the slogan of Kiro "Turn your idea into reality" isn't an empty talk but 100% capabilities shown before your eyes. &lt;/p&gt;

&lt;p&gt;Here's my GitHub repo if you're keen to have a look:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;https://github.com/angelomao/corporate-asset-management-kiro&lt;/code&gt;&lt;/p&gt;

</description>
      <category>fullstack</category>
      <category>typescript</category>
      <category>webdev</category>
      <category>ai</category>
    </item>
    <item>
      <title>Deploy the Generative AI Application Builder on AWS</title>
      <dc:creator>angelomao</dc:creator>
      <pubDate>Fri, 05 Sep 2025 01:25:05 +0000</pubDate>
      <link>https://forem.com/aws-builders/deploy-the-generative-ai-application-builder-on-aws-3gid</link>
      <guid>https://forem.com/aws-builders/deploy-the-generative-ai-application-builder-on-aws-3gid</guid>
      <description>&lt;p&gt;This solution is based on the below architecture with pure serverless technology on AWS.&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhknvrpx4oexi6tmrbe82.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%2Fhknvrpx4oexi6tmrbe82.png" alt=" " width="800" height="514"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The overview of this diagram is described as follows:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Use CloudFront to deliver the Web GUI which is hosted on S3 bucket.&lt;/li&gt;
&lt;li&gt;The Web GUI leverages the REST API which behind APIGateway.&lt;/li&gt;
&lt;li&gt;Use AWSWAF to protect the API from attacks via web ACL.&lt;/li&gt;
&lt;li&gt;Leverage Cognito to authenticate users against Web UI and API Gateway.&lt;/li&gt;
&lt;li&gt;AWS Lambda hosts the business logic for the Rest API.&lt;/li&gt;
&lt;li&gt;Use CloudFormation to deploy the Use Cases.&lt;/li&gt;
&lt;li&gt;Amazon DynamoDB stores the data of deployments.&lt;/li&gt;
&lt;li&gt;Amazon CloudWatch monitors the performance of solution and operational health.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Deployment Process:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Download the cloudformation template from &lt;a href="https://s3.amazonaws.com/solutions-reference/generative-ai-application-builder-on-aws/latest/generative-ai-application-builder-on-aws.template" rel="noopener noreferrer"&gt;here&lt;/a&gt; &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Deploy the downloaded template with inputs to the following parameters on AWS cloudformation console &lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;Admin User Email&lt;/code&gt;: your email address&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;DeployUI&lt;/code&gt;: Yes&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;After the deployment is completed, you can get access to the Web UI as shown below&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyezfx0enzlyktz46m9ua.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%2Fyezfx0enzlyktz46m9ua.png" alt=" " width="800" height="377"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Deploy a Use Case such as Text based chatbot&lt;/p&gt;

&lt;p&gt;Now you can start to chat with your LLM such as Amazon Nova Pro&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpns5oy7swhrxi00t9jmo.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%2Fpns5oy7swhrxi00t9jmo.png" alt=" " width="800" height="380"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>genai</category>
      <category>aws</category>
      <category>rag</category>
    </item>
    <item>
      <title>Deploy Drupal on ECS Fargate</title>
      <dc:creator>angelomao</dc:creator>
      <pubDate>Tue, 02 Sep 2025 10:06:37 +0000</pubDate>
      <link>https://forem.com/aws-builders/deploy-drupal-on-ecs-fargate-31h3</link>
      <guid>https://forem.com/aws-builders/deploy-drupal-on-ecs-fargate-31h3</guid>
      <description>&lt;p&gt;Do you want to build a Content Management System (CMS) based on Drupal in a totally SERVERLESS manner automatically on Amazon Web Services (AWS)? Well this solution can definitely help you out with the following overview:&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fla5z9srhkyh0shkp9hub.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%2Fla5z9srhkyh0shkp9hub.png" alt=" " width="768" height="672"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Host the Application layer on ECSFargate which is totally serverless&lt;/li&gt;
&lt;li&gt;Attach the EFS system to multiple tasks on ECSFargate&lt;/li&gt;
&lt;li&gt;Host the Database layer on Aurora for MySQL in Serverlessv2 db class&lt;/li&gt;
&lt;li&gt;Deploy both the app and database layer in the private subnet in a VPC&lt;/li&gt;
&lt;li&gt;Use Internet Gateway deployed in the public subnet for inbound traffic&lt;/li&gt;
&lt;li&gt;Leverage NAT Gateway deployed in the public subnet for outbound traffic&lt;/li&gt;
&lt;li&gt;The entire stack is deployed via CloudFormation template.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Deploying the CloudFormation Stacks
&lt;/h2&gt;

&lt;p&gt;Clone the repository and deploy the solution from an AWS Cloudformation console using the cloned main.yaml file.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;git clone https://github.com/angelomao/drupal-on-ecs-fargate.git&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Providing the Parameter for CloudFormation to Deploy the Stack
&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%2Fy6ujp1h6kvm3cde5945k.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%2Fy6ujp1h6kvm3cde5945k.png" alt=" " width="625" height="595"&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnbza502vhscsjd76vsvk.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%2Fnbza502vhscsjd76vsvk.png" alt=" " width="610" height="589"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Configuring the Drupal Website
&lt;/h2&gt;

&lt;p&gt;Configure the demo Drupal application that you want to build. The application landing page redirects to the installation page after selecting Save and continue.&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F59kbqak11ex8dhm4xq6k.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%2F59kbqak11ex8dhm4xq6k.png" alt=" " width="800" height="379"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You will eventually see the website after initializing it successfully&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsiy1djxrbz9iykl5blgk.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%2Fsiy1djxrbz9iykl5blgk.png" alt=" " width="800" height="382"&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flv1x6z7p7zoveihnt0sr.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%2Flv1x6z7p7zoveihnt0sr.png" alt=" " width="800" height="382"&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fk9slkzvq66itiwnt4tg3.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%2Fk9slkzvq66itiwnt4tg3.png" alt=" " width="800" height="381"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>How to deploy and manage your workload on EKS in a one-stop shop</title>
      <dc:creator>angelomao</dc:creator>
      <pubDate>Fri, 06 Jun 2025 09:25:47 +0000</pubDate>
      <link>https://forem.com/aws-builders/how-to-deploy-and-manage-your-workload-on-eks-in-a-one-stop-shop-4fl1</link>
      <guid>https://forem.com/aws-builders/how-to-deploy-and-manage-your-workload-on-eks-in-a-one-stop-shop-4fl1</guid>
      <description>&lt;p&gt;Amazon Web Services (AWS) has carried out its Elastic Kubernetes Service (EKS) Auto Mode based on the open source technology Karpenter, which extends the management beyond the Kubernetes cluster itself and provide Just-in-time autoscaling of the cluster based on your deployed workloads, and extremely offload the burden of the administer / DevOps personnel while let developers focus on the application. Recently I have exlpored this service and been amazed by the functionality and features which let you manage your containerized workload on this platform in a one-stop shop. This article works you through the process of setting up the cluster and deploying the sample application onto it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Create the EKS Auto Mode cluster
&lt;/h2&gt;

&lt;p&gt;First and foremost, you need to have an active AWS account with admin rights, with which you can create a user with the relevant IAM permission and Security credentials (aka, Access Key ID and Secret Access Key).&lt;/p&gt;

&lt;p&gt;Second, you can choose the method to create the EKS Auto Mode cluster (like awscli, eksctl, terraform, etc). I choose Terraform module (&lt;a href="https://registry.terraform.io/modules/terraform-aws-modules/eks/aws/latest" rel="noopener noreferrer"&gt;https://registry.terraform.io/modules/terraform-aws-modules/eks/aws/latest&lt;/a&gt;) and leverage GitHub with Terraform Cloud (&lt;a href="https://app.terraform.io" rel="noopener noreferrer"&gt;https://app.terraform.io&lt;/a&gt;) to deploy it in a continuous manner, which extremely simplifies the process of deploying all required resources (EKS cluster, IAM role, IAM policy, SA, etc) and reduces the manually errors. The GUI looks like the picture below.  &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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbroeqxnhjs8x8bp3h7zv.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%2Fbroeqxnhjs8x8bp3h7zv.png" alt="Image description" width="800" height="485"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Third, if everything is OK, the EKS Auto Mode cluster should be successfully created and displayed on your AWS Management console as shown below.&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9djoxdl4w1u2d1erxl25.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%2F9djoxdl4w1u2d1erxl25.png" alt="Image description" width="800" height="200"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Next, you need to update the kubeconfig on your laptop with command below so that you can get access to your cluster.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;aws eks update-kubeconfig --name "&amp;lt;your cluster name&amp;gt;"&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;after which, you can spot the nodes of the cluster with below command:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;kubectl get nodepools&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Deploy your sample workload onto the EKS cluster
&lt;/h2&gt;

&lt;p&gt;After creating the cluster, you can deploy the sample workload onto the cluster to see the effect. I choose to deploy game 2048 which gives the direct visual effects.&lt;/p&gt;

&lt;p&gt;Create a file named 01-namespace.yaml:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;apiVersion: v1
kind: Namespace
metadata:
  name: game-2048
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Apply the namespace configuration:&lt;br&gt;
&lt;code&gt;kubectl apply -f 01-namespace.yaml&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Create a file named 02-deployment.yaml:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;apiVersion: apps/v1
kind: Deployment
metadata:
  namespace: game-2048
  name: deployment-2048
spec:
  selector:
    matchLabels:
      app.kubernetes.io/name: app-2048
  replicas: 5
  template:
    metadata:
      labels:
        app.kubernetes.io/name: app-2048
    spec:
      containers:
        - image: public.ecr.aws/l6m2t8p7/docker-2048:latest
          imagePullPolicy: Always
          name: app-2048
          ports:
            - containerPort: 80
          resources:
            requests:
              cpu: "0.5"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Apply the deployment:&lt;br&gt;
&lt;code&gt;kubectl apply -f 02-deployment.yaml&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Create a file named 03-service.yaml:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;apiVersion: v1
kind: Service
metadata:
  namespace: game-2048
  name: service-2048
spec:
  ports:
    - port: 80
      targetPort: 80
      protocol: TCP
  type: NodePort
  selector:
    app.kubernetes.io/name: app-2048
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Apply the service:&lt;br&gt;
&lt;code&gt;kubectl apply -f 03-service.yaml&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Create a file named 04-ingressclass.yaml:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;apiVersion: networking.k8s.io/v1
kind: IngressClass
metadata:
  labels:
    app.kubernetes.io/name: LoadBalancerController
  name: alb
spec:
  controller: eks.amazonaws.com/alb
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt;&lt;br&gt;
You need to manually add the tag into the subnets of VPC below if the cluster isn't created by eksctl. Otherwise the creation will fail.&lt;br&gt;
&lt;code&gt;kubernetes.io/role/elb: 1&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Then create the Ingress resource. Create a file named 05-ingress.yaml:&lt;br&gt;
apiVersion: networking.k8s.io/v1&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kind: Ingress
metadata:
  namespace: game-2048
  name: ingress-2048
  annotations:
    alb.ingress.kubernetes.io/scheme: internet-facing
    alb.ingress.kubernetes.io/target-type: ip
spec:
  ingressClassName: alb
  rules:
    - http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: service-2048
                port:
                  number: 80
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Apply the ingress configurations:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kubectl apply -f 04-ingressclass.yaml
kubectl apply -f 05-ingress.yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Verify the Deployment&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kubectl get pods -n game-2048
kubectl get svc -n game-2048
kubectl get ingress -n game-2048
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The ADDRESS field in the ingress output will show your ALB endpoint. Wait 2-3 minutes for the ALB to provision and register all targets.&lt;/p&gt;

&lt;p&gt;If everything works fine, you should be able to get access to the deployed app as shown below.&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fssvhtgzngnk5sw11wcrj.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%2Fssvhtgzngnk5sw11wcrj.png" alt="Image description" width="681" height="872"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Monitoring your workload
&lt;/h2&gt;

&lt;p&gt;In order to monitor your workload via AWS CloudWatch, you need to install CloudWatch Observability add-ons into the cluster.&lt;/p&gt;

&lt;p&gt;First, go to the "Observability" tab of the EKS cluster on the management console.&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxhxybnpja6gozenugdmg.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%2Fxhxybnpja6gozenugdmg.png" alt="Image description" width="800" height="290"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Second, click on "Manage CloudWatch Observability add-ons" button and follow the instruction to install the add-on.&lt;/p&gt;

&lt;p&gt;If everything is ok, you should see the add-on under the "Add-ons" tab as shown below.&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb459ku7ua2y7qgqylpp5.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%2Fb459ku7ua2y7qgqylpp5.png" alt="Image description" width="800" height="208"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now you can go to the Container Insights of CloudWatch to monitor your workload in a visual manner.&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flc3jrdqyxd576n1flqqo.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%2Flc3jrdqyxd576n1flqqo.png" alt="Image description" width="800" height="390"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Backend Architecture on AWS</title>
      <dc:creator>angelomao</dc:creator>
      <pubDate>Sat, 22 Mar 2025 12:07:59 +0000</pubDate>
      <link>https://forem.com/aws-builders/backend-architecture-on-aws-17h2</link>
      <guid>https://forem.com/aws-builders/backend-architecture-on-aws-17h2</guid>
      <description>&lt;p&gt;Today I am thrilled to announce that the brand new architecture designed by myself for the backend of XXX app is now live on Amazon Web Services (AWS) after several months of deploying and tuning efforts!&lt;br&gt;
Plenty of features are applied to this architecture which include but not limited to:&lt;br&gt;
Route53&lt;br&gt;
API Gateway + VPC Link&lt;br&gt;
AWS WAF&lt;br&gt;
AWS ALB&lt;br&gt;
AWS Certificate Manager&lt;br&gt;
AWS Secrets Manager&lt;br&gt;
Amazon Inspector&lt;br&gt;
VPC Endpoints for S3/ECR/CodeDeploy&lt;br&gt;
VPC Peering&lt;br&gt;
NAT Gateway&lt;br&gt;
CloudFront&lt;br&gt;
EC2 AutoScaling Group&lt;br&gt;
ECS Fargate AutoScaling&lt;br&gt;
ECR&lt;br&gt;
EFS&lt;br&gt;
S3 Bucket&lt;br&gt;
AWS Elastic Transcoder&lt;br&gt;
AWS Rekognition&lt;br&gt;
RDS MySQL + Read Replica&lt;br&gt;
Elasticache for Memcached/Redis&lt;br&gt;
Athena + Data Source Connector&lt;br&gt;
HashiCorp Packer for AMI&lt;br&gt;
MongoDB Atlas on AWS&lt;br&gt;
Amazon Managed Grafana Labs&lt;br&gt;
CloudWatch + SNS&lt;br&gt;
Blue/Green Deployments for RDS&lt;br&gt;
CI by GitLab + CD by CodeDeploy&lt;/p&gt;

&lt;p&gt;The whole infrastructure is deployed with HashiCorp Terraform Cloud.&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fytkipykwmfe22y10v16f.jpg" 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%2Fytkipykwmfe22y10v16f.jpg" alt="Image description" width="800" height="1125"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Setup OpenVPN AS on AWS</title>
      <dc:creator>angelomao</dc:creator>
      <pubDate>Sat, 22 Mar 2025 11:54:30 +0000</pubDate>
      <link>https://forem.com/aws-builders/setup-openvpn-as-on-aws-4168</link>
      <guid>https://forem.com/aws-builders/setup-openvpn-as-on-aws-4168</guid>
      <description>&lt;p&gt;Here’s an example of setting up an OpenVPN Inc. Access Server behind an Application Load Balancer which let the Admin/User login the web portal in a secure manner, and a Network Load Balancer which facilitates the User to form a VPN connection to the AS server with high performance and security then freely connect to private endpoints on Amazon Web Services (AWS)&lt;br&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%2F0c96zd0xt608bmvi5e7i.jpeg" 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%2F0c96zd0xt608bmvi5e7i.jpeg" alt="Image description" width="800" height="538"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>aws</category>
      <category>networking</category>
      <category>tutorial</category>
      <category>cloud</category>
    </item>
    <item>
      <title>Implement CD pipeline on AWS</title>
      <dc:creator>angelomao</dc:creator>
      <pubDate>Sat, 22 Mar 2025 11:51:58 +0000</pubDate>
      <link>https://forem.com/aws-builders/impment-cd-on-aws-38gh</link>
      <guid>https://forem.com/aws-builders/impment-cd-on-aws-38gh</guid>
      <description>&lt;p&gt;DevOps personnels don't have access to the source code due to some information security policies? Not a problem. You can upload a workable artifact from Developers together with appspec yml file and scripts for starting the services in zip format onto S3 bucket, and CodePipeline will check the changes of file and trigger the deployment with CodeDeploy which will deploy the new artifact onto EC2 servers via agent in an AutoScalingGroup, and SNS will inform you on any deployment failure events. Thus you have a workable CD pipeline on Amazon Web Services (AWS) which can introduce a lot of efficiencies into your daily work.&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8l30b55fwt622igigsg5.jpeg" 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%2F8l30b55fwt622igigsg5.jpeg" alt="Image description" width="622" height="421"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>aws</category>
      <category>devops</category>
      <category>productivity</category>
      <category>cicd</category>
    </item>
    <item>
      <title>How to build an AMI image on AWS with HashiCorp Packer and use it in Terraform</title>
      <dc:creator>angelomao</dc:creator>
      <pubDate>Mon, 04 Mar 2024 09:46:23 +0000</pubDate>
      <link>https://forem.com/aws-builders/how-to-build-an-ami-image-on-aws-with-hashicorp-packer-and-use-it-in-terraform-184h</link>
      <guid>https://forem.com/aws-builders/how-to-build-an-ami-image-on-aws-with-hashicorp-packer-and-use-it-in-terraform-184h</guid>
      <description>&lt;p&gt;As a DevOps engineer you always encounter the scenario that you need to bake the image with which to spin up the new servers on the Public Clouds like AWS/Azure/GCP. This article introduce how to bake the image using HashiCorp Packer and use it via IaC tools like Terraform on the Public Cloud (take AWS as an example) in a continuous manner.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Follow the tutorial on HashiCorp official website to install Packer on your developer machine. &lt;a href="https://developer.hashicorp.com/packer/tutorials/docker-get-started/get-started-install-cli" rel="noopener noreferrer"&gt;https://developer.hashicorp.com/packer/tutorials/docker-get-started/get-started-install-cli&lt;/a&gt;. &lt;/li&gt;
&lt;li&gt;Go to your AWS Management Console and generate an Access key under the IAM user with the necessary permission to build an AMI image. Export the credentials on your developer machine like the below.
&lt;em&gt;export AWS_ACCESS_KEY_ID=
export AWS_SECRET_ACCESS_KEY=&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;Prepare your script for building the AMI with Packer in JSON format.&lt;/li&gt;
&lt;li&gt;Use the command below to upgrade your script in JSON into HCL format.
packer hcl2_upgrade .json&lt;/li&gt;
&lt;li&gt;Go to your HashiCorp Cloud Platform website and generate the tokens required to push the built AMI onto Packer repo. Export the tokens into your env vars on your developer machine.
&lt;em&gt;export HCP_CLIENT_ID=
export HCP_CLIENT_SECRET=&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;Build your AMI with the command below.
packer build .hcl
And Packer will upload the newly built AMI onto Packer repo on HCP website.&lt;/li&gt;
&lt;li&gt;Add the required snippet into your Terraform code.
&lt;strong&gt;Note&lt;/strong&gt;: the value for bucket_name and region can be set according to your actual situation.&lt;/li&gt;
&lt;li&gt;Refer to the ID of built AMI with the below statement in your Terraform code.
image_id = data.hcp_packer_image.sample.cloud_image_id&lt;/li&gt;
&lt;li&gt;So Terraform will always get the AMI ID of the newly built AMI as the referral to spin up the new EC2 instance.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Therefore you can build your AMI and use the ID of the output in your Terraform code in a continuous manner. And most importantly it's totally FREE. Hope it can help with your daily work.&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
