实现AWS Lambda函数安全地请求企业内部API返回数据
需要编写一个Lambda函数在AWS云上运行,它需要访问企业内部的API获取JSON格式的数据,企业有网关和防火墙,API有公司的okta身份认证,通过公司的域账号来授权访问,现在需要创建一个专用的域账号,让Lambda函数访问Secret Manager,来获取账号密码,然后通过配置访问公司内部API的数据,请写出所有的开发配置步骤,以及完成这一功能的所有的Python源代码,需要确保安全性和可靠性。
一、架构设计
- Lambda函数部署在AWS公有云
- 通过AWS Secrets Manager存储Okta认证凭证
- Lambda通过HTTPS访问企业API网关
- 使用Okta的OAuth 2.0客户端凭证模式获取访问令牌
- 所有通信使用TLS加密
二、配置步骤
1. 创建专用域账号
- 在企业Okta控制台:
- 创建新应用(OAuth 2.0客户端凭证类型)
- 生成Client ID和Client Secret
- 配置API访问权限范围(Scopes)
2. 配置AWS Secrets Manager
aws secretsmanager create-secret --name prod/okta_api_creds \
--secret-string '{"client_id": "YOUR_CLIENT_ID","client_secret": "YOUR_CLIENT_SECRET","token_url": "https://yourcompany.okta.com/oauth2/v1/token","api_endpoint": "https://internal-api.yourcompany.com/v1/data"
}'
3. 配置Lambda执行角色
IAM策略示例:
{"Version": "2012-10-17","Statement": [{"Effect": "Allow","Action": "secretsmanager:GetSecretValue","Resource": "arn:aws:secretsmanager:region:account-id:secret:prod/okta_api_creds-*"},{"Effect": "Allow","Action": "logs:CreateLogGroup","Resource": "arn:aws:logs:region:account-id:*"},{"Effect": "Allow","Action": ["logs:CreateLogStream","logs:PutLogEvents"],"Resource": ["arn:aws:logs:region:account-id:log-group:/aws/lambda/your-function-name:*"]}]
}
4. 网络配置(可选)
如果企业API在私有网络:
- 部署Lambda到VPC私有子网
- 配置安全组出站规则
- 设置VPC对等连接或VPN到企业网络
三、Python源代码
1. Lambda主处理程序
import os
import json
import boto3
from botocore.exceptions import ClientError
import requests
from requests.exceptions import RequestException# 初始化客户端
secrets_client = boto3.client('secretsmanager')
session = requests.Session()def get_secret():"""安全获取Secret Manager中的凭证"""try:response = secrets_client.get_secret_value(SecretId='prod/okta_api_creds')return json.loads(response['SecretString'])except ClientError as e:if e.response['Error']['Code'] == 'ResourceNotFoundException':raise Exception("Secret not found") from eelif e.response['Error']['Code'] == 'AccessDeniedException':raise Exception("Access denied to secret") from eelse:raise Exception(f"Secret retrieval failed: {str(e)}") from edef get_okta_token(client_id, client_secret, token_url):"""获取Okta访问令牌"""headers = {'Accept': 'application/json'}data = {'grant_type': 'client_credentials','client_id': client_id,'client_secret': client_secret,'scope': 'api.access'}try:response = session.post(token_url,headers=headers,data=data,timeout=10)response.raise_for_status()return response.json()['access_token']except RequestException as e:raise Exception(f"Token request failed: {str(e)}") from edef call_internal_api(api_url, token):"""调用内部API"""headers = {'Authorization': f'Bearer {token}','Content-Type': 'application/json'}try:response = session.get(api_url,headers=headers,timeout=15)response.raise_for_status()return response.json()except RequestException as e:raise Exception(f"API call failed: {str(e)}") from edef lambda_handler(event, context):try:# 获取认证凭证secret = get_secret()# 获取访问令牌token = get_okta_token(secret['client_id'],secret['client_secret'],secret['token_url'])# 调用内部APIapi_data = call_internal_api(secret['api_endpoint'], token)return {'statusCode': 200,'body': api_data}except Exception as e:# 记录完整错误到CloudWatchprint(f"Error: {str(e)}")return {'statusCode': 500,'body': json.dumps({'error': 'Internal Server Error'})}
2. 安全增强措施
-
Secret加密:
aws secretsmanager update-secret --secret-id prod/okta_api_creds \ --kms-key-id alias/aws/secretsmanager -
网络防护:
# 在requests会话中增加安全配置 session = requests.Session() adapter = requests.adapters.HTTPAdapter(max_retries=3,pool_connections=10,pool_maxsize=10 ) session.mount('https://', adapter) -
证书验证增强:
# 在敏感请求中启用证书固定 response = session.get(api_url, headers=headers,verify='/path/to/cert.pem')
四、部署与验证
1. 部署流程
# 安装依赖
pip install requests boto3 -t ./dependencies# 打包Lambda
zip -r lambda.zip *.py dependencies/# 创建Lambda函数
aws lambda create-function \--function-name InternalApiAccess \--runtime python3.9 \--handler lambda_function.lambda_handler \--role arn:aws:iam::account-id:role/lambda-execution-role \--zip-file fileb://lambda.zip \--environment Variables={AWS_NODEJS_CONNECTION_REUSE_ENABLED=1} \--timeout 30
2. 测试验证
- 在AWS控制台执行Lambda测试事件
- 验证CloudWatch日志:
aws logs tail /aws/lambda/InternalApiAccess --follow - 执行端到端测试:
# 测试脚本示例 import lambda_function print(lambda_function.lambda_handler({}, None))
五、运维监控
1. 安全审计配置
# 启用Secret轮换
aws secretsmanager rotate-secret --secret-id prod/okta_api_creds \
--rotation-lambda-arn arn:aws:lambda:region:account-id:function:secret-rotation-function \
--rotation-rules '{"AutomaticallyAfterDays": 90}'
2. CloudWatch警报配置
- 监控指标:
- Lambda错误率 > 1%
- 调用延迟 > 5秒
- 并发执行数异常增长
3. 安全防护
- 启用Lambda代码签名
- 配置VPC流量镜像
- 启用AWS Shield Advanced
六、故障处理预案
| 故障场景 | 处理方案 |
|---|---|
| Okta认证失败 | 1. 检查Secret Manager内容 2. 验证Okta应用配置 3. 检查网络连通性 |
| API连接超时 | 1. 检查安全组规则 2. 验证企业防火墙白名单 3. 测试DNS解析 |
| 凭证泄露 | 1. 立即轮换Secret 2. 审计Lambda执行日志 3. 撤销旧客户端凭证 |
该方案实现了:
- 凭证与代码分离(通过Secrets Manager)
- 最小权限原则(IAM策略)
- 端到端加密传输
- 完善的错误处理机制
- 完整的审计跟踪能力
建议定期执行以下维护:
- 每季度轮换客户端凭证
- 每月审计Lambda执行日志
- 每周验证备份恢复流程
- 持续监控API响应时间指标
相关文章:
实现AWS Lambda函数安全地请求企业内部API返回数据
需要编写一个Lambda函数在AWS云上运行,它需要访问企业内部的API获取JSON格式的数据,企业有网关和防火墙,API有公司的okta身份认证,通过公司的域账号来授权访问,现在需要创建一个专用的域账号,让Lambda函数访…...
面试题--随机(一)
MySQL事务中的ACID特性? A 原子性 事务是一组SQL语句,不可分割 C 一致性 事务中的SQL语句要么同时执行,即全部执行成功,要么全部不执行,即执行失败 I 隔离性 MySQL中的各个事务通过不同的事务隔离等级,产生…...
200+短剧出海平台:谁能成为“海外红果”?
2025年,短剧的国际市场表现令人瞩目。仅在两年前,业界关注的焦点仍是美国市场,如今国产短剧应用已成功打入包括印尼、巴西、美国、墨西哥、印度、菲律宾、泰国、日本、哥伦比亚及韩国在内的多个国家,轻松获得超过500万次下载。 市…...
Visio导出清晰图片步骤
在Visio里画完图之后如何导出清晰的图片?👇 ①左上角单击【文件】 ②导出—更改文件类型—PNG/JPG ③分辨率选择【打印机】,大小选择【源】,即可。 ④选择保存位置并命名 也可以根据自己需要选择是否需要【透明底】哈。 选PNG 然…...
Linux系统:详解进程等待wait与waitpid解决僵尸进程
本节重点 理解进程等待的相关概念掌握系统调用wait与waitpid的使用方法输出型status参数的存储结构阻塞等待与非阻塞等待 一、概念 进程等待是操作系统中父进程与子进程协作的核心机制,指父进程通过特定方式等待子进程终止并回收其资源的过程。这一机制的主要目的…...
6.7 ChatGPT自动生成定时任务脚本:Python与Cron双方案实战指南
ChatGPT自动生成定时任务脚本:Python与Cron双方案实战指南 关键词:定时任务调度, ChatGPT 代码生成, Cron 脚本开发, Python 调度器, 自动化更新系统 6.3 使用 ChatGPT 生成 Cron 调度脚本 在 GitHub Sentinel 的定期更新功能中,定时任务调度是核心模块。本节演示如何通过…...
K8S运维实战之集群证书升级与容器运行时更换全记录
第一部分:Kubernetes集群证书升级实战 tips:此博文只演示一个节点作为示范,所有的集群节点步骤都可以参考。 项目背景 某金融业务系统Kubernetes集群即将面临生产证书集中过期风险(核心组件证书剩余有效期不足90天),…...
IntelliJ IDEA clean git password
IntelliJ IDEA clean git password 清除git密码 方法一:(这个要特别注意啊,恢复默认设置,你的插件什么要重新下载了) File->Manage IDE Settings->Restore Default Settings以恢复IDEA的默认设置(可选); 清空…...
【已更新完毕】2025泰迪杯数据挖掘竞赛C题数学建模思路代码文章教学:竞赛智能客服机器人构建
完整内容请看文末最后的推广群 基于大模型的竞赛智能客服机器人构建 摘要 随着国内学科和技能竞赛的增多,参赛者对竞赛相关信息的需求不断上升,但传统人工客服存在效率低、成本高、服务不稳定和用户体验差的问题。因此,设计一款智能客服机器…...
2025年4月19日 记录大模型出现的计算问题
2025年4月19日 记录大模型出现的计算问题,用了四个大模型计算json的数值,3个错误,1个正确 问题 Class Train Val answer 2574 853 screen 5025 1959 blackBoard 7847 3445 teacher 8490 3228 stand…...
ACI EP Learning Whitepaper 3. Disabling IP Data-plane Learning 功能
目录 1. 使用场景 1.1 未disable IP data-plane learning时 1.2 disable IP data-plane learning后 2. 一代Leaf注意事项 3. L2 未知单播注意事项 1. 使用场景 Windows网卡的动态负载均衡绑定模式等。或多个设备共享相同VIP并通过ARP/GARP/ND来宣告VIP切换时,这些外部设…...
C++入门七式——模板初阶
目录 函数模板 函数模板概念 函数模板格式 函数模板的原理 函数模板的实例化 模板参数的匹配原则 类模板 类模板的定义格式 类模板的显式实例化 当面对下面的代码时,大家会不会有一种无力的感觉?明明这些代码差不多,只是因为类型不…...
计算机网络 - 在浏览器中输入 URL 地址到显示主页的过程?
第一步,浏览器通过 DNS 来解析 URL,得到相应的 ip 地址(到哪里找) 和 方法(做什么) 第二步,浏览器于服务器建立 TCP 三次握手连接 第三步,建立好连接后,浏览器会组装 HTTP 请求报文…...
【教程】检查RDMA网卡状态和测试带宽 | 附测试脚本
转载请注明出处:小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你,欢迎[点赞、收藏、关注]哦~ 目录 检查硬件和驱动状态 测试RDMA通信 报错修复 对于交换机的配置,可以看这篇: 【教程】详解配置多台主机通过交换机实现互…...
(二)Trae 配置C++ 编译
Trae配置c编译 零 CMake 编译C0.1 下载安装0.2 安装设置0.3 三种编译方式(见 下文 一 二 三)0.4 调试 (见 下文四) 一 使用MSVC方式编译1.1 安装编译环境1.2安装插件1.3 设置文件 二 使用GCC方式2.1 安装编译环境2.1.1下载:[MinGw](https://gcc-mcf.lhmouse.com/)2.1.2安装:(以…...
Doris 本地部署集群重启后报错
报错描述 Docker 版本: apache/doris:fe-2.1.9 apache/doris:be-2.1.9 连接 MySQL 报错: ERROR 2003 (HY000): Cant connect to MySQL server on 127.0.0.1:9030 (111)FE 日志: INFO (UNKNOWN fe_e7cff187_69d4_42ee_90be_147e87310549(-1…...
日本公司如何实现B2B商城订货系统的自动化和个性化?
在日本构建具备前后台日文本地化、业务员代客下单、一客一价、智能拆单发货的B2B电商系统,需结合日本商业习惯与技术实现。以下是关键模块的落地方案: 一、系统架构设计 1. 前端本地化 语言与UI适配 采用全日语界面,包含敬语体系(…...
自动化测试相关协议深度剖析及A2A、MCP协议自动化测试应用展望
一、不同协议底层逻辑关联分析 1. OPENAPI协议 OPENAPI 协议核心在于定义 API 的规范结构,它使用 YAML 或 JSON 格式来描述 API 的端点、请求参数、响应格式等信息。其底层逻辑是构建一个清晰、标准化的 API 描述文档,方便不同的客户端和服务端进行对接…...
ReAct、CoT 和 ToT:大模型提示词推理架构的对比分析
ReAct、CoT 和 ToT:大模型提示词推理架构的对比分析 在大型语言模型(LLM)的研究与应用中,如何有效提升模型在复杂任务上的推理能力是关键问题之一。目前,ReAct(Reasoning and Acting)、CoT&…...
用魔法打败魔法——获取软件安装路径
用魔法打败魔法——获取软件安装路径 🌟嗨,我是LucianaiB! 🌍 总有人间一两风,填我十万八千梦。 🚀 路漫漫其修远兮,吾将上下而求索。 目录 背景普通方法用魔法一句话 1.首先新建‘PC自动化应…...
2024-04-19| Java: Documented注解学习 JavaDoc
在 Java 中,Documented 是一个元注解(meta-annotation),用于标记其他注解,表明这些注解应该被包含在 JavaDoc 文档中。以下是关于 Documented 注解的作用的简要说明: 作用 记录注解信息到 JavaDoc&#x…...
Spring Boot常用注解全解析:从入门到实战
🌱 Spring Boot常用注解全解析:从入门到实战 #SpringBoot核心 #注解详解 #开发技巧 #高效编程 一、核心启动与配置注解 1. SpringBootApplication 作用:标记主启动类,整合了Configuration、EnableAutoConfiguration和Component…...
【重学Android】1.关于@Composer注解的一点知识笔记
最新因为一些原因,开始重新学习Android及kotlin编程,也觉得可以顺带记录下这个过程中的一些知识点,也可以用作日后自己查找复习。 Composable 注解在 Android 开发中的使用 Composable 是 Jetpack Compose(Android 的现代声明式…...
【排队论】Probabilistic Forecasts of Bike-Sharing Systems for Journey Planning
Probabilistic Forecasts of Bike-Sharing Systems forJourney Planning abstract 我们研究了对共享单车系统(BSS)车站未来自行车可用性进行预测的问题。这是相关的,以便提出建议,保证用户能够进行旅行的概率足够高。为此&#x…...
大数据平台简介
一、分布式系统基础架构 (一)定义与核心特征 分布式系统是由多台计算机(节点)通过网络协作组成的系统,对外表现为一个统一整体。其核心特征包括: 去中心化:节点平等或分角色协作(如…...
加一:从简单问题到复杂边界的深度思考
加一:从简单问题到复杂边界的深度思考 引言 在算法世界里,有些问题看似简单,实则暗藏玄机,其中“加一”问题就是一个典型例子。所谓“加一”,通常指的是给一个由数字组成的数组表示的整数加一,这听起来简…...
高精度算法(加、减、乘、除、阶乘和)
归纳编程学习的感悟, 记录奋斗路上的点滴, 希望能帮到一样刻苦的你! 如有不足欢迎指正! 共同学习交流! 🌎欢迎各位→点赞 👍 收藏⭐ 留言📝 唯有主动付出,才有丰富的果…...
实战设计模式之备忘录模式
概述 与解释器模式、迭代器模式一样,备忘录模式也是一种行为设计模式。备忘录模式允许我们保存一个对象的状态,并在稍后恢复到这个状态。该模式非常适合于需要回滚、撤销或历史记录等功能的应用场景。通过使用备忘录模式,开发者可以轻松添加诸…...
keil5 µVision 升级为V5.40.0.0:增加了对STM32CubeMX作为全局生成器的支持,主要有哪些好处?
在Keil5 μVision V5.40.0.0版本中,增加了对STM32CubeMX作为全局生成器的支持,这一更新主要带来了以下三方面的提升: 开发流程整合STM32CubeMX原本就支持生成Keil项目代码,但新版本将这一集成升级为“全局生成器”级别,意味着STM32CubeMX生成的代码能直接成为Keil项目的核…...
吉尔吉斯斯坦工商会代表团赴齐河德瑞新能源汽车考察
德州齐河,2025年4月15日电 时中美贸易突变之际,乘国家一带一路之风。 展中国新能源之宏图,塑国贸体系之新方向。 今日上午,吉尔吉斯斯坦共和国工商会代表团一行三人受邀抵达济南,开启对德瑞新能源科技有限公司&…...
