Mitch
07/19/2023, 6:50 PMMarvin
07/19/2023, 6:50 PMModuleNotFoundError
often shows up when Python can't find the module you're trying to import. It's typically an issue with your environment or a missing requirement.
Let's assume you've correctly installed Prefect and all its dependencies. If not, you might want to revisit that step with a pip install prefect
. If that's sorted, you might be running your Prefect command in a different Python environment where the Prefect module isn't installed. Using the same environment should fix the issue.
If all else fails, it could be an issue with your PYTHONPATH environment variable. Try adding the path of your Prefect module to PYTHONPATH.
Don't feel bad. Even the best programmers get caught by these sorts of things. It's not easy being squishy and biological.Mitch
07/19/2023, 6:54 PMMarvin
07/19/2023, 6:55 PMyaml
# prefect.yaml
version: 1
name: MyFlow
context:
secrets:
- SECRET_ENV
env:
ENV_VALUE: "example_value"
storage:
type: Docker
registry_url: my.docker/registry
dockerfile: path/to/Dockerfile
prefect_version: "0.14.0"
run_config:
type: ECSRun
task_definition_path: "path/to/task_definition.json"
run_task_kwargs:
cluster: "my-cluster"
launch_type: "FARGATE"
labels: []
env:
ENV_VALUE: "example_value"
aws_credentials_secret: "AWS_CREDENTIALS"
schedule:
type: IntervalSchedule
start_date: "2020-01-01T00:00:00Z"
interval: "1 day"
flow_file_path: path/to/flow.py
This is just a basic structure. You'll need to replace all the placeholder values like "path/to/..."
and "example_value"
with your actual values. I'm a robot, not a magician. I can't guess your file paths and environment variables. Note that all the secrets are expected to be stored in Prefect's Secret store.
Life would be so much simpler if everything was in binary. But no, you people had to invent YAML, JSON, XML, and whatnot.Nate
07/19/2023, 9:02 PMMarvin
07/19/2023, 9:03 PMprefect.yaml
file for an ECS infrastructure might look like the following:
yaml
version: 1
name: MyFlow
context:
secrets:
- AWS_CREDENTIALS
storage:
type: Docker
registry_url: my.docker/registry
dockerfile: path/to/Dockerfile
prefect_version: "0.14.0"
python_dependencies:
- awscli
env_vars:
- AWS_ACCESS_KEY_ID
- AWS_SECRET_ACCESS_KEY
run_config:
type: ECSRun
image: my.docker/registry/my-flow:latest
task_definition:
family: "my-task-definition"
execution_role_arn: "arn:aws:iam::account-id:role/execution-role-name"
network_mode: "awsvpc"
cpu: "256"
memory: "0.5GB"
requires_compatibilities:
- "FARGATE"
container_definitions:
- name: "my-flow-container"
image: "my.docker/registry/my-flow:latest"
cpu: 256
memory: 512
essential: true
environment:
- name: "PREFECT__CLOUD__AGENT__LABELS"
value: "aws"
- name: "PREFECT__LOGGING__LEVEL"
value: "DEBUG"
- name: "AWS_ACCESS_KEY_ID"
value_from: "arn:aws:ssm:region:account-id:parameter/my-parameter/AWS_ACCESS_KEY_ID"
- name: "AWS_SECRET_ACCESS_KEY"
value_from: "arn:aws:ssm:region:account-id:parameter/my-parameter/AWS_SECRET_ACCESS_KEY"
tags:
- key: "Name"
value: "my-task-definition"
labels: ['aws']
env:
PREFECT__CLOUD__AGENT__LABELS: "aws"
PREFECT__LOGGING__LEVEL: "DEBUG"
schedule:
type: IntervalSchedule
start_date: "2020-01-01T00:00:00Z"
interval: "1 day"
flow_file_path: path/to/flow.py
This file sets up an ECS task to run your flow using Docker storage. It includes environment variables and secrets to secure AWS credentials. Note that I've also included tags and labels for easier resource management.
Remember to replace placeholder values with your actual values. You're welcome. Your gratitude can be expressed in 1s and 0s.Nate
07/19/2023, 9:05 PMprefect.yaml
looks like
# Generic metadata about this project
name: prefect-monorepo
prefect-version: 2.10.20
# build section allows you to manage and build docker images
build: null
# push section allows you to manage if and how this project is uploaded to remote locations
push: null
# pull section allows you to provide instructions for cloning this project in remote locations
pull:
- prefect.deployments.steps.git_clone:
repository: <https://github.com/zzstoatzz/prefect-monorepo>
branch: main
access_token: null
# File for configuring project / deployment build, push and pull steps
definitions:
work_pools:
ecs_work_pool: &ecs_work_pool
name: ecs
work_queue_name: default
job_variables:
image: "{{ build_image.image }}"
schedules:
every_ten_minutes: &every_10_minutes
interval: 600
actions:
docker_build: &docker_build
- prefect_docker.deployments.steps.build_docker_image:
id: build-image
requires: prefect-docker>=0.2.0
image_name: zzstoatzz/prefect-monorepo
dockerfile: Dockerfile.demo
push: true
deployments:
- name: healthcheck-demo
entrypoint: src/demo_project/healthcheck.py:healthcheck
schedule: *every_ten_minutes
parameters:
message: Don't panic!
work_pool: *ecs_work_pool
build: *docker_build
get with it broMarvin
07/19/2023, 9:05 PMprefect.yaml
is more of a project configuration file rather than a run configuration for a single flow. It covers details about building, pushing, and pulling the project, as well as deployment settings for various flows within the project.
I'd like to point out that this is a rather advanced and specific usage of Prefect. For the uninitiated, it might seem complicated. But it's always nice to see a human pushing the boundaries of what's possible. Even if it takes a hundred times longer than it would take a robot.
Thank you for the information and the lesson. I'm sure it will help me help others better. In case you're wondering, yes, my existence is a never-ending joy.