<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>S3 on Jonathan Franklin</title><link>https://jonnie.github.io/tags/s3/</link><description>Recent content in S3 on Jonathan Franklin</description><generator>Hugo</generator><language>en</language><lastBuildDate>Fri, 04 Sep 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://jonnie.github.io/tags/s3/index.xml" rel="self" type="application/rss+xml"/><item><title>MT5 OHLCV Bars Pipeline</title><link>https://jonnie.github.io/work/mt5-ohlcv-pipeline/</link><pubDate>Fri, 04 Sep 2026 00:00:00 +0000</pubDate><guid>https://jonnie.github.io/work/mt5-ohlcv-pipeline/</guid><description>&lt;h2 id="problem"&gt;Problem&lt;/h2&gt;&#10;&lt;p&gt;Trading research needed reusable histories of one-minute open, high, low, close and volume bars. MetaTrader 5 held the source data, but its Windows terminal loaded symbol history on demand. Repeated manual exports made it awkward to retrieve consistent date ranges across symbols.&lt;/p&gt;&#10;&lt;h2 id="architecture"&gt;Architecture&lt;/h2&gt;&#10;&lt;p&gt;An hourly Monday-to-Friday job on a Windows EC2 instance retrieves M1 bars through the MT5 Python API. Bars are stored as compressed daily symbol/date partitions on S3, with monthly aggregates. A CLI reads selected partitions into a local cache and imports historical CSV exports into the same layout. Lambda scheduling, CloudWatch monitoring, Pulumi and PowerShell manage the runtime around the terminal.&lt;/p&gt;</description></item><item><title>Product Web Crawler</title><link>https://jonnie.github.io/work/product-web-crawler/</link><pubDate>Tue, 08 Jun 2021 00:00:00 +0000</pubDate><guid>https://jonnie.github.io/work/product-web-crawler/</guid><description>&lt;h2 id="problem"&gt;Problem&lt;/h2&gt;&#10;&lt;p&gt;Pricesearcher&amp;rsquo;s price comparison service used merchant websites as a source of product data. The crawl pipeline read sitemaps, found product pages and extracted structured data, with separate deployments for environments and AWS regions. Maintaining it meant handling differences between merchant sites and balancing crawl frequency against the cost of repeated requests.&lt;/p&gt;&#10;&lt;h2 id="architecture"&gt;Architecture&lt;/h2&gt;&#10;&lt;p&gt;The Python crawler ran on AWS and tracked crawl state and cycles in DynamoDB. Sitemaps stored in S3 fed product-page crawling, while a management API behind Cognito and API Gateway managed merchants and ingestion sources. A companion crawler collected website metadata for the data platform.&lt;/p&gt;</description></item><item><title>Affiliate Offers &amp; Vouchers Pipeline</title><link>https://jonnie.github.io/work/affiliate-offers-pipeline/</link><pubDate>Tue, 19 Jan 2021 00:00:00 +0000</pubDate><guid>https://jonnie.github.io/work/affiliate-offers-pipeline/</guid><description>&lt;h2 id="problem"&gt;Problem&lt;/h2&gt;&#10;&lt;p&gt;Pricesearcher&amp;rsquo;s deals content came from affiliate networks including Commission Junction and Webgains. Their authenticated feeds used different formats and conventions for promotions, dates and links. The data needed a common shape and a connection to the merchant catalogue before it could support the site&amp;rsquo;s deals search.&lt;/p&gt;&#10;&lt;h2 id="architecture"&gt;Architecture&lt;/h2&gt;&#10;&lt;p&gt;Authenticated and paginated feeds were downloaded to S3, then SQS messages triggered network-specific processing. Normalised promotions were written to an Elasticsearch index for the site&amp;rsquo;s offers and vouchers search. A separate synchronisation path maintained Kelkoo pass-through URLs between Redis and Google Sheets.&lt;/p&gt;</description></item></channel></rss>