<?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>Forem: Rich Dudley</title>
    <description>The latest articles on Forem by Rich Dudley (@rjdudley).</description>
    <link>https://forem.com/rjdudley</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%2F515853%2F97193a61-12e3-4e67-8fef-a78ed937f84c.jpeg</url>
      <title>Forem: Rich Dudley</title>
      <link>https://forem.com/rjdudley</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/rjdudley"/>
    <language>en</language>
    <item>
      <title>EventBridge: The Enterprise Service Bus You Probably Didn't Realize Was An ESB</title>
      <dc:creator>Rich Dudley</dc:creator>
      <pubDate>Thu, 16 Sep 2021 02:40:02 +0000</pubDate>
      <link>https://forem.com/rjdudley/eventbridge-the-enterprise-service-bus-you-probably-didn-t-realize-was-an-esb-5ffa</link>
      <guid>https://forem.com/rjdudley/eventbridge-the-enterprise-service-bus-you-probably-didn-t-realize-was-an-esb-5ffa</guid>
      <description>&lt;p&gt;AWS takes a lot of heat for its product names, usually becasue they're weird, and that's especially true for EventBridge but for a different reason.  EventBridge is often marketed as the successor for Cloudwatch events, but that description greatly undersells the service.  EventBridge is more than just a relay for things which happened, it is by any defintion a fully-fledged enterprise service bus, and is worthy of consideration with Kafka or MuleSoft or other event-based messaging platforms.&lt;/p&gt;

&lt;p&gt;In Services Oriented Architecture, an Enterprise Service Bus is actually a compound pattern realizing seven other subpatterns.  Someone somewhere knew what they were doing when they designed EventBridge because every ESB subpattern can be realized with an EventBridge feature.  Here's how the features line up to the patterns:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;SOA Subpattern&lt;/th&gt;
&lt;th&gt;EventBridge Feature&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Asynchronous Queuing&lt;/td&gt;
&lt;td&gt;EventBridge can use SQS as a destination to queue events before sending to the consumers, as shown in this pattern: &lt;a href="https://serverlessland.com/patterns/eventbridge-sqs"&gt;https://serverlessland.com/patterns/eventbridge-sqs&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Event-driven Messaging&lt;/td&gt;
&lt;td&gt;As a consumer, EventBridge has direct integration with over 130 AWS sources, plus a number of third party SaaS platforms.  Direct integration with the API Gateway as well as a dirext PutEvents API allows for integration from custom sources.  EventBridge supports 35 targets, including API Gateway destinations for custom integrations.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Intermediate Routing&lt;/td&gt;
&lt;td&gt;A rules engine filters events and routes messages to one or more targets.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Policy Centralization&lt;/td&gt;
&lt;td&gt;EventBridge has a schema registry, supporting either OpenAPI or JSON-Schema.  Code bindings for several languages can be downloaded from the schema registry.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Reliable Messaging&lt;/td&gt;
&lt;td&gt;EventBridge offers at-least once delivery, with retry and durable storage across multiple availability zones.  EventBridge also features archive and replay of events.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Rules Centralization&lt;/td&gt;
&lt;td&gt;Routing and transformation rules are localized to a single service&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Service Broker&lt;/td&gt;
&lt;td&gt;The Service Broker pattern is itself a compound pattern, composed of the Data Format Transformation, Data Model Transformation and Protocol Bridging patterns.  EventBridge transformation rules realize Data Format Transformation and Data Model Transformation, while Protocol Bridging occurs mainly with API Gateway integrations&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;It's hard to understate the value of API endpoints.  These realize Service Loose Coupling, which makes EventBridge completely agnostic to whatever language or application is being used by producers and consumers.  There are no proprietary protocols, libraries or config languages beyond HTTP.  This allows easy integration across applications, business units or even cloud providers.&lt;/p&gt;

&lt;p&gt;Many purpose-built ESBs require a great deal of infrastructure and team members to support them, but EventBridge is serverless.  There is no infrastructure to manage, and no capacity to plan around other than the limits documented at &lt;a href="https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-quota.html"&gt;https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-quota.html&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;EventBridge itself can be configured in a matter of minutes, and with its direct integrations to so many AWS services events can be flowing shortly thereafter.  Accomplishing so much in a single iteration is a tremendous boost to systems integration.&lt;/p&gt;

&lt;p&gt;In addition to its documentaion, EventBridge is also supported by a number of patterns on Serverlessland, at &lt;a href="https://serverlessland.com/patterns?services=eventbridge"&gt;https://serverlessland.com/patterns?services=eventbridge&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;With its speed to implement and ESB-fulfilling features, EventBridge deserves consideration alongside other messaging systems.&lt;/p&gt;

&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Enterprise_service_bus"&gt;https://en.wikipedia.org/wiki/Enterprise_service_bus&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://patterns.arcitura.com/soa-patterns/compound_patterns/enterprise_service_bus"&gt;https://patterns.arcitura.com/soa-patterns/compound_patterns/enterprise_service_bus&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://aws.amazon.com/eventbridge/features/"&gt;https://aws.amazon.com/eventbridge/features/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
    </item>
    <item>
      <title>15 S3 Facts for S3’s 15th</title>
      <dc:creator>Rich Dudley</dc:creator>
      <pubDate>Mon, 15 Mar 2021 01:28:28 +0000</pubDate>
      <link>https://forem.com/rjdudley/15-s3-facts-for-s3-s-15th-65j</link>
      <guid>https://forem.com/rjdudley/15-s3-facts-for-s3-s-15th-65j</guid>
      <description>&lt;p&gt;To celebrate S3’s 15th birthday on 3/14/2021, and to kick off AWS Pi Week, I tweeted out 15 facts about S3.  Here they are as a blog post, to make them easier to read.  Because of the rapid pace of innovation in AWS services, including S3, so if you’re reading this in the future, some things may have changed.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;S3 is designed for "eleven 9s" of durability. When you take into account redundancy in and across availability zones, in 10,000,000 years you'd lose only lose one of 10,000 objects. Read more at &lt;a href="https://aws.amazon.com/blogs/aws/new-amazon-s3-reduced-redundancy-storage-rrs/"&gt;https://aws.amazon.com/blogs/aws/new-amazon-s3-reduced-redundancy-storage-rrs/&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;S3 is region-bound, which means all S3 buckets in that region are partying in the same publicly available cloud ether. You can restrict access to a VPC but the bucket is still located outside the VPC. Related: &lt;a href="https://cloudonaut.io/does-your-vpc-endpoint-allow-access-to-half-of-the-internet/"&gt;https://cloudonaut.io/does-your-vpc-endpoint-allow-access-to-half-of-the-internet/&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;S3 is a very versatile storage service. The trillions of objects it stores are the basis for many workloads, including serving websites, video streaming and analytics.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The return of INI files! With a first byte latency of milliseconds, S3 is suitable for storing configuration settings in an available and inexpensive way. Databases are no longer a fixed cost and there is no need for one just for configuration. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;S3 is designed for "infinite storage". Each object can be up to 5TB in size, and there is no limit to the number of objects you can store in a bucket. Analytics aren't constrained by a file or disk size. It's like a TARDIS, or bag of holding!&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;How do you perform operations on hundreds, thousands or more objects? S3 Batch Operations allow you to copy objects, restore from Glacier, or even call a lambda for each file. For more information, see &lt;a href="https://aws.amazon.com/blogs/aws/new-amazon-s3-batch-operations/"&gt;https://aws.amazon.com/blogs/aws/new-amazon-s3-batch-operations/&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;S3 is a "consumption model", so you pay only for what you use when you use it. No more provisioning fixed-size network storage solutions with large up-front costs.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;But what if you need massive object storage closer to your location? S3 on Outposts puts S3 on-premises, right where you collect or process your data. For more info, start at &lt;a href="https://aws.amazon.com/s3/outposts/"&gt;https://aws.amazon.com/s3/outposts/&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;If your bandwidth is limited or non-existent, you can use Snowball Data Transfer to move TB to PB of data in and out of AWS. Learn more at &lt;a href="https://aws.amazon.com/snowball/"&gt;https://aws.amazon.com/snowball/&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;For data collection and object generation at the most extreme edges there is Snowball Edge Storage. Snowball Edge can even run processing workloads. Read more at &lt;a href="https://docs.aws.amazon.com/snowball/latest/developer-guide/whatisedge.html"&gt;https://docs.aws.amazon.com/snowball/latest/developer-guide/whatisedge.html&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Although you can upload files to S3 via the console, CLI and REST API, wouldn't it be great if you could just drag a file to a network share and have it appear in the cloud? With a File Gateway, you can do exactly that! See &lt;a href="https://aws.amazon.com/storagegateway/file/"&gt;https://aws.amazon.com/storagegateway/file/&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;S3 offers multiple storage classes, so you can optimize cost, latency and retention period. Standard offers the lowest latency but at the highest cost, while Glacier Deep Archive is perfect for yearslong retention. Read more at &lt;a href="https://aws.amazon.com/s3/storage-classes/"&gt;https://aws.amazon.com/s3/storage-classes/&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;S3 Storage Lens is a central dashboard organizations can use for insight into S3 utilization and to get recommendation to optimize price. Read more at &lt;a href="https://aws.amazon.com/blogs/aws/s3-storage-lens/"&gt;https://aws.amazon.com/blogs/aws/s3-storage-lens/&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;S3 can version objects, so if you accidentally delete or profoundly update an object, you can recover from the most recent save or many prior versions, too.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;S3 is a very secure service. IAM policies can be applied at the bucket and object level with a great deal of granularity. Additionally, VPC endpoints bind S3 traffic to a specific VPC only.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;And one to grow on (for everyone): AWS recently released three new S3 training courses: &lt;a href="https://aws.amazon.com/about-aws/whats-new/2021/01/announcing-three-new-digital-courses-for-amazon-s3/"&gt;https://aws.amazon.com/about-aws/whats-new/2021/01/announcing-three-new-digital-courses-for-amazon-s3/&lt;/a&gt;.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>First Look: AWS Glue DataBrew</title>
      <dc:creator>Rich Dudley</dc:creator>
      <pubDate>Tue, 29 Dec 2020 02:47:03 +0000</pubDate>
      <link>https://forem.com/aws-builders/first-look-aws-glue-databrew-1phl</link>
      <guid>https://forem.com/aws-builders/first-look-aws-glue-databrew-1phl</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;This is a post about a new vendor service which blew up a blog series I had planned, and I'm not mad.  With a greater reliance on data science comes a greater emphasis on data engineering, and I had planned a blog series about building a pipeline with AWS services.  That all changed when AWS released DataBrew, which is a managed data profiling and preparation service.  The announcement is at &lt;a href="https://aws.amazon.com/blogs/aws/announcing-aws-glue-databrew-a-visual-data-preparation-tool-that-helps-you-clean-and-normalize-data-faster/"&gt;https://aws.amazon.com/blogs/aws/announcing-aws-glue-databrew-a-visual-data-preparation-tool-that-helps-you-clean-and-normalize-data-faster/&lt;/a&gt;, but the main thing to know is that DataBrew is a visual tool for analyzing and preparing datasets.  It's powerful without a lot of programming. Despite its ease of use and numerous capabilities, DataBrew will not replace data engineers; instead, DataBrew will make it easier to set up and perform a great deal of the simple, rote data preparation activities, freeing data engineers to focus on the really hard problems.  We'll look into use cases and capabilities in future blog posts.  Spoiler alert: we're still going to need that pipeline I was going to write about, just more streamlined.  Updated series in future posts.&lt;/p&gt;

&lt;p&gt;DataBrew is not a stand-alone component, but is instead a component of AWS Glue.  This makes sense, since it adds a lot of missing capabilities into Glue, but can also take advantage of Glue's job scheduling and workflows.  Some of what I was planning to write involved Glue anyway, so this is convenient for me.&lt;/p&gt;

&lt;p&gt;In this "First Look" post I'm working my way through the DataBrew screens as you first encounter them, so if you have an AWS account, it might be useful to open DataBrew and move through the screens as you read.  No worries if you don't, I'll cover features more in-depth as I work through future posts. &lt;/p&gt;

&lt;h2&gt;
  
  
  DataBrew Overview
&lt;/h2&gt;

&lt;p&gt;There are four main parts of DataBrew: Datasets, Projects, Recipes and Jobs.  These are just where we start, there is a lot of ground to cover.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--emgJtwcq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/22tr5ahx5gljrtwwusb0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--emgJtwcq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/22tr5ahx5gljrtwwusb0.png" alt="DataBrew Overview"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--xNneL3r0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/37d6blbrse7ecygu3gk1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--xNneL3r0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/37d6blbrse7ecygu3gk1.png" alt="DataBrew datasets"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Projects
&lt;/h3&gt;

&lt;p&gt;Holey moley there's a lot of stuff here!  The Projects screen is where the real action is, and we'll spend a lot of time here in the future.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--zEm7phBX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/iv79g5nx9uorp27qda4u.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--zEm7phBX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/iv79g5nx9uorp27qda4u.png" alt="DataBrew Projects"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Sample View
&lt;/h4&gt;

&lt;p&gt;As we explore the Sample View, it's important to keep in mind that DataBrew is meant for actual data preparation work, not just lightweight profiles.  This sample view is kept to a small windows so we can explore the effects of transformations and monitor effects on quality.&lt;/p&gt;

&lt;p&gt;The majority of this page is taken up with a sample of the dataset and some lightweight profiling, including the type, number of unique values in the sample, the most common values in the sample, and the first few rows of the sample.  The sample size and position in the set can be changed.  This sample view is a great way to test transformations and enrichments, which we'll look into later.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--R3A14YgP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/zsz9shkv086ssmspo43k.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--R3A14YgP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/zsz9shkv086ssmspo43k.png" alt="DataBrew Sample"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The profile view can be changed to explore the schema, which will be inferred from CSV and JSON files, or use the metadata in parquet or Glue Catalog.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--8dWmtuq2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/i9k217gnm4pgy8fvij7j.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--8dWmtuq2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/i9k217gnm4pgy8fvij7j.png" alt="DataBrew Schema"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The third profile view is correlations and summaries.  If you've runs several profiles, the history is available to browse.  The "missing cells" statistic is something we will revisit for the dataset I have loaded here.  Also, for my sample dataset, the Correlation isn't that interesting because the majority of the columns are part of an address so they should correlate.  But in other datasets, this could be really interesting.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--RRDeSFIP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/89qnlqpdx4gkrqrf2dnj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--RRDeSFIP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/89qnlqpdx4gkrqrf2dnj.png" alt="DataBrew Profile Overview"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The profile view also has data insights into individual columns, showing several quality metrics for the selected column.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--2_JwC_uI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/whv7vowhk0oklangk3dx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--2_JwC_uI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/whv7vowhk0oklangk3dx.png" alt="DataBrew Column Stats"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Transformations
&lt;/h4&gt;

&lt;p&gt;DataBrew currently has over 250 built-in transformations, which AWS confusingly calls "&lt;a href="https://docs.aws.amazon.com/databrew/latest/dg/recipe-actions-reference.html"&gt;Recipe actions&lt;/a&gt;" in parts of its documentation.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--laJJkxgn--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/268wmvtra6l9cxqr1qwr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--laJJkxgn--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/268wmvtra6l9cxqr1qwr.png" alt="DataBrew Transformations"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The transformations are categorized in the menu bar above the profile grid.  Transformations include removing invalid values, remove nulls, flag column, replace values, joins, aggregates, splits, etc.  Most of these should be familiar to a data professional.  With a join you can enrich one dataset by joining to other datasets.&lt;/p&gt;

&lt;h3&gt;
  
  
  Recipes
&lt;/h3&gt;

&lt;p&gt;When we're in the Projects tab, and we apply a transformation to a column, we're creating a recipe step.  One or more recipe steps form a recipe, and there isn't a published maximum number of recipes per dataset.  Since each recipe can be called by a separate job, this provides a great deal of flexibility in our data prep processes.  Recipe steps can only be edited on the Projects tab; the Recipes tab lists the existing recipes, allows for downloading of recipes and some other administrative tasks.  Recipes can be downloaded and published via CloudFront or the CLI, providing a rudimentary sharing ability across datasets.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--H181F8Zs--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/95udpe8r12b6heva83tl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--H181F8Zs--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/95udpe8r12b6heva83tl.png" alt="DataBrew Recipes Tab"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Opening a recipe brings up summaries of the recipe's versions, and the other tab on this page opens up the data lineage for the recipe.  This lineage is not the data lineage through your enterprise, just the pathway through the recipe.  My simple example here isn't that impressive, but if you build a more complex flow with joins to other datasets and more recipes, this will be a nice view.  Although you can preview the datasets and recipes at the various steps, this is not a graphical workflow editor.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--kGP1IDhG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/9k0f4bz3aqd2dlu7w5bn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--kGP1IDhG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/9k0f4bz3aqd2dlu7w5bn.png" alt="DataBrew Lineage"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is also a convenient screen to access CloudTrail logs for the recipes&lt;/p&gt;

&lt;h3&gt;
  
  
  Jobs
&lt;/h3&gt;

&lt;p&gt;There are two types of jobs in DataBrew--"recipe" and "profile".  &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ly_WUvxV--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/3ivhq4r1p555nbulupa9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ly_WUvxV--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/3ivhq4r1p555nbulupa9.png" alt="DataBrew Job Types"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A profile job examines up to 20,000 rows of data (more if you request an increase).  The results of a profiling job include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;data type&lt;/li&gt;
&lt;li&gt;unique values count&lt;/li&gt;
&lt;li&gt;missing values count&lt;/li&gt;
&lt;li&gt;most common values and occurrences&lt;/li&gt;
&lt;li&gt;minimum and maximum values with occurrences&lt;/li&gt;
&lt;li&gt;percentiles, means, standard deviation, median&lt;/li&gt;
&lt;li&gt;and more...&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;One feature missing in the Profiling is determining the pattern or length of text values.  The Profiling results are saved in JSON format, can be saved in S3, and there is an option to create a QuickSight dataset for reporting.  Anything more than QuickSight will require some custom processing of the JSON output. Although it took this long in a blog post to discuss profiling jobs, a profile is something which really should be created before building recipes.&lt;/p&gt;

&lt;p&gt;A recipe job configures a published recipe to be run against a selected dataset.  In a Dataset job we choose the dataset, recipe and recipe version we want to use.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ai5WKrQY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/c0c1dh86jr06l4a6cy32.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ai5WKrQY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/c0c1dh86jr06l4a6cy32.png" alt="DataBrew Dataset Job"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The other recipe job option is is a Project job, which uses a saved project defined on the Projects tab.  In this job, the only thing we need to configure is the project.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--k5Q9v9hU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/ty6rq11899sw5mhmqvao.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--k5Q9v9hU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/ty6rq11899sw5mhmqvao.png" alt="DataBrew Project Job"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The original dataset is not modified in DataBrew; instead, we configure the S3 location, output file format, and compression for storing the results.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--uKcItV9R--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/eecgxmj3otw2wpaqdlmi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--uKcItV9R--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/eecgxmj3otw2wpaqdlmi.png" alt="DataBrew Output File Type"&gt;&lt;/a&gt; &lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--0gStf09e--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/pqtrcuw1bdync124iksl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--0gStf09e--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/pqtrcuw1bdync124iksl.png" alt="DataBrew Output Compression"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The output can be partitioned on a particular column, and we can choose whether to overwrite the files from the previous run or keep each run's files.  Please use encryption.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--zGUwLb4s--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/6dxh59ajsi8cuq5lzatx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--zGUwLb4s--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/6dxh59ajsi8cuq5lzatx.png" alt="DataBrew Output Partitioning"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once configured, jobs can be scheduled.  You can have a maximum of two schedules per job.  If you need more than two schedules you'll need to create an identical job.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--FpY_jHBE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/4w5wuv0vokedaqle6zan.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--FpY_jHBE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/4w5wuv0vokedaqle6zan.png" alt="DataBrew Job Schedule"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Either type of job can be run on a schedule, on-demand or as part of other workflows (see "Jobs Integrations" below).  There is only one recipe and one dataset per job, so processing multiple recipes and/or multiple datasets would require additional workflow.&lt;/p&gt;

&lt;h3&gt;
  
  
  Jobs Integrations
&lt;/h3&gt;

&lt;p&gt;Aside from the console or a schedule, how else can a DataBrew job be started?  For starters, the DataBrew API exposes all the functionality in the console, including running a job.  When coupled with lambdas, this exposes a great amount of flexibility in starting a job.&lt;/p&gt;

&lt;p&gt;A second option is to use a Jupyter notebook (vanilla Jupyter, not SageMaker notebook yet) and the plugin found at &lt;a href="https://github.com/aws/aws-glue-databrew-jupyter-extension"&gt;https://github.com/aws/aws-glue-databrew-jupyter-extension&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Source Control Integration
&lt;/h3&gt;

&lt;p&gt;Recipes and jobs have a form of versioning, but it seems to be S3 object versioning since there isn't a real source control workflow, but rather a new version is created with every published update.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--zjGT7uOS--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/2pwmv5og9q8ym2a18evb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--zjGT7uOS--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/2pwmv5og9q8ym2a18evb.png" alt="DataBrew Publish Recipe"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ta6_zGw_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/e2okx18y8c6d1ddqslmm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ta6_zGw_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/e2okx18y8c6d1ddqslmm.png" alt="DataBrew Recipe Versions"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;However, as with most of AWS's online editors, there is no direct source control integration.  The best you can do is to download recipes and jobs as JSON and check them in manually.  Better than nothing but still surprising since AWS has CodeCommit.&lt;/p&gt;

&lt;h3&gt;
  
  
  Infrastructure as Code
&lt;/h3&gt;

&lt;p&gt;At this time, neither Terraform nor Pulumi support DataBrew, but CloudFormation can be used to script DataBrew; see the &lt;a href="https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/AWS_DataBrew.html"&gt;https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/AWS_DataBrew.html&lt;/a&gt; for the API documentation and examples.  The CLI is another scripting option, the documentation for the CLI is at &lt;a href="https://awscli.amazonaws.com/v2/documentation/api/latest/reference/databrew/index.html"&gt;https://awscli.amazonaws.com/v2/documentation/api/latest/reference/databrew/index.html&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>glue</category>
      <category>databrew</category>
      <category>dataengineering</category>
      <category>etl</category>
    </item>
  </channel>
</rss>
