AWS Lambda งานที่กำหนดเวลาไว้


145

Amazon ประกาศ AWS Lambda ( http://aws.amazon.com/lambda/ )

คำอธิบายผลิตภัณฑ์รวมถึง:

งานที่กำหนดเวลาไว้

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

เมื่อฉันอ่านสิ่งนี้ฉันเข้าใจว่าในที่สุดฉันก็มีวิธีที่จะทำงานที่ "เหมือน cron" อย่างต่อเนื่อง ฉันต้องการเรียกใช้แบบสอบถามเฉพาะทุกวันเวลา 5 โมงเย็นสมมติว่า

อย่างไรก็ตามฉันไม่พบสิ่งนี้ในเอกสารคู่มือ พวกเขาพูดถึงเพียงทริกเกอร์เหตุการณ์เชิงโปรแกรมหรือเหตุการณ์จากบริการ AWS อื่น ๆ

ฉันเข้าใจผิดหรือเปล่า? หรือใครบางคนสามารถชี้ให้ฉันไปที่เอกสาร?

คำตอบ:


159

การสนับสนุนพื้นเมืองสำหรับกิจกรรมตามกำหนดเวลาได้เพิ่ม 8 ตุลาคม 2558:

ตามที่ประกาศในโพสต์บล็อก AWSตอนนี้การสนับสนุนการกำหนดเวลาจะเป็นประเภทแหล่งที่มาของกิจกรรม (เรียกอีกอย่างว่าทริกเกอร์) เรียกว่า " เหตุการณ์ CloudWatch - กำหนดการ " และสามารถแสดงเป็นอัตราหรือนิพจน์ cron

เพิ่มกิจกรรมที่กำหนดไว้ในแลมบ์ดาใหม่

ไปที่ขั้นตอนการสร้าง 'กำหนดค่าทริกเกอร์' และระบุทริกเกอร์ 'CloudWatch Event - Schedule' ตัวอย่างการกำหนดค่าด้านล่าง:

ภาพที่แสดงการกำหนดค่าสำหรับการสร้างเหตุการณ์ที่กำหนดเวลา 5:00 UTC

เพิ่มกิจกรรมที่กำหนดไว้ในแลมบ์ดาที่มีอยู่

ไปที่แท็บ 'ทริกเกอร์' ของแลมบ์ดาของคุณเลือก 'เพิ่มทริกเกอร์' และระบุทริกเกอร์ 'CloudWatch Event - Schedule' ตัวอย่างภาพหน้าจอที่ฉันมีแลมบ์ดาที่มีทริกเกอร์ SNS อยู่:

ภาพที่แสดงวิธีการนำทางเพื่อเพิ่ม UI ของทริกเกอร์จากคอนโซลแลมบ์ดา

เมื่อโหลดแล้ว UI เพื่อกำหนดค่าทริกเกอร์นี้จะเหมือนกับภาพหน้าจอในส่วน "เพิ่มกิจกรรมที่กำหนดเวลาไว้ในแลมบ์ดาใหม่" ด้านบน

อภิปรายผล

กรณีตัวอย่างของคุณคุณจะต้องการที่จะใช้แทนcron() rate()นิพจน์ Cron ในแลมบ์ดาต้องการทุกฟิลด์และแสดงเป็น UTC ดังนั้นในการรันฟังก์ชั่นทุกวันเวลา 5 โมงเย็น (UTC) ให้ใช้นิพจน์ cron ต่อไปนี้:

cron(0 17 * * ? *)

แหล่งข้อมูลเพิ่มเติม

หมายเหตุ

  • ชื่อของประเภทเหตุการณ์นี้เปลี่ยนจาก "เหตุการณ์ที่กำหนดไว้" เป็น "เหตุการณ์ CloudWatch - ตารางเวลา" เนื่องจากคุณลักษณะนี้เปิดตัวครั้งแรก
  • ก่อนที่จะมีการเปิดตัวคุณสมบัตินี้ทางออกที่แนะนำสำหรับปัญหานี้ (ต่อ"เริ่มต้นกับ AWS Lambda" ที่ 42 นาที 50 วินาที ) คือการใช้ SWF เพื่อสร้างตัวจับเวลาหรือเพื่อสร้างตัวจับเวลาด้วยแอปพลิเคชันภายนอก
  • แลมบ์ดา UI นั้นได้รับการแก้ไขตั้งแต่การโพสต์บล็อกกิจกรรมที่กำหนดไว้และภาพหน้าจอภายในนั้นไม่ถูกต้องอีกต่อไป ดูภาพหน้าจอที่อัปเดตของฉันด้านบนจาก 3/10/2017 สำหรับการแก้ไขล่าสุด

คุณรู้หรือไม่ว่ามีความหวังสำหรับการสนับสนุนความแม่นยำ 1 นาทีหรือไม่
kaptan

2
มันค่อนข้างแฮ็ก แต่คุณสามารถทำได้เป็นเวลา 1 นาทีความถี่youtube.com/watch?v=FhJxTIq81AU
ingh.am

4
ประเภทแหล่งที่มาของเหตุการณ์อยู่ในขณะนี้ "เหตุการณ์ CloudWatch - กำหนดการ"
Guy Daher

@GuyDaher ขอขอบคุณฉันได้อัปเดตคำตอบแล้ว
Anthony Neace

3
มันสนับสนุนอัตรา 1 นาทีในขณะนี้ docs.aws.amazon.com/lambda/latest/dg/…
advncd

18

ตั้งแต่เวลาของการโพสต์นี้ดูเหมือนว่าจะมีเพิ่มขึ้นวิธีอื่น: กำหนดการที่เกิดขึ้นประจำ AWS แลมบ์ดาสวดด้วยความไม่น่าเชื่อถือ Town Clock (UTC)ในการที่ผู้เขียนได้นำเสนอการสมัครสมาชิก SNS หัวข้อที่ไม่น่าเชื่อถือ Town Clock ฉันไม่ได้ใช้ทั้ง SWF และ SNS แต่ดูเหมือนว่าโซลูชัน SNS นั้นง่ายกว่า นี่คือข้อความที่ตัดตอนมาจากบทความ

นาฬิกาเมืองที่ไม่น่าเชื่อถือ (UTC)

Town Town ที่ไม่น่าเชื่อถือ (UTC) เป็นหัวข้อ SNS สาธารณะฟรี (บริการแจ้งเตือนที่เรียบง่ายของ Amazon) ที่เผยแพร่ข้อความ“ เสียงระฆัง” ทุก ๆ ชั่วโมงแก่สมาชิกทุกคน มันสามารถส่งเสียงระฆังไปยังฟังก์ชั่น AWS Lambda, SQS queues และที่อยู่อีเมล

คุณสามารถใช้แอททริบิวต์ chime เพื่อรันโค้ดของคุณทุกสิบห้านาทีหรือรันโค้ดของคุณเพียงครั้งเดียวต่อชั่วโมง (เช่นเมื่อนาที == "00") หรือวันละครั้ง (เช่นเมื่อชั่วโมง == "00" และนาที = = "00") หรือช่วงเวลาอื่น ๆ

คุณสามารถสมัครสมาชิกฟังก์ชั่นที่คุณต้องการเรียกใช้เพียงครั้งเดียวเท่านั้นในเวลาที่กำหนดในอนาคต: ให้ฟังก์ชั่นนี้ไม่สนใจการเรียกใช้ทั้งหมดจนกว่าจะถึงเวลาที่ต้องการ เมื่อถึงเวลามันสามารถทำงานได้แล้วยกเลิกการเป็นสมาชิกจาก SNS Topic

การเชื่อมต่อรหัสของคุณกับนาฬิกาเมืองที่ไม่น่าเชื่อถือนั้นรวดเร็วและง่ายดาย ไม่มีขั้นตอนการสมัครหรือสร้างบัญชี


9
ไม่ใช่คำตอบที่ถูกต้องอีกต่อไป ไม่มีนาฬิกาเมืองที่ไม่น่าเชื่อถืออีกต่อไป
blueskin

15

โซลูชั่นใหม่: แลมบ์ดาตามตารางงาน

เวอร์เนอร์โวเกิลได้ประกาศคืนนี้ (10/08) ที่อีกครั้ง: ประดิษฐ์ว่า AWS Lambda ตอนนี้มีกำหนดการของตัวเองแล้ว

ที่ se Release Note AWS แลมบ์ดาใน 2015/10/08 :

คุณยังสามารถตั้งค่า AWS Lambda เพื่อเรียกใช้รหัสของคุณตามกำหนดเวลาปกติโดยใช้คอนโซล AWS Lambda คุณสามารถระบุอัตราคงที่ (จำนวนชั่วโมงวันหรือสัปดาห์) หรือคุณสามารถระบุนิพจน์ cron ยกตัวอย่างให้ดูเกมส์ 5: การใช้ฟังก์ชั่นแลมบ์ดากับการดำเนินการกิจกรรมที่กำหนด (งูใหญ่)


โซลูชันเก่า: การจัดตารางเวลาด้วย AWS Data Pipeline

คุณสามารถใช้ AWS Data Pipeline เพื่อกำหนดเวลางานตามช่วงเวลาที่กำหนด แอ็คชันสามารถเป็นคำสั่งใด ๆ เมื่อคุณกำหนดค่า Pipeline ของคุณด้วยShellCommandActivity ShellCommandActivity

ตัวอย่างเช่นคุณสามารถเรียกใช้คำสั่ง AWS CLI เพื่อ:

  • ใส่ข้อความถึง SQS
  • หรือเรียกใช้ฟังก์ชัน Lambdaโดยตรง(ดูที่เรียกใช้ )

คุณสามารถสร้างงานที่กำหนดเวลา AWS Data Pipeline โดยตรงภายในคอนโซล AWS (เช่นด้วยคำสั่ง AWS CLI):

ป้อนคำอธิบายรูปภาพที่นี่

คุณยังสามารถใช้ API เพื่อกำหนดการของคุณ:

{
 "pipelineId": "df-0937003356ZJEXAMPLE",
 "pipelineObjects": [
    {
      "id": "Schedule",
      "name": "Schedule",
      "fields": [
        { "key": "startDateTime", "stringValue": "2012-12-12T00:00:00" }, 
        { "key": "type", "stringValue": "Schedule" }, 
        { "key": "period", "stringValue": "1 hour" }, 
        { "key": "endDateTime", "stringValue": "2012-12-21T18:00:00"  }
       ]
     }, {
      "id": "DoSomething",
      "name": "DoSomething",
      "fields": [
        { "key": "type", "stringValue": "ShellCommandActivity" },
        { "key": "command", "stringValue": "echo hello" },
        { "key": "schedule", "refValue": "Schedule" }
      ]
    }
  ]
}

ขีด จำกัด : ช่วงเวลาการตั้งเวลาขั้นต่ำคือ 15 นาที
ราคา : ประมาณ $ 1.00 ต่อเดือน


9

นี่คือวิธีที่ฉันทำ:

  • สร้างแลมบ์ดาซึ่ง:

  • สร้างการแจ้งเตือน CloudWatch สำหรับ: ApproximateNumberOfMessagesVisible> 0 เป็นเวลา 1 นาที

  • สมัครสมาชิกหัวข้อ SNS เพื่อปลุก
  • สมัครแลมบ์ดาหัวข้อ SNS

ตอนนี้คุณมีตัวจับเวลาด้วยความละเอียดประมาณ 15 นาที

จากนั้นฟังก์ชั่นแลมบ์ดาอื่น ๆ จะสมัครเป็นสมาชิกของ SNS Topic และเรียกทุก 15 นาที


4
คำตอบนี้เป็นพื้นคำแนะนำสำหรับการหนึ่งกลไกที่สามารถดำเนินการที่ไม่น่าเชื่อถือ Town Clock อธิบายไว้ในคำตอบของ Shadi ระบุว่าผู้เขียน UTC เตือนว่า "อาจหายไปโดยไม่มีการเตือนเมื่อใดก็ได้" วิธีการของคุณน่าจะเหนือกว่า
Brian

การใช้งานครั้งแรก - 1 ข้อความ - ทำงานสองสามวันและหยุด ดูเหมือนว่าข้อความจะไม่ส่งถึง SQS เป็นระยะ เพิ่มอีก 2 ข้อความ (รวม 3) - ตอนนี้ใช้งานได้แล้วในหนึ่งสัปดาห์ ใน CloudWatch ฉันเห็นการพลาดเป็นระยะ - ส่งข้อความได้เพียง 2 ข้อความเท่านั้น สรุปสาระสำคัญได้รับการปรับปรุงgist.github.com/mikeplavsky/5ffe7e33e0d70a248537
maplpro

@Brian ในฐานะผู้เขียน Town Town ที่ไม่น่าเชื่อถือ ( townclock.io ) ฉันยอมรับว่าการใช้งานของคุณเองทำให้คุณควบคุมได้ดีขึ้นกว่าคนแปลกหน้าบางคน (me) ในความเป็นจริงฉันแนะนำให้คนใช้ Town Town ที่ไม่น่าเชื่อถือของตัวเองและได้เผยแพร่แหล่งข้อมูลบน GitHub: github.com/alestic/alestic-unreliable-town-clock
Eric Hammond

4

เนื่องจากตอนนี้เป็นไปได้ที่จะเรียกใช้ฟังก์ชั่นแลมบ์ดาผ่าน HTTP (เช่นการใช้ GET หรือขด) ได้อย่างง่ายดายโซลูชั่นที่ง่ายคือการใช้ CRON ที่มีการจัดการเช่น easycron: https://www.easycron.com/เพื่อให้ฟังก์ชั่นแลมบ์ดาของคุณทำงาน

เรามีปัญหาเดียวกันและลงเอยด้วยการใช้บริการ cron บน Google App Engine ใน python เนื่องจากอนุญาตให้มีความยืดหยุ่นและความซับซ้อนมากขึ้นในงาน CRON


เวลามีการเปลี่ยนแปลงและแลมบ์ดาในขณะนี้สนับสนุน cron ประเภทการจัดตารางการออกกล่องdocs.aws.amazon.com/lambda/latest/dg/with-scheduled-events.html
เดิร์คคอนราด Coetsee

2

ในหน้าฟังก์ชั่นเพิ่มทริกเกอร์คุณสามารถเพิ่มกิจกรรม CloudWatch และทำให้เป็นประเภทกำหนดการ

ป้อนคำอธิบายรูปภาพที่นี่


1

คุณสามารถกำหนดเวลาด้วยกิจกรรม cloudWatch ได้เช่นกัน สร้างกฎ -> แนบเป้าหมาย (แลมบ์ดา) และตั้งค่ากำหนดการ cron / rate อย่างชาญฉลาดในกฎของคุณ


1

วิธีคอนโซลบนเว็บค่อนข้างตรงไปตรงมา เพียงแค่สร้างCloudWatchกฎสำหรับแลมบ์ดาและเพิ่มไว้ในTriggersแท็บแลมบ์ดา

สำหรับผู้ที่ต้องการอัตโนมัติด้วยaws cliเราสามารถ

  1. สร้างฟังก์ชั่น
  2. สร้างกฎ
  3. อนุญาต
  4. กฎลิงค์และฟังก์ชั่น

สร้างฟังก์ชั่น

aws lambda create-function --function-name ${FUNCTION-NAME} \
--runtime java8 \
--role 'arn:aws:iam::${Account}:role/${ROLE}' \
--handler org.yourCompany.LambdaApp \
--code '{"S3Bucket":"yourBucket", "S3Key": "RC/yourapp.jar"}' \
--description 'check hive connection' \
--timeout 180 \
--memory-size 384 \
--publish \
--vpc-config '{"SubnetIds": ["subnet-1d2e3435", "subnet-0df4547a"], "SecurityGroupIds": ["sg-cb17b1ae", "sg-0e7ae277"]}' \
--environment Variables={springEnv=dev}

สร้างกฎ

## create
aws events put-rule --name ${ruleName} \
--schedule-expression 'rate(5 minutes)' \
--state ENABLED \
--description 'check hive connection'

# grant permission to the Rule to allow it to trigger the function
aws lambda add-permission --function-name ${functionName} \
--statement-id 123 \
--action 'lambda:InvokeFunction' \
--principal events.amazonaws.com \
--source-arn arn:aws:events:us-east-1:acc:rule/${ruleName}

# link rule and function
aws events put-targets --rule ${ruleName} \
--targets '[{"Id":"1", "Arn":"arn:aws:lambda:us-east-1:acc:function:RC-checkhive"}]'

1

วิธีง่ายๆในการเรียกใช้คิวรีของคุณในแลมบ์ดาสำหรับช่วงเวลาเฉพาะคือการกำหนดกฎสำหรับฟังก์ชั่นแลมบ์ดาของคุณ สำหรับสิ่งนั้นหลังจากสร้างฟังก์ชั่นแลมบ์ดาไปที่ cloudwatch >> rules >> schedule และกำหนดการแสดงออก cron และในส่วนเป้าหมายเลือกฟังก์ชั่นแลมบ์ดาที่คุณต้องการที่จะเรียก


0

ในขณะที่สร้างฟังก์ชั่นแลมบ์ดาทริกเกอร์ "เหตุการณ์ CloudWatch - กำหนดการ"

ตอนนี้คุณสามารถใช้การตั้งค่าล่วงหน้า AWS ในนิพจน์กำหนดเวลาเช่น rate = 15 นาทีหรือคุณสามารถใช้นิพจน์ cron

ป้อนคำอธิบายรูปภาพที่นี่

สำหรับความต้องการของคุณกำหนดการ Cron คือ "0 0 17 1/1 *? *"


-1

Diksha คือ AWS แลมบ์ดาตารางเวลาขึ้นอยู่กับ AWS SWF Trigger ตามคำแนะนำของทีม AWS หนึ่งสามารถกำหนดเวลางานโดยใช้การแสดงออก cron และยังสามารถระบุจำนวนเวลาที่คุณต้องการเรียกใช้เมื่อใดที่จะเริ่มหรือเมื่อสิ้นสุด คุณสามารถดูสถานะเช่นเดียวกับประวัติของงานที่กำหนด ความปลอดภัยได้รับการจัดการโดยนโยบาย AWS

เมื่อคุณตั้งค่าเครื่องยนต์ diksha คุณสามารถกำหนดเวลาฟังก์ชั่นโดยใช้นิพจน์ cron ในวิธีต่อไปนี้:

java -jar diksha-client-0.0.1.jar -lcfg cf1 -cj "jobName | functionName | context | 0 0-59 * * * * | 10"

ในงานนี้จะทำงานทุกนาทีเป็นเวลา 10 ครั้ง AWS SWF จะเรียกใช้ฟังก์ชันด้วยตัวเอง

รายละเอียด: https://github.com/milindparikh/diksha

คำเตือน: ฉันเป็นผู้มีส่วนร่วมในโครงการ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.