<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Teches on Technology Enlightened</title>
    <link>https://pprakash.me/tech/</link>
    <description>Recent content in Teches on Technology Enlightened</description>
    <generator>Hugo</generator>
    <language>en</language>
    <copyright>&amp;copy; &lt;a href=&#34;https://github.com/p-prakash/&#34;&gt;Prakash P&lt;/a&gt; 2015 - 2023</copyright>
    <lastBuildDate>Fri, 31 Jul 2026 16:00:00 +0100</lastBuildDate>
    <atom:link href="https://pprakash.me/tech/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Multi-region high availability for Azure Content Understanding</title>
      <link>https://pprakash.me/tech/2026/07/31/multi-region-ha-azure-content-understanding/</link>
      <pubDate>Fri, 31 Jul 2026 16:00:00 +0100</pubDate>
      <guid>https://pprakash.me/tech/2026/07/31/multi-region-ha-azure-content-understanding/</guid>
      <description>&lt;p&gt;Azure Content Understanding and Azure OpenAI Service are regional services. A production document-processing workflow often cannot treat a regional endpoint, its model deployments, or its analyzer definitions as a single point of failure. In this post, we discuss a highly available solution built across multiple regions to handle regional failures.&lt;/p&gt;&#xA;&lt;h2 id=&#34;architecture&#34;&gt;Architecture&lt;/h2&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://pprakash.me/images/2026/07/azure-content-understanding-multi-region-ha.png&#34; alt=&#34;Architecture diagram of implemented regional stacks and cross-region flows&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;em&gt;Figure 1. Implemented regional stacks and cross-region flows.&lt;/em&gt;&lt;/p&gt;&#xA;&lt;p&gt;The diagram shows two distinct planes: solid lines represent synchronous request traffic, while dashed lines represent asynchronous analyzer reconciliation. This separation addresses two related resilience challenges: routing requests to a healthy Content Understanding backend and keeping analyzer configurations consistent across regions. API Management selects a local-first backend synchronously within each available gateway, while two queue-driven Azure Functions synchronize analyzers asynchronously.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Scale Azure Databricks secure network access to Azure Data Lake Storage</title>
      <link>https://pprakash.me/tech/2023/12/11/scale-azure-databricks-secure-network-access-to-azure-data-lake/</link>
      <pubDate>Mon, 11 Dec 2023 18:00:00 +0100</pubDate>
      <guid>https://pprakash.me/tech/2023/12/11/scale-azure-databricks-secure-network-access-to-azure-data-lake/</guid>
      <description>&lt;p&gt;Many organisations store their data in a centralised data lake on Azure Storage accounts. In this post we will look at a solution to scale the secure network access between the centralised data lake storage account and Azure Databricks workspaces VNets.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://pprakash.me/images/2023/12/Databricks_Network_Design.png&#34; alt=&#34;Architecture diagram of having storage account with Private Endpoint connected to Azure Databricks workspaces VNets&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;The recommended approach to achieve a scalable and secure network access to the data lake storage is to use Private Endpoints for the storage accounts.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Build intelligence in your eCommerce applications using Azure Open AI</title>
      <link>https://pprakash.me/tech/2023/03/13/intelligent-ecommerce-apps-using-azure-open-ai/</link>
      <pubDate>Mon, 13 Mar 2023 15:00:00 +0100</pubDate>
      <guid>https://pprakash.me/tech/2023/03/13/intelligent-ecommerce-apps-using-azure-open-ai/</guid>
      <description>&lt;h2 id=&#34;overview&#34;&gt;Overview&lt;/h2&gt;&#xA;&lt;p&gt;Whenever I shop online, checking the reviews of the products is a tedious task. Sometimes the low-rated reviews are based on delivery, packaging&amp;hellip; whereas a few high-rated reviews might be on cost but not on quality. Generally, reviews/ratings are displayed without any context which results in customers needing additional time and effort to get the most value out of it. Hence, we built this prototype using &lt;a href=&#34;https://learn.microsoft.com/en-us/azure/cognitive-services/openai/overview&#34;&gt;Azure Open AI&lt;/a&gt; to present the consolidated information from all the reviews of a product.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Optimize Azure Kubernetes Service Node Cost by Combining OnDemand and Spot VMs</title>
      <link>https://pprakash.me/tech/2023/02/27/optimize-aks-node-cost-by-combining-spot-ondemand-vms/</link>
      <pubDate>Mon, 27 Feb 2023 08:00:00 +0100</pubDate>
      <guid>https://pprakash.me/tech/2023/02/27/optimize-aks-node-cost-by-combining-spot-ondemand-vms/</guid>
      <description>&lt;h2 id=&#34;overview&#34;&gt;Overview&lt;/h2&gt;&#xA;&lt;p&gt;While it&amp;rsquo;s possible to run the kubernetes nodes either in on-demand or spot node pools separately. We can optimize the application cost without compromising the reliability by placing the pods unevenly on spot and OnDemand VMs using the &lt;strong&gt;&lt;a href=&#34;https://kubernetes.io/docs/concepts/scheduling-eviction/topology-spread-constraints/&#34;&gt;topology spread constraints&lt;/a&gt;&lt;/strong&gt;. With baseline amount of pods deployed in OnDemand node pool offering reliability we can scale on spot node pool based on the load at a lower cost. In this post, we will go through step by step approach on deploying an application spread unevenly on spot and OnDemand VMs.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Serverless URL Shortener on Azure</title>
      <link>https://pprakash.me/tech/2023/02/20/serverless-url-shortener-azure/</link>
      <pubDate>Mon, 20 Feb 2023 08:20:00 +0100</pubDate>
      <guid>https://pprakash.me/tech/2023/02/20/serverless-url-shortener-azure/</guid>
      <description>&lt;p&gt;Building an URL shortener is much easier now using the Serverless technologies in Azure. In this post, we will discuss about developing this solution.&lt;/p&gt;&#xA;&lt;p&gt;&lt;em&gt;Update: My colleague (&lt;a href=&#34;https://www.linkedin.com/in/cmaneu/&#34;&gt;Christopher Maneu&lt;/a&gt;) pointed out that we could optimize the cost by using &lt;a href=&#34;https://learn.microsoft.com/en-us/azure/static-web-apps/overview&#34;&gt;Azure Static Web Apps&lt;/a&gt; (&lt;strong&gt;SWA&lt;/strong&gt;) for hosting the management console. I updated the design to use SWA and added another API to check what the target URL is for the specific short URL gets resolved without visiting the site.&lt;/em&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Serverless API Backend for xBrowserSync on Azure</title>
      <link>https://pprakash.me/tech/2020/12/21/xbrowsersync-api-backend-azure/</link>
      <pubDate>Sun, 30 Oct 2022 20:00:00 +0000</pubDate>
      <guid>https://pprakash.me/tech/2020/12/21/xbrowsersync-api-backend-azure/</guid>
      <description>&lt;p&gt;I have been using &lt;a href=&#34;https://www.xbrowsersync.org/&#34;&gt;xBrowserSync&lt;/a&gt; for two years now with my own API Backend. In this post we will look at deploying the xBrowserSync API backedn using the serverless technologies on Microsoft Azure&lt;/p&gt;&#xA;&lt;p&gt;I used CosmosDB to persist the data, CosmosDB supports &lt;a href=&#34;https://learn.microsoft.com/en-us/azure/cosmos-db/concepts-limits#per-item-limits&#34;&gt;per item size of up to 2MB&lt;/a&gt;. Hence I set the size limit to 1.5MB and configured it to &lt;a href=&#34;https://learn.microsoft.com/en-us/azure/cosmos-db/serverless&#34;&gt;serverless mode&lt;/a&gt; as to pay only for the used read/write capacity units. One Azure functions have been used to handle create-bookmark, updat-bookmark, and get details from CosmosDB operations. Using &lt;a href=&#34;https://learn.microsoft.com/en-us/azure/api-management/api-management-features&#34;&gt;Azure API Management consumption plan&lt;/a&gt;, I have configured APIs to invoke this Azure function.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Mirror HTTP request using ALB backed by AWS Lambda</title>
      <link>https://pprakash.me/tech/2021/03/20/mirror-http-request-using-alb-backed-by-aws-lambda/</link>
      <pubDate>Sun, 12 Sep 2021 10:30:00 +0000</pubDate>
      <guid>https://pprakash.me/tech/2021/03/20/mirror-http-request-using-alb-backed-by-aws-lambda/</guid>
      <description>&lt;p&gt;When Gonzalo Diethelm asked me whether there is a way to echo the http request to validate Lambda@Edge functions that modifies the request by adding / updating / deleting headers? I couldn&amp;rsquo;t find something that&amp;rsquo;s already available. Hence I quickly created a simple Lambda function front-ended by Application Load Balancer to just return the response that it has recieved.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Serverless UI testing using Selenium, AWS Lambda, AWS Fargate, and AWS Developer Tools</title>
      <link>https://pprakash.me/tech/2021/03/20/serverless-ui-testing-using-selenium-aws-lambda-aws-fargate-and-aws-developer-tools/</link>
      <pubDate>Sat, 20 Mar 2021 08:30:00 +0000</pubDate>
      <guid>https://pprakash.me/tech/2021/03/20/serverless-ui-testing-using-selenium-aws-lambda-aws-fargate-and-aws-developer-tools/</guid>
      <description>&lt;p&gt;Since the post &lt;a href=&#34;https://aws.amazon.com/blogs/devops/using-aws-codepipeline-aws-codebuild-and-aws-lambda-for-serverless-automated-ui-testing/&#34;&gt;Using AWS CodePipeline, AWS CodeBuild, and AWS Lambda for Serverless Automated UI Testing&lt;/a&gt; was published, things have evolved with &lt;a href=&#34;https://developers.google.com/web/updates/2017/04/headless-chrome&#34;&gt;Chrome headless&lt;/a&gt; and &lt;a href=&#34;https://hacks.mozilla.org/2017/12/using-headless-mode-in-firefox/&#34;&gt;Firefox headless&lt;/a&gt; being supported natively. &lt;a href=&#34;https://aws.amazon.com/lambda/&#34;&gt;AWS Lambda&lt;/a&gt; now supports container images, &lt;a href=&#34;https://aws.amazon.com/step-functions/&#34;&gt;AWS Step Functions&lt;/a&gt; has added support for &lt;a href=&#34;https://docs.aws.amazon.com/step-functions/latest/dg/amazon-states-language-map-state.html&#34;&gt;Map state&lt;/a&gt; and its integration with Lambda, and &lt;a href=&#34;https://aws.amazon.com/fargate/&#34;&gt;AWS Fargate&lt;/a&gt; has enabled automating the UI testing completely using serverless technologies.&lt;/p&gt;&#xA;&lt;p&gt;The goal of this post is to demonstrate how to use &lt;a href=&#34;https://aws.amazon.com/products/developer-tools/&#34;&gt;AWS Developer Tools&lt;/a&gt;) to build a continuous delivery pipeline that automatically deploys a test environment and runs a UI test against it. We also explain how to build a container image which includes Chromium browser, Firefox browser, Selenium, and its dependencies, which are used in Lambda and Fargate. You can accelerate the testing by launching multiple test cases in parallel using the Map state in Step Functions.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Serverless API Backend for xBrowserSync</title>
      <link>https://pprakash.me/tech/2020/12/21/xbrowsersync-serverless-api-backed/</link>
      <pubDate>Mon, 21 Dec 2020 16:00:00 +0000</pubDate>
      <guid>https://pprakash.me/tech/2020/12/21/xbrowsersync-serverless-api-backed/</guid>
      <description>&lt;p&gt;Ever since &lt;a href=&#34;https://web.archive.org/web/20180401124824/https://www.ghacks.net/2018/03/31/logmein-to-shut-down-xmarks-on-may-1-2018/&#34;&gt;Xmarks Sync was shutdown by LogMeIn(LastPass)&lt;/a&gt;, I was looking for a better cross browser &amp;amp; cross device bookmark synchronization service. While reviewing &lt;a href=&#34;https://privacytools.io/browsers/#addons&#34;&gt;PrivacyTools&lt;/a&gt; I came across &lt;a href=&#34;https://www.xbrowsersync.org/&#34;&gt;xBrowserSync&lt;/a&gt; which looked like a better alternative.&lt;/p&gt;&#xA;&lt;p&gt;I liked the way it has been implemented using &lt;code&gt;SHA-256&lt;/code&gt; hash, &lt;code&gt;250000&lt;/code&gt; iterations and &lt;code&gt;AES-GCM&lt;/code&gt; algorithm to generate the hash of the custom password provided. Additionally, xBrowserSync provides a way to configure your own API backend where you store your information. There is already an open source implementation of &lt;a href=&#34;https://github.com/xbrowsersync/api&#34;&gt;xBrowserSync API&lt;/a&gt; and &lt;a href=&#34;https://github.com/xbrowsersync/api-docker/blob/master/README.md&#34;&gt;a docker version&lt;/a&gt; available.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Running AWS Glue jobs connecting to database in VPC with Custom DNS</title>
      <link>https://pprakash.me/tech/2018/09/06/running-aws-glue-jobs-connecting-to-database-in-vpc-with-custom-dns/</link>
      <pubDate>Thu, 06 Sep 2018 07:55:46 +0000</pubDate>
      <guid>https://pprakash.me/tech/2018/09/06/running-aws-glue-jobs-connecting-to-database-in-vpc-with-custom-dns/</guid>
      <description>&lt;p&gt;AWS Glue is a fully managed ETL service that makes it simple and cost-effective to categorize your data, clean it, enrich it, and move it reliably between various data stores. Glue job is the business logic that automate the extract, transform, and transfer data to different locations.&lt;/p&gt;&#xA;&lt;p&gt;Glue job creates a Hadoop task in the backend and since it uses Hadoop ecosystem all the nodes in the cluster must be able to find using the FQDN and communicate with each other. To satisfy Hadoop DNS lookup, both forward and reverse lookups must succeed. When you use the default DHCP option set with AmazonProvidedDNS, it automatically creates the DNS record for the nodes that’s getting created in the VPC.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Using AWS CodePipeline, AWS CodeBuild, and AWS Lambda for Serverless Automated UI Testing</title>
      <link>https://pprakash.me/tech/2017/09/23/using-aws-codepipeline-aws-codebuild-and-aws-lambda-for-serverless-automated-ui-testing/</link>
      <pubDate>Sat, 23 Sep 2017 08:21:28 +0000</pubDate>
      <guid>https://pprakash.me/tech/2017/09/23/using-aws-codepipeline-aws-codebuild-and-aws-lambda-for-serverless-automated-ui-testing/</guid>
      <description>&lt;p&gt;Testing the user interface of a web application is an important part of the development lifecycle. In this post, I’ll explain how to automate UI testing using serverless technologies, including &lt;!-- raw HTML omitted --&gt;AWS CodePipeline&lt;!-- raw HTML omitted --&gt;, &lt;!-- raw HTML omitted --&gt;AWS CodeBuild&lt;!-- raw HTML omitted --&gt;, and &lt;!-- raw HTML omitted --&gt;AWS Lambda&lt;!-- raw HTML omitted --&gt;.&lt;/p&gt;&#xA;&lt;p&gt;I built a website for UI testing that is hosted in S3. I used Selenium to perform cross-browser UI testing on Chrome, Firefox, and PhantomJS, a headless WebKit browser with &lt;!-- raw HTML omitted --&gt;Ghost Driver&lt;!-- raw HTML omitted --&gt;, an implementation of the WebDriver Wire Protocol. I used Python to create test cases for ChromeDriver, FirefoxDriver, or PhatomJSDriver based the browser against which the test is being executed.&lt;/p&gt;&#xA;&lt;p&gt;Resources referred to in this post, including the AWS CloudFormation template, test and status websites hosted in S3, AWS CodeBuild build specification files, AWS Lambda function, and the Python script that performs the test are available in the &lt;!-- raw HTML omitted --&gt;serverless-automated-ui-testing&lt;!-- raw HTML omitted --&gt; GitHub repository.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Create Multiple Builds from the Same Source Using Different AWS CodeBuild Build Specification Files</title>
      <link>https://pprakash.me/tech/2017/08/02/create-multiple-builds-from-the-same-source-using-different-aws-codebuild-build-specification-files/</link>
      <pubDate>Wed, 02 Aug 2017 04:40:10 +0000</pubDate>
      <guid>https://pprakash.me/tech/2017/08/02/create-multiple-builds-from-the-same-source-using-different-aws-codebuild-build-specification-files/</guid>
      <description>&lt;p&gt;In June 2017, &lt;a href=&#34;https://forums.aws.amazon.com/ann.jspa?annID=4762&#34;&gt;AWS CodeBuild announced&lt;/a&gt; you can now specify an alternate build specification file name or location in an AWS CodeBuild project.&lt;/p&gt;&#xA;&lt;p&gt;In this post, I’ll show you how to use different build specification files in the same repository to create different builds. You’ll find the source code for this post in the &lt;a href=&#34;https://github.com/p-prakash/aws-codebuild-multiple-buildspec&#34;&gt;GitHub repo&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Requirements&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;The &lt;a href=&#34;https://aws.amazon.com/cli/&#34;&gt;AWS CLI&lt;/a&gt; must be installed and configured.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Solution Overview&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;I have created a C program (cbsamplelib.c) that will be used to create a shared library and another utility program (cbsampleutil.c) to use that library. I’ll use a Makefile to compile these files.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Continuous Delivery of Nested AWS CloudFormation Stacks Using AWS CodePipeline</title>
      <link>https://pprakash.me/tech/2017/06/28/codepipeline-nested-cfn/</link>
      <pubDate>Wed, 28 Jun 2017 08:45:47 +0000</pubDate>
      <guid>https://pprakash.me/tech/2017/06/28/codepipeline-nested-cfn/</guid>
      <description>&lt;p&gt;In &lt;a href=&#34;https://aws.amazon.com/blogs/aws/codepipeline-update-build-continuous-delivery-workflows-for-cloudformation-stacks/&#34;&gt;CodePipeline Update – Build Continuous Delivery Workflows for CloudFormation Stacks&lt;/a&gt;, Jeff Barr discusses infrastructure as code and how to use &lt;a href=&#34;https://aws.amazon.com/codepipeline/&#34;&gt;AWS CodePipeline&lt;/a&gt; for continuous delivery. In this blog post, I discuss the continuous delivery of nested CloudFormation stacks using AWS CodePipeline, with &lt;a href=&#34;https://aws.amazon.com/codecommit/&#34;&gt;AWS CodeCommit&lt;/a&gt; as the source repository and &lt;a href=&#34;https://aws.amazon.com/codebuild/&#34;&gt;AWS CodeBuild&lt;/a&gt; as a build and &lt;a href=&#34;https://aws.amazon.com/about-aws/whats-new/2017/03/aws-codepipeline-adds-support-for-unit-testing/&#34;&gt;testing tool&lt;/a&gt;. I deploy the stacks using &lt;a href=&#34;http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-updating-stacks-changesets.html&#34;&gt;CloudFormation change sets&lt;/a&gt; following a &lt;a href=&#34;http://docs.aws.amazon.com/codepipeline/latest/userguide/approvals.html&#34;&gt;manual approval process&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Here’s how to do it:&lt;/p&gt;&#xA;&lt;p&gt;In AWS CodePipeline, create a pipeline with four stages:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Monitor AWS Trusted Advisor Checks</title>
      <link>https://pprakash.me/tech/2017/03/14/monitor-aws-trusted-advisor-checks/</link>
      <pubDate>Tue, 14 Mar 2017 17:39:24 +0000</pubDate>
      <guid>https://pprakash.me/tech/2017/03/14/monitor-aws-trusted-advisor-checks/</guid>
      <description>&lt;p&gt;AWS Trusted Advisor is an important tool which provides more than 50 checks across four different categories Cost Optimization, Performance, Security &amp;amp; Fault Tolerance (at the moment of writing this post).&lt;/p&gt;&#xA;&lt;p&gt;But I have noticed that this is not being used more extensively considering the importance of it. Hence I created couple of lambda functions which shall be configured to run on daily basis to refresh the checks and create summary of all the checks and send an email.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Scheduling automated EBS snapshots serverless using AWS Lambda</title>
      <link>https://pprakash.me/tech/2016/06/09/automated-ebs-snapshots/</link>
      <pubDate>Thu, 09 Jun 2016 11:46:37 +0000</pubDate>
      <guid>https://pprakash.me/tech/2016/06/09/automated-ebs-snapshots/</guid>
      <description>&lt;p&gt;EBS snapshot as backup mechanism is a very common practice and it also has been defined in &lt;a href=&#34;http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-best-practices.html&#34;&gt;Backup and Recovery&lt;/a&gt; section of EC2 best practices. If you have read my another article &lt;a href=&#34;https://pprakash.me/tech/2015/11/15/save-aws-costs-by-scheduled-start-and-stop-of-ec2-instances/&#34;&gt;Save AWS costs by scheduled start and stop of EC2 instances&lt;/a&gt;, similar approach will be used in creating Snapshots too.&lt;/p&gt;&#xA;&lt;p&gt;Using JSON in EC2 Tags enables us to provide granular configuration details. Create an EC2 tag with name as &lt;em&gt;backup&lt;/em&gt; and value with details containing time to take backup and retention period. Obtaining these details from Tags will enable us to configure different schedule &amp;amp; retention period for different EC2 instance. If no backup is needed on a particular day, that day shall be removed from the value.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Sync S3 bucket to multiple S3 buckets in different region</title>
      <link>https://pprakash.me/tech/2016/05/27/sync-s3-bucket-to-multiple-different-s3-buckets/</link>
      <pubDate>Fri, 27 May 2016 11:55:41 +0000</pubDate>
      <guid>https://pprakash.me/tech/2016/05/27/sync-s3-bucket-to-multiple-different-s3-buckets/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://aws.amazon.com/blogs/aws/new-cross-region-replication-for-amazon-s3/&#34;&gt;Cross-Region Replication for Amazon S3&lt;/a&gt; was introduced last year which enables replicating objects from a S3 bucket to a different S3 bucket located in different region (it can be same/different AWS account). It’s one of the most sought after feature for long time but it doesn’t solve some of the scenarios as defined below.&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Synchronizing to a bucket in same region.&lt;/li&gt;&#xA;&lt;li&gt;Synchronizing to multiple destination buckets.&lt;/li&gt;&#xA;&lt;li&gt;Object ACLs needs to be set at the source bucket hence multiple different ACLs needs to be set when copying across different accounts.&lt;/li&gt;&#xA;&lt;li&gt;Replication doesn’t change the ownership of the objects hence bucket policy applied at the destination bucket won’t be honored.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Refer the feedback from AWS support team regarding the last point mentioned above.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Running IIS in Windows Docker Container in Amazon EC2</title>
      <link>https://pprakash.me/tech/2016/05/15/running-iis-in-windows-docker-container-in-amazon-ec2/</link>
      <pubDate>Sun, 15 May 2016 15:53:17 +0000</pubDate>
      <guid>https://pprakash.me/tech/2016/05/15/running-iis-in-windows-docker-container-in-amazon-ec2/</guid>
      <description>&lt;p&gt;Windows Server 2016 Technical Preview 5 was released on &lt;a href=&#34;https://technet.microsoft.com/en-us/library/dn765472(v=ws.12).aspx&#34;&gt;27th April 2016&lt;/a&gt; &amp;amp; it&amp;rsquo;s well known by now that it supports docker with its &lt;a href=&#34;https://www.docker.com/microsoft&#34;&gt;windows server containers&lt;/a&gt;. Microsoft also started uploading windows server core with various application as docker images to &lt;a href=&#34;https://hub.docker.com/u/microsoft/?page=1&#34;&gt;docker hub&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;I was wondering whether it’s possible to run Windows 2016 TP5 on an EC2 instance and launch a windows container inside the EC2 instance. EC2 officially supports only upto Windows 2012 R2 and I couldn’t find any 2016 AMI’s in Ireland region. Hence I decided to install Windows 2016 TP5 on local VirtualBox, upload it to S3 create AMI out of it and launch the EC2 instance.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Using AWS IoT button - Simple Example</title>
      <link>https://pprakash.me/tech/2016/05/14/using-aws-iot-button-simple-example/</link>
      <pubDate>Sat, 14 May 2016 17:32:27 +0000</pubDate>
      <guid>https://pprakash.me/tech/2016/05/14/using-aws-iot-button-simple-example/</guid>
      <description>&lt;p&gt;Amazon did a limited release of the &lt;a href=&#34;https://aws.amazon.com/iot/button/&#34;&gt;programmable Dash button&lt;/a&gt; and unsurprisingly it got &lt;a href=&#34;http://mashable.com/2016/05/13/amazon-dash-custom/#n0NCZ5flsSqG&#34;&gt;sold out within a day&lt;/a&gt;. It&amp;rsquo;s stated in amazon.com that &amp;ldquo;&lt;a href=&#34;http://www.amazon.com/AWS-IoT-Button-Limited-Programmable/dp/B01C7WE5WM&#34;&gt;We don&amp;rsquo;t know when or if this item will be back in stock.&lt;/a&gt;&amp;rdquo;, hence you might need to wait to get one.&lt;/p&gt;&#xA;&lt;p&gt;I take this opportunity to write a post about how I used the AWS IoT button that I received in AWS re:Invent 2015 to show case AWS IoT to the team.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Automated Blue/Green deployment using Lambda and CloudFormation</title>
      <link>https://pprakash.me/tech/2016/05/05/automated-bluegreen-deployment-using-lambda-and-cloudformation/</link>
      <pubDate>Thu, 05 May 2016 07:42:54 +0000</pubDate>
      <guid>https://pprakash.me/tech/2016/05/05/automated-bluegreen-deployment-using-lambda-and-cloudformation/</guid>
      <description>&lt;p&gt;Blue/Green deployment is a well-known method to deploy an application without any downtime. Performing DNS switch is one of the very common techniques to achieve this. Using DNS switch has a minor issue with DNS caching which might take some time for DNS change to be propagated.&lt;/p&gt;&#xA;&lt;p&gt;Apart from DNS switch, AWS gives us two different options to switch the stacks. One is to have single ELB and swap it across auto-scaling group and another is switching the launch configuration of the auto-scaling group. Check the following presentation on various methods to achieve blue/green deployment in AWS.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Cracking AWS Solution Architect Professional Certification</title>
      <link>https://pprakash.me/tech/2016/03/06/cracking-aws-solution-architect-professional-certification/</link>
      <pubDate>Sun, 06 Mar 2016 20:06:20 +0000</pubDate>
      <guid>https://pprakash.me/tech/2016/03/06/cracking-aws-solution-architect-professional-certification/</guid>
      <description>&lt;p&gt;If you had noticed, there has been a gap of few weeks since my last post. I went off the radar to prepare for AWS Certified Solution Architect Professional exam. Lots of learning and completed it successfully.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://pprakash.me/images/2016/03/solutions-architect-professional.png&#34; alt=&#34;Solutions-Architect-Professional&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;I can&amp;rsquo;t provide any details on the questions since I have signed a NDA. But I shall provide some suggestions based on my experience.&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Read through the blue print and understand the weight-age for different sections.&lt;/li&gt;&#xA;&lt;li&gt;I took &lt;a href=&#34;https://linuxacademy.com/amazon-web-services/training/course/name/aws-certified-solutions-architect-professional-level&#34;&gt;this Linux Academy course&lt;/a&gt;. It was helpful to refresh all the topics and useful on services which I didn&amp;rsquo;t use regularly.&lt;/li&gt;&#xA;&lt;li&gt;Quiz provided by Linux Academy was okay. I tried Cloud Academy quiz and it had lots of typo and didn&amp;rsquo;t cover all the sections.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Reading the product documentation, FAQs, whitepapers &amp;amp; case studies were useful.&lt;/strong&gt;&lt;/li&gt;&#xA;&lt;li&gt;Most of the questions had multiple requirements which covers more than 3 AWS services. Hence while answering we need to make sure that the selected answer is best suitable for all the requirements.&lt;/li&gt;&#xA;&lt;li&gt;Some of the questions on outdated (which is expected) referring to old reservation model. But they did a good job in avoiding feature specific questions which might change.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Certain AWS services like Direct Connect, Storage Gateway, CloudFront, IAM, S3 were prominent.&lt;/strong&gt;&lt;/li&gt;&#xA;&lt;li&gt;Knowledge on storage concepts like RAID, iSCSI connections used in Storage Gateway, etc will be useful.&lt;/li&gt;&#xA;&lt;li&gt;Deep knowledge on Networking especially VPC, VPN, Routing, etc would help.&lt;/li&gt;&#xA;&lt;li&gt;Good understanding of Web Identity federation, SAML based federation, Custom identity broker &amp;amp; SSO to Management console is needed.&lt;/li&gt;&#xA;&lt;li&gt;Knowledge on media streaming, download/upload options, performance and cost benefits using CloudFront would be required.&lt;/li&gt;&#xA;&lt;li&gt;You might already know that the questions &amp;amp; answers are lengthy. Many questions have at least two correct answers and identifying the best answer was really tricky.&lt;/li&gt;&#xA;&lt;li&gt;72 questions in 170 minutes looks achievable and I had 25 minutes to spare after reviewing all the questions which I marked for review.&lt;/li&gt;&#xA;&lt;li&gt;Don&amp;rsquo;t miss to take the practice exam (it costs $40) and it will help you to understand your area of strength and weakness.&lt;/li&gt;&#xA;&lt;li&gt;Take a practice exam after you complete your preparation and before booking the exam. Based on the result you shall book or study deeply on the sections that you need more attention.&lt;/li&gt;&#xA;&lt;li&gt;Don&amp;rsquo;t take the practice exam multiple times since the questions will be same during all the attempts of practice exam (you shall find this detail in fine prints when you try to re-book for practice exam).&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;I would say all the effort and money that you spend on this certification is worth it.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Installing Let’s Encrypt - Free &amp; Open TLS certificate</title>
      <link>https://pprakash.me/tech/2015/12/20/installing-lets-encrypt-free-open-tls-certificate/</link>
      <pubDate>Sun, 20 Dec 2015 09:51:35 +0000</pubDate>
      <guid>https://pprakash.me/tech/2015/12/20/installing-lets-encrypt-free-open-tls-certificate/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://letsencrypt.org/&#34;&gt;Let’s Encrypt&lt;/a&gt; is a free and open certificate authority managed by a public benefit organization called &lt;a href=&#34;https://letsencrypt.org/isrg/&#34;&gt;ISRG&lt;/a&gt; which concentrates on the security communication over the Internet. There are many technology companies like Mozilla, Akamai, EFF, Cisco, IdenTrust, Facebook, etc are sponsors and the platinum sponsors have a seat in their Technical Advisory Board.&lt;/p&gt;&#xA;&lt;p&gt;It uses Automated Certificate Management Environment (ACME) protocol to enable communication between the certification authority and the web server to which the certificate is issued. Let’s encrypt uses ACME to validate the domain Server Name Indication. ACME protocol has been submitted as &lt;a href=&#34;https://tools.ietf.org/html/draft-barnes-acme-04&#34;&gt;draft to IETF&lt;/a&gt; for formal approval process to be an RFC.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Sending response back to CFN custom resource from python Lambda function</title>
      <link>https://pprakash.me/tech/2015/12/20/sending-response-back-to-cfn-custom-resource-from-python-lambda-function/</link>
      <pubDate>Sun, 20 Dec 2015 06:00:56 +0000</pubDate>
      <guid>https://pprakash.me/tech/2015/12/20/sending-response-back-to-cfn-custom-resource-from-python-lambda-function/</guid>
      <description>&lt;p&gt;CloudFormation uses a pre-signed S3 URL to receive the response back from the custom resources managed by it. There are few blue prints available for Node.js Lambda custom resources but nothing available for python yet. Hence I created this simple function which shall be used to send the response back to CFN custom resource by performing PUT request to the pre-signed S3 URL.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; json&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; requests&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;lambda_handler&lt;/span&gt;(event, context):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    responseStatus &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;SUCCESS&amp;#39;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    responseData &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; {}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; event[&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;RequestType&amp;#39;&lt;/span&gt;] &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;Delete&amp;#39;&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        sendResponse(event, context, responseStatus, responseData)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    responseData &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; {&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;Success&amp;#39;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;Test Passed.&amp;#39;&lt;/span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    sendResponse(event, context, responseStatus, responseData)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;sendResponse&lt;/span&gt;(event, context, responseStatus, responseData):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    responseBody &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; {&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;Status&amp;#39;&lt;/span&gt;: responseStatus,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;Reason&amp;#39;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;See the details in CloudWatch Log Stream: &amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; context&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;log_stream_name,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;PhysicalResourceId&amp;#39;&lt;/span&gt;: context&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;log_stream_name,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;StackId&amp;#39;&lt;/span&gt;: event[&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;StackId&amp;#39;&lt;/span&gt;],&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;RequestId&amp;#39;&lt;/span&gt;: event[&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;RequestId&amp;#39;&lt;/span&gt;],&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;LogicalResourceId&amp;#39;&lt;/span&gt;: event[&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;LogicalResourceId&amp;#39;&lt;/span&gt;],&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;Data&amp;#39;&lt;/span&gt;: responseData}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    print &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;RESPONSE BODY:n&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; json&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;dumps(responseBody)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;try&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        req &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; requests&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;put(event[&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;ResponseURL&amp;#39;&lt;/span&gt;], data&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;json&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;dumps(responseBody))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; req&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;status_code &lt;span style=&#34;color:#f92672&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;200&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            print req&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;text&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;raise&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Exception&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;Recieved non 200 response while sending response to CFN.&amp;#39;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;except&lt;/span&gt; requests&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;exceptions&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;RequestException &lt;span style=&#34;color:#66d9ef&#34;&gt;as&lt;/span&gt; e:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        print e&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;raise&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; __name__ &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;__main__&amp;#39;&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    lambda_handler(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;event&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;handler&amp;#39;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;I&amp;rsquo;m using json module to form the response body, json module is available by default in the Lambda container. Whereas the requests module which I use to perform the http PUT request needs to be packaged along with the python script.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Continuous Integration - Manage shared resources across accounts automatically</title>
      <link>https://pprakash.me/2015/12/07/continuous-integration-manage-shared-resources-across-accounts-automatically/</link>
      <pubDate>Mon, 07 Dec 2015 18:28:16 +0000</pubDate>
      <guid>https://pprakash.me/2015/12/07/continuous-integration-manage-shared-resources-across-accounts-automatically/</guid>
      <description>&lt;p&gt;I prefer creating the base &lt;a href=&#34;http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/sharing-amis.html&#34;&gt;AMI&lt;/a&gt; using &lt;a href=&#34;https://www.packer.io/&#34;&gt;packer&lt;/a&gt;; &lt;a href=&#34;http://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_ShareSnapshot.html&#34;&gt;RDS snapshot&lt;/a&gt; using a Jenkins job which get triggered whenever there is a change in the database schema in the SCM. In case of installers, binaries, etc. it would be best to store them in a single &lt;a href=&#34;http://docs.aws.amazon.com/AmazonS3/latest/dev/using-iam-policies.html&#34;&gt;S3 bucket&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;In all the above mentioned scenarios I prefer to share those resources to a 3rd party AWS account and remove the share when not needed. Automating this would be easy to handle add/remove permissions, hence I decided to hold the sharing details in a JSON file in the SCM. Changes to that file will trigger a Jenkins job which will invoke a Lambda function which in turn will share the resources based on the values in the JSON file.&lt;/p&gt;</description>
    </item>
    <item>
      <title>CloudFormation parameters grouping and labelling</title>
      <link>https://pprakash.me/tech/2015/12/06/cloudformation-parameters-grouping-and-labelling/</link>
      <pubDate>Sun, 06 Dec 2015 07:16:52 +0000</pubDate>
      <guid>https://pprakash.me/tech/2015/12/06/cloudformation-parameters-grouping-and-labelling/</guid>
      <description>&lt;p&gt;Last week AWS &lt;a href=&#34;https://aws.amazon.com/about-aws/whats-new/2015/12/aws-cloudformation-adds-support-for-aws-codepipeline-aws-config-and-more/&#34;&gt;enhanced CloudFormation&lt;/a&gt; by adding new services like AWS CodePipeline, AWS Config, AWS KMS and few more; default stack limit also has been increased from 20 to 200. Among other new features they also have introduced this small but useful &lt;a href=&#34;http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudformation-interface.html&#34;&gt;parameters grouping and labelling&lt;/a&gt; feature.&lt;/p&gt;&#xA;&lt;p&gt;Earlier all the parameters in a CFN template get listed in alphabetical order based on the logical name of the parameter. Also the parameters logical name is restricted to alphanumeric characters hence it causes some restrictions.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Executing Ruby code in AWS Lambda</title>
      <link>https://pprakash.me/tech/2015/11/29/executing-ruby-code-in-aws-lambda/</link>
      <pubDate>Sun, 29 Nov 2015 18:41:59 +0000</pubDate>
      <guid>https://pprakash.me/tech/2015/11/29/executing-ruby-code-in-aws-lambda/</guid>
      <description>&lt;p&gt;AWS Lambda supports only Java, JavaScript &amp;amp; Python at the time of writing this post. I was wondering whether I can exploit the Lambda to execute chef’s &lt;a href=&#34;https://docs.chef.io/knife.html&#34;&gt;knife&lt;/a&gt; commands on it since Lambda runs on a Linux container. Using simple python function I have identified that the code of the Lambda function gets copied to &lt;code&gt;/var/task&lt;/code&gt; and executed from there.&lt;/p&gt;&#xA;&lt;p&gt;I decided to custom build ruby as embedded platform similar to how &lt;a href=&#34;https://downloads.chef.io/chef-client/&#34;&gt;chef-client&lt;/a&gt; or &lt;a href=&#34;https://downloads.chef.io/chef-dk/&#34;&gt;chefdk&lt;/a&gt; are distributed. My requirement is to execute knife commands and its uses embedded ruby version 2.1.0, hence I downloaded the source archive that specific version.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Automated cross account DNS management through CFN and API access through API gateway</title>
      <link>https://pprakash.me/tech/2015/11/27/automated-cross-account-dns-management-through-cfn-and-api-access-through-api-gateway/</link>
      <pubDate>Fri, 27 Nov 2015 09:57:13 +0000</pubDate>
      <guid>https://pprakash.me/tech/2015/11/27/automated-cross-account-dns-management-through-cfn-and-api-access-through-api-gateway/</guid>
      <description>&lt;p&gt;It’s a general best practice to manage all DNS entries in Route53 in a centralized AWS account. In that case it is difficult to automate the DNS record creation/deletion based on resources created in another AWS account using CloudFormation. CloudFormation doesn’t yet have the capability to create resources in a different AWS account.&lt;/p&gt;&#xA;&lt;p&gt;Combining IAM role delegation, AWS Lambda &amp;amp; CFN Custom resources provides us a solution. I have extended the same solution by exposing the Lambda function through API gateway which provides a powerful mechanism. The illustration give below explains the solution.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Obtain AMI Id from name to be used in CFN</title>
      <link>https://pprakash.me/tech/2015/11/22/obtain-ami-id-from-ami-name-to-be-used-in-cfn/</link>
      <pubDate>Sun, 22 Nov 2015 17:41:24 +0000</pubDate>
      <guid>https://pprakash.me/tech/2015/11/22/obtain-ami-id-from-ami-name-to-be-used-in-cfn/</guid>
      <description>&lt;p&gt;In most cases we create custom AMI’s for various reasons like OS hardening, installing and configuring additional software, etc. If you use single AWS account to create the AMI’s and share it with other AWS accounts and use that as part of CloudFormation template, it is required to pass the new AMI Id every time.&lt;/p&gt;&#xA;&lt;p&gt;AWS Lambda comes handy for easy and elegant solution to get the latest AMI Id based on the AMI name and owner.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Save AWS costs by scheduled start and stop of EC2 instances</title>
      <link>https://pprakash.me/tech/2015/11/15/save-aws-costs-by-scheduled-start-and-stop-of-ec2-instances/</link>
      <pubDate>Sun, 15 Nov 2015 14:56:57 +0000</pubDate>
      <guid>https://pprakash.me/tech/2015/11/15/save-aws-costs-by-scheduled-start-and-stop-of-ec2-instances/</guid>
      <description>&lt;p&gt;Most of the AWS resources are billed on per-hour basis which provides us an opportunity to save cost based on the usage pattern. Especially in case of Dev/Test environment, we need them only during the working days and working hours.&lt;/p&gt;&#xA;&lt;p&gt;By using &lt;a href=&#34;https://aws.amazon.com/lambda/&#34;&gt;AWS Lambda&lt;/a&gt; function (&lt;a href=&#34;https://aws.amazon.com/blogs/aws/aws-lambda-update-python-vpc-increased-function-duration-scheduling-and-more/&#34;&gt;python&lt;/a&gt;) in combination with EC2 instance tags, scheduled start or stop can be achieved with few lines of code.&lt;/p&gt;&#xA;&lt;p&gt;Advantages of using AWS Lambda:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;For 128MB memory we get 3,200,000 seconds &lt;a href=&#34;https://aws.amazon.com/lambda/pricing/&#34;&gt;free tier usage per month in AWS Lambda&lt;/a&gt; which will be more than enough for this function.&lt;/li&gt;&#xA;&lt;li&gt;IAM role will be associated with the Lambda function which will be used to perform the required task and no separate keys need to be configured.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;I used a tag with name as &lt;em&gt;schedule&lt;/em&gt; &amp;amp; JSON string for tag value using which I could define the day and time when it needs to be started or stopped.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Best editor for AWS CloudFormation template (JSON)</title>
      <link>https://pprakash.me/tech/2015/11/06/best-editor-for-aws-cloudformation-template-json/</link>
      <pubDate>Fri, 06 Nov 2015 21:56:03 +0000</pubDate>
      <guid>https://pprakash.me/tech/2015/11/06/best-editor-for-aws-cloudformation-template-json/</guid>
      <description>&lt;p&gt;AWS CloudFormation template is a way to describe the AWS resources that can be created/updated/deleted and it’s in JSON format. Like many other programming languages most of the editors/IDE don’t have proper syntax highlighting for JSON.&lt;/p&gt;&#xA;&lt;p&gt;For a long time I was using &lt;a href=&#34;https://notepad-plus-plus.org/&#34;&gt;notepad++&lt;/a&gt; and the built-in Javascript syntax highlighting which doesn&amp;rsquo;t provide much granular highlighting. I was looking for a much better editor and finally found &lt;a href=&#34;https://atom.io/&#34;&gt;Atom&lt;/a&gt;, the most powerful editor by GitHub. It provides the ability to customize almost everything in it. It also can be extended using huge list of packages and themes.&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
