{"id":57852,"date":"2023-08-01T06:37:32","date_gmt":"2023-08-01T01:07:32","guid":{"rendered":"https:\/\/www.tothenew.com\/blog\/?p=57852"},"modified":"2023-08-09T16:22:56","modified_gmt":"2023-08-09T10:52:56","slug":"creating-production-grade-microservices-architecture-on-aws-eks","status":"publish","type":"post","link":"https:\/\/www.tothenew.com\/blog\/creating-production-grade-microservices-architecture-on-aws-eks\/","title":{"rendered":"Creating Production Grade Microservices Architecture on AWS EKS"},"content":{"rendered":"<h2><span style=\"font-weight: 400;\">Introduction<\/span><\/h2>\n<p style=\"text-align: left;\"><span style=\"font-weight: 400;\">The main goal of this blog is to provide production-grade best practices for Microservices Infra in a way to implement the entire system easily on your own. You\u2019ll see what an end-to-end solution looks like, including how to combine Kubernetes, AWS VPCs, data stores, CI\/CD, secrets management, and a whole lot more to deploy your applications for companies that need reliable infrastructure for production use cases.<\/span><\/p>\n<h2><span style=\"font-weight: 400;\">Base Infra Setup<\/span><\/h2>\n<p><span style=\"font-weight: 400;\">This repo creates a bundle of resources that are required before we can start building infrastructure for our application basically your n\/w layer i.e.<\/span><\/p>\n<ul>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">VPC<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">NAT Gateways<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Subnets<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Internet Gateway<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Attach diff &#8211; diff routes that you would need\u00a0<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Create required IAM Roles<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Terraform Server<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Jenkins Server &#8211; to run terraform scripts for your application<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">S3 Buckets<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">DynamoDB tables<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">&amp; all those things that you would need eventually for Terraform to work.<\/span><\/li>\n<\/ul>\n<p><span style=\"font-weight: 400;\">Link: <\/span><a href=\"https:\/\/github.com\/tothenew\/terraform-basic-setup\"><span style=\"font-weight: 400;\">https:\/\/github.com\/tothenew\/terraform-basic-setup<\/span><\/a><\/p>\n<p><img decoding=\"async\" loading=\"lazy\" class=\"aligncenter size-full wp-image-57847\" src=\"\/blog\/wp-ttn-blog\/uploads\/2023\/07\/Screenshot-2023-07-31-at-14.53.30.png\" alt=\"\" width=\"2388\" height=\"1172\" srcset=\"\/blog\/wp-ttn-blog\/uploads\/2023\/07\/Screenshot-2023-07-31-at-14.53.30.png 2388w, \/blog\/wp-ttn-blog\/uploads\/2023\/07\/Screenshot-2023-07-31-at-14.53.30-300x147.png 300w, \/blog\/wp-ttn-blog\/uploads\/2023\/07\/Screenshot-2023-07-31-at-14.53.30-1024x503.png 1024w, \/blog\/wp-ttn-blog\/uploads\/2023\/07\/Screenshot-2023-07-31-at-14.53.30-768x377.png 768w, \/blog\/wp-ttn-blog\/uploads\/2023\/07\/Screenshot-2023-07-31-at-14.53.30-1536x754.png 1536w, \/blog\/wp-ttn-blog\/uploads\/2023\/07\/Screenshot-2023-07-31-at-14.53.30-2048x1005.png 2048w, \/blog\/wp-ttn-blog\/uploads\/2023\/07\/Screenshot-2023-07-31-at-14.53.30-624x306.png 624w\" sizes=\"(max-width: 2388px) 100vw, 2388px\" \/><\/p>\n<p>First, copy the above repo into the client\u2019s\/customer\u2019s repo. For e.g. let\u2019s say Rahul is a client in his organization. In very few words, we will import this repo, modify some parameters based on the client, and then execute this terraform. We are using this repo as the template for our base setup.<\/p>\n<ul>\n<li><span data-preserver-spaces=\"true\">Keep your repo private.<\/span><\/li>\n<li><span data-preserver-spaces=\"true\">Import the repo using the above link in your git repository. For this guide, we will be following below naming convention i.e.<\/span><\/li>\n<\/ul>\n<pre><span style=\"font-weight: 400;\">infra-&lt;git-org-name\/client-name&gt;-base<\/span><\/pre>\n<ul>\n<li><span style=\"font-weight: 400;\">Once the repo is imported. Clone the same on your machine.<\/span><\/li>\n<\/ul>\n<pre><span style=\"font-weight: 400;\">git <\/span><span style=\"font-weight: 400;\">clone<\/span><span style=\"font-weight: 400;\"> &lt;your-repo-url&gt;\r\n<\/span><\/pre>\n<ul>\n<li><span style=\"font-weight: 400;\">The only prerequisite tools for this solution are \u201cmake\u201d &amp; \u201cdocker\u201d which are already installed in all modern systems. <\/span>Copy the template of the repo &amp; create a repo for yourself.<\/li>\n<\/ul>\n<p><span style=\"font-weight: 400;\">Update the config.yml:<\/span><\/p>\n<ul>\n<li><strong><span data-preserver-spaces=\"true\">account_name:<\/span><\/strong><span data-preserver-spaces=\"true\">\u00a0How are you going to refer to resources bundled in this logical namespace?\u00a0<\/span><\/li>\n<li><strong><span data-preserver-spaces=\"true\">account_id:<\/span><\/strong><span data-preserver-spaces=\"true\">\u00a0The account id of your AWS account but is not getting used anywhere; this is just for ease of reference &amp; to set mapping to your account_name.<\/span><\/li>\n<li><strong><span data-preserver-spaces=\"true\">project_name<\/span><\/strong><span data-preserver-spaces=\"true\">:<\/span><\/li>\n<li><strong><span data-preserver-spaces=\"true\">client name<\/span><\/strong><span data-preserver-spaces=\"true\">\u00a0i.e. &lt;git-org-name\/client-name&gt;. E.g., if multiple clients are in one account, then the project name would be the same, but the client names would be different.\u00a0<\/span><\/li>\n<li><span data-preserver-spaces=\"true\">All uncommon variables required to run our infra will be passed as shown in config.yml. For a detailed example, visit\u00a0<\/span><a class=\"editor-rtfLink\" href=\"https:\/\/github.com\/tothenew\/infra-tothenew-apps\/blob\/main\/example\/config-testproject-us-west-1.yml\" target=\"_blank\" rel=\"noopener\"><span data-preserver-spaces=\"true\">the link<\/span><\/a><span data-preserver-spaces=\"true\">.<\/span><\/li>\n<li><span data-preserver-spaces=\"true\">Now to run this, first export on which \u201cworkspace\u201d you want to run it &amp; then run \u201cmake init\u201d as shown below:<\/span><\/li>\n<\/ul>\n<pre><span style=\"font-weight: 400;\">export WORKSPACE=nonprod-us-west-1-default\r\nmake init\r\n<\/span><\/pre>\n<p><span style=\"font-weight: 400;\">Now, run \u201cmake plan\u201d<\/span><\/p>\n<pre><span style=\"font-weight: 400;\">make plan\r\n<\/span><\/pre>\n<p><span style=\"font-weight: 400;\">This will create 63 resources in total. To name few major ones are mentioned below:<\/span><\/p>\n<ul>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Jenkins-Master Server<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Terraform EC2 Agent &#8211; (Terraform will run from this ec2 instance created by the base infra.)<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Network Resources<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Some IAM Roles<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">1 S3 Bucket<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Subnets<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">DynamoDB<\/span><\/li>\n<\/ul>\n<p><span style=\"font-weight: 400;\">Every time we execute \u201cmake plan\u201d it will store the planned output in \u201c.terraform-plan-nonprod-us-west-1-default\u201d &amp; use this plan to \u201capply.\u201d<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Now, run \u201cmake apply\u201d<\/span><\/p>\n<pre><span style=\"font-weight: 400;\">make apply<\/span><\/pre>\n<p><span style=\"font-weight: 400;\">Once \u201cmake apply\u201d has finished creating all 63 resources, the base infrastructure is ready, which you will need before starting the actual infrastructure creation.<br \/>\n<\/span><\/p>\n<p><span style=\"font-weight: 400;\"> <img decoding=\"async\" loading=\"lazy\" class=\"aligncenter size-full wp-image-57848\" src=\"\/blog\/wp-ttn-blog\/uploads\/2023\/07\/Screenshot-2023-07-31-at-15.07.37.png\" alt=\"\" width=\"2428\" height=\"304\" srcset=\"\/blog\/wp-ttn-blog\/uploads\/2023\/07\/Screenshot-2023-07-31-at-15.07.37.png 2428w, \/blog\/wp-ttn-blog\/uploads\/2023\/07\/Screenshot-2023-07-31-at-15.07.37-300x38.png 300w, \/blog\/wp-ttn-blog\/uploads\/2023\/07\/Screenshot-2023-07-31-at-15.07.37-1024x128.png 1024w, \/blog\/wp-ttn-blog\/uploads\/2023\/07\/Screenshot-2023-07-31-at-15.07.37-768x96.png 768w, \/blog\/wp-ttn-blog\/uploads\/2023\/07\/Screenshot-2023-07-31-at-15.07.37-1536x192.png 1536w, \/blog\/wp-ttn-blog\/uploads\/2023\/07\/Screenshot-2023-07-31-at-15.07.37-2048x256.png 2048w, \/blog\/wp-ttn-blog\/uploads\/2023\/07\/Screenshot-2023-07-31-at-15.07.37-624x78.png 624w\" sizes=\"(max-width: 2428px) 100vw, 2428px\" \/> <\/span><\/p>\n<p><span style=\"font-weight: 400;\">BASE INFRA is created. Do Not Forget to commit back everything to your git repository, including state-file, as your state file will be local.<\/span><\/p>\n<h2><span style=\"font-weight: 400;\">Setup Application Infrastructure<\/span><\/h2>\n<p><img decoding=\"async\" loading=\"lazy\" class=\"aligncenter size-full wp-image-57849\" src=\"\/blog\/wp-ttn-blog\/uploads\/2023\/07\/Screenshot-2023-07-31-at-15.09.08.png\" alt=\"\" width=\"2444\" height=\"976\" srcset=\"\/blog\/wp-ttn-blog\/uploads\/2023\/07\/Screenshot-2023-07-31-at-15.09.08.png 2444w, \/blog\/wp-ttn-blog\/uploads\/2023\/07\/Screenshot-2023-07-31-at-15.09.08-300x120.png 300w, \/blog\/wp-ttn-blog\/uploads\/2023\/07\/Screenshot-2023-07-31-at-15.09.08-1024x409.png 1024w, \/blog\/wp-ttn-blog\/uploads\/2023\/07\/Screenshot-2023-07-31-at-15.09.08-768x307.png 768w, \/blog\/wp-ttn-blog\/uploads\/2023\/07\/Screenshot-2023-07-31-at-15.09.08-1536x613.png 1536w, \/blog\/wp-ttn-blog\/uploads\/2023\/07\/Screenshot-2023-07-31-at-15.09.08-2048x818.png 2048w, \/blog\/wp-ttn-blog\/uploads\/2023\/07\/Screenshot-2023-07-31-at-15.09.08-624x249.png 624w\" sizes=\"(max-width: 2444px) 100vw, 2444px\" \/><\/p>\n<p><span style=\"font-weight: 400;\">Link: <\/span><a href=\"https:\/\/github.com\/tothenew\/infra-tothenew-apps\"><span style=\"font-weight: 400;\">https:\/\/github.com\/tothenew\/infra-tothenew-apps<\/span><\/a><\/p>\n<p><span style=\"font-weight: 400;\">Import the above repo as we did earlier for base infrastructure.<\/span><span style=\"font-weight: 400;\">Now, we will connect to terraform agent instance, which we created in base-infra.<\/span><\/p>\n<p><img decoding=\"async\" loading=\"lazy\" class=\"aligncenter size-full wp-image-57850\" src=\"\/blog\/wp-ttn-blog\/uploads\/2023\/07\/Screenshot-2023-07-31-at-15.11.05.png\" alt=\"\" width=\"2214\" height=\"1064\" srcset=\"\/blog\/wp-ttn-blog\/uploads\/2023\/07\/Screenshot-2023-07-31-at-15.11.05.png 2214w, \/blog\/wp-ttn-blog\/uploads\/2023\/07\/Screenshot-2023-07-31-at-15.11.05-300x144.png 300w, \/blog\/wp-ttn-blog\/uploads\/2023\/07\/Screenshot-2023-07-31-at-15.11.05-1024x492.png 1024w, \/blog\/wp-ttn-blog\/uploads\/2023\/07\/Screenshot-2023-07-31-at-15.11.05-768x369.png 768w, \/blog\/wp-ttn-blog\/uploads\/2023\/07\/Screenshot-2023-07-31-at-15.11.05-1536x738.png 1536w, \/blog\/wp-ttn-blog\/uploads\/2023\/07\/Screenshot-2023-07-31-at-15.11.05-2048x984.png 2048w, \/blog\/wp-ttn-blog\/uploads\/2023\/07\/Screenshot-2023-07-31-at-15.11.05-624x300.png 624w\" sizes=\"(max-width: 2214px) 100vw, 2214px\" \/><\/p>\n<p><span style=\"font-weight: 400;\">Base Infrastructure can be created from anywhere as it doesn\u2019t need any VPC, Subnet, or any other required resources as a pre-requisite. <\/span><span style=\"font-weight: 400;\">But, this infrastructure\/application that we are about to create needs to be created from terraform agent instance as in our code, the resources being used would need to connect with different components like rabbitMQ, RDS, and EKS private cluster.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Each VPC would need to have a terraform agent server. <\/span><span style=\"font-weight: 400;\">For any new setup, we will clone the repo inside the client\u2019s account:<\/span><\/p>\n<ol>\n<li><span style=\"font-weight: 400;\">Base Infra:<\/span>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li style=\"font-weight: 400;\" aria-level=\"2\"><span style=\"font-weight: 400;\">The state file will be committed back in git. So, make sure to create only those resources in which we aren\u2019t generating any secrets.<\/span><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<li><span style=\"font-weight: 400;\">&lt;app-name&gt;-Infra<\/span>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li style=\"font-weight: 400;\" aria-level=\"2\"><span style=\"font-weight: 400;\">Actual Infrastructure resources are created here, where applications would be deployed post-creation of base infrastructure.<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"2\"><span style=\"font-weight: 400;\">&lt;app-name&gt; is project\/environment\/product.<\/span><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<li><span style=\"font-weight: 400;\">Update config.yml for &lt;app&gt;-infra, with your details like:<\/span><\/li>\n<li style=\"list-style-type: none;\">\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li aria-level=\"2\">Role<\/li>\n<li aria-level=\"2\">region<\/li>\n<li aria-level=\"2\">Project_name<\/li>\n<li aria-level=\"2\">Envinoment_name<\/li>\n<li aria-level=\"2\">Any other changes that you desire<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<p><span style=\"font-weight: 400;\">\u00a0 4. Export workspace &amp; execute \u201cmake init\u201d.<\/span><\/p>\n<pre><span style=\"font-weight: 400;\">export<\/span><span style=\"font-weight: 400;\"> WORKSPACE=nonprod-us-west-1-qa<\/span>\r\n<span style=\"font-weight: 400;\">make init<\/span><\/pre>\n<p><span style=\"font-weight: 400;\">\u00a0 5. After initialization, execute \u201cmake plan\u201d.<\/span><\/p>\n<pre><span style=\"font-weight: 400;\">make plan<\/span><\/pre>\n<p><span style=\"font-weight: 400;\">\u00a06. Update Bucket Name in \u201c_settings.tf\u201d &amp; execute \u201cmake init plan\u201d<\/span><\/p>\n<pre><span style=\"font-weight: 400;\">make init plan<\/span><\/pre>\n<p><span style=\"font-weight: 400;\">\u00a0 7. Run \u201cmake apply\u201d<\/span><\/p>\n<pre><span style=\"font-weight: 400;\">make apply\r\n<\/span><\/pre>\n<p><span style=\"font-weight: 400;\">\u00a0 8. Setup Application Infra is provisioned with a basic monitoring stack already installed in it with Prometheus &amp; node exporter. We can deploy a sample application now.<\/span><\/p>\n<h2><span style=\"font-weight: 400;\">Deploy Sample Application\u00a0<\/span><\/h2>\n<h3><span style=\"text-decoration: underline;\"><span style=\"font-weight: 400;\">ArgoCD<\/span><\/span><\/h3>\n<p><span style=\"font-weight: 400;\">Once the application infra is created, you can add more addons like argoCD; we already have some examples ready in the \u201cmore-examples\u201d directory; you can copy from it &amp; initialize again.<\/span><\/p>\n<pre><span style=\"font-weight: 400;\">cp &lt;cloned repo&gt;\/more-examples\/argocd.tf &lt;cloned repo&gt;\/\r\n<\/span><\/pre>\n<p><img decoding=\"async\" loading=\"lazy\" class=\"aligncenter size-full wp-image-57851\" src=\"\/blog\/wp-ttn-blog\/uploads\/2023\/07\/Screenshot-2023-07-31-at-15.18.18.png\" alt=\"\" width=\"2412\" height=\"136\" srcset=\"\/blog\/wp-ttn-blog\/uploads\/2023\/07\/Screenshot-2023-07-31-at-15.18.18.png 2412w, \/blog\/wp-ttn-blog\/uploads\/2023\/07\/Screenshot-2023-07-31-at-15.18.18-300x17.png 300w, \/blog\/wp-ttn-blog\/uploads\/2023\/07\/Screenshot-2023-07-31-at-15.18.18-1024x58.png 1024w, \/blog\/wp-ttn-blog\/uploads\/2023\/07\/Screenshot-2023-07-31-at-15.18.18-768x43.png 768w, \/blog\/wp-ttn-blog\/uploads\/2023\/07\/Screenshot-2023-07-31-at-15.18.18-1536x87.png 1536w, \/blog\/wp-ttn-blog\/uploads\/2023\/07\/Screenshot-2023-07-31-at-15.18.18-2048x115.png 2048w, \/blog\/wp-ttn-blog\/uploads\/2023\/07\/Screenshot-2023-07-31-at-15.18.18-624x35.png 624w\" sizes=\"(max-width: 2412px) 100vw, 2412px\" \/><\/p>\n<pre><span style=\"font-weight: 400;\">export<\/span><span style=\"font-weight: 400;\"> WORKSPACE=nonprod-us-west1-qa<\/span> \r\n<span style=\"font-weight: 400;\">make init<\/span><\/pre>\n<p><span style=\"font-weight: 400;\">Run \u201cmake plan apply\u201d<\/span><\/p>\n<pre><span style=\"font-weight: 400;\">make plan apply\r\n<\/span><\/pre>\n<p><span style=\"font-weight: 400;\">We have scripts inside the docker container in the more-examples directory which you can use to get endpoint &amp; creds by passing app-name, region &amp; role-arn as the arguments.<\/span><\/p>\n<pre><span style=\"font-weight: 400;\">cat more-examples\/getArgo.sh<\/span><\/pre>\n<p><span style=\"font-weight: 400;\">Using endpoint &amp; creds we can access argoCD Console. Till here infrastructure setup is done. Now if you want to deploy an application. <\/span><\/p>\n<h3><span style=\"text-decoration: underline;\"><span style=\"font-weight: 400;\">Sample Application<\/span><\/span><\/h3>\n<p><span style=\"font-weight: 400;\">Go to Link: <\/span><a href=\"https:\/\/github.com\/tothenew\/tothenew-sample-helm-app\"><span style=\"font-weight: 400;\">https:\/\/github.com\/tothenew\/tothenew-sample-helm-app<\/span><\/a><\/p>\n<ul>\n<li><span data-preserver-spaces=\"true\">Open argoCD from the previous steps. And, In ArgoCD go to Settings -&gt; Repositories -&gt; Connect Repo.<\/span><\/li>\n<\/ul>\n<ul>\n<li><span data-preserver-spaces=\"true\">Fill git Repository URL with the above\u00a0<\/span><a class=\"editor-rtfLink\" href=\"https:\/\/github.com\/tothenew\/tothenew-sample-helm-app\" target=\"_blank\" rel=\"noopener\"><span data-preserver-spaces=\"true\">link<\/span><\/a><span data-preserver-spaces=\"true\">\u00a0&amp; click CONNECT. You will see the Connection Status as Successful.<\/span><\/li>\n<\/ul>\n<ul>\n<li><span data-preserver-spaces=\"true\">Go to Applications, select NEW APP fill in details as per your application to deploy it via ArgoCD.<\/span><\/li>\n<\/ul>\n<ul>\n<li><span data-preserver-spaces=\"true\">Click on CREATE &amp; It will get created. Once created, click on the created application.<\/span><\/li>\n<\/ul>\n<ul>\n<li><span data-preserver-spaces=\"true\">Open the app created. Select SYNC &amp; then click SYNCHRONIZE. This will create all required Kubernetes resources basis on the helm chart.<\/span><\/li>\n<\/ul>\n<ul>\n<li><span data-preserver-spaces=\"true\">Click on nginx-app-ingress. Scroll down to copy the load balancer ingress hostname &amp; you can access your application via the same.<\/span><\/li>\n<\/ul>\n<p><span style=\"font-weight: 400;\">If you execute &amp; run it as is, you will have your infrastructure ready more or less with all the best practices which you should follow for a microservice architecture.<\/span><\/p>\n<h2><span style=\"font-weight: 400;\">Conclusion<\/span><\/h2>\n<p><span style=\"font-weight: 400;\">This solution can also be extended further to solve the remaining requirements (if any) per your use case. <\/span><span style=\"font-weight: 400;\">We have started using terminologies that we use IaaC to create our Infra. But, what we all are doing is creating a template &amp; then we use that template to launch a stack that is it. It is not really IaaC until &amp; unless we can actually follow the same principle of application development.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">We are in the process of rolling out this Automation Accelerator that we want all of us to use instead of how we have been using IaaC in the past traditionally. We hope it would\u2019ve helped you the way we intended it to. Subscribe to our blogs for further insights.\u00a0<\/span><\/p>\n<p><span style=\"font-weight: 400;\">\u00a0<\/span><\/p>\n<div class=\"ap-custom-wrapper\"><\/div><!--ap-custom-wrapper-->","protected":false},"excerpt":{"rendered":"<p>Introduction The main goal of this blog is to provide production-grade best practices for Microservices Infra in a way to implement the entire system easily on your own. You\u2019ll see what an end-to-end solution looks like, including how to combine Kubernetes, AWS VPCs, data stores, CI\/CD, secrets management, and a whole lot more to deploy [&hellip;]<\/p>\n","protected":false},"author":1388,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"iawp_total_views":133},"categories":[2026,1174,4308,4682,2348,1],"tags":[2930,5308,248,3270,2845,5301,1587,5323,1682,5303,3965,288,2929,1499,5302,5304,1585],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/www.tothenew.com\/blog\/wp-json\/wp\/v2\/posts\/57852"}],"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\/1388"}],"replies":[{"embeddable":true,"href":"https:\/\/www.tothenew.com\/blog\/wp-json\/wp\/v2\/comments?post=57852"}],"version-history":[{"count":12,"href":"https:\/\/www.tothenew.com\/blog\/wp-json\/wp\/v2\/posts\/57852\/revisions"}],"predecessor-version":[{"id":57935,"href":"https:\/\/www.tothenew.com\/blog\/wp-json\/wp\/v2\/posts\/57852\/revisions\/57935"}],"wp:attachment":[{"href":"https:\/\/www.tothenew.com\/blog\/wp-json\/wp\/v2\/media?parent=57852"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.tothenew.com\/blog\/wp-json\/wp\/v2\/categories?post=57852"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.tothenew.com\/blog\/wp-json\/wp\/v2\/tags?post=57852"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}