如何在API Gateway的HTTP请求头中传递Secrets Manager的值
完全可行,根据你的使用场景,有以下几种实现方式:
1. 借助API Gateway Lambda授权器(自定义授权器)
这是最常用的方案,适合通过API Gateway转发请求的场景:
- 编写Lambda函数从Secrets Manager获取Token,在返回的授权策略中通过
context字段携带Token - 在API Gateway的集成请求中,将
context中的Token映射到Authorization请求头
示例Lambda代码:
import boto3 import json secrets_manager = boto3.client('secretsmanager') def lambda_handler(event, context): # 从Secrets Manager读取指定密钥 secret = secrets_manager.get_secret_value(SecretId='your-secret-id') auth_token = secret['SecretString'] # 返回授权策略,同时在context中传递Token return { 'principalId': 'authorized-user', 'policyDocument': { 'Version': '2012-10-17', 'Statement': [ { 'Action': 'execute-api:Invoke', 'Effect': 'Allow', 'Resource': event['methodArn'] } ] }, 'context': { 'authToken': auth_token } }
配置API Gateway:
- 在对应方法的集成请求中,添加HTTP请求头
Authorization - 将映射值设置为
$context.authorizer.authToken
2. API Gateway直接集成Secrets Manager(无需Lambda)
如果不需要额外的授权逻辑,可以直接让API Gateway从Secrets Manager获取Token并设置请求头:
- 创建API Gateway方法,集成类型选择「AWS Service」
- 配置服务为Secrets Manager,动作选择
GetSecretValue - 在集成请求的映射模板中,构造请求参数指定要获取的Secret ID
- 通过集成响应的映射模板提取Secret中的Token,映射到
Authorization头
3. Lambda内部发起请求时设置头
如果是Lambda自身需要调用外部API,直接在请求中注入Token即可:
import boto3 import requests secrets_manager = boto3.client('secretsmanager') def lambda_handler(event, context): secret = secrets_manager.get_secret_value(SecretId='your-secret-id') auth_token = secret['SecretString'] # 发起请求时设置Authorization头 response = requests.get( 'https://target-api-endpoint.com', headers={'Authorization': f'Bearer {auth_token}'} ) return {'status_code': response.status_code, 'body': response.json()}
你之前没找到的「Lambda返回值设置请求头」场景,核心是通过API Gateway的上下文映射实现——Lambda返回的context数据会被API Gateway捕获,再通过映射规则转成请求头,而非Lambda直接返回HTTP头。
内容的提问来源于stack exchange,提问作者lkz
相关产品推荐
相关产品推荐

