<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Pete</title>
    <description>The latest articles on DEV Community by Pete (@mcvicar).</description>
    <link>https://dev.to/mcvicar</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F643404%2Fdd29c57a-7eaf-43c5-8a23-3d1c6de99075.png</url>
      <title>DEV Community: Pete</title>
      <link>https://dev.to/mcvicar</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/mcvicar"/>
    <language>en</language>
    <item>
      <title>Adding additional services into Amplify</title>
      <dc:creator>Pete</dc:creator>
      <pubDate>Wed, 07 Jul 2021 16:48:39 +0000</pubDate>
      <link>https://dev.to/mcvicar/adding-additional-services-into-amplify-egg</link>
      <guid>https://dev.to/mcvicar/adding-additional-services-into-amplify-egg</guid>
      <description>&lt;p&gt;Michael Liendo's post &lt;a href="https://dev.to/mtliendo/serverless-contact-form-using-aws-amplify-1e9m"&gt;Serverless Contact Form Using AWS Amplify&lt;/a&gt; reminded me of something I learnt about adding additional "not natively supported" services into Amplify.&lt;/p&gt;

&lt;p&gt;When I say "not natively supported", I mean you can't create the resources with the cli. Rather than, Amplify doesn't support them at all. Of course your application will, you've access to the AWS SDK after all...&lt;/p&gt;

&lt;h2&gt;
  
  
  Sending a simple templated email...
&lt;/h2&gt;

&lt;p&gt;Like Michael's example, I wanted to simply create an email to invite people to an organisation in &lt;a href="https://www.theslate.co"&gt;the slate&lt;/a&gt;. The difference was I wanted to use an &lt;a href="https://docs.aws.amazon.com/ses/latest/DeveloperGuide/send-personalized-email-api.html"&gt;SES email template&lt;/a&gt;, so that I could have different environmental versions. &lt;/p&gt;

&lt;h2&gt;
  
  
  SES templates?
&lt;/h2&gt;

&lt;p&gt;Rather than have the actual email template like so&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;ses&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;sendEmail&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;Destination&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;ToAddresses&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;SES_EMAIL&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="na"&gt;Source&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;SES_EMAIL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;Message&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;Subject&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;Data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Candidate Submission&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="na"&gt;Body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;Data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`My name is &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;candidateName&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;. You can reach me at &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;candidateEmail&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;})&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;promise&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can do something like this,&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;emailTemplate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;Destination&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;ToAddresses&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;Source&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`The Slate &amp;lt;&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;inviteEmail&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;gt;`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;Template&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;SLATE_INVITE&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;TemplateData&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`{ \"invited_by\":\"&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;userDetails&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;\", \"invite_url\": \"&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;\" }`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// THIS HAS TO BE A JSON ESCAPED STRING!?&lt;/span&gt;
  &lt;span class="na"&gt;ReplyToAddresses&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="s2"&gt;`The Slate &amp;lt;&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;inviteEmail&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;gt;`&lt;/span&gt;
  &lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;ses&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;sendTemplatedEmail&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;emailTemplate&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;promise&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;SLATE_INVITE&lt;/code&gt; is a reference to an HTML and Text email template held in SES, and it will accept the references and data in &lt;code&gt;TemplateData&lt;/code&gt; to be rendered in the template. To me it's a nice / clearer way of making changes to the template.&lt;/p&gt;

&lt;h2&gt;
  
  
  Kicking it up a notch
&lt;/h2&gt;

&lt;p&gt;For some reason, I've no idea why, I decided to put the HTML and text templates into &lt;code&gt;/amplify/backend/email&lt;/code&gt;. &lt;/p&gt;

&lt;p&gt;Then in my infinite wisdom I wondered, could I make a Cloudformation template for this? &lt;/p&gt;

&lt;p&gt;My rational was that I could deploy environmental/versioned templates alongside everything else, and if I had to spin the slate up on a different AWS account, it wouldn't be a problem. The short answer is &lt;a href="https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ses-template.html"&gt;yes&lt;/a&gt;, yes you can. &lt;/p&gt;

&lt;p&gt;As you can imagine, it didn't take long to go "If I have a cloudformation template, could add it to the existing Amplify cloudformation set-up?". Again, turns out you can do this too. &lt;/p&gt;

&lt;h2&gt;
  
  
  Extending your Amplify Cloudformations
&lt;/h2&gt;

&lt;p&gt;You may have never have noticed, but there is a file at &lt;code&gt;/amplify/backend/backend-config.json&lt;/code&gt; that describes your amplify resources, e.g.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;storage&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;slate&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;service&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;DynamoDB&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;providerPlugin&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;awscloudformation&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;},&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The format of the json describes two things;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;"Storage" is both the "Category" you see in the cli and a folder (&lt;code&gt;/amplify/backend/storage&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;"slate" is "Resource name" you see in the cli and a folder (&lt;code&gt;/amplify/backend/storage/slate&lt;/code&gt;) holding the cloudformation template&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If you were to add something like&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;email&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;invite&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;service&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;SES&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;providerPlugin&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;awscloudformation&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;},&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In theory it will be picked up.&lt;/p&gt;

&lt;p&gt;In theory you say?&lt;br&gt;
Yes - because you need to have &lt;code&gt;/amplify/#current-cloud-backend/amplify-meta.json&lt;/code&gt; refreshed to see your new service in the cli. &lt;/p&gt;

&lt;p&gt;Once that happens, when you will see your new custom service and it will execute as part of the cloudformation stack. If it isn't there, it won't.&lt;/p&gt;

</description>
      <category>aws</category>
      <category>cloudformation</category>
      <category>amplify</category>
      <category>javascript</category>
    </item>
    <item>
      <title>What is your error budget?</title>
      <dc:creator>Pete</dc:creator>
      <pubDate>Mon, 14 Jun 2021 16:48:18 +0000</pubDate>
      <link>https://dev.to/mcvicar/what-is-your-error-budget-347</link>
      <guid>https://dev.to/mcvicar/what-is-your-error-budget-347</guid>
      <description>&lt;p&gt;Part of the reason I built &lt;a href="https://www.theslate.co"&gt;The Slate&lt;/a&gt; was because I've seen this common pattern too many times.&lt;/p&gt;

&lt;p&gt;Service A (that people interact with) relies on Service B and C. Service B &amp;amp; C constantly fail, but Service A gets a bad rap with their users. The teams responsible for B &amp;amp; C don't know about the impact they are having on Service A. The team running Service A doesn't know Service B or C's error budgets, which is much lower. &lt;/p&gt;

&lt;h2&gt;
  
  
  What's an error budget?
&lt;/h2&gt;

&lt;p&gt;Pretty simply, an error budget is the maximum amount of time that a team is "happy" to allow a system or service to fail. Usually you'll see it represented as a percentage of availability (e.g. 99.99% uptime!). &lt;/p&gt;

&lt;p&gt;If you were to break down the percentages per month, you'd get; &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;99.000% is 7h 18m 18s per month &lt;/li&gt;
&lt;li&gt;99.900% is 43m 50s per month&lt;/li&gt;
&lt;li&gt;99.990% is 4m 23s per month &lt;/li&gt;
&lt;li&gt;99.999% is 26s per month&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Some of these can be pretty tough targets to hit, that might not be required for your business. I'd say a marketing site could easily handle an error budget of 99.9%. An e-commerce site might need to be 99.99%.&lt;/p&gt;

&lt;p&gt;Just remember, five 9s (99.999%) can be significantly more expensive than four 9s (99.99%) to achieve. Particularly if you don't have the budget, resources or business support to achieve them.&lt;/p&gt;

&lt;h2&gt;
  
  
  What about those upstream services?
&lt;/h2&gt;

&lt;p&gt;The services you depend on might have a different error budget. Like in my example earlier, Service A had a budget of four 9s. They had the budget, processes and resources in place to achieve that. But the other services had error budgets of two 9s.&lt;/p&gt;

&lt;p&gt;As the owner of Service A, you have a choice. You might be able to build Service A to be resilient of downtime for Service B and/or C. But if you can't, then you've got two options;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Reconsider your error budget to reflect your dependancy's budget&lt;/li&gt;
&lt;li&gt;Speak to the other Service's teams about their error budgets, and if it is possible to improve it.&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Who is happy with downtime?!
&lt;/h1&gt;

&lt;p&gt;No one really is. But you have to be realistic, not every service is, or should be, five 9s. Outages happen. How we respond to them, learn from them and adapt to them is the vital part here. &lt;/p&gt;

&lt;p&gt;The first step in dealing with them however is being transparent about what each service's error budgets are, and how they might have an impact on dependant service. &lt;/p&gt;

&lt;p&gt;This one very small aspect of the governance of your microservices, but it can easily increase your reliability and resilience.&lt;/p&gt;

</description>
      <category>microservices</category>
      <category>microservicesgovernance</category>
      <category>errorbudgets</category>
    </item>
    <item>
      <title>How a viral video helped me design my MVP</title>
      <dc:creator>Pete</dc:creator>
      <pubDate>Wed, 09 Jun 2021 09:55:52 +0000</pubDate>
      <link>https://dev.to/mcvicar/how-a-viral-video-helped-me-design-my-mvp-5399</link>
      <guid>https://dev.to/mcvicar/how-a-viral-video-helped-me-design-my-mvp-5399</guid>
      <description>&lt;p&gt;If you’ve ever worked as product manager or a technologist working within a complex technology ecosystem, you’ve likely had a conversation like this before.&lt;/p&gt;

&lt;p&gt;Usually tho, it’s a little less humourless…&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/y8OnoxKotPQ"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;About a year ago, I came across that video. I chuckled along — it’s funny ‘cause it’s true — and promptly forgot about it.&lt;/p&gt;

&lt;h2&gt;
  
  
  One year later
&lt;/h2&gt;

&lt;p&gt;As I was building the MVP for &lt;a href="https://www.theslate.co/"&gt;the Slate&lt;/a&gt;, I came across it again. It stuck me, this is the type of problem I’m trying to help solve.&lt;/p&gt;

&lt;p&gt;Highlighting and communicating dependancies between microservices, architectural decisions and product requirements is hard. So I took the video and tried to work out two things.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Does &lt;a href="https://www.theslate.co/"&gt;the Slate&lt;/a&gt; have all the functionality there that they describe?&lt;/li&gt;
&lt;li&gt;What would this technology estate even look like if they used the Slate?&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  The results
&lt;/h2&gt;

&lt;p&gt;After some tweaking and a missed piece of functionality (“deprecation notices, how could I have forgotten those?!”), I had a result.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://app.theslate.co/#/example/services/3fa1743e-a084-11eb-892a-4713a7ea79d7"&gt;A service specification for Entropy Khaos Service (EKS) which is being deprecated&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://app.theslate.co/#/example/services/400943fc-a084-11eb-84e8-37f16b167d93"&gt;A service specification for Omega Star&lt;/a&gt;, the replacement for EKS&lt;/li&gt;
&lt;li&gt;&lt;a href="https://app.theslate.co/#/specs/example"&gt;An architectural decision that everything should support ISO timestamps&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;And of course, &lt;a href="https://app.theslate.co/#/example/services/400943fc-a084-11eb-84e8-37f16b167d93"&gt;Galatcus&lt;/a&gt;, the all-knowing user service provider aggregator.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Could the Slate have helped?
&lt;/h2&gt;

&lt;p&gt;Would the Slate have stopped an awkward conversation between a Product Manager and Developer that ended in crying? I’m not sure.&lt;/p&gt;

&lt;p&gt;Would the Product Manager have known about how the services interrelate, what the blocker for Birthday Boy is and why? I’d say so.&lt;/p&gt;

&lt;p&gt;I know that it’s an exaggerated scenario, but it’s pretty close to the truth as well. It also gave me a nice “demo-able” example for people to see/interact with the service.&lt;/p&gt;

&lt;p&gt;Overall, it felt like a worthwhile endeavour. Although I’m sure I’ve missed something, somewhere.&lt;/p&gt;

</description>
      <category>microservices</category>
      <category>microservicegoverance</category>
      <category>devops</category>
    </item>
    <item>
      <title>A Microservices Service Catalogue? (or why I built the Slate)</title>
      <dc:creator>Pete</dc:creator>
      <pubDate>Fri, 04 Jun 2021 10:48:45 +0000</pubDate>
      <link>https://dev.to/mcvicar/a-microservices-service-catalogue-or-why-i-built-the-slate-56bm</link>
      <guid>https://dev.to/mcvicar/a-microservices-service-catalogue-or-why-i-built-the-slate-56bm</guid>
      <description>&lt;p&gt;About six months ago, I saw a great talk by Nora Jones’ called “&lt;a href="https://www.infoq.com/presentations/rethinking-chaos-engineering/"&gt;Rethinking chaos engineering&lt;/a&gt;” — I was inspired, not so much by the chaos engineering, but by something else.&lt;/p&gt;

&lt;p&gt;You see, I’d seen these pattern in a bunch of different organisations;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pattern 1:&lt;/strong&gt;&lt;br&gt;
Service A (that your audience interacts with) relies on Service B and C. Service B &amp;amp; C fails, but Service A gets a bad rap with their users. The teams responsible for Services B &amp;amp; C don’t know about the impact they are having on Service A.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pattern 2:&lt;/strong&gt;&lt;br&gt;
New product owner comes into a team. The don’t understand the technology estate. They are left with questions like “Is Service A more important that Service B?” “How critical is Service C to my overall priorities?”.&lt;/p&gt;

&lt;p&gt;So I spent a few nights pulling together a &lt;a href="https://mcvicar.github.io/spectacle/#/"&gt;Proof-of-Concept&lt;/a&gt; called Spectacle.&lt;/p&gt;

&lt;p&gt;My solution was to create a dashboard that would capture, displaying and communicate service’s SLIs, SLOs, SLAs, their dependancies and align the service closer to business priorities.&lt;/p&gt;

&lt;p&gt;I saw the purpose of the concept as a way of facilitating a conversation between teams about the importance of a service within a microservice estate.&lt;/p&gt;

&lt;p&gt;I got some lovely feedback from a few folks, made a few tweaks and moved on.&lt;/p&gt;

&lt;h2&gt;
  
  
  Four months later
&lt;/h2&gt;

&lt;p&gt;I had started playing around my next PoC — content workflow/state management — when it stuck me something major was missing from Spectacle; Architectural decisions.&lt;/p&gt;

&lt;p&gt;Helping to build a complete picture of each microservice within your estate is one thing. Building an understanding and consensus amongst teams on the direction, challenges and impacts those microservices are facing is the next logical step.&lt;/p&gt;

&lt;p&gt;I’ve seen too many architects in organisations make decisions upon high and not communicate them at all (or particularly well). Then disaster hits, because the impact of the decision reaches the service teams and doesn’t fit.&lt;/p&gt;

&lt;p&gt;So taking some cues from Riot Games on how they do &lt;a href="https://technology.riotgames.com/news/tech-design-riot"&gt;Tech Design&lt;/a&gt; and Michael Nygard’s &lt;a href="http://thinkrelevance.com/blog/2011/11/15/documenting-architecture-decisions"&gt;documenting architecture decisions&lt;/a&gt; I decided to add it into Spectacle. But it would need a &lt;em&gt;major change&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Spectacle was ‘single user’ — it saved your data locally in your browser, using local storage. You couldn’t export or easily share your data, this required a major shift.&lt;/p&gt;

&lt;h2&gt;
  
  
  A macro/micro/nano-SaaS?
&lt;/h2&gt;

&lt;p&gt;User authentication, multi-tenancy, databases, APIs. It was all starting to look like a fully fledged software-as-a-service. So I thought, why not launch it as one?&lt;/p&gt;

&lt;p&gt;I decided to use an old domain that I had never used and see what happens. Two months later, &lt;a href="https://www.theslate.co/"&gt;The Slate&lt;/a&gt; went live.&lt;/p&gt;

&lt;p&gt;I do believe in the power of insights and open communication. The more you and your teams know, the better decisions you make. I don’t expect the Slate to become the “next big thing”. But if it helps one or two teams have a better understanding of their organisational context, then I’ve done something useful.&lt;/p&gt;

&lt;h2&gt;
  
  
  What’s next?
&lt;/h2&gt;

&lt;p&gt;Going back to the feedback from the Spectacle PoC, there were two major comments.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;I can’t share it with anyone (Resolved!).&lt;/li&gt;
&lt;li&gt;I’d like to see summaries from monitoring and alerting systems alongside a particular service.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;So, depending on how well the launch goes I’m going to start looking at 3rd party integration and see where that leads me.&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>slos</category>
      <category>devops</category>
      <category>adrs</category>
    </item>
  </channel>
</rss>
