<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Shane Dowling</title>
    <description>The latest articles on DEV Community by Shane Dowling (@shano).</description>
    <link>https://dev.to/shano</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F189818%2F081d23f7-81b3-4808-80b3-556482b7b3c7.jpeg</url>
      <title>DEV Community: Shane Dowling</title>
      <link>https://dev.to/shano</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/shano"/>
    <language>en</language>
    <item>
      <title>Learning Python as a Platform Engineer — First Steps</title>
      <dc:creator>Shane Dowling</dc:creator>
      <pubDate>Fri, 01 Jan 2021 14:48:49 +0000</pubDate>
      <link>https://dev.to/shano/learning-python-as-a-platform-engineer-first-steps-24dc</link>
      <guid>https://dev.to/shano/learning-python-as-a-platform-engineer-first-steps-24dc</guid>
      <description>&lt;h3&gt;
  
  
  Learning Python as a Platform Engineer — First Steps
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--pZkW1ZIg--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2At-tjPBb9m6YDhRdn3wKGSg.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--pZkW1ZIg--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2At-tjPBb9m6YDhRdn3wKGSg.jpeg" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I’ve relatively recently moved into a Platform Engineering position after working in very developer oriented teams for many years. What’s interesting is that the engineers you work with have much more diverse and interesting backgrounds in terms of their experience, so there’s a real opportunity to grow and learn a lot more, as opposed to a more homogenous set of developers. With that in mind, I wanted to put together materials on how a more ops focused engineer can up-skill in Python(as that’s more my wheel-house), in particular what are the things that would help you move into a more Python-focused role.&lt;/p&gt;

&lt;h3&gt;
  
  
  Where to start
&lt;/h3&gt;

&lt;p&gt;Beginners who have no experience of Python are going to need to get their head around the fundamentals. I wouldn’t avoid reading books, but you’re going to get more impact delivering. Prioritise writing and reading code over anything else. One thing I’d always suggest is to try automate parts of your life with code. There’s a great book called “Automate the boring stuff with Python” if you need inspiration to focus on delivering.&lt;/p&gt;

&lt;p&gt;Personally, when I needed a refresher in Python after several years of NodeJS, I started writing scripts that helped me to refresh myself. I wrote a script to alert me of the most up to date bus arrival times from TFL just before I’d usually leave the house in the morning, so I knew what time I had to leave.&lt;/p&gt;

&lt;p&gt;On an ongoing basis, I maintain a simple Python project on an ongoing-basis that will watch a YouTube channel and automatically download any streams that appear. I use this project to test out things is like to try out, such as new libraries or programming concepts. It’s a safe way to try things out before I might suggest using it at work.&lt;/p&gt;

&lt;p&gt;So to start with, &lt;strong&gt;pick a project&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  What to avoid
&lt;/h3&gt;

&lt;p&gt;Don’t read books and not output anything! It’s a trap of feeling productive while avoiding cementing any learnings. Think of it this way, you don’t want to “learn to code”, what you are is lazy and what you really want is to solve boring problems with code. You’re learning to use a hammer, find nails in your life to start banging away at!&lt;/p&gt;

&lt;p&gt;Also avoid getting bogged down in setup. As an ops engineer, you might lean more into what you’re comfortable with. Just get something super basic working and don’t waste too much time on setup or use repl.it and forget about it! Heck I even wrote a post on &lt;a href="https://shano.medium.com/why-im-using-an-ipad-as-my-at-home-machine-2fe3e8949bb2"&gt;coding on my iPad&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Set a goal
&lt;/h3&gt;

&lt;p&gt;Don’t set a vague goal when learning to program, getting “better” doesn’t mean anything. Programming is about delivering projects and learning what works and what doesn’t. Focus on delivering small projects that help you in any small way and iterate on complexity. Don’t be afraid to set clear goals for yourself and share them with others.&lt;/p&gt;

&lt;p&gt;If it helps try to think about it as a maturity vs capabilities. You don’t “mature” to be a developer, what would that even mean? Think of it more as adding capabilities to yourself, “I’m capable of writing a Python script, I’m capable of writing some tests, I’m capable of using boto to interact with AWS automatically”. Avoid thinking “I’ll read a bunch of books and be a developer some day”.&lt;/p&gt;

&lt;p&gt;So set a goal of delivering a &lt;strong&gt;specific project at a specific date&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Figure it out
&lt;/h3&gt;

&lt;p&gt;Now it’s time to start figuring out how to solve this problem you’ve set for yourself. At this stage I would say, look for what works best for you. Could you learn the basics more from say a book, a series of articles, a Udemy course? I’ve put some resources at the bottom of this post but this step really only you can define.&lt;/p&gt;

&lt;p&gt;The one thing I would recommend is getting good at reading documentation, try to read up using the Python docs first before using Google/SO, but it’s fine if that’s what you need to do.&lt;/p&gt;

&lt;h3&gt;
  
  
  Asking for help
&lt;/h3&gt;

&lt;p&gt;If you get stuck, ask for help. Ask colleagues, if you can’t ask them, ask on Stackoverflow or find a Python discord or IRC channel for example: &lt;a href="https://pythondiscord.com/"&gt;https://pythondiscord.com/&lt;/a&gt; and reach out. I can only speak for myself, but I always love helping people genuinely trying to learn but just getting blocked. If you can’t find any help at those resources and have some cash to spare, you can always use a service like &lt;a href="https://codementor.io"&gt;https://codementor.io&lt;/a&gt; to get the expertise you need.&lt;/p&gt;

&lt;h3&gt;
  
  
  Automate your (platform) life
&lt;/h3&gt;

&lt;p&gt;From a more platform-focused perspective, if you have say, manual things you do in AWS repeatedly, could that be turned into a quick script? Take a look at boto3 and see if there’s anything that could save you some time every day.&lt;/p&gt;

&lt;p&gt;Some inspiration:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;When an incident occurs in the systems you maintain, are there several things you might check depending on the type of incident that occurs? Perhaps you could automate pulling out some key data on your local machine to save some critical time.&lt;/li&gt;
&lt;li&gt;Rotating keys, setting up users, any other admin tasks you could use avoid logging into your cloud platform?&lt;/li&gt;
&lt;li&gt;Are there parts of your job where the UI of your cloud-provider of choice is a total pain(*cough* Cloudwatch… *cough*)? Perhaps you could avoid it by programming a solution.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Resources
&lt;/h3&gt;

&lt;p&gt;In terms of resources you can use:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://automatetheboringstuff.com"&gt;https://automatetheboringstuff.com&lt;/a&gt; — Great for inspiration to start projects.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.twilio.com/quest/learn/python"&gt;https://www.twilio.com/quest/learn/python&lt;/a&gt; — If you can’t think of any projects you’d like to start, this looks like a fun way to crank out some lines of code.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.fullstackpython.com/"&gt;https://www.fullstackpython.com/&lt;/a&gt; — Deep dive into programming in Python.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.youtube.com/watch?v=mvK0UzFNw1Q"&gt;https://www.youtube.com/watch?v=mvK0UzFNw1Q&lt;/a&gt; — Great video on where to start and explains why you should focus on delivering projects instead.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://repl.it/"&gt;https://repl.it/&lt;/a&gt; — Don’t get bogged down setting your local environment.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://codementor.io/"&gt;https://codementor.io/&lt;/a&gt; — Pay to get expert help.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is definitely enough to get a platform engineer started, I’ll expand on this series with next steps, so keep an eye! I’ll also start documenting how I’m growing from a Developer into a role demanding more Ops capabilities when I feel more comfortable myself.&lt;/p&gt;

</description>
      <category>python</category>
      <category>learning</category>
      <category>learningtocode</category>
      <category>devops</category>
    </item>
    <item>
      <title>Populate Ansible from Amazon secrets manager</title>
      <dc:creator>Shane Dowling</dc:creator>
      <pubDate>Thu, 03 Sep 2020 18:06:58 +0000</pubDate>
      <link>https://dev.to/shano/populate-ansible-from-amazon-secrets-manager-4p10</link>
      <guid>https://dev.to/shano/populate-ansible-from-amazon-secrets-manager-4p10</guid>
      <description>&lt;h3&gt;
  
  
  Populate Ansible from AWS Secrets Manager
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--DUBrURX5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2Al0WrN40X7lf7tKsbdtj7Sw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--DUBrURX5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2Al0WrN40X7lf7tKsbdtj7Sw.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;One of the ways to improve your security and avoid passing around env files is to follow the &lt;a href="https://12factor.net/config"&gt;twelve factor app&lt;/a&gt; and start populating your secrets from the environment. Another improvement is to pull those secrets from a known secret store, with features like rotation, auditing etc.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Requirements&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.ansible.com/"&gt;Ansible&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Have some secrets stored in &lt;a href="https://aws.amazon.com/secrets-manager/"&gt;AWS Secrets Manager&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Ansible should have access to the latest &lt;a href="https://aws.amazon.com/cli/"&gt;aws-cli&lt;/a&gt; command(secrets manager is a recent addition)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://stedolan.github.io/jq/"&gt;Jq&lt;/a&gt; if you’re storing json in your secrets&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It’s worth testing your AWS calls to just extract the secret you’re interested in to stdout, from the terminal tests some calls like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;aws secretsmanager get-secret-value --secret-id some/secret/name --query SecretString --output text
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or for json you might do something like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;aws secretsmanager get-secret-value --secret-id secrets| jq --raw-output '.SecretString' | jq -r .API\_KEY
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Ansible Config
&lt;/h3&gt;

&lt;p&gt;Once you have secrets manager outputting your secrets to stdout, you can utilise it in Ansible. In this example I’m outputting to an env file but this could but used anywhere in Ansible. Instead of outputting to a file you could set its own environment variables then spin up the project from Ansible without outputting to a file anywhere.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;- name: Setting env with some secret
  args:
    executable: /bin/bash
  shell: |
    aws secretsmanager get-secret-value --secret-id some/secret/name --query SecretString --output text
  register: some\_secret

- name: pass response of ssm to .env file
  become: no
  blockinfile:
    dest: '{{ some\_environment\_path }}/.env'
    state: present
    create: yes
    marker: "# {mark} MY SECRET FROM AWS #"
    block: |
      SOME\_SECRET='{{ some\_secret.stdout }}'
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And that’s it! Anything I could’ve done better(which I’m sure there is), do let me know!&lt;/p&gt;




</description>
      <category>secrets</category>
      <category>aws</category>
      <category>ansible</category>
    </item>
    <item>
      <title>Better local development for Serverless Functions</title>
      <dc:creator>Shane Dowling</dc:creator>
      <pubDate>Mon, 11 Feb 2019 20:15:38 +0000</pubDate>
      <link>https://dev.to/shano/better-local-development-for-serverless-functions-52ah</link>
      <guid>https://dev.to/shano/better-local-development-for-serverless-functions-52ah</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--3wyPSeNC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2AroedigbmFjRYkZobdZWuKg.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--3wyPSeNC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2AroedigbmFjRYkZobdZWuKg.jpeg" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Lambda is a terrific piece of kit for all the benefits listed on the &lt;a href="https://aws.amazon.com/lambda/"&gt;AWS product page&lt;/a&gt; and &lt;a href="https://serverless.com/"&gt;Serverless&lt;/a&gt; is a very useful framework for developing Lambda functions. However, developing serverless applications locally is a total pain if what you’re solving isn’t totally trivial.&lt;/p&gt;

&lt;p&gt;When things get complicated and your Lambda functions start to integrate with other AWS services, things really begin to break down. There are a few things that look like silver-bullets, I’ll share them here and explain why they didn’t work for me, then give you a working example that I myself struggled to find(hence me writing this).&lt;/p&gt;

&lt;h3&gt;
  
  
  Localstack
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/localstack/localstack"&gt;Localstack&lt;/a&gt; is definitely the biggest attempt at a silver bullet here. Basically it emulates a huge chunk of AWS locally and you connect your serverless functions into that. Why I didn’t use it:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Bits worked, but if you have any sort of half complicated setup(like a region outside us-east-1 or eu-west-1), it will break down. Uploading a whole cloudformation template was a disaster of broken links between services. I got to the point of editing localstack code to try fix issue after issue I was coming across and gave up. The product would be cool if it wasn’t trying to do something so super complicated.&lt;/li&gt;
&lt;li&gt;It’s also a huge resource drain on a developer’s machine.&lt;/li&gt;
&lt;li&gt;Fundamentally, you shouldn’t have to emulate half of AWS to test your code.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Serverless Offline
&lt;/h3&gt;

&lt;p&gt;Serverless offline is fairly straightforward. It should allow you to spin up your functions locally and call them as needed. Where this fell down for me was that it required you to have HTTP endpoints for your lambda functions, all of our Lambda functions were driven either by SQS events or a Cron. We also instantiate our SNS topics in our code, so it would constantly attempt to create SNS topics and AWS would throw errors.&lt;/p&gt;

&lt;p&gt;I also did try using &lt;a href="https://www.npmjs.com/package/serverless-offline-sqs"&gt;serverless-offline-sqs&lt;/a&gt; but could not get it to drive events into our Lamdba functions.&lt;/p&gt;

&lt;p&gt;I was burning a lot of time getting a dev environment setup and I realised that this was fundamentally the wrong approach. I needed to start writing proper unit tests and use mocking to emulate the infrastructure(I mean ideally they’d be isolated properly and infrastructure/functions would be totally ignorant of each other, but that’s for another day).&lt;/p&gt;

&lt;h3&gt;
  
  
  The Example
&lt;/h3&gt;

&lt;p&gt;Say we’re developing an application that makes use of:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Lambda&lt;/li&gt;
&lt;li&gt;MongoDB&lt;/li&gt;
&lt;li&gt;SQS&lt;/li&gt;
&lt;li&gt;SNS&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Your lambda function connects to your MongoDB, does a thing and fires off occasional SNS notifications/SQS messages to other services.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Lambda&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;For the actual code being run, I was going to use &lt;a href="https://www.npmjs.com/package/jest"&gt;jest&lt;/a&gt; to start writing tests. Jest works well and integrates nicely into serverless.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;MongoDB&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;To emulate MongoDB, I’m going to use an &lt;a href="https://www.npmjs.com/package/mongodb-memory-server"&gt;in-memory version of MongoDB&lt;/a&gt; that ties nicely into our Mongoose models.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;SQS/SNS&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;For any Amazon infrastructure, we’re going to use &lt;a href="https://www.npmjs.com/package/aws-sdk-mock"&gt;aws-sdk-mock&lt;/a&gt;. This is an excellent wrapper around &lt;a href="https://www.npmjs.com/package/sinon"&gt;sinon&lt;/a&gt; for mocking the AWS infrastructure, that’s super useful for unit tests as you’ll see later.&lt;/p&gt;

&lt;h3&gt;
  
  
  Tieing it all together
&lt;/h3&gt;

&lt;p&gt;So firstly lets install our dependencies.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm install aws-sdk-mock mongodb-memory-server sinon jest --save-dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Let’s also create a tests folder to keep all this test code in.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;mkdir tests
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Setting up MongoDB&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Now, for our code to integrate with our in-memory Mongo-DB server, we’re going to need to add a few setup/teardown functions and a Mongo Environment. Clone this &lt;a href="https://github.com/vladgolubev/jest-mongodb"&gt;repo&lt;/a&gt; and put:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;setup.js&lt;/li&gt;
&lt;li&gt;teardown.js&lt;/li&gt;
&lt;li&gt;mongo-environment.js&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;into your new test folder.&lt;/p&gt;

&lt;p&gt;In your root directory add a jest.config.js with this content.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;module.exports = {
 globalSetup: './tests/setup.js',
 globalTeardown: './tests/teardown.js',
 testEnvironment: './tests/mongo-environment.js',
 roots: ['./tests/'],
};
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;This should be enough to get MongoDB up and running. Now onto our actual tests scripts.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Setting up our tests&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Now, finally, you can tie it all together with this snippet:&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;



&lt;p&gt;Add jest to your package.json&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"scripts":{ 
 "test": "jest"
},
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And run with npm test .&lt;/p&gt;

&lt;p&gt;One major point to note is that aws-mock-sdk requires a very specific way of instantiating AWS resources(within the scope of the function tests), so if you see any errors around aws regions, double check &lt;a href="https://github.com/dwyl/aws-sdk-mock#use-in-your-tests"&gt;you’re following the rules&lt;/a&gt;.&lt;/p&gt;




</description>
      <category>aws</category>
      <category>serverlessfunctions</category>
      <category>javascript</category>
      <category>serverless</category>
    </item>
    <item>
      <title>Easy maintenance mode with nginx</title>
      <dc:creator>Shane Dowling</dc:creator>
      <pubDate>Mon, 20 Aug 2018 18:51:42 +0000</pubDate>
      <link>https://dev.to/shano/easy-maintenance-mode-with-nginx-2c6g</link>
      <guid>https://dev.to/shano/easy-maintenance-mode-with-nginx-2c6g</guid>
      <description>&lt;p&gt;So I combined a few solutions I found online to come up with a quick way to set up maintenance mode using nginx. Ideally it shouldn’t happen but in times of emergency in can be good to knock up a quick maintenance page for everyone but your own internal ips.&lt;/p&gt;

&lt;h3&gt;
  
  
  Nginx Config
&lt;/h3&gt;

&lt;p&gt;So here’s the configuration I use for nginx, it starts with setting the internal ips of your company in the main nginx config file. Then in the actual vhost, you can set it to watch for the existence of a maintenance_on.html and when it exists, throw a 503 and use the maintenance page as your 503 error page.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;h3&gt;
  
  
  How to use
&lt;/h3&gt;

&lt;p&gt;By default I have the file named as maintenance_off.html, so it’s only a simple move operation to turn on maintenance mode. For the content of my maintenance file, I generally use this self-contained static html file to serve out a message to customers.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt; : Any sort of conditionals going on on your web server is likely to slow things down by a few milliseconds. Again you’re asking your web server to check against network and the disk per request, then make a decision, so bear this in mind before implementing a solution like this.&lt;/p&gt;




</description>
      <category>linux</category>
      <category>devops</category>
      <category>nginx</category>
    </item>
  </channel>
</rss>
