Setting Up AWS Lambda with API Gateway: A Technical Guide
Introduction
This guide walks through the complete process of building a serverless API using AWS Lambda and API Gateway. By following these steps, you'll create a fully functional API that can perform CRUD operations on a DynamoDB database.
Step 1: Create Permissions Policy
- Create an IAM policy allowing DynamoDB CRUD operations and CloudWatch Logs write access
- Use JSON policy with specific service actions
- Name policy
lambda-apigateway-policy
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "DynamoDBAccess",
"Effect": "Allow",
"Action": [
"dynamodb:GetItem",
"dynamodb:PutItem",
"dynamodb:UpdateItem",
"dynamodb:DeleteItem",
"dynamodb:Scan",
"dynamodb:Query"
],
"Resource": "arn:aws:dynamodb:*:*:table/lambda-apigateway"
},
{
"Sid": "CloudWatchLogsAccess",
"Effect": "Allow",
"Action": [
"logs:CreateLogGroup",
"logs:CreateLogStream",
"logs:PutLogEvents"
],
"Resource": "arn:aws:logs:*:*:*"
}
]
}
Step 2: Create Execution Role
- Create an IAM role for Lambda function
- Attach the previously created
lambda-apigateway-policy - Role name:
lambda-apigateway-role - Enables Lambda to interact with DynamoDB and CloudWatch
Step 3: Create Lambda Function
- Language options: Node.js or Python
- Function name:
LambdaFunctionOverHttps - Key implementation details:
- Define CRUD operations for DynamoDB
- Use AWS SDK for database interactions
- Handle different operation types via switch/dictionary
- Attach
lambda-apigateway-roleas execution role
// Node.js example
const AWS = require('aws-sdk');
const docClient = new AWS.DynamoDB.DocumentClient();
const TABLE_NAME = "lambda-apigateway";
exports.handler = async (event) => {
const operation = event.operation;
switch(operation) {
case 'create':
return await createItem(event.payload);
case 'read':
return await readItem(event.payload);
case 'update':
return await updateItem(event.payload);
case 'delete':
return await deleteItem(event.payload);
default:
return {
statusCode: 400,
body: JSON.stringify({ error: "Unsupported operation" })
};
}
};
async function createItem(data) {
const params = {
TableName: TABLE_NAME,
Item: data
};
try {
await docClient.put(params).promise();
return {
statusCode: 201,
body: JSON.stringify({ message: "Item created successfully" })
};
} catch (err) {
return {
statusCode: 500,
body: JSON.stringify({ error: err.message })
};
}
}
Step 4: Create DynamoDB Table
- Table name:
lambda-apigateway - Partition key:
id(String type) - Used for storing and managing data
Step 5: Configure API Gateway
- Create REST API named
DynamoDBOperations - Add resource:
DynamoDBManager - Create POST method
- Integrate with Lambda function
- Deploy API to a stage (e.g.,
test)
Step 6: Test and Invoke
- Test via AWS Console:
- Create/Read/Update/Delete items
- Use
curlfor HTTP requests - Verify operations through DynamoDB console
Best Practices
- Use environment variables for table names
- Consider separate Lambda functions for each operation
- Implement proper error handling
- Use IAM for secure access management