AWS Step Functions คืออะไร? การแนะนำฟังก์ชันล่าสุดของ AWS ในปี 2023

2023.03.31

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

What is AWS Step Functions

AWS Step Functions คือ serverless orchestration เซอร์วิสที่สามารถเชื่อมต่อและจัดการกระบวนการต่างๆ

ด้วยการควบคุมการจัดการคำสั่งต่างๆที่อยู่ใน Lambda function และหลายๆ APIs ที่ทำให้ง่ายต่อการจัดการกระบวนการต่างๆที่เราต้องการจะใช้งานภายในคำสั่ง ตัวอย่างเช่น ETL และ batch processing

ประเภทของการประมวลผลที่ดำเนินการสามารถแสดงให้เห็นได้ในรูปแบบของ workflow บน AWS management console ซึ่งสิ่งนี้สร้างความประทับใจได้อย่างดีกับการจัดการระบบ Job จากจุดที่มีการกระบวนการทำงานที่เชื่อมโยงกัน

Workflow example

workflow ถูกดีไซน์ใน AWS Step Functions สตูดิโอ สามารถเข้าไปศึกษาข้อมูลเพิ่มเติมได้ที่ลิ้งค์ด้านล่างนี้เลยครับ

เพิ่มเติมคือ AWS Step Functions Workflow Studio โดยตัว workflows สามารถจัดการได้ไม่ใช่แค่ GUI แต่รวมถึง CLI ที่การแสดง workflow นี้ใน ASL (Amazon States Language) มีดังต่อไปนี้ (สามารถคลิ้กตัวอย่าง ASL)

ตัวอย่าง ASL (คลิ้กเพื่อแสดง)
{
  "Comment": "A description of my state machine",
  "StartAt": "Lambda Invoke",
  "States": {
    "Lambda Invoke": {
      "Type": "Task",
      "Resource": "arn:aws:states:::lambda:invoke",
      "OutputPath": "$.Payload",
      "Parameters": {
        "Payload.$": "$"
      },
      "Retry": [
        {
          "ErrorEquals": [
            "Lambda.ServiceException",
            "Lambda.AWSLambdaException",
            "Lambda.SdkClientException"
          ],
          "IntervalSeconds": 2,
          "MaxAttempts": 6,
          "BackoffRate": 2
        }
      ],
      "Next": "SNS Publish"
    },
    "SNS Publish": {
      "Type": "Task",
      "Resource": "arn:aws:states:::sns:publish",
      "Parameters": {
        "Message.$": "$"
      },
      "Next": "Choice"
    },
    "Choice": {
      "Type": "Choice",
      "Choices": [
        {
          "Next": "Map"
        }
      ],
      "Default": "Glue StartJobRun"
    },
    "Map": {
      "Type": "Map",
      "Next": "Step Functions StartExecution",
      "Iterator": {
        "StartAt": "DescribeAlarms",
        "States": {
          "DescribeAlarms": {
            "Type": "Task",
            "End": true,
            "Parameters": {},
            "Resource": "arn:aws:states:::aws-sdk:cloudwatch:describeAlarms"
          }
        }
      }
    },
    "Step Functions StartExecution": {
      "Type": "Task",
      "Resource": "arn:aws:states:::states:startExecution.sync:2",
      "Parameters": {
        "StateMachineArn": "arn:aws:states:REGION:ACCOUNT_ID:stateMachine:STATE_MACHINE_NAME",
        "Input": {
          "StatePayload": "Hello from Step Functions!",
          "AWS_STEP_FUNCTIONS_STARTED_BY_EXECUTION_ID.$": "$$.Execution.Id"
        }
      },
      "Next": "Parallel"
    },
    "Parallel": {
      "Type": "Parallel",
      "Branches": [
        {
          "StartAt": "DeleteFunction",
          "States": {
            "DeleteFunction": {
              "Type": "Task",
              "End": true,
              "Parameters": {
                "FunctionName": "MyData"
              },
              "Resource": "arn:aws:states:::aws-sdk:lambda:deleteFunction"
            }
          }
        },
        {
          "StartAt": "CopyObject",
          "States": {
            "CopyObject": {
              "Type": "Task",
              "End": true,
              "Parameters": {
                "Bucket": "MyData",
                "CopySource": "MyData",
                "Key": "MyData"
              },
              "Resource": "arn:aws:states:::aws-sdk:s3:copyObject"
            }
          }
        }
      ],
      "Next": "Success"
    },
    "Success": {
      "Type": "Succeed"
    },
    "Glue StartJobRun": {
      "Type": "Task",
      "Resource": "arn:aws:states:::glue:startJobRun",
      "Parameters": {
        "JobName": "myJobName"
      },
      "Next": "Choice 2"
    },
    "Choice 2": {
      "Type": "Choice",
      "Choices": [
        {
          "Variable": "$",
          "IsPresent": true,
          "Next": "Fail"
        }
      ],
      "Default": "Wait"
    },
    "Wait": {
      "Type": "Wait",
      "Seconds": 5,
      "Next": "Success"
    },
    "Fail": {
      "Type": "Fail"
    }
  }
}

จากที่เห็น คำจำกัดความสามารถจัดการได้ด้วยโค้ด ดังนั้นถ้าเราใช้บริการควบคุมเวอร์ชัน เช่น GitHub และ CodeCommit เราสามารถสร้างไปป์ไลน์ CI/CD และปรับใช้โดยอัตโนมัติ จากตัวอย่างด้านล่างและนี้คือการสร้างไปป์ไลน์ CI/CD โดยใช้ CodeCommit, CodeBuild และ CodePipeline

กระบวนการที่กำหนดโดย AWS Step Functions เรียกว่า state machine ดังนั้น "การเรียกใช้ state machine" หมายถึงเริ่มกระบวนการที่กำหนดไว้ใน AWS Step Functions

นอกจากนี้ AWS Step Functions ยังมีสองประเภท ได้แก่ Standard และ Express โดยมีการใช้งานและคุณสมบัติหลักดังนี้

Standard:

  • กรณีที่เราคาดหวังการดำเนินการหนึ่งครั้งจะใช้เวลามากกว่า 5 นาที
    • อัตราการดำเนินการ 2,000/วินาที
    • อัตราการเปลี่ยนสถานะ 4,000 ต่อวินาที
    • ราคาต่อการเปลี่ยนแปลงของรัฐ
    • ดูประวัติการดำเนินการและการแก้จุดบกพร่องด้วยภาพ
    • รองรับการรวมบริการและรูปแบบทั้งหมด
  • การประมวลผลแบบกลุ่มทั่วไป, ETL ฯลฯ

Express:

  • กรณีที่เราคาดหวัง 100,000 สายต่อวินาทีสำหรับเวิร์กโฟลว์ภายใน 5 นาที
    • อัตราการดำเนินการ 100,000/วินาที
    • อัตราการเปลี่ยนสถานะเกือบไม่ จำกัด
    • ราคาต่อจำนวนการดำเนินการและระยะเวลาในการดำเนินการ
    • ส่งประวัติการดำเนินการไปยัง Amazon CloudWatch
    • รองรับการรวมบริการและรูปแบบทั้งหมด
  • microservice ฯลฯ

อีกทั้งเรายังสามารถใช้งานร่วมกันได้ระหว่าง Standard และ Express เพื่อเรียกดูเรียกสถานะของเครื่อง Express จากตัว Standard ได้ ถ้าเราต้องการเคลื่อนย้ายการตั้งค่าที่อยู่ในระบบ job management ไปยัง AWS Step functions โดนผมขอแนะนำให้ใช้เป็นตัว Standard ครับ

ประโยชน์ของ AWS Step Functions

ฟังก์ชั่นที่จำเป็นสำหรับบริการดังกล่าวคืออะไร?

หากเรามีความต้องการที่จะจัดการกระบวนการหรือ workflow ต่างๆ ความสามารถเหล่านี้จะมีส่วนช่วยเราได้

  • Synchronous execution
  • Parallel execution
  • Conditional branch
  • loop
  • stand-by
  • retry
  • Exception handling
  • Check execution result
  • Coordination between different workflows

AWS Step Functions สามารถใช้งานฟังก์ชันทั้งหมดที่ระบุไว้ด้านบนได้ ยิ่งไปกว่านั้น เนื่องจากเป็นเซิร์ฟเวอร์แบบ serverless จึงไม่มีความจำเป็นต้องจัดการเซิร์ฟเวอร์เหมือนระบบจัดการทั่วไป

น่าสนใจมากที่สามารถใช้ฟังก์ชันเหล่านี้ได้อย่างง่ายดายและทันที

สิ่งที่ AWS Step Functions ไม่สามารถทำได้

หลายคนอาจจะติดว่า AWS step function จะมาแทนที่ระบบ Job management หรือปล่าว ? อย่างไรก็ตาม AWS Step Functions ไม่ใช่ระบบการจัดการงาน ดังนั้นจึงไม่สามารถแทนที่ระบบ Job Wanagement ได้ เบื้องหลังการทำงานและการตรวจสอบก็จะรวมอยู่ในที่เดียวกัน

1.การดำเนินการจากส่วนกลางของ workflow

  • หากกระบวนการล้มเหลวระหว่างกลาง จะไม่สามารถดำเนินการใหม่จากตรงกลางได้
  • หากต้องการที่จะเริ่มกระบวนการใหม่ คุณจะต้องเริ่มต้นใหม่ตั้งแต่ต้น workflow
  • ดังนั้นจึงจำเป็นต้องมีกระบวนการทำงานร่วมกันและการประมวลผลที่เทียบเท่ากัน จึงไม่สำคัญว่าจะมีการรันซ้ำหรือไม่
  • ข้อมูลอ้างอิง: Implementation of equalities in serverless ( Batch processing and distributed transactionals )

2.การดำเนินการที่ยืดหยุ่นโดยยึดตามปฏิทิน

สิ่งที่ AWS Step Functions สามารถทำได้

เหล่านี้คือประเภทของการประมวลผล = สถานะที่ AWS Step Functions สามารถทำได้ด้วย นี้คือรายชื่อประเภทของ State ที่สามารถตามได้

  • Task
  • Choice
  • Wait
  • Success
  • Fail
  • Parallel
  • Map

Task

Task คือสถานะที่มีการทำงานแค่ส่วนเดียว

AWS API และกิจกรรมต่างๆ ที่สามารถตั้งค่าได้ซึ่งในขณะนี้สามารถเรียกใช้ API ได้มากกว่า 200 รายการแล้ว การควบคุมการทำงานของแอพพลิเคชันที่ปฏิบัติการอยู่ใน EC2 instance และ บน on-premises สามารถดูเนื้อหาได้ด้านล่างนี้

Choice

Choice คือสถานะที่ทำการแบ่งแยกออกเป็นหลายๆกลุ่มอย่างมีเงื่อนไข

เราสามารถกำหนดสถานะที่อยู่ภายในเงื่อนไขโดยสามารถเปรียบเทียบได้ดังนี้

  • And
  • BooleanEquals, BooleanEqualsPath
  • IsBoolean
  • IsNull
  • IsNumeric
  • IsPresent
  • IsString
  • IsTimestamp
  • Not
  • NumericEquals, NumericEqualsPath
  • Numeric Greater Than, NumericGreaterThan Path
  • NumericGreaterThanEquals, NumericGreaterThanEqualsPath
  • NumericLessThan, NumericLessThanPath
  • NumericLessThanEquals, NumericLessThanEqualsPath
  • Or
  • StringEquals, StringEqualsPath
  • StringGreaterThan, StringGreaterThanPath
  • StringGreaterThanEquals, StringGreaterThanEqualsPath
  • StringLessThan, StringLessThanPath
  • StringLessThanEquals, StringLessThanEqualsPath
  • StringMatches
  • TimestampEquals, TimestampEqualsPath
  • TimestampGreaterThan, TimestampGreaterThanPath
  • TimestampGreaterThanEquals,TimestampGreaterThanEqualsPath
  • TimestampLessThan, TimestampLessThanPath
  • TimestampLessThanEquals,TimestampLessThanEqualsPath

Wait

Wait คือสถานะรอโดยมีการกำหนดระยะเวลา

เราสามารถเลือกระหว่างเวลาที่เป็น (วินาที) และ เวลาในรูปแบบของ (timestamp) ได้ โดยรายการต่างๆ จะมีการระบุเวลาสัมพัทธ์หรือเวลาสัมบูรณ์และใช้การประมวลผลที่รอเวลาที่ระบุ

Success

Success คือสถานะสำหรับการ terminate แบบปกติ

คุณไม่จำเป็นต้องเพิ่มสถานะ Success ที่จุดสิ้นสุดของ workflow สถานะนี้ถูกใช้แค่เป็นจุดสิ้นสุดของการทำงาน โดยไม่ต้องทำอะไรเพิ่มเติมอย่างเช่นข้อมูลหรือผลลัพธ์ที่มีการแตกแขนงด้วยเงื่อนไขที่ต้องมีการเลือก

Fail

Fail คือสถานะที่เกิดจากความผิดปกติของการ terminate

ใช้งานเมื่อมีการ terminate และสถานะของเซิร์ฟเวอร์ที่ผิดปกติตามเงื่อนที่กำหนดโดย Choice

Parallel

Parallel คือสถานะที่ควบคุมการทำงานของ parallel

  • AWS Step Functions: Parallel ถูกใช้งานเมื่อเรามีความต้องการที่จะรันคำสั่งที่มากกว่า 2 คำสั่งหรือมีกการทำงานอยู่ใน parallel

Map

Map คือสถานะที่มีการทำซ้ำในกระบวนการเดียวกันผ่าน array

จากตัวอย่างการใช้งานถ้าคุณต้องการจะ Stop EC2 instances แบบหลายตัว EC2:StopInstances เราสามารถแสดงได้อย่างรัดกุมโดยผ่านอาร์เรย์ของ ID อินสแตนซ์ EC2 ไปยังแผนที่และกำหนด API ที่จะดำเนินการภายในแผนที่

Map example

How the state machine is executed

There are mainly the following methods of executing the state machine.

  1. management console
  2. EventBridge rules
  1. API Gateway
  1. APIs
  1. CLI
  1. SDKs

โดยส่วนมากเราจะมีการเรียกใช้สถานะของ Machine ผ่าน EventBridge rules ถ้าคุณต้องการจะใช้งาน API backend เราควรจะดำเนินการจาก API gateway

Value input/output

ถ้าเราต้องการจะเชื่อม values ระหว่างสถานะ เราสามารถใช้ Parameter ควบคุมสิ่งต่างๆได้

Parameters ที่ควบคุมมีทั้งหมดดังนี้

  • InputPath
    • กรองส่วนหนึ่งของอินพุตและส่งต่อไปยังรัฐ
  • Output Path
    • กรองส่วนของเอาต์พุตและส่งต่อไปยังสถานะถัดไป
  • Result Path
    • ผนวกอินพุตต้นฉบับเข้ากับเอาต์พุต
  • Parameters
    • ระบุอินพุตที่จะส่งไปยังรัฐ
  • Result Selector
    • แปลงผลลัพธ์เอาต์พุต

สำหรับการดำเนินการของ Parameters เหล่านี้สามารถศึกษาข้อมูลเพิ่มเติมได้จากบทความที่เขียนขึ้นจาก Developer.IO และ AWS ที่เผยแพร่อย่างเป็นทางการได้จากลิ้งค์ด้านล่างนี้ครับ

Logging และ monitoring

วิธีการต่อไปนี้จะใช้เป็นหลักในการตรวจสอบผลการดำเนินการสถานะของ Machine

  • ตรวจสอบบันทึกการดำเนินการของ Output แต่ละสถานะไปยัง CloudWatch Logs
  • ตรวจสอบประวัติการดำเนินการจากคอนโซลการจัดการ
  • ดูไทม์ไลน์การประมวลผลจาก X-Ray tracemap
  • ตรวจสอบประวัติการดำเนินการ API จาก CloudTrail เมื่อตรวจสอบจาก management console สถานะที่ประมวลผลสำเร็จจะเป็นสีเขียวตามที่แสดงรูปด้านล่าง

Checking completion of state machine execution

นอกจากนี้ ตัววัดการดำเนินการของ AWS Step Functions ยังสามารถรองรับการทำงานร่วมกับ CloudWatch ได้ด้วยโดยมี metrics ดังต่อไปนี้

metrics explanation
ExecutionTime บอกเป็นช่วงเวลา (เป็นมิลลิวินาที) ตั้งแต่เริ่มดำเนินการจนถึงสิ้นสุด
Execution Throttled จำนวนการปรับแต่ง StateEntered event และ จำนวนครั้งที่มีการ retry ได้
Executions Aborted จำนวนครั้งที่มีการถูกรบกวนหรือถูก terminated
Executions failed จำนวนครั้งที่มีการดำเนินการล้มเหลว
Executions Started จำนวนครั้งที่ดำเนินการ
Executions Succeeded จำนวนครั้งที่ประสบความสำเร็จในการดำเนินการ
Executions Timed Out จำนวนครั้งที่การดำเนินการหมดอายุหรือถูกยกเลิกด้วยเหตุผลบางประการ

AWS Step Functions: ราคา(Price)

ค่าบริการ AWS Step Functions จากวันที่ 3 มีนาคม ปี 2023 (Singapore region)

ในราคามาตรฐานจะมีค่าบริการดังนี้

  • ฟรีการถ่ายโอน 4,000 ต่อเดือน (หลังจากหมด Free Tier 12 เดือน)
  • $0.025 ต่อการเปลี่ยนสถานะ 1,000 ครั้ง

สำหรับราคาพิเศษระดับ :

  • $1.00 ต่อ 1 ล้าน requests
  • $0.000001 ต่อ 1 request
  • การใช้งาน Memory ต่อระยะเวลา
    • $0.00001667 per GB-Second เริ่มต้นที่ 1,000 ชั่วโมง GB-Hours ($0.0600 ต่อ GB-Second)
    • $0.00000833 per GB-Sec หลังจาก 4,000 ชั่วโมง GB-Hours ($0.0300 per GB-Sec)
    • $0.00000456 per GB-s และสูงขึ้นไปเป็น ($0.01642 per GB-s)

สรุปเกี่ยวกับ AWS Step Functions

เนื้อหาในบทความนี้แปลมาจากบล็อกของคุณ のんピ ครับผมสามารถเข้าไปดูบล็อกต้นฉบับและติดตามเนื้อหาเพิ่มเติมได้เลยครับ ขอบคุณครับ