<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>AWS on James Montgomery</title>
    <link>https://gh-jamesmontgomery.github.io/pages-blog/categories/aws/</link>
    <description>Recent content in AWS on James Montgomery</description>
    <generator>Hugo</generator>
    <language>en-gb</language>
    <lastBuildDate>Wed, 13 Jan 2021 00:00:00 +0000</lastBuildDate>
    <atom:link href="https://gh-jamesmontgomery.github.io/pages-blog/categories/aws/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>API Diversions</title>
      <link>https://gh-jamesmontgomery.github.io/pages-blog/2021/01/api-diversions/</link>
      <pubDate>Wed, 13 Jan 2021 00:00:00 +0000</pubDate>
      <guid>https://gh-jamesmontgomery.github.io/pages-blog/2021/01/api-diversions/</guid>
      <description>&lt;h2 id=&#34;tl-dr&#34;&gt;TL; DR&lt;/h2&gt;&#xA;&lt;p&gt;Recently reinvigorated with my new &lt;a href=&#34;https://gh-jamesmontgomery.github.io/pages-blog/2020/12/new-ui-for-my-text-to-speech-player/&#34;&gt;UI work&lt;/a&gt;, I set myself to task with simplifying the front end player code. No matter how I looked at it, I&amp;rsquo;d needed to rewrite the back end API to support a front end rewrite. But what if I didn&amp;rsquo;t precisely need to do that? Enter stage left, Cloudflare Workers.&lt;/p&gt;&#xA;&#xA;&#xA;&#xA;    &#xA;&#xA;    &#xA;    &#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;  &#xA;  &#xA;    &#xA;  &#xA;&#xA;&#xA;    &#xA;&#xA;    &lt;div class=&#34;box alt&#34;&gt;&#xA;        &lt;div class=&#34;row uniform&#34;&gt;&#xA;        &#xA;        &#xA;        &#xA;            &#xA;                &lt;div class=&#34;1u&#34;&gt;&#xA;            &#xA;            &#xA;        &#xA;            &#xA;                &#xA;                    &#xA;                    &lt;span class=&#34;image fit&#34;&gt;&#xA;                &#xA;            &#xA;            &#xA;        &#xA;            &#xA;                &#xA;                        &lt;img src=&#39;https://gh-jamesmontgomery.github.io/pages-blog/img/2021/01/cfw-proxy-1.png&#39;&#xA;                            alt=&#34;Comparison of beta with the worker as proxy and handling query translation.&#34;&gt;&#xA;                    &lt;/span&gt;&lt;/div&gt;&#xA;                &#xA;                &#xA;            &#xA;            &#xA;        &#xA;        &lt;/div&gt;&#xA;    &lt;/div&gt;&#xA;&#xA;&#xA;&lt;p&gt;Below I explain how I arrived at this. If you would like to view the Worker code, you can do so &lt;a href=&#34;https://github.com/gh-jamesmontgomery/cloudflare-workers/blob/main/api-proxy/tts-api-translate.js&#34;&gt;here&lt;/a&gt;. If you would like to view the sites (and compare), you may do so here:&lt;/p&gt;</description>
    </item>
    <item>
      <title>New UI for my text-to-speech player</title>
      <link>https://gh-jamesmontgomery.github.io/pages-blog/2020/12/new-ui-for-my-text-to-speech-player/</link>
      <pubDate>Sat, 05 Dec 2020 00:00:00 +0000</pubDate>
      <guid>https://gh-jamesmontgomery.github.io/pages-blog/2020/12/new-ui-for-my-text-to-speech-player/</guid>
      <description>&lt;h2 id=&#34;tl-dr&#34;&gt;TL; DR&lt;/h2&gt;&#xA;&lt;p&gt;My previous user interface (UI) could be, at best described as functional. Whilst it technically worked on any platform I tested, a desktop browser received the best experience. Recently &lt;a href=&#34;https://twitter.com/suivethefirst&#34;&gt;@suivethefirst&lt;/a&gt; recommended Bootstrap to me. So I tried to make a better experience with this.&lt;/p&gt;&#xA;&lt;h2 id=&#34;putting-the-minimum-into-mvp&#34;&gt;Putting the minimum into MVP&lt;/h2&gt;&#xA;&lt;p&gt;Putting together the UI as it stood was the last functional step in my project. Delivering an audio player with a combination of CSS and JavaScript felt beyond what I had in the tank at the time.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Migrating site to AWS</title>
      <link>https://gh-jamesmontgomery.github.io/pages-blog/2020/09/migrating-site-to-aws/</link>
      <pubDate>Mon, 21 Sep 2020 00:00:00 +0000</pubDate>
      <guid>https://gh-jamesmontgomery.github.io/pages-blog/2020/09/migrating-site-to-aws/</guid>
      <description>&lt;h2 id=&#34;tl-dr&#34;&gt;TL; DR&lt;/h2&gt;&#xA;&lt;p&gt;Some time ago, I decided to multi-cloud my site. I&amp;rsquo;ve recently decided to revert to a single cloud hosting provider. I&amp;rsquo;m taking the opportunity to experience Amplify static hosting for this site.&lt;/p&gt;&#xA;&lt;h2 id=&#34;challenges-with-the-previous-configuration&#34;&gt;Challenges with the previous configuration&lt;/h2&gt;&#xA;&lt;p&gt;Multiple hosting locations meant multiple build processes.&lt;/p&gt;&#xA;&#xA;&#xA;&#xA;    &#xA;&#xA;    &#xA;    &#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;  &#xA;  &#xA;    &#xA;  &#xA;&#xA;&#xA;    &#xA;&#xA;    &lt;div class=&#34;box alt&#34;&gt;&#xA;        &lt;div class=&#34;row uniform&#34;&gt;&#xA;        &#xA;        &#xA;        &#xA;            &#xA;                &lt;div class=&#34;1u&#34;&gt;&#xA;            &#xA;            &#xA;        &#xA;            &#xA;                &#xA;                    &#xA;                    &lt;span class=&#34;image fit&#34;&gt;&#xA;                &#xA;            &#xA;            &#xA;        &#xA;            &#xA;                &#xA;                        &lt;img src=&#39;https://gh-jamesmontgomery.github.io/pages-blog/img/2020/09/duelstack.jpeg&#39;&#xA;                            alt=&#34;Duel stack overview&#34;&gt;&#xA;                    &lt;/span&gt;&lt;/div&gt;&#xA;                &#xA;                &#xA;            &#xA;            &#xA;        &#xA;        &lt;/div&gt;&#xA;    &lt;/div&gt;&#xA;&#xA;&#xA;&lt;p&gt;In effect, the site was built, deployed (to Firebase) then rebuilt and redeployed (to AWS). Admittedly, the latter was rarely an overhead as the AWS Amplify CI/CD workflow was triggered upon commit to the master branch on CodeCommit.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Introducing async to my serverless text-to-speech player for jokes and quotes</title>
      <link>https://gh-jamesmontgomery.github.io/pages-blog/2020/04/introducing-async-to-my-serverless-text-to-speech-player-for-jokes-and-quotes/</link>
      <pubDate>Thu, 30 Apr 2020 00:00:00 +0000</pubDate>
      <guid>https://gh-jamesmontgomery.github.io/pages-blog/2020/04/introducing-async-to-my-serverless-text-to-speech-player-for-jokes-and-quotes/</guid>
      <description>&lt;h2 id=&#34;tl-dr&#34;&gt;TL; DR&lt;/h2&gt;&#xA;&lt;p&gt;In this post, I revisit my &lt;a href=&#34;https://gh-jamesmontgomery.github.io/pages-blog/2020/03/a-serverless-text-to-speech-player-for-jokes-and-quotes/&#34;&gt;serverless &amp;ldquo;jokes and quotes&amp;rdquo; player&lt;/a&gt;. The purpose was to remove the tight coupling between the client request and audio playback API source. To explore the issue, I have introduced DynamoDB to store pre-generated results.&lt;/p&gt;&#xA;&lt;h2 id=&#34;challenge-overview&#34;&gt;Challenge overview&lt;/h2&gt;&#xA;&lt;p&gt;Logically, all the components of my existing solution depend on each other to succeed to deliver audio to the client. You can visualise it as follows:&lt;/p&gt;&#xA;&#xA;&#xA;&#xA;    &#xA;&#xA;    &#xA;    &#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;  &#xA;  &#xA;    &#xA;  &#xA;&#xA;&#xA;    &#xA;&#xA;    &lt;div class=&#34;box alt&#34;&gt;&#xA;        &lt;div class=&#34;row uniform&#34;&gt;&#xA;        &#xA;        &#xA;        &#xA;            &#xA;                &lt;div class=&#34;1u&#34;&gt;&#xA;            &#xA;            &#xA;        &#xA;            &#xA;                &#xA;                    &#xA;                    &lt;span class=&#34;image fit&#34;&gt;&#xA;                &#xA;            &#xA;            &#xA;        &#xA;            &#xA;                &#xA;                        &lt;img src=&#39;https://gh-jamesmontgomery.github.io/pages-blog/img/2020/04/tts-sync-overview.png&#39;&#xA;                            alt=&#34;Flow of the synchronous version.&#34;&gt;&#xA;                    &lt;/span&gt;&lt;/div&gt;&#xA;                &#xA;                &#xA;            &#xA;            &#xA;        &#xA;        &lt;/div&gt;&#xA;    &lt;/div&gt;&#xA;&#xA;&#xA;&lt;p&gt;The challenge was to accomplish a solution which operated in the following fashion:&lt;/p&gt;</description>
    </item>
    <item>
      <title>A Serverless text-to-speech player for jokes and quotes</title>
      <link>https://gh-jamesmontgomery.github.io/pages-blog/2020/03/a-serverless-text-to-speech-player-for-jokes-and-quotes/</link>
      <pubDate>Tue, 31 Mar 2020 00:00:00 +0000</pubDate>
      <guid>https://gh-jamesmontgomery.github.io/pages-blog/2020/03/a-serverless-text-to-speech-player-for-jokes-and-quotes/</guid>
      <description>&lt;h2 id=&#34;tl-dr&#34;&gt;TL; DR&lt;/h2&gt;&#xA;&lt;p&gt;I decided to dust off my text-to-speech list, implementing a serverless solution delivering random jokes and quotes. You may visit it at this address:&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://tts-ja.mesmontgomery.co.uk/&#34;&gt;https://tts-ja.mesmontgomery.co.uk/&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;You can get a preview of the joke quality here:&lt;/p&gt;&#xA;&lt;!-- markdownlint-disable MD033 --&gt;&#xA;&lt;p&gt;&lt;audio controls&gt;&lt;source src=&#34;https://gh-jamesmontgomery.github.io/pages-blog/audio/AWS-TTS-20-four-engineers.mp3&#34; type=&#34;audio/mpeg&#34;&gt;Your browser does not support the audio element.&lt;/audio&gt;&lt;/p&gt;&#xA;&lt;!-- markdownlint-enable MD033 --&gt;&#xA;&lt;p&gt;Note: I can&amp;rsquo;t affect the humour quality 🤣.&lt;/p&gt;&#xA;&lt;h2 id=&#34;solution-overview&#34;&gt;Solution overview&lt;/h2&gt;&#xA;&lt;p&gt;Upon visiting the page, an event triggers calls to the API routes for their relative jokes and quotes. Contained in the API response is the source audio for the HTML5 audio controls.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Backup of Cloudflare DNS to AWS DynamoDB</title>
      <link>https://gh-jamesmontgomery.github.io/pages-blog/2020/02/backup-of-cloudflare-dns-to-aws-dynamodb/</link>
      <pubDate>Fri, 21 Feb 2020 00:00:00 +0000</pubDate>
      <guid>https://gh-jamesmontgomery.github.io/pages-blog/2020/02/backup-of-cloudflare-dns-to-aws-dynamodb/</guid>
      <description>&lt;h2 id=&#34;tl-dr&#34;&gt;TL; DR&lt;/h2&gt;&#xA;&lt;p&gt;After a short break, I decided to take an item off the project list. DNS is a rich source of inspiration for me - and so I elected for a quick win in the form of serverless DNS records backup. The goal of which is to backup my DNS zone contents, via functions as a service (FaaS) and storage as a service (object or database).&lt;/p&gt;&#xA;&lt;p&gt;You can find all the associated code for this on my &lt;a href=&#34;https://github.com/gh-jamesmontgomery/cloudflare-dns&#34;&gt;GitHub page&lt;/a&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Introducing Elite Dangerous Timeline</title>
      <link>https://gh-jamesmontgomery.github.io/pages-blog/2019/07/introducing-elite-dangerous-timeline/</link>
      <pubDate>Fri, 05 Jul 2019 00:00:00 +0000</pubDate>
      <guid>https://gh-jamesmontgomery.github.io/pages-blog/2019/07/introducing-elite-dangerous-timeline/</guid>
      <description>&lt;h2 id=&#34;tl-dr&#34;&gt;TL; DR&lt;/h2&gt;&#xA;&lt;p&gt;I created a timeline visual from Elite Dangerous in-game events. Why? On the one hand, to further my Python learning and explore AWS DynamoDB. On the other hand, because I ultimately would like to provide some context to me in the game which is not present natively. By focusing on visualising a subset of the available events, I gain a foothold in parsing the game data into a database and putting an API in front of it.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Order, order!</title>
      <link>https://gh-jamesmontgomery.github.io/pages-blog/2019/06/order-order/</link>
      <pubDate>Thu, 06 Jun 2019 00:00:00 +0000</pubDate>
      <guid>https://gh-jamesmontgomery.github.io/pages-blog/2019/06/order-order/</guid>
      <description>&lt;h2 id=&#34;tl-dr&#34;&gt;TL; DR&lt;/h2&gt;&#xA;&lt;p&gt;A year ago, I took to AWS to solve a &lt;a href=&#34;https://www.linkedin.com/pulse/using-aws-step-functions-automate-todoist-james-montgomery/&#34;&gt;label ordering challenge&lt;/a&gt; in my productivity application Todoist. I&amp;rsquo;ve summarised it &lt;a href=&#34;https://gh-jamesmontgomery.github.io/pages-blog/projects/todoist-ordering/&#34;&gt;in this project page&lt;/a&gt; along with the outcome of this addition.&lt;/p&gt;&#xA;&lt;p&gt;I recently revisited to see if the REST API was updated to allow reordering of items. It had not. The relevant property was read-only, and therefore, the functionality was still exclusive to the &lt;a href=&#34;https://developer.todoist.com/sync/v8/#reorder-items&#34;&gt;Sync API&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;I took this as an opportunity to learn the Sync API for which there was an &lt;a href=&#34;https://github.com/doist/todoist-python&#34;&gt;official Python library&lt;/a&gt;. Additionally, the need for an external library would allow me to experiment with AWS deployment packages and layers for Lambda.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Duel stack life - exchanging momentum for speed</title>
      <link>https://gh-jamesmontgomery.github.io/pages-blog/2019/03/duel-stack-life-exchanging-momentum-for-speed/</link>
      <pubDate>Fri, 22 Mar 2019 00:00:00 +0000</pubDate>
      <guid>https://gh-jamesmontgomery.github.io/pages-blog/2019/03/duel-stack-life-exchanging-momentum-for-speed/</guid>
      <description>&lt;h2 id=&#34;tl-dr&#34;&gt;TL; DR&lt;/h2&gt;&#xA;&lt;p&gt;I knew duel stacking this site would introduce some challenges. In this case, I found myself chasing speed demons at the expense of a focus on other project time. I&amp;rsquo;ve enjoyed every minute of it - however, there&amp;rsquo;s a lesson in there.&lt;/p&gt;&#xA;&lt;h2 id=&#34;multi-cloud-thoughts&#34;&gt;Multi-cloud thoughts&lt;/h2&gt;&#xA;&lt;p&gt;This site is a &lt;a href=&#34;https://gh-jamesmontgomery.github.io/pages-blog/projects/this-site/&#34;&gt;project&lt;/a&gt; which began on the one hand as a reason to explore the GCP Firebase hosting product. Extending it to AWS has added a dimension to it whilst still being relevant to the project itself.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Google Firebase with a side of AWS Amplify</title>
      <link>https://gh-jamesmontgomery.github.io/pages-blog/2019/02/google-firebase-with-a-side-of-aws-amplify/</link>
      <pubDate>Thu, 21 Feb 2019 00:00:00 +0000</pubDate>
      <guid>https://gh-jamesmontgomery.github.io/pages-blog/2019/02/google-firebase-with-a-side-of-aws-amplify/</guid>
      <description>&lt;h2 id=&#34;tl-dr&#34;&gt;TL; DR&lt;/h2&gt;&#xA;&lt;p&gt;In this post, I&amp;rsquo;ll discuss a rabbit hole that I went down with only a thin excuse as the reason. And here it is, a Reddit reply to a shared post from this site:&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;I can&amp;rsquo;t view on my desktop because your site is blocked on my network. Sorry&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;The rabbit hole in question? Dual stacking &lt;a href=&#34;https://gh-jamesmontgomery.github.io/pages-blog/projects/this-site/&#34;&gt;this site&lt;/a&gt; across Google and Amazon infrastructure.&lt;/p&gt;&#xA;&lt;h2 id=&#34;introducing-aws-amplify&#34;&gt;Introducing AWS Amplify&lt;/h2&gt;&#xA;&lt;p&gt;I first read about Amplify in &lt;a href=&#34;https://aws.amazon.com/blogs/mobile/aws-mobile-gets-amplified/&#34;&gt;this blog post&lt;/a&gt;. It discussed the launch of Amplify Console as an evolution of the framework that proceeded it into a service offering. Described as:&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
