วิธีเริ่มและหยุดอินสแตนซ์ EC2 โดยใช้ Lambda

ฉันกำลังพยายามเริ่มและหยุดอินสแตนซ์ windows EC2 โดยใช้แลมบ์ดา ฉันใช้ Node.js 8.10 เพื่อเขียนสคริปต์เริ่มต้นและหยุด เมื่อฉันทดสอบสคริปต์ สคริปต์จะดำเนินการได้สำเร็จ แต่อินสแตนซ์ EC2 จะไม่ได้รับผลกระทบ ฉัน ให้รายละเอียดอินสแตนซ์และสคริปต์ด้านล่าง

const AWS = require('aws-sdk');

exports.handler = async (event) => {

const ec2 = new AWS.EC2({ region: event.instanceRegion });
 ec2.stopInstances({ InstanceIds: [event.instanceId] }).promise()
    .then(() => callback(null, `Successfully stopped ${event.instanceId}`))
    .catch(err => callback(err));
};

สคริปต์ดำเนินการสำเร็จ

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

ด้านล่างนี้คือรายละเอียดอินสแตนซ์ ป้อนคำอธิบายรูปภาพที่นี่

นี่เป็นสคริปต์หยุด แต่ไม่สามารถหยุดอินสแตนซ์ได้ โปรดช่วยฉันด้วย ฉันยังใหม่กับ aws ขอบคุณล่วงหน้า


person Mandrek    schedule 31.07.2019    source แหล่งที่มา
comment
คุณต้องคืน ec2.stopInstances() สัญญา วิธีที่คุณทำอยู่ คุณกำลังคืนสัญญาที่ได้รับการแก้ไขแล้วแก่ผู้จัดการ แล้วคุณ .stopInstances() ก็ทำงานไม่เสร็จ   -  person guijob    schedule 31.07.2019
comment
@guijob คุณช่วยแก้ไขรหัสของฉันได้ไหม ฉันยังใหม่กับโหนดด้วย   -  person Mandrek    schedule 31.07.2019


คำตอบ (1)


เมื่อใช้ Lambda ฟังก์ชันตัวจัดการของคุณจะได้รับพารามิเตอร์สามตัว: เหตุการณ์ บริบท และการโทรกลับ คุณใช้ callback เมื่อใช้ฟังก์ชันซิงโครนัส เมื่อใช้ async คุณควรคืนสัญญา

const AWS = require('aws-sdk');

exports.handler = async (event, context, callback) => {

const ec2 = new AWS.EC2({ region: event.instanceRegion });
 return ec2.stopInstances({ InstanceIds: [event.instanceId] }).promise()
    .then(() => `Successfully stopped ${event.instanceId}`)
    .catch(err => console.log(err));
};

ในความเป็นจริง เมื่อคุณใช้คำหลัก async คุณกำลังส่งคืนสัญญา แต่การไม่คืนสิ่งใดเลย คุณกำลังแก้ไขปัญหาด้วยการตอบกลับ null ดังนั้นโค้ดของคุณจะสิ้นสุดลง และ stopInstances ของคุณจะไม่ทำงานให้เสร็จสิ้น

person guijob    schedule 31.07.2019
comment
หรือเพียงแค่ await ec2.stopInstances({ InstanceIds: [event.instanceId] }).promise() - person Thales Minussi; 31.07.2019
comment
มีวิธีแก้ไขปัญหาที่แตกต่างกันมากมายสำหรับเรื่องนี้ - person guijob; 31.07.2019
comment
ไม่แน่ใจว่าฉันยอมรับว่าแนวทาง .then().catch() สามารถเรียกได้ว่าเป็นวิธีแก้ปัญหา มันไม่สมเหตุสมผลอีกต่อไปเมื่อเรามี async/await มันใช้งานได้อย่างแน่นอน แต่ควรจะขมวดคิ้ว - person Thales Minussi; 31.07.2019