AWS Lambda Authorizer
| Field | Value |
|---|---|
| Document ID | ASCEND-SDK-004 |
| Version | 1.0.0 |
| Last Updated | December 19, 2025 |
| Author | Ascend Engineering Team |
| Publisher | OW-KAI Technologies Inc. |
| Classification | Enterprise Client Documentation |
| Compliance | SOC 2 CC6.1/CC6.2, PCI-DSS 7.1/8.3, HIPAA 164.312, NIST 800-53 AC-2/SI-4 |
Reading Time: 15 minutes | Skill Level: Intermediate
Overview
The ASCEND Lambda Authorizer integrates AI governance with Amazon API Gateway. Every request is evaluated against your governance policies before reaching backend services.
Architecture
┌─────────────────────────────────────────────────────────────────────┐
│ LAMBDA AUTHORIZER FLOW │
├─────────────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────┐ ┌──────────────┐ ┌────────────────────────────┐ │
│ │ AI │ │ API │ │ Lambda Authorizer │ │
│ │ Agent │───▶│ Gateway │───▶│ │ │
│ │ │ │ │ │ 1. Map request │ │
│ └─────────┘ └──────────────┘ │ 2. Check cache │ │
│ │ │ 3. Call ASCEND │ │
│ │ │ 4. Generate IAM policy │ │
│ │ │ 5. Return Allow/Deny │ │
│ │ └────────────────────────────┘ │
│ │ │ │
│ │ ▼ │
│ │ ┌────────────────┐ │
│ │ │ ASCEND Platform │ │
│ │ │ │ │
│ │ │ Risk Assessment│ │
│ │ │ Policy Engine │ │
│ │ │ Audit Log │ │
│ │ └────────────────┘ │
│ │ │
│ ▼ │
│ ┌──────────────┐ │
│ │ Backend │ │
│ │ Service │ │
│ └──────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────┘
Prerequisites
- AWS Account with API Gateway
- AWS CLI configured
- Python 3.9+ runtime
- ASCEND API key
Deployment Options
Option 1: AWS Serverless Application Repository (Recommended)
The easiest way to deploy is via the AWS Serverless Application Repository:
# Deploy via AWS Console
# Visit: https://serverlessrepo.aws.amazon.com/applications/us-east-2/511851427029/ascend-lambda-authorizer
# Or deploy via CLI
aws serverlessrepo create-cloud-formation-change-set \
--application-id arn:aws:serverlessrepo:us-east-2:511851427029:applications/ascend-lambda-authorizer \
--stack-name ascend-authorizer \
--capabilities CAPABILITY_IAM \
--parameter-overrides Name=AscendApiKeySecret,Value=arn:aws:secretsmanager:REGION:ACCOUNT:secret:ascend-api-key
Package Info: ascend-lambda-authorizer on AWS SAR | Version: 1.0.0
Option 2: CloudFormation
# Source: lambda-authorizer/cloudformation/template.yaml
AWSTemplateFormatVersion: '2010-09-09'
Description: ASCEND Lambda Authorizer
Parameters:
AscendApiKey:
Type: String
NoEcho: true
Description: ASCEND API Key
AscendApiUrl:
Type: String
Default: https://pilot.owkai.app
Description: ASCEND API URL
Environment:
Type: String
Default: production
AllowedValues:
- production
- staging
- development
Resources:
AscendAuthorizerFunction:
Type: AWS::Lambda::Function
Properties:
FunctionName: ascend-authorizer
Runtime: python3.11
Handler: handler.lambda_handler
Code:
S3Bucket: ascend-lambda-artifacts
S3Key: authorizer/latest.zip
Timeout: 10
MemorySize: 256
Environment:
Variables:
ASCEND_API_KEY: !Ref AscendApiKey
ASCEND_API_URL: !Ref AscendApiUrl
ASCEND_ENVIRONMENT: !Ref Environment
CACHE_ENABLED: 'true'
CACHE_TTL_SECONDS: '60'
FAIL_OPEN: 'false'
AscendAuthorizer:
Type: AWS::ApiGateway::Authorizer
Properties:
Name: AscendAuthorizer
RestApiId: !Ref MyRestApi
Type: REQUEST
AuthorizerUri: !Sub 'arn:aws:apigateway:${AWS::Region}:lambda:path/2015-03-31/functions/${AscendAuthorizerFunction.Arn}/invocations'
AuthorizerResultTtlInSeconds: 60
IdentitySource: method.request.header.X-Ascend-Agent-ID
AuthorizerPermission:
Type: AWS::Lambda::Permission
Properties:
FunctionName: !GetAtt AscendAuthorizerFunction.Arn
Action: lambda:InvokeFunction
Principal: apigateway.amazonaws.com
SourceArn: !Sub 'arn:aws:execute-api:${AWS::Region}:${AWS::AccountId}:${MyRestApi}/*'
Outputs:
AuthorizerArn:
Value: !GetAtt AscendAuthorizerFunction.Arn
Deploy:
aws cloudformation deploy \
--template-file template.yaml \
--stack-name ascend-authorizer \
--parameter-overrides \
AscendApiKey="owkai_your_key_here" \
Environment=production \
--capabilities CAPABILITY_IAM
Option 3: SAM (Serverless Application Model)
# template.yaml
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Resources:
AscendAuthorizer:
Type: AWS::Serverless::Function
Properties:
Handler: handler.lambda_handler
Runtime: python3.11
CodeUri: ./src
Environment:
Variables:
ASCEND_API_KEY: '{{resolve:ssm:/ascend/api-key}}'
ASCEND_API_URL: https://pilot.owkai.app
Deploy:
sam build
sam deploy --guided
Option 4: Terraform
# main.tf
resource "aws_lambda_function" "ascend_authorizer" {
filename = "authorizer.zip"
function_name = "ascend-authorizer"
role = aws_iam_role.authorizer_role.arn
handler = "handler.lambda_handler"
runtime = "python3.11"
timeout = 10
memory_size = 256
environment {
variables = {
ASCEND_API_KEY = var.ascend_api_key
ASCEND_API_URL = "https://pilot.owkai.app"
ASCEND_ENVIRONMENT = "production"
CACHE_ENABLED = "true"
CACHE_TTL_SECONDS = "60"
}
}
}
resource "aws_api_gateway_authorizer" "ascend" {
name = "ascend-authorizer"
rest_api_id = aws_api_gateway_rest_api.api.id
authorizer_uri = aws_lambda_function.ascend_authorizer.invoke_arn
authorizer_result_ttl_in_seconds = 60
type = "REQUEST"
identity_source = "method.request.header.X-Ascend-Agent-ID"
}
Configuration
Environment Variables
| Variable | Required | Default | Description |
|---|---|---|---|
ASCEND_API_KEY | Yes | - | Your ASCEND API key |
ASCEND_API_URL | No | https://pilot.owkai.app | API endpoint |
ASCEND_ENVIRONMENT | No | production | Environment name |
CACHE_ENABLED | No | true | Enable decision caching |
CACHE_TTL_SECONDS | No | 60 | Cache TTL in seconds |
FAIL_OPEN | No | false | Allow on error (dangerous) |
LOG_LEVEL | No | INFO | Logging level |
Lambda Handler
The handler processes API Gateway events:
# Source: lambda-authorizer/src/handler.py:109
def lambda_handler(event: Dict[str, Any], context: Any) -> Dict[str, Any]:
"""
Lambda authorizer entry point.
Security:
- FAIL SECURE: Any error returns Deny policy
- Never logs sensitive data (API keys, tokens)
- All decisions are audited
"""
# ... implementation
Supported Event Types
| Event Type | API Gateway Type | Support |
|---|---|---|
| REQUEST | REST API | ✅ Full |
| TOKEN | REST API | ✅ Full |
| HTTP API v2 | HTTP API | ✅ Full |
Request Mapping
Agent ID Extraction
The authorizer extracts agent ID from:
X-Ascend-Agent-IDheader (preferred)- Request context (if configured)
- Default agent ID (if configured)
Action Type Mapping
| HTTP Method | Path Pattern | Action Type |
|---|---|---|
| GET | /customers/* | api.read_customers |
| POST | /orders | api.create_orders |
| DELETE | /users/* | api.delete_users |
Custom mappings can be configured via environment variables.
IAM Policy Generation
Allow Policy
{
"principalId": "my-agent-001",
"policyDocument": {
"Version": "2012-10-17",
"Statement": [{
"Action": "execute-api:Invoke",
"Effect": "Allow",
"Resource": "arn:aws:execute-api:us-east-1:123456789:api/stage/GET/customers"
}]
},
"context": {
"ascend_action_id": "12345",
"ascend_risk_score": "3.5",
"ascend_risk_level": "low",
"ascend_status": "approved"
}
}
Deny Policy
{
"principalId": "my-agent-001",
"policyDocument": {
"Version": "2012-10-17",
"Statement": [{
"Action": "execute-api:Invoke",
"Effect": "Deny",
"Resource": "arn:aws:execute-api:*"
}]
},
"context": {
"ascend_status": "denied",
"ascend_reason": "High-risk operation requires approval",
"ascend_error_code": "POLICY_VIOLATION"
}
}
Caching
API Gateway Caching
Enable caching in API Gateway Authorizer settings:
AuthorizerResultTtlInSeconds: 60 # Cache approved results for 60s
Internal Caching
The Lambda also maintains an internal cache for faster responses:
# Source: lambda-authorizer/src/policy_generator.py
# Internal cache for approved policies
# Reduces ASCEND API calls for repeated requests
Monitoring
CloudWatch Metrics
The authorizer publishes these metrics:
| Metric | Description |
|---|---|
AscendAuthorizerLatency | Total authorization time |
AscendApiLatency | ASCEND API call time |
CacheHitRate | Percentage of cache hits |
DenyRate | Percentage of denied requests |
ErrorRate | Percentage of errors |
CloudWatch Logs
Structured JSON logging:
{
"correlation_id": "req-12345",
"agent_id": "my-agent-001",
"action_type": "api.read_customers",
"status": "approved",
"risk_score": 3.5,
"latency_ms": 45,
"cache_hit": false
}
Alarms
Recommended CloudWatch Alarms:
# High error rate alarm
AscendErrorAlarm:
Type: AWS::CloudWatch::Alarm
Properties:
AlarmName: ascend-authorizer-errors
MetricName: ErrorRate
Namespace: Ascend/Authorizer
Threshold: 5
EvaluationPeriods: 3
ComparisonOperator: GreaterThanThreshold
Fail Secure Design
The authorizer follows FAIL SECURE principles:
# Source: lambda-authorizer/src/handler.py:182
# FAIL SECURE: Any error returns Deny policy
# unless explicitly configured for fail_open
try:
response = call_ascend_api(action)
except AscendTimeoutError:
return create_deny_policy("Authorization timeout")
except AscendAPIError:
return create_deny_policy("Authorization service error")
except Exception:
return create_deny_policy("Internal authorization error")
Testing
Local Testing
# test_handler.py
import json
from src.handler import lambda_handler
event = {
"type": "REQUEST",
"methodArn": "arn:aws:execute-api:us-east-1:123456:api/prod/GET/customers",
"headers": {
"X-Ascend-Agent-ID": "test-agent"
},
"httpMethod": "GET",
"path": "/customers"
}
response = lambda_handler(event, None)
print(json.dumps(response, indent=2))
Integration Testing
# Test with curl
curl -H "X-Ascend-Agent-ID: test-agent" \
https://api.yourcompany.com/customers
Troubleshooting
| Issue | Cause | Solution |
|---|---|---|
| All requests denied | FAIL_OPEN=false + API errors | Check ASCEND_API_KEY |
| High latency | Cold starts | Increase memory, use Provisioned Concurrency |
| Cache not working | TTL=0 | Set CACHE_TTL_SECONDS > 0 |
| 403 Unauthorized | Invalid policy | Check authorizer permissions |
Best Practices
-
Use Secrets Manager for API Key
ASCEND_API_KEY: '{{resolve:secretsmanager:ascend-api-key}}' -
Enable Provisioned Concurrency for consistent latency
-
Set appropriate timeout (10s recommended)
-
Monitor error rates with CloudWatch Alarms
-
Use VPC endpoint for private API access
Next Steps
- Kong Plugin — For Kong Gateway
- Envoy/Istio — For service mesh
- Smart Rules — Create custom rules
Document Version: 1.0.0 | Last Updated: December 2025