prefect_base

  • image

    • https://docs.prefect.io/latest/

  • Prefect๋Š” Python ๊ธฐ๋ฐ˜ ์›Œํฌํ”Œ๋กœ ๊ด€๋ฆฌ ์‹œ์Šคํ…œ์ž…๋‹ˆ๋‹ค. Prefect๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋กœ๊น…, ์žฌ์‹œ๋„, ๋™์  ๋งคํ•‘, ์บ์‹ฑ, ์‹คํŒจ ์•Œ๋ฆผ ๋“ฑ์„ ๋ฐ์ดํ„ฐ ํŒŒ์ดํ”„๋ผ์ธ์— ์‰ฝ๊ฒŒ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค

  • image

    • https://discourse.prefect.io/t/what-are-the-components-of-prefect-2-0-architecture/909

  • Prefect๋Š” Dask ์œ„์— ๊ตฌ์ถ•๋˜์—ˆ์œผ๋ฉฐ Dask๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ถ„์‚ฐ ํ™˜๊ฒฝ์—์„œ Prefect ์›Œํฌํ”Œ๋กœ์˜ ์‹คํ–‰์„ ์˜ˆ์•ฝํ•˜๊ณ  ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

  • Prefect๋Š” ์›Œํฌํ”Œ๋กœ์˜ ์ผ์ •์„ ์ฒ˜๋ฆฌ ํ•˜๊ณ  Dask๋Š” ๊ฐ ์›Œํฌํ”Œ๋กœ ๋‚ด ์ž‘์—… ์˜ ์ผ์ • ๋ฐ ๋ฆฌ์†Œ์Šค ๊ด€๋ฆฌ๋ฅผ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

    • ์ž‘์—… ์˜ˆ์•ฝ: Dask๋Š” ์›Œํฌํ”Œ๋กœ์šฐ ๋‚ด์—์„œ ๋ชจ๋“  ์ž‘์—… ์˜ˆ์•ฝ์„ ์ฒ˜๋ฆฌํ•˜๋ฏ€๋กœ Prefect๋Š” Dask๊ฐ€ ๋ฐ€๋ฆฌ์ดˆ ๋Œ€๊ธฐ ์‹œ๊ฐ„์œผ๋กœ ์˜ˆ์•ฝํ•˜๋Š” ๋” ์ž‘์€ ์ž‘์—…์„ ์žฅ๋ คํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    • Dataflow: Dask๊ฐ€ ์ž‘์—… ๊ฐ„์˜ ์ ์ ˆํ•œ ์ •๋ณด ์ง๋ ฌํ™” ๋ฐ ํ†ต์‹ ์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— Prefect๋Š” "๋ฐ์ดํ„ฐ ํ๋ฆ„"์„ ์ผ๊ธ‰ ํŒจํ„ด์œผ๋กœ ์ง€์›ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    • ๋ถ„์‚ฐ ๊ณ„์‚ฐ: Dask๋Š” ํด๋Ÿฌ์Šคํ„ฐ์˜ ์ž‘์—…์ž์—๊ฒŒ ์ž‘์—… ํ• ๋‹น์„ ์ฒ˜๋ฆฌํ•˜์—ฌ ์‚ฌ์šฉ์ž๊ฐ€ ์ตœ์†Œํ•œ์˜ ์˜ค๋ฒ„ํ—ค๋“œ๋กœ ๋ถ„์‚ฐ ๊ณ„์‚ฐ์˜ ์ด์ ์„ ์ฆ‰์‹œ ์‹คํ˜„ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

    • ๋ณ‘๋ ฌ์„ฑ: ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ์‹คํ–‰ํ•˜๋“  ๋กœ์ปฌ์—์„œ ์‹คํ–‰ํ•˜๋“  Dask๋Š” ์„ ๋ฐ˜์—์„œ ๋ณ‘๋ ฌ ์ž‘์—… ์‹คํ–‰์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

Task

  • ๋ฐ์ดํ„ฐ ํŒŒ์ดํ”„๋ผ์ธ์—์„œ ์‹ค์ œ๋กœ ์ˆ˜ํ–‰๋˜๋Š” ์ž‘์—… ๋‹จ์œ„์ž…๋‹ˆ๋‹ค. Task๋Š” ๋‹จ์ผ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋ฉฐ, ๋‹ค๋ฅธ Task์— ์˜์กดํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค.

  • ์ž…๋ ฅ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„์„œ ์ถœ๋ ฅ ๋ฐ์ดํ„ฐ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ์ฝ”๋“œ๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค

  • Argument
    Description

    name

    Task์˜ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค. ์ด๋ฆ„์„ ์ง€์ •ํ•˜์ง€ ์•Š์œผ๋ฉด ํ•จ์ˆ˜์˜ ์ด๋ฆ„์ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

    description

    Task์— ๋Œ€ํ•œ ์„ค๋ช…์ž…๋‹ˆ๋‹ค. docstring์—์„œ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.

    tags

    Task์— ๋Œ€ํ•œ ํƒœ๊ทธ์ž…๋‹ˆ๋‹ค. ์‹คํ–‰์‹œ prefect.context.tags์— ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค.

    cache_key_fn

    Task ๊ฒฐ๊ณผ๋ฅผ ์บ์‹ฑํ•  ๋•Œ, ๊ฒฐ๊ณผ๋ฅผ ์บ์‹œํ•˜๊ธฐ ์œ„ํ•œ ํ‚ค๋ฅผ ์ƒ์„ฑํ•˜๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค. ํ•จ์ˆ˜๋Š” kwargs๋ฅผ ์ธ์ž๋กœ ๋ฐ›์•„, ๋ฌธ์ž์—ด์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

    cache_expiration

    Task ๊ฒฐ๊ณผ ์บ์‹œ์˜ ๋งŒ๋ฃŒ ๊ธฐ๊ฐ„์ž…๋‹ˆ๋‹ค.

    task_run_name

    Task ์‹คํ–‰์‹œ ์‹คํ–‰ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค. ํ‚ค์›Œ๋“œ ์ธ์ž๋“ค์„ ๋ณ€์ˆ˜๋กœ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋ฆ„์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

    retries

    Task ์‹คํ–‰ ์‹คํŒจ์‹œ ์žฌ์‹œ๋„ ํšŸ์ˆ˜์ž…๋‹ˆ๋‹ค.

    retry_delay_seconds

    Task ์‹คํ–‰ ์‹คํŒจ์‹œ ์žฌ์‹œ๋„๋ฅผ ๋Œ€๊ธฐํ•˜๋Š” ์‹œ๊ฐ„์ž…๋‹ˆ๋‹ค.

    version

    Task์˜ ๋ฒ„์ „ ์ •๋ณด์ž…๋‹ˆ๋‹ค.

  • from prefect import flow, task
    
    @task(retries=3, cache_key_fn=task_input_hash, cache_expiration=timedelta(days=1))
    def fetch(dataset_url: str) -> pd.DataFrame:
        """Read taxi data from web into pandas DataFrame"""
        df = pd.read_csv(dataset_url)
        return df
    
    @flow()
    def etl_web_to_gcs()->None:
        """Main ETL function"""
        color = "yellow"
        year = 2021
        month = 1 
        dataset_file = f"{color}_tripdata_{year}-{month:02}"
        dataset_url = f"https://github.com/DataTalksClub/nyc-tlc-data/releases/download/{color}/{dataset_file}.csv.gz"
    
        df = fetch(dataset_url)
    
    if __name__ == '__main__':
        etl_web_to_gcs()

Flow

  • image

  • ๋ฐ์ดํ„ฐ ํŒŒ์ดํ”„๋ผ์ธ์„ ์ •์˜ํ•˜๊ณ  ์‹คํ–‰ํ•˜๊ธฐ์œ„ํ•œ ์ถ”์ƒํ™”๋œ ๊ฐœ๋…์ž…๋‹ˆ๋‹ค.

  • Prefect Flow๋Š” ๋‹จ์ผ ํƒœ์Šคํฌ ๋˜๋Š” ์—ฌ๋Ÿฌ ํƒœ์Šคํฌ๋กœ ๊ตฌ์„ฑ๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด๋Ÿฌํ•œ ํƒœ์Šคํฌ๋Š” ์ผ๋ จ์˜ ํŒŒ์ด์ฌ ํ•จ์ˆ˜๋กœ ์ž‘์„ฑ๋ฉ๋‹ˆ๋‹ค.

  • Flow๋Š” ๋‹ค์–‘ํ•œ ๋ฐ์ดํ„ฐ ํŒŒ์ดํ”„๋ผ์ธ ํŒจํ„ด์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

  • Argument
    Description

    description

    Flow์— ๋Œ€ํ•œ ๋ฌธ์ž์—ด ์„ค๋ช…์„ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค. ์ž…๋ ฅํ•˜์ง€ ์•Š์œผ๋ฉด ๋ฐ์ฝ”๋ ˆ์ดํŠธ๋œ ํ•จ์ˆ˜์˜ docstring์—์„œ ์„ค๋ช…์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.

    name

    Flow์˜ ์ด๋ฆ„์„ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค. ์ž…๋ ฅํ•˜์ง€ ์•Š์œผ๋ฉด ํ•จ์ˆ˜์˜ ์ด๋ฆ„์—์„œ ์ถ”๋ก ๋ฉ๋‹ˆ๋‹ค.

    retries

    Flow ์‹คํ–‰ ์‹คํŒจ ์‹œ ์žฌ์‹œ๋„ํ•  ํšŸ์ˆ˜๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ 0์ž…๋‹ˆ๋‹ค.

    retry_delay_seconds

    Flow ์‹คํ–‰ ์‹คํŒจ ํ›„ ์žฌ์‹œ๋„ ์ „ ๋Œ€๊ธฐํ•  ์‹œ๊ฐ„์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. retries๊ฐ€ 0์ด ์•„๋‹Œ ๊ฒฝ์šฐ์—๋งŒ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.

    flow_run_name

    Flow ์‹คํ–‰ ์ด๋ฆ„์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ์ด ์ด๋ฆ„์€ Flow ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๋ณ€์ˆ˜๋กœ ์‚ฌ์šฉํ•˜์—ฌ ๋ฌธ์ž์—ด ํ…œํ”Œ๋ฆฟ์œผ๋กœ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•จ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜๋กœ ์ œ๊ณตํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

    task_runner

    Flow ๋‚ด์—์„œ task ์‹คํ–‰์— ์‚ฌ์šฉํ•  task runner๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ์ง€์ •ํ•˜์ง€ ์•Š์œผ๋ฉด ConcurrentTaskRunner๊ฐ€ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

    timeout_seconds

    Flow ์ตœ๋Œ€ ์‹คํ–‰ ์‹œ๊ฐ„์„ ์ดˆ ๋‹จ์œ„๋กœ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ์ง€์ •๋œ ์‹œ๊ฐ„์ด ์ดˆ๊ณผ๋˜๋ฉด Flow๊ฐ€ ์‹คํŒจ๋กœ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. Flow ์‹คํ–‰์€ ๋‹ค์Œ task๊ฐ€ ํ˜ธ์ถœ๋  ๋•Œ๊นŒ์ง€ ๊ณ„์†๋ฉ๋‹ˆ๋‹ค.

    validate_parameters

    Flow ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ Pydantic์„ ํ†ตํ•ด ๊ฒ€์ฆ๋˜๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ True์ž…๋‹ˆ๋‹ค.

    version

    Flow ๋ฒ„์ „์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ์ง€์ •ํ•˜์ง€ ์•Š์œผ๋ฉด ๋ž˜ํ•‘๋œ ํ•จ์ˆ˜๊ฐ€ ํฌํ•จ๋œ ํŒŒ์ผ์˜ ํ•ด์‹œ ๊ฐ’์„ ์ด์šฉํ•˜์—ฌ ๋ฒ„์ „์„ ์ƒ์„ฑํ•˜๋ ค ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค. ํŒŒ์ผ์„ ์ฐพ์„ ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ ๋ฒ„์ „์€ null์ด ๋ฉ๋‹ˆ๋‹ค.

Blocks

  • ๋ธ”๋ก์€ ๊ตฌ์„ฑ ์ €์žฅ์„ ํ™œ์„ฑํ™”ํ•˜๊ณ  ์™ธ๋ถ€ ์‹œ์Šคํ…œ๊ณผ ์ƒํ˜ธ ์ž‘์šฉํ•˜๊ธฐ ์œ„ํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณตํ•˜๋Š” Prefect ๋‚ด์˜ ๊ธฐ๋ณธ ์š”์†Œ์ž…๋‹ˆ๋‹ค.

  • ๋ธ”๋ก์„ ์‚ฌ์šฉํ•˜๋ฉด AWS, GitHub, Slack ๋ฐ Prefect๋กœ ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜ํ•˜๋ ค๋Š” ๊ธฐํƒ€ ์‹œ์Šคํ…œ๊ณผ ๊ฐ™์€ ์„œ๋น„์Šค๋กœ ์ธ์ฆํ•˜๊ธฐ ์œ„ํ•œ ์ž๊ฒฉ ์ฆ๋ช…์„ ์•ˆ์ „ํ•˜๊ฒŒ ์ €์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • prefect ๋‚ด๋ถ€์—์„œ Block๋ฅผ ๋ˆŒ๋Ÿฌ ๋‹ค์–‘ํ•œ ์ปค๋„ฅํ„ฐ๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

  • image

  • Google Cloud Platform ์šฉ Prefect ์ปค๋„ฅํ„ฐ๋ฅผ ๋“ฑ๋กํ•ฉ๋‹ˆ๋‹ค.

    • prefect block register -m prefect_gcp

    • image

  • from prefect import flow, task
    from prefect_gcp.cloud_storage import GcsBucket
    
    @task()
    def write_gcs(path: Path) -> None:
        """Upload local parquet file to GCS"""
        gcs_block = GcsBucket.load("zoom-gcs")
        gcs_block.upload_from_path(from_path=path, to_path=path)
        return
  • Prefect built-in blocks

    • Block
      Slug
      Description

      Azure

      azure

      Azure Datalake ๋ฐ Azure Blob Storage์—์„œ ํŒŒ์ผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ๋ธ”๋ก์ž…๋‹ˆ๋‹ค.

      Date Time

      date-time

      ๋‚ ์งœ ๋ฐ ์‹œ๊ฐ„์„ ๋‚˜ํƒ€๋‚ด๋Š” ๋ธ”๋ก์ž…๋‹ˆ๋‹ค.

      Docker Container]

      docker-container

      ์ปจํ…Œ์ด๋„ˆ์—์„œ ๋ช…๋ น์„ ์‹คํ–‰ํ•˜๋Š” ๋ธ”๋ก์ž…๋‹ˆ๋‹ค.

      Docker Registry

      docker-registry

      Docker ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์— ์—ฐ๊ฒฐํ•˜๋Š” ๋ธ”๋ก์œผ๋กœ Docker Engine์— ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

      GCS

      gcs

      Google Cloud Storage์— ํŒŒ์ผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ๋ธ”๋ก์ž…๋‹ˆ๋‹ค.

      GitHub

      github

      ๊ณต๊ฐœ GitHub ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์— ์ €์žฅ๋œ ํŒŒ์ผ๊ณผ ์ƒํ˜ธ ์ž‘์šฉํ•˜๋Š” ๋ธ”๋ก์ž…๋‹ˆ๋‹ค.

      JSON

      json

      JSON ๋ฐ์ดํ„ฐ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋ธ”๋ก์ž…๋‹ˆ๋‹ค.

      Kubernetes Cluster Config

      kubernetes-cluster-config

      Kubernetes ํด๋Ÿฌ์Šคํ„ฐ์™€ ์ƒํ˜ธ ์ž‘์šฉํ•˜๊ธฐ ์œ„ํ•œ ๊ตฌ์„ฑ์„ ์ €์žฅํ•˜๋Š” ๋ธ”๋ก์ž…๋‹ˆ๋‹ค.

      Kubernetes Job

      kubernetes-job

      Kubernetes Job์œผ๋กœ ๋ช…๋ น์„ ์‹คํ–‰ํ•˜๋Š” ๋ธ”๋ก์ž…๋‹ˆ๋‹ค.

      Local File System

      local-file-system

      ๋กœ์ปฌ ํŒŒ์ผ ์‹œ์Šคํ…œ์— ํŒŒ์ผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ๋ธ”๋ก์ž…๋‹ˆ๋‹ค

      Microsoft Teams Webhook

      ms-teams-webhook

      ์ œ๊ณต๋œ Microsoft Teams ์›นํ›…์„ ์‚ฌ์šฉํ•˜์—ฌ ์•Œ๋ฆผ์„ ๋ณด๋‚ด๋Š” ๋ธ”๋ก์ž…๋‹ˆ๋‹ค.

      Opsgenie Webhook

      opsgenie-webhook

      ์ œ๊ณต๋œ Opsgenie ์›นํ›…์„ ์‚ฌ์šฉํ•˜์—ฌ ์•Œ๋ฆผ์„ ๋ณด๋‚ด๋Š” ๋ธ”๋ก์ž…๋‹ˆ๋‹ค.

      Pager Duty Webhook

      pager-duty-webhook

      ์ œ๊ณต๋œ PagerDuty ์›นํ›…์„ ์‚ฌ์šฉํ•˜์—ฌ ์•Œ๋ฆผ์„ ๋ณด๋‚ด๋Š” ๋ธ”๋ก์ž…๋‹ˆ๋‹ค.

      Process

      process

      ์ƒˆ ํ”„๋กœ์„ธ์Šค์—์„œ ๋ช…๋ น์„ ์‹คํ–‰ํ•˜๋Š” ๋ธ”๋ก์ž…๋‹ˆ๋‹ค.

      Remote File System

      remote-file-system

      ์›๊ฒฉ ํŒŒ์ผ ์‹œ์Šคํ…œ์— ํŒŒ์ผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ๋ธ”๋ก์œผ๋กœ fsspec์—์„œ ์ง€์›ํ•˜๋Š” ๋ชจ๋“  ์›๊ฒฉ ํŒŒ์ผ ์‹œ์Šคํ…œ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค..

      S3

      s3

      AWS S3์— ํŒŒ์ผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ๋ธ”๋ก์ž…๋‹ˆ๋‹ค.

      Secret

      secret

      ๋น„๋ฐ€ ๊ฐ’์œผ๋กœ์„œ ๋กœ๊ทธ๋˜๊ฑฐ๋‚˜ UI์— ํ‘œ์‹œ๋  ๋•Œ ๊ฐ€๋ ค์ง€๋Š” ๋ธ”๋ก์ž…๋‹ˆ๋‹ค.

      Slack Webhook

      slack-webhook

      ์ œ๊ณต๋œ Slack ์›นํ›…์„ ์‚ฌ์šฉํ•˜์—ฌ ์•Œ๋ฆผ์„ ๋ณด๋‚ด๋Š” ๋ธ”๋ก์ž…๋‹ˆ๋‹ค.

      SMB

      smb

      SMB ๊ณต์œ ์— ํŒŒ์ผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ๋ธ”๋ก์ž…๋‹ˆ๋‹ค.

      String

      string

      ๋ฌธ์ž์—ด ๋ฐ์ดํ„ฐ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋ธ”๋ก์ž…๋‹ˆ๋‹ค.

      Twilio SMS

      twilio-sms

      Twilio SMS๋ฅผ ํ†ตํ•ด ์•Œ๋ฆผ์„ ๋ณด๋‚ด๋Š” ๋ธ”๋ก์ž…๋‹ˆ๋‹ค.

      Webhook

      webhook

      ์›นํ›…์„ ํ˜ธ์ถœํ•˜๋Š” ๋ธ”๋ก์ž…๋‹ˆ๋‹ค.

Deployment

  • image

  • deployment๋Š” ์ŠคํŠธ๋ฆผ์„ ์บก์Аํ™”ํ•˜๊ณ  API๋ฅผ ํ†ตํ•ด ์ผ์ •์„ ์˜ˆ์•ฝํ•˜๊ฑฐ๋‚˜ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ๋Š” ์„œ๋ฒ„ ์ธก ์•„ํ‹ฐํŒฉํŠธ์ž…๋‹ˆ๋‹ค. flow๋Š” ์—ฌ๋Ÿฌ Deployment์— ์†ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๋ชจ๋“  ๊ฒƒ์ด ํฌํ•จ๋œ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ๋Š” ์ปจํ…Œ์ด๋„ˆ๋ผ๊ณ  ๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ช…๋ น์ค„์ด๋‚˜ Python์œผ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • Prefect ์›Œํฌํ”Œ๋กœ์— ๋Œ€ํ•œ ๋ฐฐํฌ ์ƒ์„ฑ์€ Prefect API๋ฅผ ํ†ตํ•ด ์›Œํฌํ”Œ๋กœ๋ฅผ ๊ด€๋ฆฌํ•˜๊ณ  Prefect ์—์ด์ „ํŠธ์—์„œ ์›๊ฒฉ์œผ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ์›Œํฌํ”Œ๋กœ ์ฝ”๋“œ, ์„ค์ • ๋ฐ ์ธํ”„๋ผ ๊ตฌ์„ฑ์„ ํŒจํ‚ค์ง•ํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

  • Prefect CLI ๋˜๋Š” UI๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ƒ์„ฑ, ์—…๋ฐ์ดํŠธ, ์ค‘์ง€ ๋ฐ ์‚ญ์ œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Deployment์— ๋Œ€ํ•œ ์ƒํƒœ ๋ฐ ๋กœ๊ทธ ์ •๋ณด๋Š” Prefect Cloud ๋˜๋Š” Prefect Server UI์—์„œ ๋ณผ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์›ํ•˜๋Š” ๊ฒฝ์šฐ ๋‹ค์šด๋กœ๋“œํ•˜์—ฌ ๊ฒ€์‚ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • Deployment๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด Flow๋ฅผ ์‰ฝ๊ฒŒ ์‹คํ–‰ํ•˜๊ณ  ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ฝ”๋“œ ๋ณ€๊ฒฝ์ด๋‚˜ ์—…๋ฐ์ดํŠธ๋ฅผ ์‰ฝ๊ฒŒ ๋ฐ˜์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • prefect deployment build parameterized_flows.py:etl_parent_flow -n "Parameterized ETL"

    • image

  • ๋ฐฐํฌ ๊ฒฐ๊ณผ๋กœ yaml ํŒŒ์ผ์ด ์ƒ์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

    • image

  • image

  • image

  • image

Refereence

  • https://docs.prefect.io/latest/

  • https://examples.dask.org/applications/prefect-etl.html

Last updated