Skip to main content

AWS Lambda Authorizer

FieldValue
Document IDASCEND-SDK-004
Version1.0.0
Last UpdatedDecember 19, 2025
AuthorAscend Engineering Team
PublisherOW-KAI Technologies Inc.
ClassificationEnterprise Client Documentation
ComplianceSOC 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

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

VariableRequiredDefaultDescription
ASCEND_API_KEYYes-Your ASCEND API key
ASCEND_API_URLNohttps://pilot.owkai.appAPI endpoint
ASCEND_ENVIRONMENTNoproductionEnvironment name
CACHE_ENABLEDNotrueEnable decision caching
CACHE_TTL_SECONDSNo60Cache TTL in seconds
FAIL_OPENNofalseAllow on error (dangerous)
LOG_LEVELNoINFOLogging 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 TypeAPI Gateway TypeSupport
REQUESTREST API✅ Full
TOKENREST API✅ Full
HTTP API v2HTTP API✅ Full

Request Mapping

Agent ID Extraction

The authorizer extracts agent ID from:

  1. X-Ascend-Agent-ID header (preferred)
  2. Request context (if configured)
  3. Default agent ID (if configured)

Action Type Mapping

HTTP MethodPath PatternAction Type
GET/customers/*api.read_customers
POST/ordersapi.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:

MetricDescription
AscendAuthorizerLatencyTotal authorization time
AscendApiLatencyASCEND API call time
CacheHitRatePercentage of cache hits
DenyRatePercentage of denied requests
ErrorRatePercentage 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

IssueCauseSolution
All requests deniedFAIL_OPEN=false + API errorsCheck ASCEND_API_KEY
High latencyCold startsIncrease memory, use Provisioned Concurrency
Cache not workingTTL=0Set CACHE_TTL_SECONDS > 0
403 UnauthorizedInvalid policyCheck authorizer permissions

Best Practices

  1. Use Secrets Manager for API Key

    ASCEND_API_KEY: '{{resolve:secretsmanager:ascend-api-key}}'
  2. Enable Provisioned Concurrency for consistent latency

  3. Set appropriate timeout (10s recommended)

  4. Monitor error rates with CloudWatch Alarms

  5. Use VPC endpoint for private API access

Next Steps


Document Version: 1.0.0 | Last Updated: December 2025