<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Round the loop and back</title>
	<atom:link href="https://krystanhonour.com/feed/" rel="self" type="application/rss+xml" />
	<link>https://krystanhonour.com</link>
	<description>the story of one developer and his code.</description>
	<lastBuildDate>Mon, 05 Jan 2026 11:06:08 +0000</lastBuildDate>
	<language>en-GB</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9</generator>
<site xmlns="com-wordpress:feed-additions:1">104312277</site>	<item>
		<title>The Importance of Consistency in Code Formatting</title>
		<link>https://krystanhonour.com/2026/01/05/the-importance-of-consistency-in-code-formatting/</link>
					<comments>https://krystanhonour.com/2026/01/05/the-importance-of-consistency-in-code-formatting/#respond</comments>
		
		<dc:creator><![CDATA[Krystan]]></dc:creator>
		<pubDate>Mon, 05 Jan 2026 10:56:52 +0000</pubDate>
				<category><![CDATA[Personal]]></category>
		<category><![CDATA[Technical]]></category>
		<guid isPermaLink="false">https://krystanhonour.com/?p=1056</guid>

					<description><![CDATA[<p>A senior developer reflects on the tabs vs spaces debate, explaining why code consistency and modern tooling matter more than ideology.</p>
The post <a href="https://krystanhonour.com/2026/01/05/the-importance-of-consistency-in-code-formatting/">The Importance of Consistency in Code Formatting</a> first appeared on <a href="https://krystanhonour.com">Round the loop and back</a>.]]></description>
										<content:encoded><![CDATA[<p>I’ve been writing code since I was about eight years old. Over that time the tabs vs spaces debate has come up more times than I can count.</p>



<p>I started with BASIC on a Sinclair ZX81. Then, I moved on to an Acorn Electron. I later looked on with envy at a neighbour. This neighbour was a few years older than me. They had all the exciting kit — Atari machines and then an Amiga. I eventually bought an Amiga A500 Plus with my first pay cheque, later an A1200, and that’s where I first started experimenting seriously with C and C++.</p>



<p>After a break, I returned to university in the late 1990s to formally study Computer Science.</p>



<p>I’m now fifty, and while I still care deeply about code quality, I’ve learned that some of the “religious wars” of our industry are better approached with perspective than pitchforks. The tabs vs spaces debate is a perfect example.</p>



<p>This isn’t a rant. It’s a preference — informed by a lot of years reading, writing, reviewing, and maintaining other people’s code.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">What a tab actually is (and isn’t)</h2>



<p>A tab character does <strong>not</strong> represent a fixed amount of whitespace.</p>



<p>A tab is an <strong>alignment character</strong>. When rendered, it moves the cursor to the next <em>tab stop</em>. Where that tab stop lies depends entirely on editor configuration. One developer might use tab stops of 2 spaces, another 4, another 8 — all perfectly valid choices.</p>



<p>This flexibility is intentional, and it’s also where most problems start.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">Legitimate reasons to use tabs</h2>



<p>There <em>are</em> good, well-established reasons to use tabs, and it’s worth stating that clearly:</p>



<ul class="wp-block-list">
<li><strong>Accessibility</strong>: Tabs allow developers to adjust indentation width to suit eyesight or personal preference without changing the file.</li>



<li><strong>Established conventions</strong>: Some ecosystems explicitly require tabs (Makefiles being the canonical example).</li>



<li><strong>Column alignment</strong>: Tabs can be genuinely useful for aligning tabular data.</li>



<li><strong>Long-lived codebases</strong>: Many large projects standardised on tabs decades ago, and consistency matters more than re-litigating old decisions.</li>
</ul>



<p>Using tabs in these contexts is not wrong, careless, or outdated.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p>In collaborative environments, tabs can introduce subtle problems when:</p>



<ul class="wp-block-list">
<li>Contributors use <strong>different tab stop widths</strong></li>



<li>Indentation is done manually rather than via editor automation</li>



<li>Tabs are used inconsistently or mixed with spaces</li>
</ul>



<p>The result is familiar: code that looks neatly structured in one editor becomes misaligned and hard to read in another. This isn’t because tabs are “bad” — it’s because their visual meaning is contextual.</p>



<p>When indentation carries semantic or cognitive weight — as it does in Python, YAML, or deeply nested logic — that variability becomes a real source of distraction and, occasionally, error.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">Why I still prefer spaces</h2>



<p>Personally, I prefer spaces for indentation.</p>



<p>Not because tabs are invalid, but because <strong>spaces optimise for predictability</strong>:</p>



<ul class="wp-block-list">
<li>A space is always exactly one column wide.</li>



<li>What you see in your editor is what everyone else sees.</li>



<li>Structure and alignment are unambiguous.</li>



<li>Diffs are cleaner and easier to review.</li>



<li>Accidental misalignment is harder to introduce.</li>
</ul>



<p>In practice, spaces achieve the same aim as tabs — expressing structure — but with fewer moving parts. After a few decades of working on large, shared codebases, I’ve come to value that reduction in ambiguity more than the flexibility tabs provide.</p>



<p>This is why I enable “insert spaces instead of tabs” in every editor I use. Not out of dogma, but because it removes an entire category of avoidable problems.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">tabs vs spaces: The real problem isn’t tabs — it’s inconsistency</h2>



<p>If there <em>is</em> a genuine villain in this debate, it’s inconsistency.</p>



<p>Mixing tabs and spaces without a clearly enforced standard is a reliable way to:</p>



<ul class="wp-block-list">
<li>Break visual structure</li>



<li>Generate noisy diffs</li>



<li>Turn code reviews into archaeology</li>
</ul>



<p>Fortunately, this is much easier to manage today than it was when this debate first flared up.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">tabs vs spaces in Code: A brief note on modern tooling</h2>



<p>In 2026, this debate is far less painful thanks to tooling:</p>



<ul class="wp-block-list">
<li><strong>EditorConfig</strong> allows projects to declare indentation rules once and have them respected across editors.</li>



<li><strong>Auto-formatters</strong> (Prettier, Black, gofmt, clang-format, rustfmt) remove human inconsistency entirely.</li>



<li><strong>Linters and CI checks</strong> can enforce formatting automatically and objectively.</li>



<li><strong>IDE defaults</strong> are far better than they used to be, and much easier to standardise.</li>
</ul>



<p>With the right tools in place, teams can safely use tabs <em>or</em> spaces and still achieve clean, readable, consistent code.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">Closing thoughts</h2>



<p>Tabs vs spaces isn’t a moral issue, and it isn’t a measure of engineering quality. It’s a trade-off between flexibility and determinism.</p>



<p>I choose spaces because they give me the same outcome with fewer surprises. Others choose tabs for equally valid reasons. What matters far more than the choice itself is that teams agree, document it, and let tooling enforce it.</p>



<p>After fifty years on this planet — and many of them writing code — I’ve learned that consistency beats ideology every time.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p><strong>Footnote:</strong><br>This piece is a rewrite of a much more forcefully worded post I originally wrote in 2009. At the time, the tabs vs spaces debate felt like a hill worth dying on. With a few more decades of experience — and a lot more shared codebases behind me — I’ve come to value consistency, tooling, and pragmatism far more than winning arguments. I still prefer spaces, for the reasons outlined above, but I’m much happier these days letting formatters and standards do the heavy lifting.</p>The post <a href="https://krystanhonour.com/2026/01/05/the-importance-of-consistency-in-code-formatting/">The Importance of Consistency in Code Formatting</a> first appeared on <a href="https://krystanhonour.com">Round the loop and back</a>.]]></content:encoded>
					
					<wfw:commentRss>https://krystanhonour.com/2026/01/05/the-importance-of-consistency-in-code-formatting/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1056</post-id>	</item>
		<item>
		<title>So you want to take the Kubernetes Administrator Exam (CKA)</title>
		<link>https://krystanhonour.com/2023/05/23/so-you-want-to-take-the-kubernetes-administrator-exam-cka/</link>
					<comments>https://krystanhonour.com/2023/05/23/so-you-want-to-take-the-kubernetes-administrator-exam-cka/#respond</comments>
		
		<dc:creator><![CDATA[Krystan]]></dc:creator>
		<pubDate>Tue, 23 May 2023 11:14:27 +0000</pubDate>
				<category><![CDATA[Personal]]></category>
		<guid isPermaLink="false">https://krystanhonour.com/?p=957</guid>

					<description><![CDATA[<p>It is tempting to think you are ready to take the Kubernetes Administrator Exam because you have a small cluster at home or have been working with Kubernetes for 5 or 6 months. I&#8217;ll admit I was one of those people who thought this, and then I took a look at the curriculum for this&#8230;</p>
The post <a href="https://krystanhonour.com/2023/05/23/so-you-want-to-take-the-kubernetes-administrator-exam-cka/">So you want to take the Kubernetes Administrator Exam (CKA)</a> first appeared on <a href="https://krystanhonour.com">Round the loop and back</a>.]]></description>
										<content:encoded><![CDATA[<p>It is tempting to think you are ready to take the Kubernetes Administrator Exam because you have a small cluster at home or have been working with Kubernetes for 5 or 6 months. I&#8217;ll admit I was one of those people who thought this, and then I took a look at the curriculum for this and realised I was going to need a bit more study. I was also unaware that unlike other exams I had taken in technologies, this exam is a practical exam, which means you need to be able to put into practice, under a time limit, what you know in the manner the exam wants it.</p>



<p>Like any exam, it is important to understand the subject&#8217;s key concepts. These are:</p>



<ul class="wp-block-list">
<li>Cluster Architecture</li>



<li>Cluster installation (non-managed service)</li>



<li>Networking</li>



<li>Scheduling</li>



<li>Security</li>



<li>Troubleshooting</li>
</ul>



<p>The steps I took for revision included setting up a cluster from scratch using <a href="https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/" target="_blank" rel="noopener" title="kubeadm">kubeadm</a>, I also played with <a href="https://kops.sigs.k8s.io/" target="_blank" rel="noopener" title="kops ">kops </a>a little, but you should focus on <a href="https://kubernetes.io/docs/reference/setup-tools/kubeadm/" target="_blank" rel="noopener" title="kubeadm">kubeadm</a>. When I did this, I also focused on installing networking plugins; at the time, I used flannel and weave, but there are others, like calico, <a href="https://github.com/flannel-io/flannel" target="_blank" rel="noopener" title="flannel ">flannel </a>is easy to understand in the first instance.</p>



<p>Core concepts to understand are:</p>



<ul class="wp-block-list">
<li><a href="https://kubernetes.io/docs/concepts/workloads/pods/" target="_blank" rel="noopener" title="Pods">Pods</a></li>



<li><a href="https://kubernetes.io/docs/concepts/workloads/controllers/deployment/" target="_blank" rel="noopener" title="Deployments">Deployments</a></li>



<li><a href="https://kubernetes.io/docs/concepts/services-networking/service/" target="_blank" rel="noopener" title="Services">Services</a></li>



<li><a href="https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/" target="_blank" rel="noopener" title="Namespaces">Namespaces</a></li>



<li><a href="https://kubernetes.io/docs/concepts/configuration/configmap/" target="_blank" rel="noopener" title="Configmaps">Configmaps</a></li>



<li><a href="https://kubernetes.io/docs/concepts/configuration/secret/" target="_blank" rel="noopener" title="Secrets">Secrets</a></li>



<li><a href="https://kubernetes.io/docs/concepts/storage/persistent-volumes/" target="_blank" rel="noopener" title="Persistent Volumes">Persistent Volumes</a></li>



<li><a href="https://kubernetes.io/docs/tasks/configure-pod-container/configure-persistent-volume-storage/#create-a-persistentvolumeclaim" target="_blank" rel="noopener" title="Persistent Volume Claims">Persistent Volume Claims</a></li>
</ul>



<p><a href="https://kubernetes.io/docs/concepts/services-networking/" target="_blank" rel="noopener" title="Networking models">Networking models</a> to understand thoroughly would be</p>



<ul class="wp-block-list">
<li>Services:
<ul class="wp-block-list">
<li><a href="https://kubernetes.io/docs/concepts/services-networking/cluster-ip-allocation/" target="_blank" rel="noopener" title="ClusterIP">ClusterIP</a></li>



<li><a href="https://kubernetes.io/blog/2023/05/11/nodeport-dynamic-and-static-allocation/" target="_blank" rel="noopener" title="NodePort">NodePort</a></li>



<li><a href="https://kubernetes.io/docs/concepts/services-networking/" target="_blank" rel="noopener" title="Loadbalancer">Loadbalancer</a></li>
</ul>
</li>



<li>Ingress
<ul class="wp-block-list">
<li><a href="https://kubernetes.io/docs/concepts/services-networking/ingress/" target="_blank" rel="noopener" title="Ingress itself">Ingress itself</a></li>



<li><a href="https://kubernetes.io/docs/concepts/services-networking/ingress-controllers/" target="_blank" rel="noopener" title="Ingress Controllers">Ingress Controllers</a></li>
</ul>
</li>



<li><a href="https://kubernetes.io/docs/concepts/services-networking/dns-pod-service/" target="_blank" rel="noopener" title="DNS">DNS</a></li>
</ul>



<p>Troubleshooting, this is a little more complicated. You should know how the <a href="https://kubernetes.io/docs/reference/command-line-tools-reference/kubelet/" target="_blank" rel="noopener" title="kubelet">kubelet</a> works, what it&#8217;s for, what common config files are used in a cluster, and where they sit on the Linux file system.</p>



<p>I cannot stress enough that you need to do be able to do this on the cli with no fancy guis. Also, the exam drops you in a shell with vi editor or nano, and that&#8217;s it, so you need to be comfortable in this environment; if you are not, you will not do well.</p>



<p>Pod scheduling and security concepts to understand would be</p>



<ul class="wp-block-list">
<li><a href="https://kubernetes.io/docs/reference/access-authn-authz/rbac/" target="_blank" rel="noopener" title="Role-based Access control (RBAC)">Role-based Access control (RBAC)</a></li>



<li><a href="https://kubernetes.io/docs/tasks/configure-pod-container/configure-service-account/" target="_blank" rel="noopener" title="Service accounts">Service accounts</a></li>



<li><a href="https://kubernetes.io/docs/concepts/services-networking/network-policies/" target="_blank" rel="noopener" title="Network policies">Network policies</a></li>



<li><a href="https://kubernetes.io/docs/concepts/security/pod-security-admission/" target="_blank" rel="noopener" title="Pod Security Admission">Pod Security Admission</a></li>



<li><a href="https://kubernetes.io/docs/concepts/cluster-administration/logging/" target="_blank" rel="noopener" title="Kubernetes audit and logging mechanism">Kubernetes audit and logging mechanism</a>s</li>
</ul>



<p>Cluster maintenance, you should practice</p>



<ul class="wp-block-list">
<li><a href="https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm-join/" target="_blank" rel="noopener" title="adding and removing nodes from the cluster">adding and removing nodes from the cluster</a></li>



<li><a href="https://kubernetes.io/docs/tasks/administer-cluster/kubeadm/kubeadm-upgrade/" target="_blank" rel="noopener" title="upgrading Kubernetes clusters">upgrading Kubernetes clusters</a></li>



<li><a href="https://kubernetes.io/docs/tasks/administer-cluster/kubeadm/upgrading-linux-nodes/" target="_blank" rel="noopener" title="upgrade a linux machine installed as a node">upgrade a linux machine installed as a node</a></li>



<li><a href="https://krystanhonour.com/2023/02/16/so-your-kubernetes-tls-certificates-have-expired-in-your-home-lab-what-to-do/" target="_blank" rel="noopener" title="replacing expired certificates">replacing expired certificates</a> </li>



<li><a href="https://kubernetes.io/docs/tasks/administer-cluster/configure-upgrade-etcd/#backing-up-an-etcd-cluster" target="_blank" rel="noopener" title="backing up etcd">backing up etcd</a></li>



<li><a href="https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/" target="_blank" rel="noopener" title="assigning pods to nodes">assigning pods to nodes</a> </li>
</ul>



<p></p>



<p>So this is what to learn, but where can I learn this? The <a href="https://kubernetes.io/docs/" target="_blank" rel="noopener" title="Kubernetes documentation">Kubernetes documentation</a> is very, very good. To learn the kubectl tool, you can look at the <a href="https://kubernetes.io/docs/reference/kubectl/cheatsheet/" target="_blank" rel="noopener" title="">cheat sheet</a>. I spent a lot of time on this, and it was worth it as many of the questions I was asked had their answers rooted in these commands; I also found using kubectl explain useful for reminders.</p>



<p></p>



<p>Other learning resources</p>



<ul class="wp-block-list">
<li><a href="https://killercoda.com/killer-shell-cka" target="_blank" rel="noopener" title="Killercoda">Killercoda</a> has some excellent environments, and I used these.</li>



<li><a href="https://www.udemy.com/course/certified-kubernetes-administrator-with-practice-tests/" target="_blank" rel="noopener" title="KodeKloud Training">KodeKloud Training</a> has a great CKA course on Udemy.</li>



<li><a href="https://killer.sh/course/preview/e84d0e31-4fff-4c42-8afd-be1bdbc0d994" target="_blank" rel="noopener" title="Killer Shell">Killer Shell</a> has a good run-through of their preview simulator available, which gives you a good idea of the depth you can expect to need to know, its harder than the exam and you get two instances of this when you sign up, do not make the mistake of not doing this, if you pass this well then its a good indication you are ready, if you score a low score, perhaps think twice about taking the exam soon.</li>
</ul>



<p>In addition, I set up a home cluster using Raspberry Pi, but if you cannot stretch to that, you can use kops and virtual box to do so. The lowest entry barrier is installing Docker Desktop and enabling Kubernetes there, which will get you started with no fuss and the ability to learn kubectl commands. The docker desktop method, however, is not enough to learn how to set up a cluster from scratch.</p>



<p>If you give all this a good go you should be ready do some practice exams to be sure. One last thing which will be of interest but not strictly necessary for the exam, I always say after this read an article that was pointed out to me by a colleague some time ago and that is <a href="https://www.ianlewis.org/" target="_blank" rel="noopener" title="Ian lewis's">Ian lewis&#8217;s</a> article <a href="https://www.ianlewis.org/en/almighty-pause-container" target="_blank" rel="noopener" title="The almighty pause container">The almighty pause container</a>. Honestly I learned so much reading that. <a href="https://www.ianlewis.org/en/what-are-kubernetes-pods-anyway" target="_blank" rel="noopener" title="">Ian also does an amazing job explaining Pods</a></p>The post <a href="https://krystanhonour.com/2023/05/23/so-you-want-to-take-the-kubernetes-administrator-exam-cka/">So you want to take the Kubernetes Administrator Exam (CKA)</a> first appeared on <a href="https://krystanhonour.com">Round the loop and back</a>.]]></content:encoded>
					
					<wfw:commentRss>https://krystanhonour.com/2023/05/23/so-you-want-to-take-the-kubernetes-administrator-exam-cka/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">957</post-id>	</item>
		<item>
		<title>So your kubernetes TLS certificates have expired in your home lab, what to do?</title>
		<link>https://krystanhonour.com/2023/02/16/so-your-kubernetes-tls-certificates-have-expired-in-your-home-lab-what-to-do/</link>
					<comments>https://krystanhonour.com/2023/02/16/so-your-kubernetes-tls-certificates-have-expired-in-your-home-lab-what-to-do/#respond</comments>
		
		<dc:creator><![CDATA[Krystan]]></dc:creator>
		<pubDate>Thu, 16 Feb 2023 12:48:16 +0000</pubDate>
				<category><![CDATA[Technical]]></category>
		<guid isPermaLink="false">https://krystanhonour.com/?p=941</guid>

					<description><![CDATA[<p>After a year the TLS certificates on your cluster will expire this is because the job of the certificates is to establish a two way trust and if expired that trust is no longer valid, , when this happens you will see the following error message if you try to communicate with it: The next&#8230;</p>
The post <a href="https://krystanhonour.com/2023/02/16/so-your-kubernetes-tls-certificates-have-expired-in-your-home-lab-what-to-do/">So your kubernetes TLS certificates have expired in your home lab, what to do?</a> first appeared on <a href="https://krystanhonour.com">Round the loop and back</a>.]]></description>
										<content:encoded><![CDATA[<p>After a year the TLS certificates on your cluster will expire this is because the job of the certificates is to establish a two way trust and if expired that trust is no longer valid, , when this happens you will see the following error message if you try to communicate with it:</p>



<pre class="wp-block-code"><code>Unable to connect to the server: x509: certificate has expired or is not yet valid: &lt;timestamp here&gt;</code></pre>



<p>The next step is to renew these certificates to restore communication you can do this with <code>kubeadm</code>.  So issue the following command:</p>



<pre class="wp-block-code"><code>sudo kubeadm alpha certs renew all</code></pre>



<p>You will then get output which looks something like this as the certificates are renewed:</p>



<pre class="wp-block-code"><code>certificate embedded in the kubeconfig file for the admin to use and for kubeadm itself renewed
certificate for serving the Kubernetes API renewed
certificate the apiserver uses to access etcd renewed
certificate for the API server to connect to kubelet renewed
certificate embedded in the kubeconfig file for the controller manager to use renewed
certificate for liveness probes to healthcheck etcd renewed
certificate for etcd nodes to communicate with each other renewed
certificate for serving etcd renewed
certificate for the front proxy client renewed
certificate embedded in the kubeconfig file for the scheduler manager to use renewed</code></pre>



<p>Kubernetes will then output that you need to restart api-server, controller-manager and kubelet so they can use the new certificates you have created, the quickest (and dirtiest) way in a simple home lab cluster to do this is to reboot the control plane. Before you restart you need to manage the configuration so backup the old one if you like then issue the following command.</p>



<pre class="wp-block-code"><code>sudo cp /etc/kubernetes/admin.conf ~/.kube/config</code></pre>



<p>Now restart your control plane node(s). Upon reboot you should find that after the cluster settles you are able to check the current certificates with:</p>



<pre class="wp-block-code"><code>sudo kubeadm certs check-expiration
</code></pre>



<p>Which would yield output like this:</p>



<pre class="wp-block-preformatted">CERTIFICATE                EXPIRES                  RESIDUAL TIME   CERTIFICATE AUTHORITY   EXTERNALLY MANAGED
admin.conf                 Feb 16, 2024 12:16 UTC   364d                                    no
apiserver                  Feb 16, 2024 12:16 UTC   364d            ca                      no
apiserver-etcd-client      Feb 16, 2024 12:16 UTC   364d            etcd-ca                 no
apiserver-kubelet-client   Feb 16, 2024 12:17 UTC   364d            ca                      no
controller-manager.conf    Feb 16, 2024 12:17 UTC   364d                                    no
etcd-healthcheck-client    Feb 16, 2024 12:17 UTC   364d            etcd-ca                 no
etcd-peer                  Feb 16, 2024 12:17 UTC   364d            etcd-ca                 no
etcd-server                Feb 16, 2024 12:17 UTC   364d            etcd-ca                 no
front-proxy-client         Feb 16, 2024 12:17 UTC   364d            front-proxy-ca          no
scheduler.conf             Feb 16, 2024 12:17 UTC   364d                                    no
</pre>



<p>Arguably you should be doing this before your certs expire to not loose communication but the process is the same for renewal.</p>



<p>If you prefer not to reboot, which admittedly is the dirty way to do this, you can restart the kubelet on the master node, as a note the kube-apiserver runs as a <a href="https://kubernetes.io/docs/tasks/configure-pod-container/static-pod/" title="">static pod</a>.</p>



<pre class="wp-block-code"><code>system restart kubelet</code></pre>



<p>When you issue that command all of the kube-&lt;name> services should restart.</p>The post <a href="https://krystanhonour.com/2023/02/16/so-your-kubernetes-tls-certificates-have-expired-in-your-home-lab-what-to-do/">So your kubernetes TLS certificates have expired in your home lab, what to do?</a> first appeared on <a href="https://krystanhonour.com">Round the loop and back</a>.]]></content:encoded>
					
					<wfw:commentRss>https://krystanhonour.com/2023/02/16/so-your-kubernetes-tls-certificates-have-expired-in-your-home-lab-what-to-do/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">941</post-id>	</item>
		<item>
		<title>AWS EC2 and Certificates</title>
		<link>https://krystanhonour.com/2023/01/27/aws-ec2-and-certificates/</link>
					<comments>https://krystanhonour.com/2023/01/27/aws-ec2-and-certificates/#respond</comments>
		
		<dc:creator><![CDATA[Krystan]]></dc:creator>
		<pubDate>Fri, 27 Jan 2023 14:44:52 +0000</pubDate>
				<category><![CDATA[Technical]]></category>
		<category><![CDATA[aws]]></category>
		<category><![CDATA[certificates]]></category>
		<category><![CDATA[ec2]]></category>
		<category><![CDATA[technical]]></category>
		<guid isPermaLink="false">https://krystanhonour.com/?p=930</guid>

					<description><![CDATA[<p>One of the things that confused me when I first started using certificates on AWS was how they could be used with EC2 machines. But, it is not possible to use ACM certificates with EC2 directly because you cannot export certificates from ACM. After all, the service manages the private key. So when a public&#8230;</p>
The post <a href="https://krystanhonour.com/2023/01/27/aws-ec2-and-certificates/">AWS EC2 and Certificates</a> first appeared on <a href="https://krystanhonour.com">Round the loop and back</a>.]]></description>
										<content:encoded><![CDATA[<p>One of the things that confused me when I first started using certificates on AWS was how they could be used with EC2 machines. But, it is not possible to use ACM certificates with EC2 directly because you cannot export certificates from ACM. After all, the service manages the private key. So when a public certificate is created, ACM essentially creates a KMS key which it operates and associates with ACM by setting its alias to <code>aws/acm</code>. This process is described in detail in the documentation just <a href="https://docs.aws.amazon.com/acm/latest/userguide/data-protection.html#kms" target="_blank" rel="noopener" title="here">here</a>. </p>



<p>Suppose you want to use an ACM certificate with an EC2 instance. You can associate the certificate with an Elastic Load Balancer (ELB) or CloudFront distribution in front of your EC2 instances. This allows you to secure traffic to your EC2 instances using SSL/TLS.</p>



<p>After understanding this, I was further confused by people saying that I could use the Private CA feature of ACM to provide certificates to EC2 instances; at this time, I had only ever used Private CAs to be associated with ACM, so I assumed we couldn&#8217;t use these CAs with EC2. That assumption was incorrect. The process to do this is as follows:</p>



<ol class="wp-block-list">
<li>Create an AWS Private CA in the AWS Certificate Manager (ACM) Private CA section.</li>



<li>Create a certificate signing request (CSR) on the EC2 instance where the certificate will be used.</li>



<li>Use the CSR to request a certificate from the AWS Private CA in the ACM Private CA service.</li>



<li>Once the certificate is issued, download and install it on the EC2 instance where it will be used.</li>



<li>Configure your EC2 instance to use the newly-installed certificate.</li>
</ol>



<p>Always remember that if you do this, you should ensure that your certificates are valid. Also, take care of rotation; they will not be automatically rotated with you configuring that yourself. A good way of achieving this using managed services would be, for example, by using AWS SSM to install these certificates. </p>



<p>Configuration of certificate deployment is dependent on the technology you use; for an apache web server on Amazon Linux for example, you would need to ensure mod_ssl is installed, and then the certificates and private key, and chain are deployed to the appropriate locations for that software.<code> /etc/certs</code>.</p>The post <a href="https://krystanhonour.com/2023/01/27/aws-ec2-and-certificates/">AWS EC2 and Certificates</a> first appeared on <a href="https://krystanhonour.com">Round the loop and back</a>.]]></content:encoded>
					
					<wfw:commentRss>https://krystanhonour.com/2023/01/27/aws-ec2-and-certificates/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">930</post-id>	</item>
		<item>
		<title>AWS Solutions Architect Professional &#8211; PASSED</title>
		<link>https://krystanhonour.com/2021/10/04/aws-solutions-architect-professional-passed/</link>
					<comments>https://krystanhonour.com/2021/10/04/aws-solutions-architect-professional-passed/#respond</comments>
		
		<dc:creator><![CDATA[Krystan]]></dc:creator>
		<pubDate>Mon, 04 Oct 2021 21:54:01 +0000</pubDate>
				<category><![CDATA[Personal]]></category>
		<category><![CDATA[aws]]></category>
		<category><![CDATA[technical]]></category>
		<guid isPermaLink="false">http://3.10.23.250/?p=853</guid>

					<description><![CDATA[<p>Today I took and passed my AWS Solutions Architect Professional exam. I&#8217;ve been working with AWS now for about 5 years. I Originally passed the Associate exam all the way back in December 2016. Back then I was as pleased as punch to have passed that exam and ever since then I&#8217;ve enjoyed working with&#8230;</p>
The post <a href="https://krystanhonour.com/2021/10/04/aws-solutions-architect-professional-passed/">AWS Solutions Architect Professional – PASSED</a> first appeared on <a href="https://krystanhonour.com">Round the loop and back</a>.]]></description>
										<content:encoded><![CDATA[<p></p>



<p class="has-text-align-center"><img data-recalc-dims="1" decoding="async" width="150" height="161" data-attachment-id="863" data-permalink="https://krystanhonour.com/2021/10/04/aws-solutions-architect-professional-passed/probadge/" data-orig-file="https://i0.wp.com/krystanhonour.com/wp-content/uploads/2021/10/probadge.jpg?fit=326%2C349&amp;ssl=1" data-orig-size="326,349" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;Krystan Honour&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;1633514335&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="Amazon Badge" data-image-description="" data-image-caption="" data-medium-file="https://i0.wp.com/krystanhonour.com/wp-content/uploads/2021/10/probadge.jpg?fit=280%2C300&amp;ssl=1" data-large-file="https://i0.wp.com/krystanhonour.com/wp-content/uploads/2021/10/probadge.jpg?fit=326%2C349&amp;ssl=1" class="wp-image-863" style="width: 150px;" src="https://i0.wp.com/3.10.23.250/wp-content/uploads/2021/10/probadge.jpg?resize=150%2C161" alt="Amazon Solutions Architect Professional Badge" srcset="https://i0.wp.com/krystanhonour.com/wp-content/uploads/2021/10/probadge.jpg?w=326&amp;ssl=1 326w, https://i0.wp.com/krystanhonour.com/wp-content/uploads/2021/10/probadge.jpg?resize=280%2C300&amp;ssl=1 280w" sizes="(max-width: 150px) 100vw, 150px" /></p>



<p>Today I took and passed my AWS Solutions Architect Professional exam. I&#8217;ve been working with AWS now for about 5 years. I Originally passed the Associate exam all the way back in December 2016. Back then I was as pleased as punch to have passed that exam and ever since then I&#8217;ve enjoyed working with Amazon&#8217;s cloud offering. </p>



<p>Just recently I&#8217;ve wanted to cement my learning and pass the professional exam. For me it was about proving to myself I could pass a top-flight cloud exam but also about the learning journey that came with being able to pass it.</p>



<p>To make sure I knew enough I started by brushing up on courses I had in A Cloud Guru and once that was done I purchased a course on Udemy by Stephane Maarek called &#8220;Ultimate AWS Certified Architect Professional 2021&#8221;. This course was really well-paced and covered a lot of ground, along with the hands-on experience I found this prepared me really well for the exam. After that I read a couple of whitepapers as well and Took a practice exam (which I passed). I am now the proud owner of the certification. I wonder what my next challenge will be.</p>



<p></p>



<p>You can view my badge here: <a href="https://www.credly.com/badges/0adf99df-c39f-4c66-96d6-ca67c5830d7c/public_url" target="_blank" rel="noreferrer noopener">https://www.credly.com/badges/0adf99df-c39f-4c66-96d6-ca67c5830d7c/public_url</a></p>The post <a href="https://krystanhonour.com/2021/10/04/aws-solutions-architect-professional-passed/">AWS Solutions Architect Professional – PASSED</a> first appeared on <a href="https://krystanhonour.com">Round the loop and back</a>.]]></content:encoded>
					
					<wfw:commentRss>https://krystanhonour.com/2021/10/04/aws-solutions-architect-professional-passed/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">853</post-id>	</item>
		<item>
		<title>Functional Servers, Or is that Serverless?</title>
		<link>https://krystanhonour.com/2019/09/15/functional-servers-or-is-that-serverless/</link>
					<comments>https://krystanhonour.com/2019/09/15/functional-servers-or-is-that-serverless/#respond</comments>
		
		<dc:creator><![CDATA[Krystan]]></dc:creator>
		<pubDate>Sun, 15 Sep 2019 23:00:21 +0000</pubDate>
				<category><![CDATA[Technical]]></category>
		<category><![CDATA[Serverless]]></category>
		<guid isPermaLink="false">http://54.78.232.43/?p=196</guid>

					<description><![CDATA[<p>One of the worst named popular technologies is &#8220;serverless&#8221; technology. Nothing could be further from the truth, clearly, there are servers behind all the magic, it&#8217;s just that you aren&#8217;t responsible for them.&#160; Two popular technologies in the cloud are Microservices and Webservers. The services are often hosted by the webservers. Then came container technology&#8230;</p>
The post <a href="https://krystanhonour.com/2019/09/15/functional-servers-or-is-that-serverless/">Functional Servers, Or is that Serverless?</a> first appeared on <a href="https://krystanhonour.com">Round the loop and back</a>.]]></description>
										<content:encoded><![CDATA[<p>One of the worst named  popular technologies is &#8220;serverless&#8221; technology. Nothing could be further from the truth, clearly, there are servers behind all the magic, it&#8217;s just that you aren&#8217;t responsible for them.&nbsp; Two popular technologies in the cloud are Microservices and Webservers. The services are often hosted by the webservers. Then came container technology popularised by Docker a few years ago and the instances with web servers just to host services seemed a bit old hat, after all, why run an instance when you can run multiple containers over a cluster of instances and scale them as needed?</p>



<p>After a while AWS Lambda functions became extremely popular, now we don&#8217;t even need containers, we can take little pieces of code have them exist in &#8220;lambda land&#8221; and not really worry about what it is that&#8217;s serving them because that&#8217;s all managed for us. To make matters better if you design correctly lambdas are extremely cheap and you only pay for the execution time. Meanwhile, of course, Amazon released Fargate over in ECS and you then didn&#8217;t need to worry about provisioning your ECS instances anymore. But which one is right for which.</p>



<p>Let&#8217;s take a look at Lambda first, we&#8217;ll be using the following:</p>



<ul class="wp-block-list"><li><a rel="noopener noreferrer" href="https://serverless.com" target="_blank">Serverless Framework</a></li><li><a href="https://www.nodejs.org">NodeJs</a></li><li><a href="https://aws.amazon.com/lambda/">AWS Lambda</a></li><li><a href="https://aws.amazon.com/cloudformation/">AWS CloudFormation</a></li><li><a href="https://aws.amazon.com/api-gateway/">AWS API Gateway</a></li></ul>



<p>If you haven&#8217;t used any of this before, don&#8217;t worry the cloudformation isn&#8217;t something we will be writing directly, the Serverless Framework will take care of that for us for now, it will create a &#8220;Stack&#8221; which will deploy our lambda functions and our API Gateway endpoints, the endpoints will front our lambda functions.</p>



<p>So first things first we need a serverless project, we are going to use the open-source version of the serverless framework, there is a commercial offering but you don&#8217;t need to worry about that to get started. The framework runs on NodeJs 6 or higher but we will be using version 10 of node js to remain current as of time of writing so after you have installed NodeJs  for your platform you need to install serverless which you can do with the following line:</p>



<pre class="wp-block-code"><code>npm install -g serverless</code></pre>



<p>You can find out what version you are running with </p>



<pre class="wp-block-code"><code>serverless --version</code></pre>



<p>As we are going to deploy to Amazon Webservices we are going to need login credentials for the framework to use, this is a large topic so I am not going to detail that here, however, the guys over at serverless.com have written a <a href="https://serverless.com/framework/docs/providers/aws/guide/credentials/">fantastic set of instructions</a> which you should follow and then come back.</p>



<p>Following in the tradition of all frameworks these days the serverless cli you installed above has a way of creating projects so you can get started quickly, here we create a service, which is like a project with the following command.</p>



<pre class="wp-block-code"><code>serverless create --template aws-nodejs --path myFirstService</code></pre>



<p>You will get some output that looks like this</p>



<pre class="wp-block-code"><code>Serverless: Generating boilerplate in "/home/krystan/projects/serverless_article/myFirstService"
 _______                             __
|   _   .-----.----.--.--.-----.----|  .-----.-----.-----.
|   |___|  -__|   _|  |  |  -__|   _|  |  -__|__ --|__ --|
|____   |_____|__|  \___/|_____|__| |__|_____|_____|_____|
|   |   |             The Serverless Application Framework
|       |                           serverless.com, v1.52.0
 -------'

Serverless: Successfully generated boilerplate for template: "aws-nodejs"</code></pre>



<p>In the directory &#8220;myFirstService&#8221; you will have two files, one called serverless.yml and one called handler.js. The most important file is the yml file, this is where you define the application and where you want it deployed. Each serverless service can be thought of as an application, it can have many lambda functions associated with it. Each application is housed in its own directory with its own distinct serverless.yml file. When you execute the deploy stage serverless framework reads the .yml file and take your code and deploys it for you, creating all the infrastructure you need in AWS. It does this by using Amazon Cloudformation under the covers, this is an infrastructure as code (IAC) tool written by Amazon. </p>



<p>At this point it&#8217;s worth pointing out that serverless platform can deploy to different clouds, it is not just AWS specific and it does so by making use of different providers, for this article we will stick to the AWS Provider as we are deploying to that cloud.</p>



<p>Let&#8217;s take a look at the yml file we shall be using, the one produced by the framework is quite verbose and has a lot of comments in, for this article, we shall use a paired down version that looks like this:</p>



<pre class="wp-block-code"><code>service: myfirstservice
frameworkVersion: "=1.52.0"

provider:
  name: aws
  runtime: nodejs10.x
  stage: dev
  region: eu-west-1
  apiName: ${self:provider.stage}-myfirstservice
  memorySize: 512

functions:
  hello:
    handler: handler.hello
    events:
      - http: GET hello
  tags:
      environment: ${self:provider.stage}
      serverless: true</code></pre>



<p>There is a lot going on here but we have defined an AWS provider so we can deploy to AWS, told the framework we are using nodejs10.x (these types can be found in AWS documentation for languages supported, you don&#8217;t have to use NodeJs). The stage can be thought of your environment, so for example, you may have; dev, test, uat and then prod stages. We give the API Gateway deployment a name overriding the default, this is making use of variables, in this case, it refers to itself and the provider and accesses the stage name to produce:</p>



<pre class="wp-block-code"><code>dev-myfirstservice</code></pre>



<p>We then give a starting memory size for the lambda function. We add some tags (because tagging things is good practice) and tell the framework where the code is to build the lambda function. We then associate an HTTP GET event with that handler. The handler code as generated by the serverless framework looks like this:</p>



<pre class="wp-block-code"><code>'use strict';

module.exports.hello = async event =&gt; {
  return {
    statusCode: 200,
    body: JSON.stringify(
      {
        message: 'Go Serverless v1.0! Your function executed successfully!',
        input: event,
      },
      null,
      2
    ),
  };
};
</code></pre>



<p>Its really just a hello world function but will do for now. Now lets deploy by typing:</p>



<pre class="wp-block-code"><code>serverless deploy</code></pre>



<p>We will get some output which looks something like this</p>



<pre class="wp-block-code"><code>$ serverless deploy
Serverless: Packaging service...
Serverless: Excluding development dependencies...
Serverless: Creating Stack...
Serverless: Checking Stack create progress...
.....
Serverless: Stack create finished...
Serverless: Uploading CloudFormation file to S3...
Serverless: Uploading artifacts...
Serverless: Uploading service myfirstservice.zip file to S3 (319 B)...
Serverless: Validating template...
Serverless: Updating Stack...
Serverless: Checking Stack update progress...
...............................
Serverless: Stack update finished...
Service Information
service: myfirstservice
stage: dev
region: eu-west-1
stack: myfirstservice-dev
resources: 10
api keys:
  None
endpoints:
  GET - https://quqruaplt8.execute-api.eu-west-1.amazonaws.com/dev/hello
functions:
  hello: myfirstservice-dev-hello
layers:
  None
Serverless: Run the "serverless" command to setup monitoring, troubleshooting and testing.</code></pre>



<p>This has done an awful lot for us, if we were to do this manually we would need to compile and package the lambda code, define the function and then upload the code to either a bucket or use the built-in bucket mechanism of lambda. If we wanted it repeatable we&#8217;d need to write a lot of Terraform or Cloudformation definitions to do that and then set up a mechanism to create that (probably scripts). This did all of that in one command. Lets have a look: We can list the lambda with the aws-cli like this:</p>



<pre class="wp-block-code"><code>aws lambda get-function --function-name myfirstservice-dev-hello --region=eu-west-1</code></pre>



<p>You will get some output which looks a little like this:</p>



<pre class="wp-block-code"><code>{
    "Configuration": {
        "FunctionName": "myfirstservice-dev-hello",
        "FunctionArn": "arn:aws:lambda:eu-west-1:&lt;redacted&gt;:function:myfirstservice-dev-hello",
        "Runtime": "nodejs10.x",
        "Role": "arn:aws:iam::&lt;redacted&gt;:role/myfirstservice-dev-eu-west-1-lambdaRole",
        "Handler": "handler.hello",
        "CodeSize": 319,
        "Description": "",
        "Timeout": 6,
        "MemorySize": 512,
        "LastModified": "2019-09-15T22:22:31.822+0000",
        "CodeSha256": "nAMhMEam8QPdOjMJ9JdnIYAsIZc2JUnZWrXs5/+BwT0=",
        "Version": "$LATEST",
        "TracingConfig": {
            "Mode": "PassThrough"
        },
        "RevisionId": "255e1518-f325-4609-bc52-b731a18b8b57"
    },
    "Code": {
        "RepositoryType": "S3",
        "Location": "https://awslambda-eu-west-1-tasks.s3.eu-west-1.amazonaws.com/snapshots/&lt;redacted&gt;/myfirstservice-dev-hello-033b62e1-fafd-4b6f-b936-9fcf51c545fb?versionId=sNo8GB0HJVbnp.sLGHYFgq.jGl.33aXH&amp;X-Amz-Security-Token=AgoJb3JpZ2luX2VjEIX%2F%2F%2F%2F%2F%2F%2F%2F%2F%2FwEaCWV1LXdlc3QtMSJGMEQCIH6x8MzeUx%2FjUvY90hihQOQPd4Jq1Kv0ikaUBXMZut2GAiAu%2BKf%2BSOrrqHEQwWJdL5zDJOqt5FjWcvobQttqO6e0%2FiraAwhOEAEaDDk1NDM2OTA4MjUxMSIMmXidpPgv4z%2FLvAM9KrcDwJ47KqHJ7obSPTLC2qY4VcHzIjfrXCYbt08Jp%2BPA9Vf01%2BbifjCM9SpAolq4wJmGZH5eri5g7rvcCkspuMjc%2FP%2BQSBjM5J59NZyGoHUG1uAR6E%2F2vt95RSPGmxXPNxah5CzYJ4kkVWP0nFErv0ZScJvhf1iYsfdcowW7%2F%2F6EgMfNwtvJ84hz9ie0EK%2FR4Tnnf%2BNJSsthK2n%2BP6s0%2BA8Y0et4k2ea7rsfYAheW9JkuPM6kwev%2B6sFvZuOyaH9XObSkqd12EzkBJI2fyLKzuBXrBrE%2FFWIXBMdcUt4G7F9Lin2a0Ak0r2joU4gCl7gYPpfBZhzii5MglNSpVx5x4JxZHu%2Brw7MRsbblIHA9bLCYLG9yIB1oAUJQ3wprVINqpyuSHVuEgJGCQR9L8E%2Fs0vq%2Btw6HeW5ztoIoysuHxoee9Iy%2F2R7oDNxeart9aF2sxUqrzwzfdmyX%2FpVALW7wB0w2sIQWCiARXzURybXRnfBVEP3q9XmXi0C2Wowf2rzpr33Wr%2FXCl%2FF03tVXrEjBVez%2FGWfGn%2B%2BEtagFCNpfErVK5%2B4BioLubU8VnPkoGk5pZyq94kDcBfBtTDfz%2FrrBTq1AdKN40bQ1SHXprJcF%2Bowapjm2LjslDgWs9UdmvAeAP9LEJjDHx8UN9Tyc1Mws3ePrHBd%2BuFOVXyZaFZej%2FHa8afSBTyGCxW9wUwnm6iT79vHHhMgaiXx0iYl69iMjRfsJ8Lc5c37mRddhzWUK3%2B2aheFy%2BaweV7xVqQ8ryrKZUaFUEU2uJ%2BcgcS36HCcETfHFuxTMe%2B6FGyZsm%2BGSNbC1%2B0Ncn6OTSVXKBTRz8S%2FujPzTpTNEWY%3D&amp;X-Amz-Algorithm=AWS4-HMAC-SHA256&amp;X-Amz-Date=20190915T222856Z&amp;X-Amz-SignedHeaders=host&amp;X-Amz-Expires=600&amp;X-Amz-Credential=ASIA54NGUQSHV34AKUNC%2F20190915%2Feu-west-1%2Fs3%2Faws4_request&amp;X-Amz-Signature=ee9260d791cbf1accbccc5fa7a684f10ff7f2846a164f843c7891426e9e6989c"
    },
    "Tags": {
        "STAGE": "dev",
        "aws:cloudformation:logical-id": "HelloLambdaFunction",
        "aws:cloudformation:stack-id": "arn:aws:cloudformation:eu-west-1:&lt;redacted&gt;:stack/myfirstservice-dev/32634cd0-d807-11e9-b10e-02abe6210ac8",
        "aws:cloudformation:stack-name": "myfirstservice-dev",
        "environment": "dev",
        "serverless": "true"
    }
}</code></pre>



<p>You can see here the lambda is defined and referred to in a cloud formation stack, as you make more deploys these changes are managed and resources managed for you if you remove an endpoint definition for API Gateway, it will be deleted and so on.</p>



<p>So how do we know this all works, serverless has some tools for testing, we can invoke the function directly from the command line with the following command:</p>



<pre class="wp-block-code"><code>serverless invoke --function hello</code></pre>



<p>This makes a call to the function in the cloud and we get a response, that is a json response as we setup the lambda to return JSON so the lambda proxy for API Gateway could make use of it.</p>



<p>{<br>     &#8220;statusCode&#8221;: 200,<br>     &#8220;body&#8221;: &#8220;{\n  \&#8221;message\&#8221;: \&#8221;Go Serverless v1.0! Your function executed successfully!\&#8221;,\n  \&#8221;input\&#8221;: {}\n}&#8221;<br> }</p>



<p>This is the response directly from the function, but what about the API Gateway, well the response from that is a little more verbose you can test with curl and this is what it looks like:</p>



<pre class="wp-block-code"><code>curl https://quqruaplt8.execute-api.eu-west-1.amazonaws.com/dev/hello
{
  "message": "Go Serverless v1.0! Your function executed successfully!",
  "input": {
    "resource": "/hello",
    "path": "/hello",
    "httpMethod": "GET",
    "headers": {
      "Accept": "*/*",
      "CloudFront-Forwarded-Proto": "https",
      "CloudFront-Is-Desktop-Viewer": "true",
      "CloudFront-Is-Mobile-Viewer": "false",
      "CloudFront-Is-SmartTV-Viewer": "false",
      "CloudFront-Is-Tablet-Viewer": "false",
      "CloudFront-Viewer-Country": "GB",
      "Host": "quqruaplt8.execute-api.eu-west-1.amazonaws.com",
      "User-Agent": "curl/7.58.0",
      "Via": "2.0 42322007e22ea6a235ae829b1f254f98.cloudfront.net (CloudFront)",
      "X-Amz-Cf-Id": "1a86mebsjxXKlRgtL1cgAQfEnzCR9jrjzjgWeT2kfIuGciUQZX0Cug==",
      "X-Amzn-Trace-Id": "Root=1-5d7ebeff-babadb407ddaa92c52a236a2",
      "X-Forwarded-For": "&lt;redacted&gt;, &lt;redacted&gt;",
      "X-Forwarded-Port": "443",
      "X-Forwarded-Proto": "https"
    },
    "multiValueHeaders": {
      "Accept": &#91;
        "*/*"
      ],
      "CloudFront-Forwarded-Proto": &#91;
        "https"
      ],
      "CloudFront-Is-Desktop-Viewer": &#91;
        "true"
      ],
      "CloudFront-Is-Mobile-Viewer": &#91;
        "false"
      ],
      "CloudFront-Is-SmartTV-Viewer": &#91;
        "false"
      ],
      "CloudFront-Is-Tablet-Viewer": &#91;
        "false"
      ],
      "CloudFront-Viewer-Country": &#91;
        "GB"
      ],
      "Host": &#91;
        "quqruaplt8.execute-api.eu-west-1.amazonaws.com"
      ],
      "User-Agent": &#91;
        "curl/7.58.0"
      ],
      "Via": &#91;
        "2.0 42322007e22ea6a235ae829b1f254f98.cloudfront.net (CloudFront)"
      ],
      "X-Amz-Cf-Id": &#91;
        "1a86mebsjxXKlRgtL1cgAQfEnzCR9jrjzjgWeT2kfIuGciUQZX0Cug=="
      ],
      "X-Amzn-Trace-Id": &#91;
        "Root=1-5d7ebeff-babadb407ddaa92c52a236a2"
      ],
      "X-Forwarded-For": &#91;
        "&lt;redacted&gt;, &lt;redacted&gt;"
      ],
      "X-Forwarded-Port": &#91;
        "443"
      ],
      "X-Forwarded-Proto": &#91;
        "https"
      ]
    },
    "queryStringParameters": null,
    "multiValueQueryStringParameters": null,
    "pathParameters": null,
    "stageVariables": null,
    "requestContext": {
      "resourceId": "x9w0yw",
      "resourcePath": "/hello",
      "httpMethod": "GET",
      "extendedRequestId": "AFLH-F_mjoEFT8Q=",
      "requestTime": "15/Sep/2019:22:45:19 +0000",
      "path": "/dev/hello",
      "accountId": "142273029879",
      "protocol": "HTTP/1.1",
      "stage": "dev",
      "domainPrefix": "quqruaplt8",
      "requestTimeEpoch": 1568587519762,
      "requestId": "163fd6df-c4db-4898-8f9e-4ff6245bf78b",
      "identity": {
        "cognitoIdentityPoolId": null,
        "accountId": null,
        "cognitoIdentityId": null,
        "caller": null,
        "sourceIp": "86.28.138.172",
        "principalOrgId": null,
        "accessKey": null,
        "cognitoAuthenticationType": null,
        "cognitoAuthenticationProvider": null,
        "userArn": null,
        "userAgent": "curl/7.58.0",
        "user": null
      },
      "domainName": "quqruaplt8.execute-api.eu-west-1.amazonaws.com",
      "apiId": "quqruaplt8"
    },
    "body": null,
    "isBase64Encoded": false
  }
}</code></pre>



<p>Obviously you will need to use the id which serverless told you when you deployed  but the domain name will almost definitely be the same so it should take the form &lt;id&gt;.execute-api.&lt;region&gt;.amazonaws.com.</p>



<p>This has covered getting up and running with serverless framework in AWS, now we are finished we should tidy up, we can do so by removing the stack which will delete the resources provisioned, we can do so by typing this:</p>



<pre class="wp-block-code"><code>serverless remove --verbose</code></pre>



<p>I used the verbose flag so we can get some output to see what happens when we do this, this was the output I got:</p>



<pre class="wp-block-code"><code>Serverless: Getting all objects in S3 bucket...
Serverless: Removing objects in S3 bucket...
Serverless: Removing Stack...
Serverless: Checking Stack removal progress...
CloudFormation - DELETE_IN_PROGRESS - AWS::CloudFormation::Stack - myfirstservice-dev
CloudFormation - DELETE_IN_PROGRESS - AWS::Lambda::Permission - HelloLambdaPermissionApiGateway
CloudFormation - DELETE_IN_PROGRESS - AWS::ApiGateway::Deployment - ApiGatewayDeployment1568586098127
CloudFormation - DELETE_SKIPPED - AWS::Lambda::Version - HelloLambdaVersionbsuDYFOakPR8fC7BZCJsELhtJfq62Usj2akOdNzcPM
CloudFormation - DELETE_COMPLETE - AWS::ApiGateway::Deployment - ApiGatewayDeployment1568586098127
CloudFormation - DELETE_IN_PROGRESS - AWS::ApiGateway::Method - ApiGatewayMethodHelloGet
CloudFormation - DELETE_COMPLETE - AWS::ApiGateway::Method - ApiGatewayMethodHelloGet
CloudFormation - DELETE_IN_PROGRESS - AWS::ApiGateway::Resource - ApiGatewayResourceHello
CloudFormation - DELETE_COMPLETE - AWS::ApiGateway::Resource - ApiGatewayResourceHello
CloudFormation - DELETE_COMPLETE - AWS::Lambda::Permission - HelloLambdaPermissionApiGateway
CloudFormation - DELETE_IN_PROGRESS - AWS::Lambda::Function - HelloLambdaFunction
CloudFormation - DELETE_IN_PROGRESS - AWS::ApiGateway::RestApi - ApiGatewayRestApi
CloudFormation - DELETE_COMPLETE - AWS::Lambda::Function - HelloLambdaFunction
CloudFormation - DELETE_COMPLETE - AWS::ApiGateway::RestApi - ApiGatewayRestApi
CloudFormation - DELETE_IN_PROGRESS - AWS::Logs::LogGroup - HelloLogGroup
CloudFormation - DELETE_IN_PROGRESS - AWS::IAM::Role - IamRoleLambdaExecution
CloudFormation - DELETE_IN_PROGRESS - AWS::S3::Bucket - ServerlessDeploymentBucket
CloudFormation - DELETE_COMPLETE - AWS::Logs::LogGroup - HelloLogGroup
CloudFormation - DELETE_COMPLETE - AWS::S3::Bucket - ServerlessDeploymentBucket
Serverless: Stack removal finished...</code></pre>



<p>As you can see it first emptied the deployment bucket and then triggered the stack removal when this happened the resources were removed.</p>



<p>We have barely scratched the surface of what can be done with the serverless framework, the next steps are up to you</p>The post <a href="https://krystanhonour.com/2019/09/15/functional-servers-or-is-that-serverless/">Functional Servers, Or is that Serverless?</a> first appeared on <a href="https://krystanhonour.com">Round the loop and back</a>.]]></content:encoded>
					
					<wfw:commentRss>https://krystanhonour.com/2019/09/15/functional-servers-or-is-that-serverless/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">196</post-id>	</item>
		<item>
		<title>Packing it all up neatly</title>
		<link>https://krystanhonour.com/2019/09/07/packing-it-all-up-neatly/</link>
					<comments>https://krystanhonour.com/2019/09/07/packing-it-all-up-neatly/#respond</comments>
		
		<dc:creator><![CDATA[Krystan]]></dc:creator>
		<pubDate>Sat, 07 Sep 2019 12:18:00 +0000</pubDate>
				<category><![CDATA[Technical]]></category>
		<guid isPermaLink="false">http://54.78.232.43/?p=176</guid>

					<description><![CDATA[<p>Packer is an image creation tool, its Created by the guys over at Hashicorp and its here to make our lives easier when deploying images. Just recently I’ve been doing a lot of work on Amazon Web Services and needed a way to have AMI images quickly and neatly created so I could have them&#8230;</p>
The post <a href="https://krystanhonour.com/2019/09/07/packing-it-all-up-neatly/">Packing it all up neatly</a> first appeared on <a href="https://krystanhonour.com">Round the loop and back</a>.]]></description>
										<content:encoded><![CDATA[<p>Packer is an image creation tool, its Created by the guys over at Hashicorp and its here to make our lives easier when deploying images. Just recently I’ve been doing a lot of work on Amazon Web Services and needed a way to have AMI images quickly and neatly created so I could have them ready for use in our infrastructure as code tools. Packer is a cli tool and is relatively simple to use.</p>



<h2 class="wp-block-heading">Installation</h2>



<p>Packer is a available <a href="https://www.packer.io/downloads.html" target="_blank" rel="noopener noreferrer">here</a> for most popular architectures and is not a complex product to install, in this article as I use Linux most frequently we will show the installation of packer for Linux, but it is similar on almost every platform.</p>



<p>To download packer you simply need to download the zip file from the distribution site, I did that like this:</p>



<pre class="wp-block-code"><code>export VER="1.4.3"
wget https://releases.hashicorp.com/packer/${VER}/packer_${VER}_linux_amd64.zip
unzip packer_${VER}_linux_amd64.zip -d packer
sudo mv packer /usr/local/bin/
</code></pre>



<p>Once installed you can confirm it is there by calling packer and you should get output similar to the following:</p>



<pre class="wp-block-code"><code>$ packer
Usage: packer [--version] [--help] &lt;command> [&lt;args>]

Available commands are:
    build       build image(s) from template
    console     creates a console for testing variable interpolation
    fix         fixes templates from old versions of packer
    inspect     see components of a template
    validate    check that a template is valid
    version     Prints the Packer version</code></pre>



<p>After this packer is ready to use. Packer using builders to generate images that you can deploy. There are a number of templates you can use and a list is provided on the packer site <a rel="noopener noreferrer" href="https://www.packer.io/docs/builders/index.html" target="_blank">here</a>. A common builder to us is the amazon-ebs builder which we will use for the purposes of this article, this will allow us to create Amazon Machine Images, it does this by launching an E2 instance and then creating a golden image from that instance from which other machines can be created. It then drops that in your account for you to manage. A first template configuration may look like this:</p>



<pre class="wp-block-code"><code>{
  "variables": {
    "aws_access_key": "{{env `AWS_ACCESS_KEY_ID`}}",
    "aws_secret_key": "{{env `AWS_SECRET_ACCESS_KEY`}}"
  },
  "builders": [
    {
      "type": "amazon-ebs",
      "access_key": "{{user `aws_access_key`}}",
      "secret_key": "{{user `aws_secret_key`}}",
      "region": "eu-west-1",
      "source_ami": "ami-06358f49b5839867c",
      "instance_type": "t2.micro",
      "ssh_username": "ubuntu",
      "ami_name": "packer_article {{timestamp}}"
    }
  ],
  "provisioners": [
    {
      "type": "shell",
      "script": "demo-script"
    }
  ]
}</code></pre>



<p>This is perfectly valid but its not generally a good idea to pass in your access and secret keys in this way, this is merely an example to show how you can pass in variables to the builders, the credentials should simply be set in your aws config files as normal and this would leave us with a template which looks like this:</p>



<pre class="wp-block-code"><code>{
  "builders": [
    {
      "type": "amazon-ebs",
      "region": "eu-west-1",
      "source_ami": "ami-06358f49b5839867c",
      "instance_type": "t2.micro",
      "ssh_username": "ubuntu",
      "ami_name": "packer_article {{timestamp}}"
    }
  ],
  "provisioners": [
    {
      "type": "shell",
      "script": "configure-machine.sh"
    }
  ]
}</code></pre>



<p>The basic parts of a template are:</p>



<ul class="wp-block-list"><li>variables&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; – define any variables here.</li><li>builders&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#8211; this is where the details for the AMI image go.&nbsp;&nbsp;</li><li>provisioners&nbsp;&nbsp; &#8211; this are is where you can list various provisioners to configure the AMI.</li></ul>



<p> Supported provisioners are: </p>



<ul class="wp-block-list"><li>Ansible</li><li>Chef</li><li>Salt</li><li>Shell</li><li>Powershell</li><li>Windows cmd</li><li>File – this copies a local file to an VM image.</li></ul>



<p>We are using a simple shell provisioner here which will launch a basic script to install nginx. This script looks like so:</p>



<pre class="wp-block-code"><code>#!/bin/bash
sudo yum -y update
sudo yum install -y nginx</code></pre>



<p>Now you have your template defined the next step is to build the template.</p>



<pre class="wp-block-code"><code>packer validate
packer build -color=false build.json 2>&amp;1 | tee output.txt</code></pre>



<p>During this process you will get a bunch of output and above I have piped this to a file (which is why I used the color=false option or you will get a lot of ansi colour codes). The output should look something like this:</p>



<pre class="wp-block-code"><code>amazon-ebs: Prevalidating AMI Name: packer_article 1567873619
amazon-ebs: Found Image ID: ami-06358f49b5839867c
amazon-ebs: Creating temporary keypair: packer_5d73da53-1797-d184-50ef-190d3acf3f79
amazon-ebs: Creating temporary security group for this instance: packer_5d73da78-cc5c-3179-19bb-0164e574d474
amazon-ebs: Authorizing access to port 22 from [0.0.0.0/0] in the temporary security groups...
amazon-ebs: Launching a source AWS instance...
amazon-ebs: Adding tags to source instance
amazon-ebs: Adding tag: "Name": "Packer Builder"
amazon-ebs: Instance ID: i-09a8c7a2ac70cc31c
amazon-ebs: Waiting for instance (i-09a8c7a2ac70cc31c) to become ready...
amazon-ebs: Using ssh communicator to connect: 18.203.99.110
amazon-ebs: Waiting for SSH to become available...
amazon-ebs: Connected to SSH!
amazon-ebs: Provisioning with shell script: configure_machine.sh
amazon-ebs: Get:1 http://security.ubuntu.com/ubuntu bionic-security InRelease [88.7 kB]
amazon-ebs: Hit:2 http://archive.ubuntu.com/ubuntu bionic InRelease
amazon-ebs: Get:3 http://archive.ubuntu.com/ubuntu bionic-updates InRelease [88.7 kB]
amazon-ebs: Get:4 http://archive.ubuntu.com/ubuntu bionic-backports InRelease [74.6 kB]
amazon-ebs: Get:5 http://archive.ubuntu.com/ubuntu bionic/universe amd64 Packages [8570 kB]
amazon-ebs: Get:6 http://security.ubuntu.com/ubuntu bionic-security/main amd64 Packages [497 kB]
amazon-ebs: Get:7 http://archive.ubuntu.com/ubuntu bionic/universe Translation-en [4941 kB]
amazon-ebs: Get:8 http://security.ubuntu.com/ubuntu bionic-security/main Translation-en [169 kB]
amazon-ebs: Get:9 http://security.ubuntu.com/ubuntu bionic-security/restricted amd64 Packages [6296 B]
amazon-ebs: Get:10 http://security.ubuntu.com/ubuntu bionic-security/restricted Translation-en [2776 B]
amazon-ebs: Get:11 http://security.ubuntu.com/ubuntu bionic-security/universe amd64 Packages [604 kB]
amazon-ebs: Get:12 http://security.ubuntu.com/ubuntu bionic-security/universe Translation-en [201 kB]
amazon-ebs: Get:13 http://security.ubuntu.com/ubuntu bionic-security/multiverse amd64 Packages [4688 B]
amazon-ebs: Get:14 http://security.ubuntu.com/ubuntu bionic-security/multiverse Translation-en [2356 B]
amazon-ebs: Get:15 http://archive.ubuntu.com/ubuntu bionic/multiverse amd64 Packages [151 kB]
amazon-ebs: Get:16 http://archive.ubuntu.com/ubuntu bionic/multiverse Translation-en [108 kB]
amazon-ebs: Get:17 http://archive.ubuntu.com/ubuntu bionic-updates/main amd64 Packages [722 kB]
amazon-ebs: Get:18 http://archive.ubuntu.com/ubuntu bionic-updates/main Translation-en [262 kB]
amazon-ebs: Get:19 http://archive.ubuntu.com/ubuntu bionic-updates/restricted amd64 Packages [13.1 kB]
amazon-ebs: Get:20 http://archive.ubuntu.com/ubuntu bionic-updates/restricted Translation-en [4448 B]
amazon-ebs: Get:21 http://archive.ubuntu.com/ubuntu bionic-updates/universe amd64 Packages [1003 kB]
amazon-ebs: Get:22 http://archive.ubuntu.com/ubuntu bionic-updates/universe Translation-en [308 kB]
amazon-ebs: Get:23 http://archive.ubuntu.com/ubuntu bionic-updates/multiverse amd64 Packages [7308 B]
amazon-ebs: Get:24 http://archive.ubuntu.com/ubuntu bionic-updates/multiverse Translation-en [3836 B]
amazon-ebs: Get:25 http://archive.ubuntu.com/ubuntu bionic-backports/main amd64 Packages [2512 B]
amazon-ebs: Get:26 http://archive.ubuntu.com/ubuntu bionic-backports/main Translation-en [1644 B]
amazon-ebs: Get:27 http://archive.ubuntu.com/ubuntu bionic-backports/universe amd64 Packages [4000 B]
amazon-ebs: Get:28 http://archive.ubuntu.com/ubuntu bionic-backports/universe Translation-en [1856 B]
amazon-ebs: Fetched 17.8 MB in 7s (2603 kB/s)
amazon-ebs: Reading package lists...
amazon-ebs: Reading package lists...
amazon-ebs: Building dependency tree...
amazon-ebs: Reading state information...
amazon-ebs: The following additional packages will be installed:
amazon-ebs:   libnginx-mod-http-echo nginx-common nginx-light
amazon-ebs: Suggested packages:
amazon-ebs:   fcgiwrap nginx-doc ssl-cert
amazon-ebs: The following NEW packages will be installed:
amazon-ebs:   libnginx-mod-http-echo nginx nginx-common nginx-light
amazon-ebs: 0 upgraded, 4 newly installed, 0 to remove and 14 not upgraded.
amazon-ebs: Need to get 452 kB of archives.
amazon-ebs: After this operation, 1554 kB of additional disk space will be used.
amazon-ebs: Get:1 http://security.ubuntu.com/ubuntu bionic-security/main amd64 nginx-common all 1.14.0-0ubuntu1.6 [37.3 kB]
amazon-ebs: Get:2 http://security.ubuntu.com/ubuntu bionic-security/universe amd64 libnginx-mod-http-echo amd64 1.14.0-0ubuntu1.6 [21.2 kB]
amazon-ebs: Get:3 http://security.ubuntu.com/ubuntu bionic-security/universe amd64 nginx-light amd64 1.14.0-0ubuntu1.6 [390 kB]
amazon-ebs: Get:4 http://security.ubuntu.com/ubuntu bionic-security/main amd64 nginx all 1.14.0-0ubuntu1.6 [3596 B]
amazon-ebs: debconf: unable to initialize frontend: Dialog
amazon-ebs: debconf: (Dialog frontend will not work on a dumb terminal, an emacs shell buffer, or without a controlling terminal.)
amazon-ebs: debconf: falling back to frontend: Readline
amazon-ebs: debconf: unable to initialize frontend: Readline
amazon-ebs: debconf: (This frontend requires a controlling tty.)
amazon-ebs: debconf: falling back to frontend: Teletype
amazon-ebs: dpkg-preconfigure: unable to re-open stdin:
amazon-ebs: Fetched 452 kB in 0s (2310 kB/s)
amazon-ebs: Selecting previously unselected package nginx-common.
amazon-ebs: (Reading database ... 56638 files and directories currently installed.)
amazon-ebs: Preparing to unpack .../nginx-common_1.14.0-0ubuntu1.6_all.deb ...
amazon-ebs: Unpacking nginx-common (1.14.0-0ubuntu1.6) ...
amazon-ebs: Selecting previously unselected package libnginx-mod-http-echo.
amazon-ebs: Preparing to unpack .../libnginx-mod-http-echo_1.14.0-0ubuntu1.6_amd64.deb ...
amazon-ebs: Unpacking libnginx-mod-http-echo (1.14.0-0ubuntu1.6) ...
amazon-ebs: Selecting previously unselected package nginx-light.
amazon-ebs: Preparing to unpack .../nginx-light_1.14.0-0ubuntu1.6_amd64.deb ...
amazon-ebs: Unpacking nginx-light (1.14.0-0ubuntu1.6) ...
amazon-ebs: Selecting previously unselected package nginx.
amazon-ebs: Preparing to unpack .../nginx_1.14.0-0ubuntu1.6_all.deb ...
amazon-ebs: Unpacking nginx (1.14.0-0ubuntu1.6) ...
amazon-ebs: Processing triggers for ufw (0.36-0ubuntu0.18.04.1) ...
amazon-ebs: Processing triggers for ureadahead (0.100.0-21) ...
amazon-ebs: Setting up nginx-common (1.14.0-0ubuntu1.6) ...
amazon-ebs: debconf: unable to initialize frontend: Dialog
amazon-ebs: debconf: (Dialog frontend will not work on a dumb terminal, an emacs shell buffer, or without a controlling terminal.)
amazon-ebs: debconf: falling back to frontend: Readline
amazon-ebs: Created symlink /etc/systemd/system/multi-user.target.wants/nginx.service → /lib/systemd/system/nginx.service.
amazon-ebs: Processing triggers for systemd (237-3ubuntu10.24) ...
amazon-ebs: Processing triggers for man-db (2.8.3-2ubuntu0.1) ...
amazon-ebs: Setting up libnginx-mod-http-echo (1.14.0-0ubuntu1.6) ...
amazon-ebs: Setting up nginx-light (1.14.0-0ubuntu1.6) ...
amazon-ebs: Setting up nginx (1.14.0-0ubuntu1.6) ...
amazon-ebs: Processing triggers for ureadahead (0.100.0-21) ...
amazon-ebs: Processing triggers for ufw (0.36-0ubuntu0.18.04.1) ...
amazon-ebs: Stopping the source instance...
amazon-ebs: Stopping instance
amazon-ebs: Waiting for the instance to stop...
amazon-ebs: Creating AMI packer_article 1567873619 from instance i-09a8c7a2ac70cc31c
amazon-ebs: AMI: ami-09511096fd8530040
amazon-ebs: Waiting for AMI to become ready...
amazon-ebs: Terminating the source AWS instance...
amazon-ebs: Cleaning up any extra volumes...
amazon-ebs: No volumes to clean up, skipping
amazon-ebs: Deleting temporary security group...
amazon-ebs: Deleting temporary keypair...
Build 'amazon-ebs' finished.

==> Builds finished. The artifacts of successful builds are:
--> amazon-ebs: AMIs were created:
eu-west-1: ami-09511096fd8530040</code></pre>



<p>You can see that packer has now created a standard AMI and place it in our account, this is where packers management ends of our AMIS, it is up to us to manage them once built.</p>



<p>You can check out your image with the AWS console to make sure its there and get more information:</p>



<pre class="wp-block-code"><code>aws ec2 describe-images --image-ids ami-09511096fd8530040 --output=json</code></pre>



<p>And you will get a fair amount of information back</p>



<pre class="wp-block-code"><code>{
    "Images": [
        {
            "Architecture": "x86_64",
            "CreationDate": "2019-09-07T16:29:32.000Z",
            "ImageId": "ami-09511096fd8530040",
            "ImageLocation": "&lt;myaccountId>/packer_article 1567873619",
            "ImageType": "machine",
            "Public": false,
            "OwnerId": "&lt;myaccountId>",
            "State": "available",
            "BlockDeviceMappings": [
                {
                    "DeviceName": "/dev/sda1",
                    "Ebs": {
                        "DeleteOnTermination": true,
                        "SnapshotId": "snap-000b743eca850ac19",
                        "VolumeSize": 8,
                        "VolumeType": "gp2",
                        "Encrypted": false
                    }
                },
                {
                    "DeviceName": "/dev/sdb",
                    "VirtualName": "ephemeral0"
                },
                {
                    "DeviceName": "/dev/sdc",
                    "VirtualName": "ephemeral1"
                }
            ],
            "EnaSupport": true,
            "Hypervisor": "xen",
            "Name": "packer_article 1567873619",
            "RootDeviceName": "/dev/sda1",
            "RootDeviceType": "ebs",
            "SriovNetSupport": "simple",
            "VirtualizationType": "hvm"
        }
    ]
}</code></pre>



<p>There are a lot of configuration options with packer, far too many to go into in this short article but this should get most started. For those not wanting to type all this out you can find the code <a href="https://github.com/krystan/packer_article_code" target="_blank" rel="noopener noreferrer">here</a></p>The post <a href="https://krystanhonour.com/2019/09/07/packing-it-all-up-neatly/">Packing it all up neatly</a> first appeared on <a href="https://krystanhonour.com">Round the loop and back</a>.]]></content:encoded>
					
					<wfw:commentRss>https://krystanhonour.com/2019/09/07/packing-it-all-up-neatly/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">176</post-id>	</item>
		<item>
		<title>Setup mailgun with a domain hosted by Google Domains</title>
		<link>https://krystanhonour.com/2019/04/09/setup-mailgun-with-a-domain-hosted-by-google-domains/</link>
					<comments>https://krystanhonour.com/2019/04/09/setup-mailgun-with-a-domain-hosted-by-google-domains/#respond</comments>
		
		<dc:creator><![CDATA[Krystan]]></dc:creator>
		<pubDate>Tue, 09 Apr 2019 20:41:57 +0000</pubDate>
				<category><![CDATA[Technical]]></category>
		<guid isPermaLink="false">http://54.78.232.43/?p=164</guid>

					<description><![CDATA[<p>The very first thing you will need to do is to add your domain. And the very first thing that Mailgun will have advised when you set it up was that it was probably best to use a subdomain of your main domain, this was very good advice and for this article assume the subdomain&#8230;</p>
The post <a href="https://krystanhonour.com/2019/04/09/setup-mailgun-with-a-domain-hosted-by-google-domains/">Setup mailgun with a domain hosted by Google Domains</a> first appeared on <a href="https://krystanhonour.com">Round the loop and back</a>.]]></description>
										<content:encoded><![CDATA[<p>The very first thing you will need to do is to add your domain. And the very first thing that Mailgun will have advised when you set it up was that it was probably best to use a subdomain of your main domain, this was very good advice and for this article assume the subdomain is &#8220;website&#8221;</p>
<p>You need to pop over to Google Domains and click the &#8220;Manage My Domains&#8221; button and then choose the relevant domain and click click on the DNS menu button to the right you need to scroll down to the Custom resource records.</p>
<p><a href="https://i0.wp.com/54.78.232.43/wp-content/uploads/2019/04/custom_resource_records.png"><img data-recalc-dims="1" fetchpriority="high" decoding="async" data-attachment-id="169" data-permalink="https://krystanhonour.com/2019/04/09/setup-mailgun-with-a-domain-hosted-by-google-domains/custom_resource_records/" data-orig-file="https://i0.wp.com/krystanhonour.com/wp-content/uploads/2019/04/custom_resource_records.png?fit=983%2C265&amp;ssl=1" data-orig-size="983,265" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="custom_resource_records" data-image-description="" data-image-caption="" data-medium-file="https://i0.wp.com/krystanhonour.com/wp-content/uploads/2019/04/custom_resource_records.png?fit=300%2C81&amp;ssl=1" data-large-file="https://i0.wp.com/krystanhonour.com/wp-content/uploads/2019/04/custom_resource_records.png?fit=670%2C181&amp;ssl=1" class="aligncenter size-full wp-image-169" src="https://i0.wp.com/54.78.232.43/wp-content/uploads/2019/04/custom_resource_records.png?resize=670%2C181" alt="Custom resource records " width="670" height="181" srcset="https://i0.wp.com/krystanhonour.com/wp-content/uploads/2019/04/custom_resource_records.png?w=983&amp;ssl=1 983w, https://i0.wp.com/krystanhonour.com/wp-content/uploads/2019/04/custom_resource_records.png?resize=300%2C81&amp;ssl=1 300w, https://i0.wp.com/krystanhonour.com/wp-content/uploads/2019/04/custom_resource_records.png?resize=768%2C207&amp;ssl=1 768w, https://i0.wp.com/krystanhonour.com/wp-content/uploads/2019/04/custom_resource_records.png?resize=720%2C194&amp;ssl=1 720w" sizes="(max-width: 670px) 100vw, 670px" /></a></p>
<p>Now what you need to do is to add the records required by Mailgun to verify and authorise your domain, these are:</p>
<ul>
<li>TXT</li>
<li>TXT (another one)</li>
<li>MX</li>
<li>MX (another one)</li>
<li>CNAME (for message tracking)</li>
</ul>
<p>TXT records (known as SPF and DKIM) are required to send and receive mail with Mailgun, they are detailed in the Domain Verifications &amp; DNS sections of Mailgun. You add in values by using the simple GUI at the top the columns are Name, Type, TTL (Time to live) and Data. So an example set of information looks like this:</p>
<p>&nbsp;</p>
<p><a href="https://i0.wp.com/54.78.232.43/wp-content/uploads/2019/04/custom_records_filled.png"><img data-recalc-dims="1" decoding="async" data-attachment-id="170" data-permalink="https://krystanhonour.com/2019/04/09/setup-mailgun-with-a-domain-hosted-by-google-domains/custom_records_filled/" data-orig-file="https://i0.wp.com/krystanhonour.com/wp-content/uploads/2019/04/custom_records_filled.png?fit=997%2C626&amp;ssl=1" data-orig-size="997,626" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="custom_records_filled" data-image-description="" data-image-caption="" data-medium-file="https://i0.wp.com/krystanhonour.com/wp-content/uploads/2019/04/custom_records_filled.png?fit=300%2C188&amp;ssl=1" data-large-file="https://i0.wp.com/krystanhonour.com/wp-content/uploads/2019/04/custom_records_filled.png?fit=670%2C421&amp;ssl=1" class="aligncenter wp-image-170 size-full" src="https://i0.wp.com/54.78.232.43/wp-content/uploads/2019/04/custom_records_filled.png?resize=670%2C421" alt="Filled out custom records" width="670" height="421" srcset="https://i0.wp.com/krystanhonour.com/wp-content/uploads/2019/04/custom_records_filled.png?w=997&amp;ssl=1 997w, https://i0.wp.com/krystanhonour.com/wp-content/uploads/2019/04/custom_records_filled.png?resize=300%2C188&amp;ssl=1 300w, https://i0.wp.com/krystanhonour.com/wp-content/uploads/2019/04/custom_records_filled.png?resize=768%2C482&amp;ssl=1 768w, https://i0.wp.com/krystanhonour.com/wp-content/uploads/2019/04/custom_records_filled.png?resize=720%2C452&amp;ssl=1 720w" sizes="(max-width: 670px) 100vw, 670px" /></a></p>


<p>Obviously, the data here is not real. Pay attention to the MX record, there is a little black + next to the record after entering the first one to allow multiple records under the same key. Just click that to add the second record. In each case after filling out the information click the Add button and you should end up with a similar screen as above.</p>



<p>After this is complete just wait for your domain to verify, this doesn&#8217;t take very long.</p>



<p>&nbsp;</p>



<p>&nbsp;</p>The post <a href="https://krystanhonour.com/2019/04/09/setup-mailgun-with-a-domain-hosted-by-google-domains/">Setup mailgun with a domain hosted by Google Domains</a> first appeared on <a href="https://krystanhonour.com">Round the loop and back</a>.]]></content:encoded>
					
					<wfw:commentRss>https://krystanhonour.com/2019/04/09/setup-mailgun-with-a-domain-hosted-by-google-domains/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">164</post-id>	</item>
		<item>
		<title>Now we are sailing we are open.</title>
		<link>https://krystanhonour.com/2018/04/30/now-we-are-sailing-we-are-open/</link>
					<comments>https://krystanhonour.com/2018/04/30/now-we-are-sailing-we-are-open/#respond</comments>
		
		<dc:creator><![CDATA[Krystan]]></dc:creator>
		<pubDate>Mon, 30 Apr 2018 12:32:00 +0000</pubDate>
				<category><![CDATA[Technical]]></category>
		<guid isPermaLink="false">http://54.78.232.43/?p=118</guid>

					<description><![CDATA[<p>In my previous article, I explained I was moving my blog to Amazon Lightsail, it was a pretty painless move and to be honest I was very happy with the experience. That is until I realised I was going to need to sort out the SSL certificate that is installed by default. The image created&#8230;</p>
The post <a href="https://krystanhonour.com/2018/04/30/now-we-are-sailing-we-are-open/">Now we are sailing we are open.</a> first appeared on <a href="https://krystanhonour.com">Round the loop and back</a>.]]></description>
										<content:encoded><![CDATA[<p>In my previous article, I explained I was moving my blog to Amazon Lightsail, it was a pretty painless move and to be honest I was very happy with the experience.</p>
<p>That is until I realised I was going to need to sort out the SSL certificate that is installed by default. The image created by Bitnami comes with a dummy certificate which, to be honest, isn’t useful to us on our nice new shiny domain. So how to solve this, luckily there is a way that is free of charge for things like blogs and that is located over at <a href="https://letsencrypt.org/" target="_blank" rel="noopener noreferrer">Lets Encrypts website</a>, anyone thinking SSL certificates still cost a small fortune for things like a small blog should read on.</p>
<p>So now you know about Lets Encrypt how do you go about using one of their certificates. Luckily that has been made pretty painless by the Lets Encrypt team and you can install and enable a certificate with the minimum of fuss. And you can do that like so:</p>
<h2>Install and run the Lets Encrypt certbot program.</h2>
<p>You could do this with a package manager but I went with the following:</p>
<p>After accessing your Lightsail instance via ssh create a directory</p>
<pre><code>mkdir certbot
cd certbot</code></pre>
<p>Download the certbot</p>
<pre><code>wget https://dl.eff.org/certbot-auto
chmod a+x certbot-auto</code></pre>
<p>Run the certbot for your domain (don’t forget all domain names in this case I have two)</p>
<pre><code>./certbot-auto certonly --webroot -w /home/bitnami/apps/wordpress/htdocs/ \
-d yourdomainhere.com \
-d www.yourdomainhere.com</code></pre>
<p>You now need to edit /home/bitnami/stack/apache2/conf/bitnami/bitnami.conf and make it look like the below picture, this means commenting out the default certificates and adding the new ones in.</p>
<p><a href="https://i0.wp.com/54.78.232.43/wp-content/uploads/2018/04/certs.png"><img data-recalc-dims="1" loading="lazy" decoding="async" style="display: inline; background-image: none;" title="certs" src="https://i0.wp.com/54.78.232.43/wp-content/uploads/2018/04/certs_thumb.png?resize=665%2C111" alt="certs" width="665" height="111" border="0" /></a></p>
<p>Now you need to restart the WordPress stack, Bitnami have a script for doing this and you can do so by typing the following:</p>
<pre><code>sudo /opt/bitnami/ctlscript.sh restart</code></pre>
<p>Now when you refresh your browser (and use the HTTPS protocol and not the HTTP one) you should get that padlock you’d been wanting.</p>
<p><a href="https://i0.wp.com/54.78.232.43/wp-content/uploads/2018/04/cert.png"><img data-recalc-dims="1" loading="lazy" decoding="async" data-attachment-id="122" data-permalink="https://krystanhonour.com/2018/04/30/now-we-are-sailing-we-are-open/cert/" data-orig-file="https://i0.wp.com/krystanhonour.com/wp-content/uploads/2018/04/cert.png?fit=378%2C422&amp;ssl=1" data-orig-size="378,422" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="cert" data-image-description="" data-image-caption="" data-medium-file="https://i0.wp.com/krystanhonour.com/wp-content/uploads/2018/04/cert.png?fit=269%2C300&amp;ssl=1" data-large-file="https://i0.wp.com/krystanhonour.com/wp-content/uploads/2018/04/cert.png?fit=378%2C422&amp;ssl=1" class="alignnone size-full wp-image-122" src="https://i0.wp.com/54.78.232.43/wp-content/uploads/2018/04/cert.png?resize=378%2C422" alt="" width="378" height="422" srcset="https://i0.wp.com/krystanhonour.com/wp-content/uploads/2018/04/cert.png?w=378&amp;ssl=1 378w, https://i0.wp.com/krystanhonour.com/wp-content/uploads/2018/04/cert.png?resize=269%2C300&amp;ssl=1 269w" sizes="auto, (max-width: 378px) 100vw, 378px" /></a></p>
<p>One quick reminder is that these certificates are only valid for 90 days you can run the tool again or you can set up a cron job to update this. In order to add a cron job to update this certificate do the following.</p>
<p>Open up the crontab (as root) with</p>
<pre><code>crontab -e</code></pre>
<p>Now add the following in the file that opened:</p>
<pre><code>0 0,12 * * * python -c 'import random; import time; time.sleep(random.random() * 3600)' &amp;&amp; /home/bitnami/certbot/certbot-auto renew &amp;&amp; /opt/bitnami/ctlscript.sh restart</code></pre>
<p>This code adds a random time factor so not everyone in the world hits the certbot servers at the same time, and restarts the server so the new certificate is used.</p>
<p>Hope this helps.</p>The post <a href="https://krystanhonour.com/2018/04/30/now-we-are-sailing-we-are-open/">Now we are sailing we are open.</a> first appeared on <a href="https://krystanhonour.com">Round the loop and back</a>.]]></content:encoded>
					
					<wfw:commentRss>https://krystanhonour.com/2018/04/30/now-we-are-sailing-we-are-open/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">118</post-id>	</item>
		<item>
		<title>Moving my Blog from its home to AWS Lightsail</title>
		<link>https://krystanhonour.com/2018/03/05/moving-my-blog-from-its-home-to-aws-lightsail/</link>
					<comments>https://krystanhonour.com/2018/03/05/moving-my-blog-from-its-home-to-aws-lightsail/#respond</comments>
		
		<dc:creator><![CDATA[Krystan]]></dc:creator>
		<pubDate>Mon, 05 Mar 2018 22:26:00 +0000</pubDate>
				<category><![CDATA[Technical]]></category>
		<guid isPermaLink="false">http://54.78.232.43/?p=95</guid>

					<description><![CDATA[<p>This is the second post to this blog and its to say that its moved homes. Whilst the domain may have stayed the same its permanent home has moved from Webfaction where it has lived for a long time to AWS. I did this for a few reasons but the real driving force was that&#8230;</p>
The post <a href="https://krystanhonour.com/2018/03/05/moving-my-blog-from-its-home-to-aws-lightsail/">Moving my Blog from its home to AWS Lightsail</a> first appeared on <a href="https://krystanhonour.com">Round the loop and back</a>.]]></description>
										<content:encoded><![CDATA[<p>This is the second post to this blog and its to say that its moved homes. Whilst the domain may have stayed the same its permanent home has moved from <a href="https://www.webfaction.com/" target="_blank" rel="noreferrer noopener">Webfaction</a> where it has lived for a long time to AWS. I did this for a few reasons but the real driving force was that I am now using AWS on a regular basis and felt I should move my personal domain and blog there.</p>



<p>I started using AWS 2 years ago and I really liked the interface on offer and the number of services which seem to grow at an exponential rate. I became an AWS certified architect over a year ago and always meant to move my blog but never really got around to it. All of this stopped after Amazon launched Lightsail.</p>



<p>So what’s the big deal? In Lightsail Amazon has created a way to create a number of well used and popular pre-packaged server configurations, there are entire stacks or OS only configurations here is a screen shot to give you an idea of what is available at the current time.</p>



<figure class="wp-block-image"><a href="https://i0.wp.com/54.78.232.43/wp-content/uploads/2018/03/image.png"><img data-recalc-dims="1" decoding="async" src="https://i0.wp.com/54.78.232.43/wp-content/uploads/2018/03/image_thumb.png?w=670" alt="image"/></a></figure>



<p>You simply choose your region and your instance plan, which start at $5 a month and go to $80, give it a unique name and tell the interface how many of these instances you wish to launch, your first month is free!</p>



<figure class="wp-block-image"><a href="https://i0.wp.com/54.78.232.43/wp-content/uploads/2018/03/image-1.png"><img data-recalc-dims="1" decoding="async" src="https://i0.wp.com/54.78.232.43/wp-content/uploads/2018/03/image_thumb-1.png?w=670" alt="image"/></a></figure>



<p>You can launch these instances in a number of regions and availability zones:</p>



<figure class="wp-block-image"><a href="https://i0.wp.com/54.78.232.43/wp-content/uploads/2018/03/image-2.png"><img data-recalc-dims="1" decoding="async" src="https://i0.wp.com/54.78.232.43/wp-content/uploads/2018/03/image_thumb-2.png?w=670" alt="image"/></a></figure>



<p>You can add a launch script that will execute on first launch at the click of a button this can be shell script for Linux based instances or Powershell for the windows based instances. Once you have created your instance you are presented with a small panel with the name of the instance with all its information my blog one looks like this:</p>



<figure class="wp-block-image"><a href="https://i0.wp.com/54.78.232.43/wp-content/uploads/2018/03/image-3.png"><img data-recalc-dims="1" decoding="async" src="https://i0.wp.com/54.78.232.43/wp-content/uploads/2018/03/image_thumb-3.png?w=670" alt="image"/></a></figure>



<p>You will notice from the above picture that in the tile there are a number of things shown, there is a CLI icon (more about this in a moment), a standard menu icon where various simple commands can be launched from and its IP address along with Region and A-Z. Also you will notice across the top there are simplified menu items for other services, like networking (A very simple Route53 interface) and also the ability to give your instance a static IP address. Normally Route53 although a great service can be a bit overwhelming if you are not used to that sort of service, the simplified interface on offer allows you to create a DNS Zone and to create A-Records very easily without really needing to know what all that stuff really means (you really should know if you are hosting your own stuff). Its all wizard-driven and DNS zones are a free service, you just enter your domain name in the friendly dialog and click create. After you create your records in your zone you are presented with the nameservers being used, which you can feed to your domain registrar if you are using a third party the gui is beginner friendly and looks like this:</p>



<figure class="wp-block-image"><a href="https://i0.wp.com/54.78.232.43/wp-content/uploads/2018/03/image-4.png"><img data-recalc-dims="1" decoding="async" src="https://i0.wp.com/54.78.232.43/wp-content/uploads/2018/03/image_thumb-4.png?w=670" alt="image"/></a></figure>



<p>Notice you are not restricted to A records you can add CNAMES, MX and TXT records, whilst this is not as fully featured as Route53 we are in a limited service so I think what’s available is really great. In keeping with the making things very clear if you click that delete link the entire form is replaced with a huge big red button, it is made very clear that clicking that button will destroy all subdomains and traffic will no longer be routed to your instances.</p>



<p>So then how do you get into these instances? Well these are still EC2 instance configurations under the covers they don’t appear on the EC2 panel though, same as your hosted zone is nowhere to be found in the route53, don’t panic, you can assign keys to your instances, you can either generate your own keypair or use the default Lightsail ones. You could use ssh from a Linux command line or putty to connect to your instance but why when Lightsail gives you a client to do this with (remember that CLI icon I mentioned). Just click that icon and this appears:</p>



<figure class="wp-block-image"><a href="https://i0.wp.com/54.78.232.43/wp-content/uploads/2018/03/image-5.png"><img data-recalc-dims="1" decoding="async" src="https://i0.wp.com/54.78.232.43/wp-content/uploads/2018/03/image_thumb-5.png?w=670" alt="image"/></a></figure>



<p>You don’t even need a client or to memorise the ssh command (its not that hard) because you can click in and get a fully functional terminal right there in your browser. Its pretty impressive stuff and really does make it very easy to manage straight away without ever leaving the browser where you created the instance.</p>



<p>Other important features include being able to create disks, snapshots of the vm and create load balancers if you have created multiple instances. This is the sort of joined up thinking that makes Lightsail such a no brainer if all you want is a basic service configured quickly and launched into the cloud with minimum fuss. Which is really what the service is all about.</p>



<p>So once I had my server up and running and my domain functioning I simply used <a href="https://vaultpress.com" target="_blank" rel="noreferrer noopener">Vaultpress</a> to migrate my content. There were a few issues with this, mainly to do with permissions on the <a href="https://bitnami.com/" target="_blank" rel="noreferrer noopener">Bitnami</a> image but these were easily solved after a bit of research and once the Vaultpress user could write to the correct location it uploaded its helper script and my entire domain migrated in a few minutes. (All one post of it). Also my WordPress configuration came across.</p>



<p>One of the more annoying things that comes with this image is a little banner to bitnami in the bottom of your screen you can disable this it turns out with the following command:</p>



<pre class="wp-block-code"><code>sudo /opt/bitnami/apps/wordpress/bnconfig --disable_banner 1</code></pre>



<p>and you can then use the following command to restart apache:</p>



<pre class="wp-block-code"><code>sudo /opt/bitnami/ctlscript.sh restart apache</code></pre>



<p>This service has been about for a while now (November 2016) but I’ve really only just got around to looking at it. Its not meant to be an enterprise solution, its meant to be fast and easy and have a predictable price. Its really easy to use and it took me less than 15 minutes to get my instance up, routed, configured and restored (bar permissions issues), I hadn’t read the instructions but did know how dns worked. Its a great service.</p>



<p>Oh and if using guis upsets you there is a public API for doing all this <a href="https://docs.aws.amazon.com/lightsail/2016-11-28/api-reference/Welcome.html" target="_blank" rel="noreferrer noopener">here</a>. And the lightsail docs I didn’t read are <a href="https://lightsail.aws.amazon.com/ls/docs/all" target="_blank" rel="noreferrer noopener">here</a>.</p>The post <a href="https://krystanhonour.com/2018/03/05/moving-my-blog-from-its-home-to-aws-lightsail/">Moving my Blog from its home to AWS Lightsail</a> first appeared on <a href="https://krystanhonour.com">Round the loop and back</a>.]]></content:encoded>
					
					<wfw:commentRss>https://krystanhonour.com/2018/03/05/moving-my-blog-from-its-home-to-aws-lightsail/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">95</post-id>	</item>
	</channel>
</rss>
