DynamoDB สตรีมด้วย Lambda

Dynamodb Stri Mdwy Lambda



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

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

คุณสามารถใช้ Lambda เพื่อเขียนโค้ดใน Node.js, Python, Java หรือ C# เพื่อประมวลผลบันทึกสตรีมและดำเนินการตามความเหมาะสม ประโยชน์หลักของการผสานรวม DynamoDB Streams กับ Lambda คือ Lambda ช่วยให้คุณสามารถเรียกใช้บริการสำรองหรือรหัสแอปพลิเคชันได้โดยไม่ต้องมีการดูแลระบบ







วิธีใช้สตรีม AWS DynamoDB กับ Lambda

แม้ว่าจะสามารถสร้างฟังก์ชัน Lambda ที่ใช้เหตุการณ์และการเกิดขึ้นจาก DynamoDB Stream ได้ แต่กระบวนการนี้อาจค่อนข้างยุ่งยาก โดยเฉพาะอย่างยิ่งในการพยายามครั้งแรกของคุณ ขั้นตอนต่อไปนี้จะช่วย:



ขั้นตอนที่ 1: ตรวจสอบให้แน่ใจว่าระบบของคุณตรงตามข้อกำหนดเบื้องต้น

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



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





aws – รุ่น

ผลลัพธ์สำหรับคำสั่งที่ระบุควรมีลักษณะดังนี้:

aws-cli/ 2 .x.x ไพธอน/ 3 .x.x ลินุกซ์/ 4 .x.x-xxx-std botocore/ 2 .x.x

การตอบสนองตัวอย่างที่กำหนดประกอบด้วย AWS CLI เวอร์ชันที่ติดตั้ง ( aws-cli/2.x.x ) รุ่น Python ( ไพธอน/3.x.x ) และระบบปฏิบัติการ ( ลินุกซ์/4.x.x-xxx-std ). ส่วนสุดท้ายของการตอบสนองจะกำหนดเวอร์ชันของไลบรารี Botocore ที่ AWS CLI ของคุณทำงาน ( โบโตคอร์/2.x.x ).



คุณจะจบลงด้วยสิ่งนี้:

ขั้นตอนที่ 2: สร้างบทบาทการดำเนินการ

ขั้นตอนต่อไปคือการสร้างบทบาทการดำเนินการใน AWS CLI บทบาทการดำเนินการคือบทบาท AWS Identity and Access Management (IAM) ที่ใช้บริการของ AWS เพื่อดำเนินการในนามของคุณ ช่วยให้คุณเข้าถึงทรัพยากร AWS ที่คุณต้องการไปพร้อมกัน

คุณสามารถสร้างบทบาทโดยใช้คำสั่งต่อไปนี้:

aws iam สร้างบทบาท \

--ชื่อบทบาท LambdaDynamoDBExecutionRole \

--assume-role-policy-document file://assume-role-policy.json \

--คำอธิบาย 'บทบาท AWSLambdaDynamoDBExecution' \

--ชื่อบริการ lambda.amazonaws.com

คำสั่งก่อนหน้านี้คือคำสั่ง AWS CLI เพื่อสร้างบทบาท คุณยังสามารถใช้ Amazon Management Console เพื่อสร้างบทบาทได้อีกด้วย เมื่อคุณอยู่ที่คอนโซล IAM ให้เปิด บทบาท หน้าและคลิกที่ สร้างบทบาท ปุ่ม.

ดำเนินการต่อเพื่อป้อนข้อมูลต่อไปนี้:

  • นิติบุคคลที่เชื่อถือได้: แลมบ์ดา
  • ชื่อบทบาท: lambda-dynamodb-role
  • สิทธิ์: AWSLambdaDynamoDBExecutionRole

คุณยังสามารถใช้ Python ได้โดยการติดตั้ง AWS SDK สำหรับ Python ก่อน:

pip ติดตั้ง boto3

ขั้นตอนที่ 3: เปิดใช้งานสตรีม DynamoDB บนโต๊ะของคุณ

คุณต้องเปิดใช้งานสตรีม DynamoDB บนโต๊ะของคุณ สำหรับภาพประกอบนี้ เราใช้ Boto3, AWS SDK สำหรับ Python คำสั่งต่อไปนี้จะช่วย:

นำเข้า boto3

# เชื่อมต่อกับบริการ DynamoDB
dynamodb = boto3.client( 'ไดนาโมดับบ์' )

# เปิดใช้งานสตรีม DynamoDB บนตาราง 'my-table'
การตอบสนอง = dynamodb.update_table (
ชื่อตาราง= 'มายเทเบิ้ล' ,
StreamSpecification={
'เปิดใช้งานสตรีม' : จริง,
'StreamViewType' : 'NEW_AND_OLD_IMAGES'
}
)

# ตรวจสอบการตอบสนองเพื่อให้แน่ใจว่าสตรีมเปิดใช้งานสำเร็จ
ถ้าตอบสนอง [ 'ข้อมูลจำเพาะของสตรีม' ][ 'เปิดใช้งานสตรีม' ]:
พิมพ์( 'เปิดใช้งานสตรีม DynamoDB สำเร็จ' )
อื่น:
พิมพ์( 'ข้อผิดพลาดในการเปิดใช้งานสตรีม DynamoDB' )

รหัสนี้เปิดใช้งานสตรีม DynamoDB บนตาราง “mytable” ที่สตรีมทั้งรูปภาพเก่าและใหม่ของรายการทันทีที่มีการเปลี่ยนแปลงใดๆ เกิดขึ้น คุณสามารถเลือกที่จะสตรีมรูปภาพใหม่ทันทีที่ StreamViewType เป็น “NEW_IMAGE”

โดยเฉพาะอย่างยิ่ง การรันโค้ดนี้อาจเปิดใช้งานการสตรีมในตารางของคุณหลังจากนั้นสักครู่เท่านั้น กระบวนการนี้อาจใช้เวลาสักครู่ คุณสามารถใช้วิธีการ Description_table เพื่อตรวจสอบสถานะของสตรีม

ขั้นตอนที่ 4: สร้างฟังก์ชันแลมบ์ดา

ขั้นตอนต่อไปคือการสร้างฟังก์ชัน Lambda ที่ทริกเกอร์สตรีม DynamoDB ขั้นตอนต่อไปนี้จะช่วยได้:

  • เปิดคอนโซล AWS Lambda แล้วคลิกแท็บ “สร้างฟังก์ชัน” ในหน้า 'สร้างฟังก์ชัน' เลือก 'เขียนตั้งแต่ต้น' แล้วป้อนชื่อสำหรับฟังก์ชันของคุณ คุณต้องป้อนรันไทม์ ณ จุดนี้ด้วย เราเลือก Python สำหรับภาพประกอบนี้
  • ภายใต้ 'เลือกหรือสร้างบทบาทการดำเนินการ' เลือก 'สร้างบทบาทใหม่ด้วยสิทธิ์แลมบ์ดาพื้นฐาน' เพื่อสร้างบทบาท IAM พร้อมสิทธิ์ที่จำเป็นสำหรับฟังก์ชันแลมบ์ดาของคุณ
  • คลิกปุ่ม “สร้างฟังก์ชัน” เพื่อสร้างฟังก์ชัน Lambda ของคุณ
  • ในหน้า 'การกำหนดค่า' สำหรับฟังก์ชันของคุณ ให้เลื่อนลงไปที่ส่วน 'ตัวออกแบบ' แล้วคลิกแท็บ 'เพิ่มทริกเกอร์'
  • ในช่อง 'การกำหนดค่าทริกเกอร์' ที่ปรากฏขึ้น เลือก 'DynamoDB' จากเมนูแบบเลื่อนลง 'ทริกเกอร์'
  • เลือกตาราง DynamoDB ที่คุณต้องการใช้เพื่อทริกเกอร์ฟังก์ชัน เมื่อทำเสร็จแล้ว ให้เลือกว่าคุณต้องการให้ฟังก์ชันทริกเกอร์ในการอัปเดตทั้งหมดของตารางหรือเฉพาะในการอัปเดตเฉพาะ (เช่น การอัปเดตในคอลัมน์ใดคอลัมน์หนึ่ง)
  • คลิกปุ่ม 'เพิ่ม' เพื่อสร้างทริกเกอร์
  • ในโปรแกรมแก้ไข 'โค้ดฟังก์ชัน' ให้เขียนโค้ด Python สำหรับฟังก์ชันของคุณ คุณสามารถใช้อ็อบเจกต์เหตุการณ์ที่ส่งผ่านไปยังฟังก์ชันของคุณเพื่อเข้าถึงข้อมูลที่เรียกใช้ฟังก์ชัน
  • คลิกปุ่ม 'บันทึก' เพื่อบันทึกฟังก์ชัน

นั่นคือทั้งหมดที่เกิดขึ้นเมื่อสร้างฟังก์ชัน Lambda! ขณะนี้ ฟังก์ชันของคุณถูกเรียกใช้เมื่อใดก็ตามที่มีการอัปเดตไปยังตาราง DynamoDB ที่ระบุ

ต่อไปนี้เป็นตัวอย่างของฟังก์ชัน Python อย่างง่ายที่สตรีม DynamoDB สามารถทริกเกอร์ได้:

def lambda_handler (เหตุการณ์ บริบท):

สำหรับบันทึกในเหตุการณ์[ 'บันทึก' ]:

พิมพ์ (บันทึก [ 'ไดนาโมดับบ์' ][ 'ภาพใหม่' ])

ฟังก์ชันนี้ทำซ้ำผ่านเรกคอร์ดในออบเจกต์เหตุการณ์ และพิมพ์รูปภาพใหม่ของรายการในตาราง DynamoDB ที่ทริกเกอร์ฟังก์ชัน

ขั้นตอนที่ 5: ทดสอบฟังก์ชันแลมบ์ดา

หากต้องการทดสอบฟังก์ชัน Lambda ที่สตรีม DynamoDB สามารถทริกเกอร์ได้ คุณสามารถใช้ โบโต3 ไลบรารีเพื่อเข้าถึง DynamoDB API และ เรียกใช้ วิธีการของ แลมบ์ดา ไคลเอ็นต์เพื่อทริกเกอร์ฟังก์ชัน

นี่คือตัวอย่างวิธีการ:

นำเข้า boto3

# เชื่อมต่อกับบริการ DynamoDB
dynamodb = boto3.client( 'ไดนาโมดับบ์' )

# เชื่อมต่อกับบริการแลมบ์ดา
lambda_client = boto3.client( 'แลมบ์ดา' )

# แทรกรายการลงในตาราง 'my-table'
การตอบสนอง = dynamodb.put_item(
ชื่อตาราง= 'มายเทเบิ้ล' ,
รายการ={
'รหัส' :{ 'น' : '123' },
'ชื่อ' :{ 'เอส' : 'โจเอล ออสติน},
'
อายุ ':{' เอ็น ':' 3. 4 '}
}
)

# ตรวจสอบการตอบกลับเพื่อให้แน่ใจว่าใส่รายการเรียบร้อยแล้ว
ถ้าตอบสนอง ['
การตอบสนองข้อมูลเมตา '][' HTTPStatusCode '] == 200:
พิมพ์('ใส่รายการเรียบร้อยแล้ว')
อื่น:
พิมพ์ ('ข้อผิดพลาดในการใส่รายการ')

# ทริกเกอร์ฟังก์ชันแลมบ์ดาที่สมัครเป็นสมาชิก '
ตารางของฉัน ' ตาราง
การตอบสนอง = lambda_client.invoke(
ชื่อฟังก์ชัน='
ฟังก์ชั่นของฉัน ',
InvocationType='
เหตุการณ์ ',
LogType='
หาง ',
น้ำหนักบรรทุก='
{ 'บันทึก' :[{ 'ไดนามอด' :{ 'ภาพใหม่' :{ 'รหัส' :{ 'น' : '123' }, 'ชื่อ' :{ 'เอส' : 'โจเอล ออสติน' }, 'อายุ' :{ 'น' : '3. 4' }}}}]} '
)

# ตรวจสอบการตอบสนองเพื่อให้แน่ใจว่าฟังก์ชั่นถูกเรียกสำเร็จ
ถ้าตอบสนอง ['
รหัสสถานะ '] == 202:
พิมพ์('เรียกใช้ฟังก์ชันแลมบ์ดาสำเร็จ')
อื่น:
พิมพ์ ('เกิดข้อผิดพลาดในการเรียกใช้ฟังก์ชัน Lambda')

รหัสนี้จะแทรกรายการลงใน มายเทเบิ้ล ตารางแล้วทริกเกอร์ ฟังก์ชั่นของฉัน ฟังก์ชันแลมบ์ดาโดยส่งเพย์โหลดเหตุการณ์ตัวอย่างไปยังฟังก์ชันโดยใช้ เรียกใช้ กระบวนการ. เพย์โหลดเหตุการณ์จะจำลองเหตุการณ์สตรีม DynamoDB ที่มีรูปภาพใหม่ของรายการที่เพิ่งแทรกเข้าไป

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

บทสรุป

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