{"id":3291,"date":"2026-04-10T14:22:00","date_gmt":"2026-04-10T06:22:00","guid":{"rendered":"https:\/\/ichwanchandra.com\/blog\/?p=3291"},"modified":"2026-10-16T15:57:50","modified_gmt":"2026-10-16T07:57:50","slug":"aws-solutions-architect-project-performance-efficiency-part-4","status":"publish","type":"post","link":"https:\/\/ichwanchandra.com\/blog\/aws-solutions-architect-project-performance-efficiency-part-4\/","title":{"rendered":"AWS Solutions Architect Project (Performance Efficiency Pillar) &#8211; Serverless Application &#8211; Part 4"},"content":{"rendered":"\n<p>In this part, we are going to expose our Lambda functions via API gateway as REST endpoints to allow external applications interact via HTTP requests. In essence, API gateway is the main door for our serverless endpoints while it provides unified interface for all API requests and security with its built-in authentication, authorization, and rate limiting.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Step 1: Setup API Gateway<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Visit <strong>API Gateway<\/strong> console<\/li>\n\n\n\n<li>Click <strong>Create API<\/strong><\/li>\n\n\n\n<li>Select HTTP API, click <strong>Build<\/strong>\n<ul class=\"wp-block-list\">\n<li><strong>Configure API Details<\/strong>\n<ul class=\"wp-block-list\">\n<li><strong>API Name<\/strong>: <code>ProductInventory<\/code><\/li>\n\n\n\n<li><strong>IP Address Type:<\/strong> IPv4<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Left the rest options (i.e. stage and CORS) as default<\/li>\n\n\n\n<li>Click <strong>Create<\/strong><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1066\" height=\"717\" src=\"https:\/\/ichwanchandra.com\/blog\/wp-content\/uploads\/2026\/04\/image-22.png\" alt=\"\" class=\"wp-image-3303\" srcset=\"https:\/\/ichwanchandra.com\/blog\/wp-content\/uploads\/2026\/04\/image-22.png 1066w, https:\/\/ichwanchandra.com\/blog\/wp-content\/uploads\/2026\/04\/image-22-300x202.png 300w, https:\/\/ichwanchandra.com\/blog\/wp-content\/uploads\/2026\/04\/image-22-1024x689.png 1024w, https:\/\/ichwanchandra.com\/blog\/wp-content\/uploads\/2026\/04\/image-22-768x517.png 768w\" sizes=\"auto, (max-width: 1066px) 100vw, 1066px\" \/><\/figure>\n\n\n\n<div style=\"height:40px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Step 2: Setup Routes and Integrations<\/h2>\n\n\n\n<p>Routes define the URL paths and HTTP methods that our API accepts. In the meantime, integrations connect routes to our Lambda functions<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">GET Routes Setup (READ)<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\">Route 1: GET all products<\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Click <strong>Create Route<\/strong><\/li>\n\n\n\n<li><strong>Method<\/strong>: GET <\/li>\n\n\n\n<li><strong>Resource Path<\/strong>: <code>\/<\/code>product<\/li>\n\n\n\n<li><strong>Purpose<\/strong>: Retrieve all product items from inventory <\/li>\n\n\n\n<li>Click <strong>Create<\/strong><\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1066\" height=\"343\" src=\"https:\/\/ichwanchandra.com\/blog\/wp-content\/uploads\/2026\/04\/image-24.png\" alt=\"\" class=\"wp-image-3307\" srcset=\"https:\/\/ichwanchandra.com\/blog\/wp-content\/uploads\/2026\/04\/image-24.png 1066w, https:\/\/ichwanchandra.com\/blog\/wp-content\/uploads\/2026\/04\/image-24-300x97.png 300w, https:\/\/ichwanchandra.com\/blog\/wp-content\/uploads\/2026\/04\/image-24-1024x329.png 1024w, https:\/\/ichwanchandra.com\/blog\/wp-content\/uploads\/2026\/04\/image-24-768x247.png 768w\" sizes=\"auto, (max-width: 1066px) 100vw, 1066px\" \/><\/figure>\n\n\n\n<h4 class=\"wp-block-heading\">Route 2: GET specific product<\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Click <strong>Create Route<\/strong><\/li>\n\n\n\n<li><strong>Method<\/strong>: GET <\/li>\n\n\n\n<li><strong>Resource Path<\/strong>: <code>\/product\/{id}<\/code><\/li>\n\n\n\n<li><strong>Purpose<\/strong>: Retrieve specific product item by ID <\/li>\n\n\n\n<li><strong>{id}<\/strong>: Path parameter that will be passed to Lambda function <\/li>\n\n\n\n<li>Click <strong>Create<\/strong><\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1066\" height=\"343\" src=\"https:\/\/ichwanchandra.com\/blog\/wp-content\/uploads\/2026\/04\/image-25.png\" alt=\"\" class=\"wp-image-3308\" srcset=\"https:\/\/ichwanchandra.com\/blog\/wp-content\/uploads\/2026\/04\/image-25.png 1066w, https:\/\/ichwanchandra.com\/blog\/wp-content\/uploads\/2026\/04\/image-25-300x97.png 300w, https:\/\/ichwanchandra.com\/blog\/wp-content\/uploads\/2026\/04\/image-25-1024x329.png 1024w, https:\/\/ichwanchandra.com\/blog\/wp-content\/uploads\/2026\/04\/image-25-768x247.png 768w\" sizes=\"auto, (max-width: 1066px) 100vw, 1066px\" \/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Setup Integrations for Both of GET Routes Above<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Go to <strong>Integrations<\/strong>, select <strong>Manage Integrations<\/strong>, and click <strong>Create<\/strong><\/li>\n\n\n\n<li><strong>Attach to Route<\/strong>: GET \/product<\/li>\n\n\n\n<li><strong>Integration Target<\/strong>: Lambda function <\/li>\n\n\n\n<li><strong>Lambda Function<\/strong>: Select <code>get<\/code>Product<\/li>\n\n\n\n<li><strong>Set Invoke Permissions<\/strong>\n<ul class=\"wp-block-list\">\n<li><strong>Invoke Permissions<\/strong>: Keep enabled<\/li>\n\n\n\n<li>This grants API Gateway permission to invoke our Lambda function while creates the necessary IAM permissions automatically<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Click <strong>Create<\/strong><\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1066\" height=\"945\" src=\"https:\/\/ichwanchandra.com\/blog\/wp-content\/uploads\/2026\/04\/image-26.png\" alt=\"\" class=\"wp-image-3309\" srcset=\"https:\/\/ichwanchandra.com\/blog\/wp-content\/uploads\/2026\/04\/image-26.png 1066w, https:\/\/ichwanchandra.com\/blog\/wp-content\/uploads\/2026\/04\/image-26-300x266.png 300w, https:\/\/ichwanchandra.com\/blog\/wp-content\/uploads\/2026\/04\/image-26-1024x908.png 1024w, https:\/\/ichwanchandra.com\/blog\/wp-content\/uploads\/2026\/04\/image-26-768x681.png 768w\" sizes=\"auto, (max-width: 1066px) 100vw, 1066px\" \/><\/figure>\n\n\n\n<p>Now let&#8217;s test the endpoint by going to the APIs menu from the sidebar, and choose generated API.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Copy the invoked URL<\/li>\n\n\n\n<li>Go to new window\/tab and paste the invoked URL before adding <code>\/product<\/code> the the end of it<\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1066\" height=\"945\" src=\"https:\/\/ichwanchandra.com\/blog\/wp-content\/uploads\/2026\/04\/image-27.png\" alt=\"\" class=\"wp-image-3310\" srcset=\"https:\/\/ichwanchandra.com\/blog\/wp-content\/uploads\/2026\/04\/image-27.png 1066w, https:\/\/ichwanchandra.com\/blog\/wp-content\/uploads\/2026\/04\/image-27-300x266.png 300w, https:\/\/ichwanchandra.com\/blog\/wp-content\/uploads\/2026\/04\/image-27-1024x908.png 1024w, https:\/\/ichwanchandra.com\/blog\/wp-content\/uploads\/2026\/04\/image-27-768x681.png 768w\" sizes=\"auto, (max-width: 1066px) 100vw, 1066px\" \/><\/figure>\n\n\n\n<p>Then it shall return the data in JSON format<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"675\" height=\"206\" src=\"https:\/\/ichwanchandra.com\/blog\/wp-content\/uploads\/2026\/04\/image-28.png\" alt=\"\" class=\"wp-image-3311\" srcset=\"https:\/\/ichwanchandra.com\/blog\/wp-content\/uploads\/2026\/04\/image-28.png 675w, https:\/\/ichwanchandra.com\/blog\/wp-content\/uploads\/2026\/04\/image-28-300x92.png 300w\" sizes=\"auto, (max-width: 675px) 100vw, 675px\" \/><\/figure>\n\n\n\n<p>Finally, we need to attach the 2nd GET route to the integration<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Go back to <strong>Routes<\/strong> \u2192 Select <code>\/product\/{id}<\/code> \u2192 <strong>Attach Integration<\/strong> <\/li>\n\n\n\n<li>Choose existing integration: <strong>getProduct<\/strong><\/li>\n\n\n\n<li>Click <strong>Attach Integration<\/strong><\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1070\" height=\"558\" src=\"https:\/\/ichwanchandra.com\/blog\/wp-content\/uploads\/2026\/04\/image-29.png\" alt=\"\" class=\"wp-image-3317\" srcset=\"https:\/\/ichwanchandra.com\/blog\/wp-content\/uploads\/2026\/04\/image-29.png 1070w, https:\/\/ichwanchandra.com\/blog\/wp-content\/uploads\/2026\/04\/image-29-300x156.png 300w, https:\/\/ichwanchandra.com\/blog\/wp-content\/uploads\/2026\/04\/image-29-1024x534.png 1024w, https:\/\/ichwanchandra.com\/blog\/wp-content\/uploads\/2026\/04\/image-29-768x401.png 768w\" sizes=\"auto, (max-width: 1070px) 100vw, 1070px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1070\" height=\"845\" src=\"https:\/\/ichwanchandra.com\/blog\/wp-content\/uploads\/2026\/04\/image-30.png\" alt=\"\" class=\"wp-image-3319\" srcset=\"https:\/\/ichwanchandra.com\/blog\/wp-content\/uploads\/2026\/04\/image-30.png 1070w, https:\/\/ichwanchandra.com\/blog\/wp-content\/uploads\/2026\/04\/image-30-300x237.png 300w, https:\/\/ichwanchandra.com\/blog\/wp-content\/uploads\/2026\/04\/image-30-1024x809.png 1024w, https:\/\/ichwanchandra.com\/blog\/wp-content\/uploads\/2026\/04\/image-30-768x607.png 768w\" sizes=\"auto, (max-width: 1070px) 100vw, 1070px\" \/><\/figure>\n\n\n\n<div style=\"height:40px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">PUT Route Setup (UPDATE)<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Go to <strong>API Gateway<\/strong>, select <strong>Routes<\/strong>, click <strong>Create Route<\/strong><\/li>\n\n\n\n<li><strong>Method<\/strong>: PUT<\/li>\n\n\n\n<li><strong>Resource Path<\/strong>: <code>\/product\/{id}<\/code><\/li>\n\n\n\n<li><strong>Purpose<\/strong>: Update specific product item by ID<\/li>\n\n\n\n<li>Click <strong>Create<\/strong><\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1066\" height=\"336\" src=\"https:\/\/ichwanchandra.com\/blog\/wp-content\/uploads\/2026\/04\/image-31.png\" alt=\"\" class=\"wp-image-3326\" srcset=\"https:\/\/ichwanchandra.com\/blog\/wp-content\/uploads\/2026\/04\/image-31.png 1066w, https:\/\/ichwanchandra.com\/blog\/wp-content\/uploads\/2026\/04\/image-31-300x95.png 300w, https:\/\/ichwanchandra.com\/blog\/wp-content\/uploads\/2026\/04\/image-31-1024x323.png 1024w, https:\/\/ichwanchandra.com\/blog\/wp-content\/uploads\/2026\/04\/image-31-768x242.png 768w\" sizes=\"auto, (max-width: 1066px) 100vw, 1066px\" \/><\/figure>\n\n\n\n<h4 class=\"wp-block-heading\">Setup Integrations for PUT Route<\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Go to <strong>Integrations<\/strong>, select <strong>Manage Integrations<\/strong>, and click <strong>Create<\/strong><\/li>\n\n\n\n<li><strong>Attach to Route<\/strong>: PUT <code>\/product\/{id}<\/code><\/li>\n\n\n\n<li><strong>Integration Target<\/strong>: Lambda function <\/li>\n\n\n\n<li><strong>Lambda Function<\/strong>: Select <code>updateProduct<\/code><\/li>\n\n\n\n<li><strong>Set Invoke Permissions<\/strong>\n<ul class=\"wp-block-list\">\n<li><strong>Invoke Permissions<\/strong>: Keep enabled<\/li>\n\n\n\n<li>This grants API Gateway permission to invoke our Lambda function while creates the necessary IAM permissions automatically<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Click <strong>Create<\/strong><\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1066\" height=\"959\" src=\"https:\/\/ichwanchandra.com\/blog\/wp-content\/uploads\/2026\/04\/image-32.png\" alt=\"\" class=\"wp-image-3327\" srcset=\"https:\/\/ichwanchandra.com\/blog\/wp-content\/uploads\/2026\/04\/image-32.png 1066w, https:\/\/ichwanchandra.com\/blog\/wp-content\/uploads\/2026\/04\/image-32-300x270.png 300w, https:\/\/ichwanchandra.com\/blog\/wp-content\/uploads\/2026\/04\/image-32-1024x921.png 1024w, https:\/\/ichwanchandra.com\/blog\/wp-content\/uploads\/2026\/04\/image-32-768x691.png 768w\" sizes=\"auto, (max-width: 1066px) 100vw, 1066px\" \/><\/figure>\n\n\n\n<div style=\"height:40px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">DELETE Route Setup (DELETE)<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Go to <strong>API Gateway<\/strong>, select <strong>Routes<\/strong>, click <strong>Create Route<\/strong><\/li>\n\n\n\n<li><strong>Method<\/strong>: DELETE<\/li>\n\n\n\n<li><strong>Resource Path<\/strong>: <code>\/product\/{id}<\/code><\/li>\n\n\n\n<li><strong>Purpose<\/strong>: Delete specific product item by ID<\/li>\n\n\n\n<li>Click <strong>Create<\/strong><\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1066\" height=\"335\" src=\"https:\/\/ichwanchandra.com\/blog\/wp-content\/uploads\/2026\/04\/image-33.png\" alt=\"\" class=\"wp-image-3331\" srcset=\"https:\/\/ichwanchandra.com\/blog\/wp-content\/uploads\/2026\/04\/image-33.png 1066w, https:\/\/ichwanchandra.com\/blog\/wp-content\/uploads\/2026\/04\/image-33-300x94.png 300w, https:\/\/ichwanchandra.com\/blog\/wp-content\/uploads\/2026\/04\/image-33-1024x322.png 1024w, https:\/\/ichwanchandra.com\/blog\/wp-content\/uploads\/2026\/04\/image-33-768x241.png 768w\" sizes=\"auto, (max-width: 1066px) 100vw, 1066px\" \/><\/figure>\n\n\n\n<h4 class=\"wp-block-heading\">Setup Integrations for DELETE Route<\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Go to <strong>Integrations<\/strong>, select <strong>Manage Integrations<\/strong>, and click <strong>Create<\/strong><\/li>\n\n\n\n<li><strong>Attach to Route<\/strong>: DELETE <code>\/product\/{id}<\/code><\/li>\n\n\n\n<li><strong>Integration Target<\/strong>: Lambda function <\/li>\n\n\n\n<li><strong>Lambda Function<\/strong>: Select <code>deleteProduct<\/code><\/li>\n\n\n\n<li><strong>Set Invoke Permissions<\/strong>\n<ul class=\"wp-block-list\">\n<li><strong>Invoke Permissions<\/strong>: Keep enabled<\/li>\n\n\n\n<li>This grants API Gateway permission to invoke our Lambda function while creates the necessary IAM permissions automatically<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Click <strong>Create<\/strong><\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1066\" height=\"941\" src=\"https:\/\/ichwanchandra.com\/blog\/wp-content\/uploads\/2026\/04\/image-34.png\" alt=\"\" class=\"wp-image-3332\" srcset=\"https:\/\/ichwanchandra.com\/blog\/wp-content\/uploads\/2026\/04\/image-34.png 1066w, https:\/\/ichwanchandra.com\/blog\/wp-content\/uploads\/2026\/04\/image-34-300x265.png 300w, https:\/\/ichwanchandra.com\/blog\/wp-content\/uploads\/2026\/04\/image-34-1024x904.png 1024w, https:\/\/ichwanchandra.com\/blog\/wp-content\/uploads\/2026\/04\/image-34-768x678.png 768w\" sizes=\"auto, (max-width: 1066px) 100vw, 1066px\" \/><\/figure>\n\n\n\n<div style=\"height:40px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">POST Route Setup (CREATE)<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Go to <strong>API Gateway<\/strong>, select <strong>Routes<\/strong>, click <strong>Create Route<\/strong><\/li>\n\n\n\n<li><strong>Method<\/strong>: POST<\/li>\n\n\n\n<li><strong>Resource Path<\/strong>: <code>\/product<\/code><\/li>\n\n\n\n<li><strong>Purpose<\/strong>: Delete specific product item by ID<\/li>\n\n\n\n<li>Click <strong>Create<\/strong><\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1066\" height=\"351\" src=\"https:\/\/ichwanchandra.com\/blog\/wp-content\/uploads\/2026\/04\/image-35.png\" alt=\"\" class=\"wp-image-3334\" srcset=\"https:\/\/ichwanchandra.com\/blog\/wp-content\/uploads\/2026\/04\/image-35.png 1066w, https:\/\/ichwanchandra.com\/blog\/wp-content\/uploads\/2026\/04\/image-35-300x99.png 300w, https:\/\/ichwanchandra.com\/blog\/wp-content\/uploads\/2026\/04\/image-35-1024x337.png 1024w, https:\/\/ichwanchandra.com\/blog\/wp-content\/uploads\/2026\/04\/image-35-768x253.png 768w\" sizes=\"auto, (max-width: 1066px) 100vw, 1066px\" \/><\/figure>\n\n\n\n<h4 class=\"wp-block-heading\">Setup Integrations for POST Route<\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Go to <strong>Integrations<\/strong>, select <strong>Manage Integrations<\/strong>, and click <strong>Create<\/strong><\/li>\n\n\n\n<li><strong>Attach to Route<\/strong>: POST <code>\/product<\/code><\/li>\n\n\n\n<li><strong>Integration Target<\/strong>: Lambda function <\/li>\n\n\n\n<li><strong>Lambda Function<\/strong>: Select <code>addProduct<\/code><\/li>\n\n\n\n<li><strong>Set Invoke Permissions<\/strong>\n<ul class=\"wp-block-list\">\n<li><strong>Invoke Permissions<\/strong>: Keep enabled<\/li>\n\n\n\n<li>This grants API Gateway permission to invoke our Lambda function while creates the necessary IAM permissions automatically<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Click <strong>Create<\/strong><\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1066\" height=\"998\" src=\"https:\/\/ichwanchandra.com\/blog\/wp-content\/uploads\/2026\/04\/image-36.png\" alt=\"\" class=\"wp-image-3335\" srcset=\"https:\/\/ichwanchandra.com\/blog\/wp-content\/uploads\/2026\/04\/image-36.png 1066w, https:\/\/ichwanchandra.com\/blog\/wp-content\/uploads\/2026\/04\/image-36-300x281.png 300w, https:\/\/ichwanchandra.com\/blog\/wp-content\/uploads\/2026\/04\/image-36-1024x959.png 1024w, https:\/\/ichwanchandra.com\/blog\/wp-content\/uploads\/2026\/04\/image-36-768x719.png 768w\" sizes=\"auto, (max-width: 1066px) 100vw, 1066px\" \/><\/figure>\n\n\n\n<div style=\"height:40px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">API Routes Summary<\/h3>\n\n\n\n<p>So far our API routes should be similar with something like this:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><td><strong>HTTP Methods<\/strong><\/td><td><strong>Route Paths<\/strong><\/td><td><strong>Lambda Functions<\/strong><\/td><td><strong>Operations<\/strong><\/td><\/tr><tr><td>GET<\/td><td>\/product<\/td><td>getProduct<\/td><td>Get all products<\/td><\/tr><tr><td>GET<\/td><td>\/product\/{id}<\/td><td>getProduct<\/td><td>Get specific product<\/td><\/tr><tr><td>PUT<\/td><td>\/product\/{id}<\/td><td>updateProduct<\/td><td>Update existing product<\/td><\/tr><tr><td>DELETE<\/td><td>\/product\/{id}<\/td><td>deleteProduct<\/td><td>Delete specific product<\/td><\/tr><tr><td>POST<\/td><td>\/product<\/td><td>addProduct<\/td><td>Create new product<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Summary<\/h2>\n\n\n\n<p>In this part we have been applying some best practices in setting up Lambda function and security around of it. We have applied RESTful API design based on the CRUD operations with such clear and consistent URL naming with its respective parameter. We also have setup the automatic IAM role for API gateway and also the principle of least privilege so that each integration only has permission to invoke it specific Lambda function.<\/p>\n\n\n\n<p>In the next part, we will develop front-end part via AWS Amplify, test all API endpoints, set error handling, configure CORS, and setup the monitoring and logging.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>In this part, we are going to expose our Lambda functions via API gateway as REST endpoints to allow external applications interact via HTTP requests. In essence, API gateway is the main door for our serverless endpoints while it provides unified interface for all API requests and security with its built-in authentication, authorization, and rate limiting.<\/p>\n","protected":false},"author":1,"featured_media":3415,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[10,20,85,75,8],"tags":[],"class_list":["post-3291","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-aws","category-backend","category-projects","category-system-design","category-technology"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.6 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>AWS Solutions Architect Project (Performance Efficiency Pillar) - Serverless Application - Part 4 - Ichwan Chandra<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/ichwanchandra.com\/blog\/aws-solutions-architect-project-performance-efficiency-part-4\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"AWS Solutions Architect Project (Performance Efficiency Pillar) - Serverless Application - Part 4 - Ichwan Chandra\" \/>\n<meta property=\"og:description\" content=\"In this part, we are going to expose our Lambda functions via API gateway as REST endpoints to allow external applications interact via HTTP requests. In essence, API gateway is the main door for our serverless endpoints while it provides unified interface for all API requests and security with its built-in authentication, authorization, and rate limiting.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/ichwanchandra.com\/blog\/aws-solutions-architect-project-performance-efficiency-part-4\/\" \/>\n<meta property=\"og:site_name\" content=\"Ichwan Chandra\" \/>\n<meta property=\"article:published_time\" content=\"2026-04-10T06:22:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-10-16T07:57:50+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/ichwanchandra.com\/blog\/wp-content\/uploads\/2026\/10\/aws-solutions-architect-project-performance-efficiency-part-4.jpeg\" \/>\n\t<meta property=\"og:image:width\" content=\"1376\" \/>\n\t<meta property=\"og:image:height\" content=\"768\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Ichwan Chandra\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Ichwan Chandra\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"7 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/ichwanchandra.com\\\/blog\\\/aws-solutions-architect-project-performance-efficiency-part-4\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/ichwanchandra.com\\\/blog\\\/aws-solutions-architect-project-performance-efficiency-part-4\\\/\"},\"author\":{\"name\":\"Ichwan Chandra\",\"@id\":\"https:\\\/\\\/ichwanchandra.com\\\/blog\\\/#\\\/schema\\\/person\\\/2fa69a7a1008a3369584752194b063d5\"},\"headline\":\"AWS Solutions Architect Project (Performance Efficiency Pillar) &#8211; Serverless Application &#8211; Part 4\",\"datePublished\":\"2026-04-10T06:22:00+00:00\",\"dateModified\":\"2026-10-16T07:57:50+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/ichwanchandra.com\\\/blog\\\/aws-solutions-architect-project-performance-efficiency-part-4\\\/\"},\"wordCount\":706,\"image\":{\"@id\":\"https:\\\/\\\/ichwanchandra.com\\\/blog\\\/aws-solutions-architect-project-performance-efficiency-part-4\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/ichwanchandra.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/10\\\/aws-solutions-architect-project-performance-efficiency-part-4.jpeg\",\"articleSection\":[\"AWS\",\"Backend\",\"Projects\",\"System Design\",\"Technology\"],\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/ichwanchandra.com\\\/blog\\\/aws-solutions-architect-project-performance-efficiency-part-4\\\/\",\"url\":\"https:\\\/\\\/ichwanchandra.com\\\/blog\\\/aws-solutions-architect-project-performance-efficiency-part-4\\\/\",\"name\":\"AWS Solutions Architect Project (Performance Efficiency Pillar) - Serverless Application - Part 4 - Ichwan Chandra\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/ichwanchandra.com\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/ichwanchandra.com\\\/blog\\\/aws-solutions-architect-project-performance-efficiency-part-4\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/ichwanchandra.com\\\/blog\\\/aws-solutions-architect-project-performance-efficiency-part-4\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/ichwanchandra.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/10\\\/aws-solutions-architect-project-performance-efficiency-part-4.jpeg\",\"datePublished\":\"2026-04-10T06:22:00+00:00\",\"dateModified\":\"2026-10-16T07:57:50+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/ichwanchandra.com\\\/blog\\\/#\\\/schema\\\/person\\\/2fa69a7a1008a3369584752194b063d5\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/ichwanchandra.com\\\/blog\\\/aws-solutions-architect-project-performance-efficiency-part-4\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/ichwanchandra.com\\\/blog\\\/aws-solutions-architect-project-performance-efficiency-part-4\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/ichwanchandra.com\\\/blog\\\/aws-solutions-architect-project-performance-efficiency-part-4\\\/#primaryimage\",\"url\":\"https:\\\/\\\/ichwanchandra.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/10\\\/aws-solutions-architect-project-performance-efficiency-part-4.jpeg\",\"contentUrl\":\"https:\\\/\\\/ichwanchandra.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/10\\\/aws-solutions-architect-project-performance-efficiency-part-4.jpeg\",\"width\":1376,\"height\":768},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/ichwanchandra.com\\\/blog\\\/aws-solutions-architect-project-performance-efficiency-part-4\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/ichwanchandra.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"AWS Solutions Architect Project (Performance Efficiency Pillar) &#8211; Serverless Application &#8211; Part 4\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/ichwanchandra.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/ichwanchandra.com\\\/blog\\\/\",\"name\":\"Ichwan Chandra\",\"description\":\"In a lifelong learning mode\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/ichwanchandra.com\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/ichwanchandra.com\\\/blog\\\/#\\\/schema\\\/person\\\/2fa69a7a1008a3369584752194b063d5\",\"name\":\"Ichwan Chandra\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/8d8d64c76e361108ee058442df7c49c539eefd1d1e5a3e8dbcc9d70289e0bbf2?s=96&d=retro&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/8d8d64c76e361108ee058442df7c49c539eefd1d1e5a3e8dbcc9d70289e0bbf2?s=96&d=retro&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/8d8d64c76e361108ee058442df7c49c539eefd1d1e5a3e8dbcc9d70289e0bbf2?s=96&d=retro&r=g\",\"caption\":\"Ichwan Chandra\"},\"sameAs\":[\"https:\\\/\\\/ichwanchandra.com\\\/blog\"],\"url\":\"https:\\\/\\\/ichwanchandra.com\\\/blog\\\/author\\\/isuchan193\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"AWS Solutions Architect Project (Performance Efficiency Pillar) - Serverless Application - Part 4 - Ichwan Chandra","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/ichwanchandra.com\/blog\/aws-solutions-architect-project-performance-efficiency-part-4\/","og_locale":"en_US","og_type":"article","og_title":"AWS Solutions Architect Project (Performance Efficiency Pillar) - Serverless Application - Part 4 - Ichwan Chandra","og_description":"In this part, we are going to expose our Lambda functions via API gateway as REST endpoints to allow external applications interact via HTTP requests. In essence, API gateway is the main door for our serverless endpoints while it provides unified interface for all API requests and security with its built-in authentication, authorization, and rate limiting.","og_url":"https:\/\/ichwanchandra.com\/blog\/aws-solutions-architect-project-performance-efficiency-part-4\/","og_site_name":"Ichwan Chandra","article_published_time":"2026-04-10T06:22:00+00:00","article_modified_time":"2026-10-16T07:57:50+00:00","og_image":[{"width":1376,"height":768,"url":"https:\/\/ichwanchandra.com\/blog\/wp-content\/uploads\/2026\/10\/aws-solutions-architect-project-performance-efficiency-part-4.jpeg","type":"image\/jpeg"}],"author":"Ichwan Chandra","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Ichwan Chandra","Est. reading time":"7 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/ichwanchandra.com\/blog\/aws-solutions-architect-project-performance-efficiency-part-4\/#article","isPartOf":{"@id":"https:\/\/ichwanchandra.com\/blog\/aws-solutions-architect-project-performance-efficiency-part-4\/"},"author":{"name":"Ichwan Chandra","@id":"https:\/\/ichwanchandra.com\/blog\/#\/schema\/person\/2fa69a7a1008a3369584752194b063d5"},"headline":"AWS Solutions Architect Project (Performance Efficiency Pillar) &#8211; Serverless Application &#8211; Part 4","datePublished":"2026-04-10T06:22:00+00:00","dateModified":"2026-10-16T07:57:50+00:00","mainEntityOfPage":{"@id":"https:\/\/ichwanchandra.com\/blog\/aws-solutions-architect-project-performance-efficiency-part-4\/"},"wordCount":706,"image":{"@id":"https:\/\/ichwanchandra.com\/blog\/aws-solutions-architect-project-performance-efficiency-part-4\/#primaryimage"},"thumbnailUrl":"https:\/\/ichwanchandra.com\/blog\/wp-content\/uploads\/2026\/10\/aws-solutions-architect-project-performance-efficiency-part-4.jpeg","articleSection":["AWS","Backend","Projects","System Design","Technology"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/ichwanchandra.com\/blog\/aws-solutions-architect-project-performance-efficiency-part-4\/","url":"https:\/\/ichwanchandra.com\/blog\/aws-solutions-architect-project-performance-efficiency-part-4\/","name":"AWS Solutions Architect Project (Performance Efficiency Pillar) - Serverless Application - Part 4 - Ichwan Chandra","isPartOf":{"@id":"https:\/\/ichwanchandra.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/ichwanchandra.com\/blog\/aws-solutions-architect-project-performance-efficiency-part-4\/#primaryimage"},"image":{"@id":"https:\/\/ichwanchandra.com\/blog\/aws-solutions-architect-project-performance-efficiency-part-4\/#primaryimage"},"thumbnailUrl":"https:\/\/ichwanchandra.com\/blog\/wp-content\/uploads\/2026\/10\/aws-solutions-architect-project-performance-efficiency-part-4.jpeg","datePublished":"2026-04-10T06:22:00+00:00","dateModified":"2026-10-16T07:57:50+00:00","author":{"@id":"https:\/\/ichwanchandra.com\/blog\/#\/schema\/person\/2fa69a7a1008a3369584752194b063d5"},"breadcrumb":{"@id":"https:\/\/ichwanchandra.com\/blog\/aws-solutions-architect-project-performance-efficiency-part-4\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/ichwanchandra.com\/blog\/aws-solutions-architect-project-performance-efficiency-part-4\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/ichwanchandra.com\/blog\/aws-solutions-architect-project-performance-efficiency-part-4\/#primaryimage","url":"https:\/\/ichwanchandra.com\/blog\/wp-content\/uploads\/2026\/10\/aws-solutions-architect-project-performance-efficiency-part-4.jpeg","contentUrl":"https:\/\/ichwanchandra.com\/blog\/wp-content\/uploads\/2026\/10\/aws-solutions-architect-project-performance-efficiency-part-4.jpeg","width":1376,"height":768},{"@type":"BreadcrumbList","@id":"https:\/\/ichwanchandra.com\/blog\/aws-solutions-architect-project-performance-efficiency-part-4\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/ichwanchandra.com\/blog\/"},{"@type":"ListItem","position":2,"name":"AWS Solutions Architect Project (Performance Efficiency Pillar) &#8211; Serverless Application &#8211; Part 4"}]},{"@type":"WebSite","@id":"https:\/\/ichwanchandra.com\/blog\/#website","url":"https:\/\/ichwanchandra.com\/blog\/","name":"Ichwan Chandra","description":"In a lifelong learning mode","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/ichwanchandra.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/ichwanchandra.com\/blog\/#\/schema\/person\/2fa69a7a1008a3369584752194b063d5","name":"Ichwan Chandra","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/8d8d64c76e361108ee058442df7c49c539eefd1d1e5a3e8dbcc9d70289e0bbf2?s=96&d=retro&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/8d8d64c76e361108ee058442df7c49c539eefd1d1e5a3e8dbcc9d70289e0bbf2?s=96&d=retro&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/8d8d64c76e361108ee058442df7c49c539eefd1d1e5a3e8dbcc9d70289e0bbf2?s=96&d=retro&r=g","caption":"Ichwan Chandra"},"sameAs":["https:\/\/ichwanchandra.com\/blog"],"url":"https:\/\/ichwanchandra.com\/blog\/author\/isuchan193\/"}]}},"_links":{"self":[{"href":"https:\/\/ichwanchandra.com\/blog\/wp-json\/wp\/v2\/posts\/3291","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/ichwanchandra.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/ichwanchandra.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/ichwanchandra.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/ichwanchandra.com\/blog\/wp-json\/wp\/v2\/comments?post=3291"}],"version-history":[{"count":32,"href":"https:\/\/ichwanchandra.com\/blog\/wp-json\/wp\/v2\/posts\/3291\/revisions"}],"predecessor-version":[{"id":3348,"href":"https:\/\/ichwanchandra.com\/blog\/wp-json\/wp\/v2\/posts\/3291\/revisions\/3348"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/ichwanchandra.com\/blog\/wp-json\/wp\/v2\/media\/3415"}],"wp:attachment":[{"href":"https:\/\/ichwanchandra.com\/blog\/wp-json\/wp\/v2\/media?parent=3291"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/ichwanchandra.com\/blog\/wp-json\/wp\/v2\/categories?post=3291"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/ichwanchandra.com\/blog\/wp-json\/wp\/v2\/tags?post=3291"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}