TL;DR
AWS Lambda API ช่วยให้นักพัฒนาสามารถปรับใช้ จัดการ และเรียกใช้ฟังก์ชันไร้เซิร์ฟเวอร์ด้วยโปรแกรมได้ ใช้การรับรองความถูกต้องด้วย IAM, ปลายทาง RESTful สำหรับการจัดการฟังก์ชัน, ตัวเลือกการเรียกใช้แบบอะซิงโครนัสและซิงโครนัส พร้อมขีดจำกัดการทำงานพร้อมกันในระดับบัญชี คู่มือนี้ครอบคลุมการตั้งค่าการรับรองความถูกต้อง, การปรับใช้ฟังก์ชัน, รูปแบบการเรียกใช้, การจับคู่แหล่งที่มาของเหตุการณ์ และกลยุทธ์สถาปัตยกรรมไร้เซิร์ฟเวอร์สำหรับการผลิต
บทนำ
AWS Lambda ประมวลผลคำขอหลายล้านล้านครั้งต่อเดือนสำหรับผู้ใช้งานที่แอคทีฟกว่า 1 ล้านราย สำหรับนักพัฒนาที่สร้างแอปพลิเคชันไร้เซิร์ฟเวอร์, เครื่องมืออัตโนมัติ หรือสถาปัตยกรรมที่ขับเคลื่อนด้วยเหตุการณ์ การผสานรวม Lambda API ไม่ใช่ทางเลือก—แต่เป็นสิ่งสำคัญสำหรับโครงสร้างพื้นฐานในรูปแบบโค้ด (Infrastructure as Code) และไปป์ไลน์ CI/CD
นี่คือความเป็นจริง: ทีมที่จัดการฟังก์ชัน Lambda มากกว่า 50 ฟังก์ชันด้วยตนเองจะเสียเวลา 10-15 ชั่วโมงต่อสัปดาห์ไปกับการปรับใช้, การอัปเดตการกำหนดค่า และการตรวจสอบ การผสานรวม Lambda API ที่แข็งแกร่งจะช่วยให้การปรับใช้อัตโนมัติ, การใช้งานการเปิดตัวแบบ blue-green และการปรับขนาดแบบไดนามิกตามความต้องการ
คู่มือนี้จะพาคุณผ่านกระบวนการผสานรวม AWS Lambda API ที่สมบูรณ์ คุณจะได้เรียนรู้การรับรองความถูกต้องของ IAM, การสร้างและการปรับใช้ฟังก์ชัน, รูปแบบการเรียกใช้ (ซิงค์/อะซิงค์), การจับคู่แหล่งที่มาของเหตุการณ์, สถาปัตยกรรมแบบเลเยอร์ และกลยุทธ์การปรับใช้สำหรับการผลิต เมื่อจบคู่มือนี้ คุณจะมีการผสานรวม Lambda ที่พร้อมสำหรับการใช้งานจริง
AWS Lambda API คืออะไร?
AWS Lambda มี RESTful API สำหรับการจัดการฟังก์ชันประมวลผลแบบไร้เซิร์ฟเวอร์ API จะจัดการ:
- การสร้าง อัปเดต และลบฟังก์ชัน
- การปรับใช้โค้ดและการกำหนดเวอร์ชัน
- การเรียกใช้ฟังก์ชัน (แบบซิงโครนัสและอะซิงโครนัส)
- การจับคู่แหล่งที่มาของเหตุการณ์ (SQS, Kinesis, DynamoDB, S3)
- การจัดการเลเยอร์สำหรับโค้ดที่ใช้ร่วมกัน
- การกำหนดค่า Alias และการกำหนดเส้นทาง
- การจัดการการทำงานพร้อมกันและความจุที่สำรองไว้
- การผสานรวมการบันทึกและตรวจสอบ
คุณสมบัติหลัก
| คุณสมบัติ | คำอธิบาย |
|---|---|
| RESTful API | ปลายทาง HTTPS มาตรฐาน |
| การรับรองความถูกต้องด้วย IAM | AWS Signature Version 4 |
| การเรียกใช้แบบอะซิงค์ | การประมวลผลเหตุการณ์แบบ Fire-and-forget |
| การเรียกใช้แบบซิงค์ | รูปแบบ Request-response |
| แหล่งที่มาของเหตุการณ์ | การผสานรวมบริการ AWS กว่า 200 รายการ |
| เลเยอร์ | โค้ดและส่วนประกอบที่ใช้ร่วมกัน |
| เวอร์ชัน/Alias | การเปลี่ยนเส้นทางการรับส่งข้อมูลและ Rollback |
| Provisioned Concurrency | ลด Cold Start |
การรองรับ Runtime ของ Lambda
| Runtime | เวอร์ชัน | กรณีการใช้งาน |
|---|---|---|
| Node.js | 18.x, 20.x | แบ็คเอนด์ API, การประมวลผลเหตุการณ์ |
| Python | 3.9, 3.10, 3.11 | การประมวลผลข้อมูล, การอนุมาน ML |
| Java | 11, 17, 21 | แอปพลิเคชันองค์กร |
| Go | 1.x | API ประสิทธิภาพสูง |
| Rust | 1.x | ฟังก์ชันที่มี Latency ต่ำ |
| .NET | 6, 8 | เวิร์กโหลด Windows |
| Ruby | 3.x | เว็บแอปพลิเคชัน |
| Custom | ใดๆ | Runtimes แบบคอนเทนเนอร์ |
ภาพรวมสถาปัตยกรรม API
Lambda ใช้โครงสร้าง API บริการของ AWS:
https://lambda.{region}.amazonaws.com/2015-03-31/
เวอร์ชัน API
| เวอร์ชัน | สถานะ | กรณีการใช้งาน |
|---|---|---|
| 2015-03-31 | ปัจจุบัน | การทำงานทั้งหมดของ Lambda |
| 2018-01-31 | Runtime API | อินเทอร์เฟซ Runtime แบบกำหนดเอง |
เริ่มต้นใช้งาน: การตั้งค่าการรับรองความถูกต้อง
ขั้นตอนที่ 1: สร้างบัญชี AWS และผู้ใช้ IAM
ก่อนเข้าถึง API:
- ไปที่ AWS Console
- สร้างบัญชี AWS
- ไปที่ IAM Console > ผู้ใช้ > สร้างผู้ใช้
- แนบนโยบายการดำเนินการ Lambda
ขั้นตอนที่ 2: สร้างข้อมูลประจำตัว IAM
สร้าง Access Key สำหรับการเข้าถึงด้วยโปรแกรม:
# AWS CLI method
aws iam create-access-key --user-name lambda-deployer
# Output: Store these securely
{
"AccessKey": {
"AccessKeyId": "AKIAIOSFODNN7EXAMPLE",
"SecretAccessKey": "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY"
}
}
หมายเหตุความปลอดภัย: จัดเก็บข้อมูลประจำตัวอย่างปลอดภัย:
# ~/.aws/credentials
[lambda-deployer]
aws_access_key_id = AKIAIOSFODNN7EXAMPLE
aws_secret_access_key = wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
# Or use environment variables
export AWS_ACCESS_KEY_ID="AKIAIOSFODNN7EXAMPLE"
export AWS_SECRET_ACCESS_KEY="wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY"
export AWS_DEFAULT_REGION="us-east-1"
ขั้นตอนที่ 3: ทำความเข้าใจ AWS Signature Version 4
คำขอ Lambda API ทั้งหมดต้องมีการลงนามด้วย SigV4:
const crypto = require('crypto');
class AWSSigner {
constructor(accessKeyId, secretAccessKey, region, service = 'lambda') {
this.accessKeyId = accessKeyId;
this.secretAccessKey = secretAccessKey;
this.region = region;
this.service = service;
}
sign(request, body = null) {
const now = new Date();
const amzDate = now.toISOString().replace(/[:-]|\.\d{3}/g, '');
const dateStamp = amzDate.slice(0, 8);
// Task 1: Create canonical request
const hashedPayload = body ? crypto.createHash('sha256').update(body).digest('hex') : 'UNSIGNED-PAYLOAD';
const canonicalUri = request.path;
const canonicalQuerystring = request.query || '';
const canonicalHeaders = `host:${request.host}\nx-amz-date:${amzDate}\n`;
const signedHeaders = 'host;x-amz-date';
const canonicalRequest = `${request.method}\n${canonicalUri}\n${canonicalQuerystring}\n${canonicalHeaders}\n${signedHeaders}\n${hashedPayload}`;
// Task 2: Create string to sign
const algorithm = 'AWS4-HMAC-SHA256';
const credentialScope = `${dateStamp}/${this.region}/${this.service}/aws4_request`;
const hash = crypto.createHash('sha256').update(canonicalRequest).digest('hex');
const stringToSign = `${algorithm}\n${amzDate}\n${credentialScope}\n${hash}`;
// Task 3: Calculate signature
const kDate = this.hmac(`AWS4${this.secretAccessKey}`, dateStamp);
const kRegion = this.hmac(kDate, this.region);
const kService = this.hmac(kRegion, this.service);
const kSigning = this.hmac(kService, 'aws4_request');
const signature = this.hmac(kSigning, stringToSign, 'hex');
// Task 4: Add authorization header
const authorizationHeader = `${algorithm} Credential=${this.accessKeyId}/${credentialScope}, SignedHeaders=${signedHeaders}, Signature=${signature}`;
return {
'Authorization': authorizationHeader,
'X-Amz-Date': amzDate,
'X-Amz-Content-Sha256': hashedPayload
};
}
hmac(key, string, encoding = 'buffer') {
return crypto.createHmac('sha256', key).update(string).digest(encoding);
}
}
// Usage
const signer = new AWSSigner(
process.env.AWS_ACCESS_KEY_ID,
process.env.AWS_SECRET_ACCESS_KEY,
'us-east-1'
);
ขั้นตอนที่ 4: สร้าง Lambda API Client
const LAMBDA_BASE_URL = 'https://lambda.us-east-1.amazonaws.com/2015-03-31';
const lambdaRequest = async (path, options = {}) => {
const url = new URL(`${LAMBDA_BASE_URL}${path}`);
const method = options.method || 'GET';
const body = options.body ? JSON.stringify(options.body) : null;
const signer = new AWSSigner(
process.env.AWS_ACCESS_KEY_ID,
process.env.AWS_SECRET_ACCESS_KEY,
'us-east-1'
);
const headers = signer.sign({ method, host: 'lambda.us-east-1.amazonaws.com', path }, body);
const response = await fetch(url.toString(), {
method,
headers: {
'Content-Type': 'application/json',
...headers,
...options.headers
},
body
});
if (!response.ok) {
const error = await response.json();
throw new Error(`Lambda API Error: ${error.Message}`);
}
return response.json();
};
// Usage
const functions = await lambdaRequest('/functions');
console.log(`Found ${functions.Functions.length} functions`);
ทางเลือก: ใช้ AWS SDK
สำหรับการใช้งานจริง AWS SDK จะจัดการการลงนามโดยอัตโนมัติ:
const { LambdaClient, ListFunctionsCommand, CreateFunctionCommand, InvokeCommand } = require('@aws-sdk/client-lambda');
const lambda = new LambdaClient({ region: 'us-east-1' });
// List functions
const listCommand = new ListFunctionsCommand({});
const result = await lambda.send(listCommand);
// Create function
const createCommand = new CreateFunctionCommand({
FunctionName: 'my-function',
Runtime: 'nodejs20.x',
Role: 'arn:aws:iam::123456789012:role/lambda-execution-role',
Handler: 'index.handler',
Code: {
S3Bucket: 'my-bucket',
S3Key: 'function.zip'
}
});
const fn = await lambda.send(createCommand);
การจัดการฟังก์ชัน
การสร้างฟังก์ชัน
สร้างฟังก์ชัน Lambda ผ่าน API:
const createFunction = async (functionConfig) => {
const response = await lambdaRequest('/functions', {
method: 'POST',
body: {
FunctionName: functionConfig.name,
Runtime: functionConfig.runtime || 'nodejs20.x',
Role: functionConfig.roleArn,
Handler: functionConfig.handler || 'index.handler',
Code: {
S3Bucket: functionConfig.s3Bucket,
S3Key: functionConfig.s3Key
},
Description: functionConfig.description || '',
Timeout: functionConfig.timeout || 3,
MemorySize: functionConfig.memorySize || 128,
Environment: {
Variables: functionConfig.environment || {}
},
Tags: functionConfig.tags || {}
}
});
return response;
};
// Usage
const fn = await createFunction({
name: 'order-processor',
roleArn: 'arn:aws:iam::123456789012:role/lambda-execution-role',
handler: 'index.handler',
runtime: 'nodejs20.x',
s3Bucket: 'my-deployments-bucket',
s3Key: 'order-processor/v1.0.0.zip',
description: 'Process orders from SQS queue',
timeout: 30,
memorySize: 512,
environment: {
DB_HOST: 'db.example.com',
LOG_LEVEL: 'info'
}
});
console.log(`Function created: ${fn.FunctionArn}`);
การอัปโหลดโค้ดโดยตรง
สำหรับฟังก์ชันขนาดเล็ก (บีบอัดแล้ว <50MB):
const fs = require('fs');
const path = require('path');
const createFunctionWithZip = async (functionName, zipPath) => {
const zipBuffer = fs.readFileSync(zipPath);
const base64Code = zipBuffer.toString('base64');
const response = await lambdaRequest('/functions', {
method: 'POST',
body: {
FunctionName: functionName,
Runtime: 'nodejs20.x',
Role: 'arn:aws:iam::123456789012:role/lambda-execution-role',
Handler: 'index.handler',
Code: {
ZipFile: base64Code
}
}
});
return response;
};
// Package function
// zip -r function.zip index.js node_modules/
await createFunctionWithZip('my-function', './function.zip');
การอัปเดตโค้ดฟังก์ชัน
ปรับใช้โค้ดเวอร์ชันใหม่:
const updateFunctionCode = async (functionName, updateConfig) => {
const response = await lambdaRequest(`/functions/${functionName}/code`, {
method: 'PUT',
body: {
S3Bucket: updateConfig.s3Bucket,
S3Key: updateConfig.s3Key,
Publish: updateConfig.publish || false
}
});
return response;
};
// Usage
const updated = await updateFunctionCode('order-processor', {
s3Bucket: 'my-deployments-bucket',
s3Key: 'order-processor/v1.1.0.zip',
publish: true // Create new version
});
console.log(`Updated to version: ${updated.Version}`);
การอัปเดตการกำหนดค่าฟังก์ชัน
แก้ไข timeout, memory, environment:
const updateFunctionConfig = async (functionName, config) => {
const response = await lambdaRequest(`/functions/${functionName}/configuration`, {
method: 'PUT',
body: {
Runtime: config.runtime,
Handler: config.handler,
Description: config.description,
Timeout: config.timeout,
MemorySize: config.memorySize,
Environment: {
Variables: config.environment
}
}
});
return response;
};
// Usage
const updated = await updateFunctionConfig('order-processor', {
timeout: 60,
memorySize: 1024,
environment: {
DB_HOST: 'new-db.example.com',
LOG_LEVEL: 'debug'
}
});
การลบฟังก์ชัน
ลบฟังก์ชัน:
const deleteFunction = async (functionName, qualifier = null) => {
const path = qualifier
? `/functions/${functionName}?Qualifier=${qualifier}`
: `/functions/${functionName}`;
await lambdaRequest(path, { method: 'DELETE' });
console.log(`Function ${functionName} deleted`);
};
การเรียกใช้ฟังก์ชัน
การเรียกใช้แบบซิงโครนัส (Request-Response)
เรียกใช้ฟังก์ชันและรอการตอบกลับ:
const invokeFunction = async (functionName, payload, qualifier = null) => {
const path = qualifier
? `/functions/${functionName}/invocations?Qualifier=${qualifier}`
: `/functions/${functionName}/invocations`;
const response = await lambdaRequest(path, {
method: 'POST',
headers: {
'X-Amz-Invocation-Type': 'RequestResponse', // Synchronous
'X-Amz-Log-Type': 'Tail' // Include logs
},
body: payload
});
// Parse response
const result = JSON.parse(Buffer.from(response.Payload).toString());
const logs = Buffer.from(response.LogResult, 'base64').toString();
return { result, logs };
};
// Usage
const { result, logs } = await invokeFunction('order-processor', {
orderId: 'ORD-12345',
customerId: 'CUST-67890',
items: [
{ sku: 'PROD-001', quantity: 2 },
{ sku: 'PROD-002', quantity: 1 }
]
});
console.log(`Result: ${JSON.stringify(result)}`);
console.log(`Logs:\n${logs}`);
การเรียกใช้แบบอะซิงโครนัส (Fire-and-Forget)
เรียกใช้ฟังก์ชันโดยไม่ต้องรอ:
const invokeAsync = async (functionName, payload) => {
const response = await lambdaRequest(`/functions/${functionName}/invocations`, {
method: 'POST',
headers: {
'X-Amz-Invocation-Type': 'Event', // Asynchronous
'X-Amz-Log-Type': 'None'
},
body: payload
});
return {
statusCode: response.StatusCode,
executionId: response['X-Amz-Execution-Id']
};
};
// Usage - trigger async processing
const result = await invokeAsync('email-sender', {
to: 'customer@example.com',
template: 'order-confirmation',
data: { orderId: 'ORD-12345' }
});
console.log(`Async invocation ID: ${result.executionId}`);
การเรียกใช้แบบ Dry Run
ทดสอบสิทธิ์โดยไม่ต้องดำเนินการ:
const dryRunInvocation = async (functionName) => {
const response = await lambdaRequest(`/functions/${functionName}/invocations`, {
method: 'POST',
headers: {
'X-Amz-Invocation-Type': 'DryRun'
}
});
return response;
};
// Usage - verify IAM permissions
try {
await dryRunInvocation('order-processor');
console.log('Invocation permissions OK');
} catch (error) {
console.error('Permission denied:', error.message);
}
ประเภทการตอบกลับการเรียกใช้
| ประเภทการเรียกใช้ | พฤติกรรม | กรณีการใช้งาน |
|---|---|---|
RequestResponse |
ซิงค์, รอผลลัพธ์ | การเรียกใช้ API, คำสั่ง CLI |
Event |
อะซิงค์, ไม่ต้องรอผลลัพธ์ | การประมวลผลเหตุการณ์, การแจ้งเตือน |
DryRun |
ทดสอบสิทธิ์เท่านั้น | การตรวจสอบ, การดีบัก |
การจัดการเวอร์ชันและ Alias
การเผยแพร่เวอร์ชัน
สร้างเวอร์ชันฟังก์ชันที่ไม่สามารถเปลี่ยนแปลงได้:
const publishVersion = async (functionName, description = null) => {
const response = await lambdaRequest(`/functions/${functionName}/versions`, {
method: 'POST',
body: description ? { Description: description } : {}
});
return response;
};
// Usage
const version = await publishVersion('order-processor', 'v1.2.0 - Add tax calculation');
console.log(`Published version: ${version.Version}`);
การสร้าง Alias
สร้างตัวชี้แบบมีชื่อไปยังเวอร์ชัน:
const createAlias = async (functionName, aliasName, version, description = null) => {
const response = await lambdaRequest(`/functions/${functionName}/aliases`, {
method: 'POST',
body: {
Name: aliasName,
FunctionVersion: version,
Description: description
}
});
return response;
};
// Usage - Create production alias
const prodAlias = await createAlias('order-processor', 'prod', '5', 'Production version');
console.log(`Alias ARN: ${prodAlias.AliasArn}`);
การเปลี่ยนเส้นทางการรับส่งข้อมูลด้วย Routing Config
ค่อยๆ เปลี่ยนเส้นทางการรับส่งข้อมูลไปยังเวอร์ชันใหม่:
const updateAliasWithRouting = async (functionName, aliasName, routingConfig) => {
const response = await lambdaRequest(`/functions/${functionName}/aliases/${aliasName}`, {
method: 'PUT',
body: {
RoutingConfig: {
AdditionalVersionWeights: routingConfig
}
}
});
return response;
};
// Usage - 10% traffic to version 6, 90% to version 5
await updateAliasWithRouting('order-processor', 'prod', {
'6': 0.1
});
// After validation, shift to 100%
await updateAliasWithRouting('order-processor', 'prod', {});
กรณีการใช้งาน Alias
| Alias | เวอร์ชัน | วัตถุประสงค์ |
|---|---|---|
dev |
$LATEST | การทดสอบการพัฒนา |
staging |
ทดสอบล่าสุด | การตรวจสอบ QA |
prod |
เวอร์ชันเสถียร | การรับส่งข้อมูลในการผลิต |
blue |
Prod ปัจจุบัน | การปรับใช้แบบ Blue-green |
green |
เวอร์ชันใหม่ | การปรับใช้แบบ Blue-green |
การจับคู่แหล่งที่มาของเหตุการณ์
การสร้าง SQS Trigger
เชื่อมต่อ SQS queue กับ Lambda:
const createSQSEventSource = async (functionName, queueArn, batchSize = 10) => {
const response = await lambdaRequest('/event-source-mappings', {
method: 'POST',
body: {
EventSourceArn: queueArn,
FunctionName: functionName,
BatchSize: batchSize,
Enabled: true
}
});
return response;
};
// Usage
const mapping = await createSQSEventSource(
'order-processor',
'arn:aws:sqs:us-east-1:123456789012:orders-queue',
10
);
console.log(`Event source created: ${mapping.UUID}`);
การสร้าง DynamoDB Stream Trigger
เชื่อมต่อ DynamoDB stream กับ Lambda:
const createDynamoDBEventSource = async (functionName, streamArn, startingPosition = 'LATEST') => {
const response = await lambdaRequest('/event-source-mappings', {
method: 'POST',
body: {
EventSourceArn: streamArn,
FunctionName: functionName,
StartingPosition: startingPosition,
BatchSize: 100,
BisectBatchOnFunctionError: true,
MaximumRetryAttempts: 3
}
});
return response;
};
// Usage
await createDynamoDBEventSource(
'user-analytics',
'arn:aws:dynamodb:us-east-1:123456789012:table/Users/stream/2026-03-25T00:00:00.000'
);
ประเภทแหล่งที่มาของเหตุการณ์
| แหล่งที่มา | กรณีการใช้งาน | รองรับ Batch |
|---|---|---|
| SQS | คิวข้อความ | ใช่ (1-10) |
| Kinesis | สตรีมแบบเรียลไทม์ | ใช่ (1-10,000) |
| DynamoDB Streams | การเปลี่ยนแปลงฐานข้อมูล | ใช่ (1-1,000) |
| S3 | เหตุการณ์ของออบเจกต์ | ไม่ (1 ต่อเหตุการณ์) |
| EventBridge | การกำหนดเส้นทางเหตุการณ์ | ใช่ |
| API Gateway | HTTP APIs | ไม่ |
| Schedule | Cron jobs | ไม่ |
การจัดการเลเยอร์
การสร้างเลเยอร์
แพ็กเกจโค้ด/ส่วนประกอบที่ใช้ร่วมกัน:
const createLayer = async (layerName, layerConfig) => {
const response = await lambdaRequest('/layers', {
method: 'POST',
body: {
LayerName: layerName,
Description: layerConfig.description,
CompatibleRuntimes: layerConfig.runtimes,
Content: {
S3Bucket: layerConfig.s3Bucket,
S3Key: layerConfig.s3Key
}
}
});
return response;
};
// Usage
const layer = await createLayer('shared-utils', {
description: 'Shared utilities and dependencies',
runtimes: ['nodejs20.x', 'nodejs18.x'],
s3Bucket: 'my-layers-bucket',
s3Key: 'shared-utils/v1.zip'
});
console.log(`Layer ARN: ${layer.LayerArn}`);
การใช้เลเยอร์ในฟังก์ชัน
แนบเลเยอร์เข้ากับฟังก์ชัน:
const createFunctionWithLayers = async (functionConfig) => {
const response = await lambdaRequest('/functions', {
method: 'POST',
body: {
FunctionName: functionConfig.name,
Runtime: functionConfig.runtime,
Role: functionConfig.roleArn,
Handler: functionConfig.handler,
Code: {
S3Bucket: functionConfig.s3Bucket,
S3Key: functionConfig.s3Key
},
Layers: functionConfig.layers // Array of layer ARNs
}
});
return response;
};
// Usage
await createFunctionWithLayers({
name: 'api-handler',
roleArn: 'arn:aws:iam::123456789012:role/lambda-execution-role',
handler: 'index.handler',
runtime: 'nodejs20.x',
s3Bucket: 'my-deployments-bucket',
s3Key: 'api-handler/v1.0.0.zip',
layers: [
'arn:aws:lambda:us-east-1:123456789012:layer:shared-utils:1',
'arn:aws:lambda:us-east-1:123456789012:layer:aws-sdk:3'
]
});
การทำงานพร้อมกันและการปรับขนาด
การตั้งค่า Reserved Concurrency
สำรองความจุสำหรับฟังก์ชันที่สำคัญ:
const putFunctionConcurrency = async (functionName, reservedConcurrentExecutions) => {
const response = await lambdaRequest(`/functions/${functionName}/concurrency`, {
method: 'PUT',
body: {
ReservedConcurrentExecutions: reservedConcurrentExecutions
}
});
return response;
};
// Usage - Reserve 100 concurrent executions
await putFunctionConcurrency('order-processor', 100);
ขีดจำกัดการทำงานพร้อมกันของบัญชี
| ประเภทบัญชี | ขีดจำกัดเริ่มต้น | สามารถเพิ่มได้ |
|---|---|---|
| Free Tier | 1,000 | ใช่ |
| Pay-as-you-go | 1,000 | ใช่ |
| Enterprise | 1,000+ | ขีดจำกัดที่กำหนดเอง |
รายการตรวจสอบการปรับใช้สำหรับการผลิต
ก่อนปรับใช้สู่การผลิต:
- [ ] ใช้ AWS SDK สำหรับการลงนาม SigV4 โดยอัตโนมัติ
- [ ] ใช้การกำหนดเวอร์ชันด้วย Alias
- [ ] กำหนดค่า Reserved Concurrency สำหรับฟังก์ชันที่สำคัญ
- [ ] ตั้งค่า Dead Letter Queue (DLQ) สำหรับการเรียกใช้แบบอะซิงค์
- [ ] เปิดใช้งาน X-Ray tracing สำหรับการดีบัก
- [ ] กำหนดค่า VPC สำหรับการเข้าถึงฐานข้อมูล
- [ ] ใช้ Structured Logging (รูปแบบ JSON)
- [ ] ตั้งค่า CloudWatch Alarms
- [ ] ใช้เลเยอร์สำหรับส่วนประกอบที่ใช้ร่วมกัน
- [ ] ใช้กลยุทธ์การปรับใช้แบบ Blue-green
กรณีการใช้งานในโลกจริง
แบ็คเอนด์ API
บริษัท SaaS สร้าง REST API แบบไร้เซิร์ฟเวอร์:
- ความท้าทาย: การรับส่งข้อมูลผันผวน, การปรับขนาดที่คาดเดาไม่ได้
- โซลูชัน: Lambda + API Gateway พร้อมการปรับขนาดอัตโนมัติ
- ผลลัพธ์: ความพร้อมใช้งาน 99.99%, ลดต้นทุน 60% เทียบกับ EC2
การนำไปใช้งานหลัก:
- ฟังก์ชัน Lambda ต่อทรัพยากร
- API Gateway สำหรับการกำหนดเส้นทาง/การรับรองความถูกต้อง
- DynamoDB สำหรับการจัดเก็บข้อมูล
- Provisioned Concurrency สำหรับ Latency ที่สอดคล้องกัน
ไปป์ไลน์การประมวลผลเหตุการณ์
แพลตฟอร์มอีคอมเมิร์ซประมวลผลคำสั่งซื้อ:
- ความท้าทาย: คำสั่งซื้อพุ่งสูงขึ้นในช่วงกิจกรรมการขาย
- โซลูชัน: SQS + Lambda พร้อมการประมวลผลแบบ Batch
- ผลลัพธ์: ไม่มีคำสั่งซื้อสูญหาย, รองรับการพุ่งสูงขึ้น 10 เท่า
การนำไปใช้งานหลัก:
- SQS queue บัฟเฟอร์คำสั่งซื้อ
- Lambda ประมวลผล 10 ข้อความ/Batch
- DLQ สำหรับข้อความที่ล้มเหลว
- CloudWatch alerts สำหรับความลึกของคิว
บทสรุป
AWS Lambda API มอบความสามารถในการประมวลผลแบบไร้เซิร์ฟเวอร์ที่ครอบคลุม ประเด็นสำคัญที่ได้รับ:
- การรับรองความถูกต้องด้วย IAM พร้อมการลงนาม SigV4 (ใช้ AWS SDK)
- รูปแบบการเรียกใช้แบบซิงโครนัสและอะซิงโครนัส
- การจัดการเวอร์ชันและ Alias สำหรับการปรับใช้
- การจับคู่แหล่งที่มาของเหตุการณ์สำหรับสถาปัตยกรรมไร้เซิร์ฟเวอร์
- เลเยอร์สำหรับโค้ดและส่วนประกอบที่ใช้ร่วมกัน
- Apidog ปรับปรุงการทดสอบ API และการทำงานร่วมกันเป็นทีม
ส่วนคำถามที่พบบ่อย
ฉันจะรับรองความถูกต้องกับ Lambda API ได้อย่างไร?
ใช้ข้อมูลประจำตัว AWS IAM พร้อมการลงนาม Signature Version 4 AWS SDK จะจัดการการลงนามโดยอัตโนมัติ
การเรียกใช้แบบซิงโครนัสและอะซิงโครนัสแตกต่างกันอย่างไร?
แบบซิงโครนัส (RequestResponse) จะรอให้ฟังก์ชันทำงานเสร็จสิ้นและส่งคืนผลลัพธ์ ส่วนแบบอะซิงโครนัส (Event) จะจัดคิวคำขอและส่งคืนทันที
เวอร์ชันของ Lambda ทำงานอย่างไร?
แต่ละเวอร์ชันที่เผยแพร่คือสแนปช็อตที่ไม่สามารถเปลี่ยนแปลงได้ของฟังก์ชันของคุณ ใช้ Alias เพื่อชี้ไปยังเวอร์ชันที่เฉพาะเจาะจงและเปิดใช้งานการเปลี่ยนเส้นทางการรับส่งข้อมูล
Lambda Layers คืออะไร?
เลเยอร์จะแพ็กเกจโค้ดและส่วนประกอบต่างๆ แยกจากโค้ดฟังก์ชัน ซึ่งช่วยให้สามารถใช้ไลบรารีร่วมกันได้ในหลายฟังก์ชัน
ฉันจะลด Cold Start ได้อย่างไร?
ใช้ Provisioned Concurrency, แพ็กเกจการปรับใช้ที่เล็กลง และภาษาที่คอมไพล์แล้ว (Go, Rust) สำหรับฟังก์ชันที่ต้องมีความหน่วงต่ำ
Reserved Concurrency คืออะไร?
Reserved Concurrency รับประกันช่องการดำเนินการสำหรับฟังก์ชันเฉพาะ ป้องกันปัญหาการแย่งทรัพยากร
ฉันสามารถทริกเกอร์ Lambda จาก S3 ได้หรือไม่?
ได้ คุณสามารถกำหนดค่า S3 event notifications เพื่อเรียกใช้ Lambda เมื่อมีการสร้าง/ลบออบเจกต์
