برنامه نویسی

استفاده از AWS Step Functions به عنوان هنر

توابع مرحله AWS سرویسی است که به نظرم در سازمان من کمتر از ارزش گذاری شده است. اما آنها ابزار قدرتمندی برای مدیریت گردش کار و اتوماسیون هستند، به ویژه در شرایطی که ابزارها، خدمات و مسیرهای جریان ممکن مختلف باید در ترکیب قرار گیرند. با توجه به مستندات اینجا

می توانید AWS Lambda، AWS Batch، Amazon DynamoDB، Amazon ECS، Amazon SNS، Amazon SQS، AWS Glue، Amazon SageMaker، Amazon EMR و حتی سایر توابع AWS Step را در گردش کار تابع مرحله خود بگنجانید (همراه با بسیاری دیگر؛ به جدول در پایین صفحه لینک شده).

هفته گذشته کمی ناآرام بودم و تصمیم گرفتم ببینم چه کارهای دیگری می توانم با AWS Step Functions انجام دهم. همانطور که با قابلیت ها بازی می کردم، متوجه شدم که چیزی که در حال شکل گیری هستم به طور مبهم شبیه درخت است. بنابراین تصمیم گرفتم بر اساس آن موضوع بسازم.

با استفاده از فراخوانی تابع لامبدا که به گونه ای طراحی شده است که همیشه به عنوان یک تولید کننده خروجی برای یک مرحله شکست بخورد، من توانستم رنگ هایی غیر از آبی یک مرحله اجرا نشده و سبز یک مرحله موفق را اضافه کنم. به طور خاص، من می توانم پرتقال اضافه کنم.

در شعر کد من در زیر می توانید ساختار درخت را ببینید. این ترکیبی از حالت‌های عبور، وضعیت‌های وظیفه و حالت‌های موازی است که همه با هم کار می‌کنند تا یک فرم درخت کاج زیبا ایجاد کنند.

{
  "Comment": "Building a tree is fun!",
  "StartAt": "Time to plant a seed",
  "States": {
    "Time to plant a seed": {
      "Type": "Pass",
      "Next": "To grow a beautiful tree"
    },
    "To grow a beautiful tree": {
      "Type": "Task",
      "Resource": "arn:aws:lambda:us-east-1:xxxxxxxxxxxx:function:Fail",
      "Catch": [
         {
            "ErrorEquals": [
               "States.TaskFailed"
            ],
            "Next": "As tall as it can be, so wild and free"
         }
       ],
       "Next": "As tall as it can be, so wild and free"
    },
    "As tall as it can be, so wild and free": {
      "Type": "Pass",
      "Next": "My needles are green my trunk is brown"
    },
    "My needles are green my trunk is brown": {
      "Type": "Parallel",
      "Branches": [
        {
          "StartAt": "Im the tallest",
          "States": {
            "Im the tallest": {
              "Type": "Succeed"
            }
          }
        },
        {
          "StartAt": "Healthiest",
          "States": {
            "Healthiest": {
              "Type": "Task",
              "Resource": "arn:aws:lambda:us-east-1:xxxxxxxxxxxx:function:Fail",
              "Catch": [
                {
                  "ErrorEquals": [
                    "States.TaskFailed"
                  ],
                  "Next": "Pine cones are my future"
                }
              ],
              "End": true
            },
            "Pine cones are my future": {
              "Type": "Pass",
              "Result": "Love em",
              "End": true
            }
          }
        },
        {
          "StartAt": "Tree around",
          "States": {
            "Tree around": {
              "Type": "Succeed"
            }
          }
        }
      ],
      "Next": "Whether growing up or growing down"
    },
    "Whether growing up or growing down": {
      "Type": "Parallel",
      "Next": "My trunk roots me to the ground",
      "Branches": [
        {
          "StartAt": "I reach for the sun",
          "States": {
            "I reach for the sun": {
              "Type": "Pass",
              "End": true
            }
          }
        },
        {
          "StartAt": "PC",
          "States": {
            "PC": {
              "Type": "Task",
              "Resource": "arn:aws:lambda:us-east-1:xxxxxxxxxxxx:function:Fail",
              "Catch": [
                {
                  "ErrorEquals": [
                    "States.TaskFailed"
                  ],
                  "Next": "Squirrels and birds"
                }
              ],
              "End": true
            },
            "Squirrels and birds": {
              "Type": "Pass",
              "Result": "Beautiful",
              "End": true
            }
          }
        },
        {
          "StartAt": "I burrow deep underground",
          "States": {
            "I burrow deep underground": {
              "Type": "Pass",
              "End": true
            }
          }
        },
        {
          "StartAt": "!PC",
          "States": {
            "!PC": {
              "Type": "Task",
              "Resource": "arn:aws:lambda:us-east-1:xxxxxxxxxxxx:function:Fail",
              "Catch": [
                {
                  "ErrorEquals": [
                    "States.TaskFailed"
                  ],
                  "Next": "Home for many critters"
                }
              ],
              "End": true
            },
            "Home for many critters": {
              "Type": "Pass",
              "Result": "Good company",
              "End": true
            }
          }
        },
        {
          "StartAt": "I fill the air with scent profound",
          "States": {
            "I fill the air with scent profound": {
              "Type": "Pass",
              "End": true
            }
          }
        }
      ]
    },
    "My trunk roots me to the ground": {
      "Type": "Pass",
      "End": true
    }
  }
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

درس هایی که از تلاش خلاقانه ام آموختم:

  1. مگر اینکه بخواهید یک حجم کار موازی در مقیاس بزرگ پیاده سازی کنید، یک شکست غیرمجاز (حتی یک حالت Fail) منجر به از کار افتادن کل تابع مرحله می شود. از آنجایی که می خواستم از شکست ها به عنوان راهی برای تزریق مقداری رنگ برای مخروط های کاج استفاده کنم، این کمی خسته کننده بود. وقتی متوجه شدم که می توانم از یک Task استفاده کنم و خطای شکست آن Task را برای دریافت رنگ pop بدون عملکرد گام شکست خورده برطرف کنم، بسیار خوشحال شدم.
  2. هر نام برای هر حالت در تابع گام شما باید منحصر به فرد باشد. اگر بخواهید نامی را در هر جایی مجدداً استفاده کنید، سیستم بر سر شما فریاد می زند و تا زمانی که نام تکراری را اصلاح نکنید، از رفتن به حالت های آن خودداری می کند. به طور کلی مشکلی نیست، فقط یک نکته قابل توجه است.
  3. با این حال، می‌توانید از منابع خارجی در تابع step خود استفاده مجدد کنید. برای مثال، اگر می‌خواهید فوق‌العاده تنبل باشید و توابع لامبدا منحصربه‌فردی را ایجاد نکنید که هر کدام همیشه از کار بیفتند، می‌توانید از یکی استفاده کنید و فقط چند بار آن را فراخوانی کنید. و این واقعاً خوب کار می کند.
  4. مطمئن شوید که نام ایالت های شما 100% با نام های اجرایی که فرا می خوانید مطابقت دارد. تا فاصله و نقطه گذاری! یا تابع گام شما اجرا نمی شود.
  5. اگر نمی خواهید، لازم نیست یک ورودی به تابع step خود بدهید. حتی اگر رشته پیش‌فرض json در تابع دارای ورودی مشخص شده باشد، در واقع نیازی به آن نیست.
  6. برای آثار هنری بزرگ‌تر و پیچیده‌تر، به جای یک تابع مرحله اولیه، وارد نقشه اجرای نقشه شوید. استفاده از Map Run به شما امکان می دهد یک شکست قابل تحمل برای مراحل خود تنظیم کنید، که به نوبه خود انعطاف بیشتری در ساخت هنری سیستم به شما می دهد.

علاقه مند به یادگیری بیشتر در مورد نحوه کار با Step Function هستید؟ آموزش های موجود در مستندات را بررسی کنید. تعداد کمی وجود دارد. من دوست دارم هنری را که خلق می کنید ببینم!

در اینجا هنر فوق العاده فانتزی درخت schmancy من است:

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا