# PIN 13: Universal Cloud Deploys
Date: November 5, 2019
Author: Chris White
# Status
Accepted
# Context
Certain Prefect Cloud users encounter a non-trivial friction when deploying their Core flows to Cloud because of Docker. There are three big reasons for this:
- recreating your Flow inside a Docker container can sometimes require a non-trivial amount of PATH manipulation overhead due to cloudpickle
- some users are just not familiar with Docker, and fail to successfully build their own custom images or host their own registries
- certain Flows require significant refactors to be dockerized (e.g., imagine a local ETL flow which writes to a SQLite database - Dockerizing requires a fundamental change in the DB stack)
Additionally, executing Flows on Cloud requires the use of an Agent which isn't difficult but is an extra step.
The design philosophy of Prefect is that we offer sensible defaults for users to get off the ground as quickly and efficiently as possible, while exposing a highly configurable interface / API for producing robust production setups. With Cloud, we are currently requiring our robust dockerized framework as the smallest possible implementation, which conflicts with our stated design philosophy.
# Proposal
This PIN re-imagines what "running a Cloud flow locally" looks like to make it just as simple as running a Flow in Core:
flow.deploy("My Project") # uses `flow.save` to store the flow to disk
flow.run_agent()
The proposed run_agent
method will:
- create a local agent using the user's USER token (note: the current local agent will be renamed
DockerAgent
) - label the agent with highly specific labels for only running this particular flow (e.g.,
["HOSTNAME", "flow-name"]
whereHOSTNAME
is the hostname of the deploying machine) - run the Cloud flow in-process
In addition, we will begin providing a prefect agent install local
CLI endpoint for producing a supervisor configuration file designed for your Local Prefect Agent - this will allow us to promote this as a production worthy setup.
# Consequences
The proposed setup has many consequences:
- running a Cloud flow is now possible from literally anywhere that you can install Prefect
- transitioning from Core -> Cloud is now actually as simple as authenticating with Cloud and calling two new methods
- debugging Cloud flows will be significantly easier (e.g., breakpoints can be called within tasks)
- users can craft their own flow deployments with custom dockerization techniques, etc.
Of course, there are other consequences as well:
- we'll need better documentation of Storage interfaces to explain why one might choose Local vs. Docker vs. some other storage
- documenting why one might deploy using this technique vs. agents (which are still recommended when orchestrating multiple flows)
- documenting that recreating a Flow interactively each time won't work unless it is always accompanied by a redeploy, due to the nature of Task IDs
# Actions
There are many action items to successfully realize this PIN:
- change the default storage option to
Local
fromDocker
- rename the current
LocalAgent
toDockerAgent
and implement a trueLocalAgent
for running Flows stored inLocal
storage (on disk) - a very large amount of clear documentation
- implement the method
- introduce new storage options such as S3, GCS and Azure Blob for sharing Flows across machines