{"id":6830,"date":"2021-08-31T17:04:53","date_gmt":"2021-08-31T11:34:53","guid":{"rendered":"https:\/\/opstree.com\/blog\/\/?p=6830"},"modified":"2021-08-31T19:04:52","modified_gmt":"2021-08-31T13:34:52","slug":"provisioning-infra-and-deployments-in-aws-using-packer-terraform-and-jenkins","status":"publish","type":"post","link":"https:\/\/opstree.com\/blog\/2021\/08\/31\/provisioning-infra-and-deployments-in-aws-using-packer-terraform-and-jenkins\/","title":{"rendered":"Provisioning Infra and Deployments In AWS : Using Packer, Terraform and Jenkins"},"content":{"rendered":"\n<p class=\"has-text-align-justify\">Why DevOps Rides on Immutable Infrastructure?  The acceptance of \u201cimmutable infrastructure\u201d has emerged as a viable way to improve DevOps processes and culture. By introducing standardisation in application deployment and management, the immutable infrastructure helps, among other things, to foster a better collaborative environment among developers, operations, and other stakeholders.<\/p>\n\n\n\n<p class=\"has-text-align-justify\">Let&#8217;s discuss a bit about Immutable Infra and the benefits which it brings to the table. Once we have a better understanding of it, we&#8217;ll really start to see the use case in our Deployments Model.<\/p>\n\n\n\n<!--more-->\n\n\n\n<h4 class=\"wp-block-heading\">Mutable Flow : <\/h4>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"750\" height=\"259\" src=\"https:\/\/opstree.com\/blog\/\/wp-content\/uploads\/2021\/08\/image-16.png?w=750\" alt=\"\" class=\"wp-image-7960\" \/><\/figure><\/div>\n\n\n\n<h4 class=\"wp-block-heading\">Immutable Flow :<\/h4>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"750\" height=\"259\" src=\"https:\/\/opstree.com\/blog\/\/wp-content\/uploads\/2021\/08\/image-17.png?w=750\" alt=\"\" class=\"wp-image-7962\" \/><\/figure><\/div>\n\n\n\n<p class=\"has-text-align-justify\">The difference is, when we go immutable, we don&#8217;t want to ever upgrade in place as we do in Mutable. An&nbsp;<strong>immutable infrastructure<\/strong>&nbsp;is another infrastructure model in which servers are never modified after they\u2019re deployed. If something needs to be updated, fixed, or modified in any way, new servers built from a custom machine images with the appropriate changes are provisioned to replace the old ones.&nbsp;And, here comes <strong>Packer<\/strong> to create those customized machine images to fit for our need.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Packer<\/h3>\n\n\n\n<p class=\"has-text-align-justify\">Is an open source tool which allows us to create custom identical machine images for multiple platforms from a single source configuration.&nbsp;<\/p>\n\n\n\n<h6 class=\"wp-block-heading\">Packer Template Workflow :<\/h6>\n\n\n\n<p class=\"has-text-align-justify\"><strong>Builders<\/strong>: Are responsible for creating machines and generating images from them for various platforms.<\/p>\n\n\n\n<p class=\"has-text-align-justify\"><strong>Provisioners<\/strong>: Use builtin and third-party software to install and configure the machine image after booting.<\/p>\n\n\n\n<p class=\"has-text-align-justify\"><strong>Post-processors<\/strong>: Are optional, and they can be used to upload artifacts,&nbsp;or to generate outputs of the artifacts build or generated.<\/p>\n\n\n\n<p class=\"has-text-align-center\"><img decoding=\"async\" width=\"609px;\" height=\"332px;\" src=\"https:\/\/lh6.googleusercontent.com\/AnYLAHr44o-dIuA1w2Z5clc-Li63C138HgCfYTuaFpTlIJrmywZowYK4GuLlppf43p736kD22hwgDKUNLT5uX8QEZUzrg5hAOfe9rjxExkINGnwy4LhniIDrJ3a2knQWUQyFJN-phMA=s0\"><\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\"><p><strong>What&#8217;s in the Project<\/strong><\/p><\/blockquote>\n\n\n\n<p class=\"has-text-align-justify\">In this project, we will be baking an AMI using Packer, handling configuration with Bash Script during the baking process to host a static website. We need to make sure nginx is enabled in&nbsp;systemctl&nbsp;and starts on every boot so it is ready to process immediately.&nbsp;And, using Terraform we gonna provision our servers, followed by software release deployment strategies to check and test our infra model.<\/p>\n\n\n\n<p class=\"has-text-align-justify\">The essence is, we will be deploying two versions of our code with two different machine images V1 and V2 to see the purpose of Immutable Infrastructure with Re-Create deployment strategy. <\/p>\n\n\n\n<p><strong>Step 1 <\/strong>: <strong>Setup Packer Template to Generate the AMI<\/strong><\/p>\n\n\n\n<p class=\"has-text-align-justify\">In this step, we are going to create a Packer Template with the use of <strong>Builders for AWS Platform<\/strong> to create AMI, using <strong>Bash Script as Provisioners<\/strong> to configure our machine with the static website page and the restart of our Nginx Service. And, <strong>Post-processors as Manifest<\/strong> type to generate the output.json file to get our AMI ID.<\/p>\n\n\n\n<p class=\"has-text-align-justify\">The template code can be found <a href=\"https:\/\/github.com\/OT-TRAINING\/whizlabs\/tree\/main\/packer\" target=\"_blank\" rel=\"noopener\">here<\/a>. We will be using Jenkins to build the image, the Jenkins file is kept with the code itself. And we will be getting the output.json file as a post-processing step giving us the AMI ID.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large is-resized\"><img decoding=\"async\" src=\"https:\/\/opstree.com\/blog\/\/wp-content\/uploads\/2021\/08\/image-19.png?w=1024\" alt=\"\" class=\"wp-image-7973\" width=\"550\" \/><figcaption>Packer Job Pipeline Dashboard<\/figcaption><\/figure><\/div>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"592\" height=\"348\" src=\"https:\/\/opstree.com\/blog\/\/wp-content\/uploads\/2021\/08\/image-20.png?w=592\" alt=\"\" class=\"wp-image-7975\" \/><figcaption>Output.json generating the build and Artifacts details<\/figcaption><\/figure><\/div>\n\n\n\n<p><strong>Step 2 <\/strong>: <strong>Setup Terraform to<\/strong> <strong>Provision and Deploy our Infra using above AMI<\/strong>&#8216;s<\/p>\n\n\n\n<p class=\"has-text-align-justify\">In this step, we are going to create Terraform manifests to provision our Infra  by creating an Application Load Balancer and, Auto-Scaling Group using Launched Template, in our case will be making use of default network system of AWS account.<\/p>\n\n\n\n<p class=\"has-text-align-justify\">The manifest code can be found <a href=\"https:\/\/github.com\/OT-TRAINING\/whizlabs\/tree\/main\/cd\/tf\" target=\"_blank\" rel=\"noopener\">here<\/a>. The AMI ID is passed to the Launched Template using <code>vars.tf<\/code> to provision and deploy our<strong> V1<\/strong> Application. To run this code we have another <a href=\"https:\/\/github.com\/OT-TRAINING\/whizlabs\/blob\/main\/cd\/tf\/RecreateDeployment.Jenkinsfile\" target=\"_blank\" rel=\"noopener\">Jenkins Pipeline<\/a> job which registers the provisioned computes under the Load Balancer and their desired capacity is managed by ASG.<\/p>\n\n\n\n<div class=\"wp-block-image is-style-default\"><figure class=\"aligncenter size-large is-resized\"><img decoding=\"async\" src=\"https:\/\/opstree.com\/blog\/\/wp-content\/uploads\/2021\/08\/image-22.png?w=1024\" alt=\"\" class=\"wp-image-7981\" width=\"650\" \/><figcaption>Blue Ocean View Of CD pipeline<\/figcaption><\/figure><\/div>\n\n\n\n<p class=\"has-text-align-justify\">If we follow the Pipeline, we have deployed the Basic Infra of our V1 application which can be accessed by the endpoint provided by the Application Load Balancer.<\/p>\n\n\n\n<p>TADA !! Our V1 Application is Ready \ud83d\ude42<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized is-style-default\"><img decoding=\"async\" src=\"https:\/\/opstree.com\/blog\/\/wp-content\/uploads\/2021\/08\/image-23.png?w=1024\" alt=\"\" class=\"wp-image-7982\" width=\"650\" \/><\/figure>\n\n\n\n<p class=\"has-text-align-justify\">As we mentioned above we will be following the Re-Create Deployment Strategy which states: deployment <strong>consists of shutting down V1 then deploying V2 after V1 is turned off<\/strong>.&nbsp;If we follow the Continuous Delivery pipeline of deploying Infra then we will see that it asks for a manual approval of shutting down the V1 infra and deploying the V2 infra, besides V1 AMI we did created our V2 AMI as well at the same time.<\/p>\n\n\n\n<p class=\"has-text-align-justify\">And, once we proceed with the approval of shutting down our V1 Infra, it brings the change to desired capacity of computes to zero for our ASG configuration as follows :<\/p>\n\n\n\n<pre class=\"wp-block-syntaxhighlighter-code\">stage('Bringing down V1 VMs') {\n            input {\n                message \"Shall we bring down V1 VM's?\"\n                ok \"Yes, we should.\"\n            }\n            steps {\n                sh '''\n                cd cd\/tf\n                terraform init\n                terraform validate\n                terraform plan -var='ami_id=ami-xxxxx' -var='min_capacity=0' -var='desired_capacity=0' -out myplan\n                terraform apply --auto-approve myplan\n                '''\n            }\n        }<\/pre>\n\n\n\n<p class=\"has-text-align-justify\">Which deletes the infra of V1 and then start deploying the V2 and register these computes behind our Load Balancer which can be accessed and given O\/P as <\/p>\n\n\n\n<p>TADA !! V2 Application Up and Running \ud83d\ude42<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized is-style-default\"><img decoding=\"async\" src=\"https:\/\/opstree.com\/blog\/\/wp-content\/uploads\/2021\/08\/image-25.png?w=1006\" alt=\"\" class=\"wp-image-7986\" width=\"650\" \/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Conclusion<\/h3>\n\n\n\n<p class=\"has-text-align-justify\">In this blog we have uncovered how Packer and Terraform can remarkably reduce the overhead of revising the pre-configured golden AMIs by the means of IAAC helping us incorporate the entire provisioning in our CI\/CD pipelines empowering the immutable infrastructures.<\/p>\n\n\n\n<p class=\"has-text-align-justify\"><strong>Bonus : <\/strong>The way we had introduced the <strong>Re-create<\/strong> strategy over the post, we have implemented for <a href=\"https:\/\/github.com\/OT-TRAINING\/whizlabs\/blob\/main\/cd\/tf\/RollingDeployment.Jenkinsfile\" target=\"_blank\" rel=\"noopener\">Rolling Strategy <\/a> as well. Do give it a try and share your experience with us in the comment box. <\/p>\n\n\n\n<p>Till then Keep Deploying \ud83d\ude42<\/p>\n\n\n\n<p><strong>  <strong>Blog Pundit:<\/strong> <a href=\"https:\/\/opstree.com\/blog\/\/author\/adeel109\/\">Adeel Ahmad<\/a> <\/strong>and <a href=\"https:\/\/opstree.com\/blog\/\/author\/naveenverma023\/\"><strong>Naveen Verma<\/strong><\/a><\/p>\n\n\n\n<p><a href=\"https:\/\/www.opstree.com\/?utm_source=wordpress&amp;utm_medium=blogpost&amp;utm_campaign=Provisioning+Infra+and+Deployments+In+AWS+%3A+Using+Packer%2C+Terraform+and+Jenkins\" target=\"_blank\" rel=\"noreferrer noopener\">Opstree<\/a> is an End to End DevOps solution provider<\/p>\n\n\n\n<div class=\"wp-block-buttons is-layout-flex wp-block-buttons-is-layout-flex\">\n<div class=\"wp-block-button is-style-fill\"><a class=\"wp-block-button__link\" href=\"https:\/\/www.opstree.com\/contact-us\" target=\"_blank\" rel=\"noreferrer noopener\">CONTACT US<\/a><\/div>\n<\/div>\n\n\n\n<p class=\"has-text-align-center\"><strong>Connect Us <\/strong><\/p>\n\n\n\n<ul class=\"wp-block-social-links aligncenter items-justified-right is-layout-flex wp-block-social-links-is-layout-flex\"><li class=\"wp-social-link wp-social-link-linkedin  wp-block-social-link\"><a href=\"https:\/\/www.linkedin.com\/company\/opstree-solutions\" class=\"wp-block-social-link-anchor\" target=\"_blank\" rel=\"noopener\"><svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M19.7,3H4.3C3.582,3,3,3.582,3,4.3v15.4C3,20.418,3.582,21,4.3,21h15.4c0.718,0,1.3-0.582,1.3-1.3V4.3 C21,3.582,20.418,3,19.7,3z M8.339,18.338H5.667v-8.59h2.672V18.338z M7.004,8.574c-0.857,0-1.549-0.694-1.549-1.548 c0-0.855,0.691-1.548,1.549-1.548c0.854,0,1.547,0.694,1.547,1.548C8.551,7.881,7.858,8.574,7.004,8.574z M18.339,18.338h-2.669 v-4.177c0-0.996-0.017-2.278-1.387-2.278c-1.389,0-1.601,1.086-1.601,2.206v4.249h-2.667v-8.59h2.559v1.174h0.037 c0.356-0.675,1.227-1.387,2.526-1.387c2.703,0,3.203,1.779,3.203,4.092V18.338z\"><\/path><\/svg><span class=\"wp-block-social-link-label screen-reader-text\">LinkedIn<\/span><\/a><\/li>\n\n<li class=\"wp-social-link wp-social-link-youtube  wp-block-social-link\"><a href=\"https:\/\/www.youtube.com\/channel\/UCeLma6SpNYH7jjYKSBNSexw\" class=\"wp-block-social-link-anchor\" target=\"_blank\" rel=\"noopener\"><svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M21.8,8.001c0,0-0.195-1.378-0.795-1.985c-0.76-0.797-1.613-0.801-2.004-0.847c-2.799-0.202-6.997-0.202-6.997-0.202 h-0.009c0,0-4.198,0-6.997,0.202C4.608,5.216,3.756,5.22,2.995,6.016C2.395,6.623,2.2,8.001,2.2,8.001S2,9.62,2,11.238v1.517 c0,1.618,0.2,3.237,0.2,3.237s0.195,1.378,0.795,1.985c0.761,0.797,1.76,0.771,2.205,0.855c1.6,0.153,6.8,0.201,6.8,0.201 s4.203-0.006,7.001-0.209c0.391-0.047,1.243-0.051,2.004-0.847c0.6-0.607,0.795-1.985,0.795-1.985s0.2-1.618,0.2-3.237v-1.517 C22,9.62,21.8,8.001,21.8,8.001z M9.935,14.594l-0.001-5.62l5.404,2.82L9.935,14.594z\"><\/path><\/svg><span class=\"wp-block-social-link-label screen-reader-text\">YouTube<\/span><\/a><\/li>\n\n<li class=\"wp-social-link wp-social-link-github  wp-block-social-link\"><a href=\"https:\/\/github.com\/OpsTree\" class=\"wp-block-social-link-anchor\" target=\"_blank\" rel=\"noopener\"><svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M12,2C6.477,2,2,6.477,2,12c0,4.419,2.865,8.166,6.839,9.489c0.5,0.09,0.682-0.218,0.682-0.484 c0-0.236-0.009-0.866-0.014-1.699c-2.782,0.602-3.369-1.34-3.369-1.34c-0.455-1.157-1.11-1.465-1.11-1.465 c-0.909-0.62,0.069-0.608,0.069-0.608c1.004,0.071,1.532,1.03,1.532,1.03c0.891,1.529,2.341,1.089,2.91,0.833 c0.091-0.647,0.349-1.086,0.635-1.337c-2.22-0.251-4.555-1.111-4.555-4.943c0-1.091,0.39-1.984,1.03-2.682 C6.546,8.54,6.202,7.524,6.746,6.148c0,0,0.84-0.269,2.75,1.025C10.295,6.95,11.15,6.84,12,6.836 c0.85,0.004,1.705,0.114,2.504,0.336c1.909-1.294,2.748-1.025,2.748-1.025c0.546,1.376,0.202,2.394,0.1,2.646 c0.64,0.699,1.026,1.591,1.026,2.682c0,3.841-2.337,4.687-4.565,4.935c0.359,0.307,0.679,0.917,0.679,1.852 c0,1.335-0.012,2.415-0.012,2.741c0,0.269,0.18,0.579,0.688,0.481C19.138,20.161,22,16.416,22,12C22,6.477,17.523,2,12,2z\"><\/path><\/svg><span class=\"wp-block-social-link-label screen-reader-text\">GitHub<\/span><\/a><\/li>\n\n<li class=\"wp-social-link wp-social-link-facebook  wp-block-social-link\"><a href=\"https:\/\/www.facebook.com\/opstree\" class=\"wp-block-social-link-anchor\" target=\"_blank\" rel=\"noopener\"><svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M12 2C6.5 2 2 6.5 2 12c0 5 3.7 9.1 8.4 9.9v-7H7.9V12h2.5V9.8c0-2.5 1.5-3.9 3.8-3.9 1.1 0 2.2.2 2.2.2v2.5h-1.3c-1.2 0-1.6.8-1.6 1.6V12h2.8l-.4 2.9h-2.3v7C18.3 21.1 22 17 22 12c0-5.5-4.5-10-10-10z\"><\/path><\/svg><span class=\"wp-block-social-link-label screen-reader-text\">Facebook<\/span><\/a><\/li>\n\n<li class=\"wp-social-link wp-social-link-medium  wp-block-social-link\"><a href=\"https:\/\/medium.com\/buildpiper\" class=\"wp-block-social-link-anchor\" target=\"_blank\" rel=\"noopener\"><svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M20.962,7.257l-5.457,8.867l-3.923-6.375l3.126-5.08c0.112-0.182,0.319-0.286,0.527-0.286c0.05,0,0.1,0.008,0.149,0.02 c0.039,0.01,0.078,0.023,0.114,0.041l5.43,2.715l0.006,0.003c0.004,0.002,0.007,0.006,0.011,0.008 C20.971,7.191,20.98,7.227,20.962,7.257z M9.86,8.592v5.783l5.14,2.57L9.86,8.592z M15.772,17.331l4.231,2.115 C20.554,19.721,21,19.529,21,19.016V8.835L15.772,17.331z M8.968,7.178L3.665,4.527C3.569,4.479,3.478,4.456,3.395,4.456 C3.163,4.456,3,4.636,3,4.938v11.45c0,0.306,0.224,0.669,0.498,0.806l4.671,2.335c0.12,0.06,0.234,0.088,0.337,0.088 c0.29,0,0.494-0.225,0.494-0.602V7.231C9,7.208,8.988,7.188,8.968,7.178z\"><\/path><\/svg><span class=\"wp-block-social-link-label screen-reader-text\">Medium<\/span><\/a><\/li><\/ul>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Why DevOps Rides on Immutable Infrastructure? The acceptance of \u201cimmutable infrastructure\u201d has emerged as a viable way to improve DevOps processes and culture. By introducing standardisation in application deployment and management, the immutable infrastructure helps, among other things, to foster a better collaborative environment among developers, operations, and other stakeholders. Let&#8217;s discuss a bit about &hellip; <a href=\"https:\/\/opstree.com\/blog\/2021\/08\/31\/provisioning-infra-and-deployments-in-aws-using-packer-terraform-and-jenkins\/\" class=\"more-link\">Continue reading<span class=\"screen-reader-text\"> &#8220;Provisioning Infra and Deployments In AWS : Using Packer, Terraform and Jenkins&#8221;<\/span><\/a><\/p>\n","protected":false},"author":198919067,"featured_media":29900,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_coblocks_attr":"","_coblocks_dimensions":"","_coblocks_responsive_height":"","_coblocks_accordion_ie_support":"","jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":false,"jetpack_social_options":{"image_generator_settings":{"template":"highway","enabled":false},"version":2}},"categories":[28070474,60486],"tags":[1668847,768739292,3021235],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"https:\/\/opstree.com\/blog\/wp-content\/uploads\/2025\/11\/DevSecOps-1.jpg","jetpack_likes_enabled":true,"jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/pfDBOm-1Ma","jetpack-related-posts":[],"_links":{"self":[{"href":"https:\/\/opstree.com\/blog\/wp-json\/wp\/v2\/posts\/6830"}],"collection":[{"href":"https:\/\/opstree.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/opstree.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/opstree.com\/blog\/wp-json\/wp\/v2\/users\/198919067"}],"replies":[{"embeddable":true,"href":"https:\/\/opstree.com\/blog\/wp-json\/wp\/v2\/comments?post=6830"}],"version-history":[{"count":25,"href":"https:\/\/opstree.com\/blog\/wp-json\/wp\/v2\/posts\/6830\/revisions"}],"predecessor-version":[{"id":8051,"href":"https:\/\/opstree.com\/blog\/wp-json\/wp\/v2\/posts\/6830\/revisions\/8051"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/opstree.com\/blog\/wp-json\/wp\/v2\/media\/29900"}],"wp:attachment":[{"href":"https:\/\/opstree.com\/blog\/wp-json\/wp\/v2\/media?parent=6830"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/opstree.com\/blog\/wp-json\/wp\/v2\/categories?post=6830"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/opstree.com\/blog\/wp-json\/wp\/v2\/tags?post=6830"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}