GPT Actions 库 - AWS 中间件:AWS Lambda 集成指南
技术背景
随着大语言模型(LLM)的普及,开发者希望将 ChatGPT 的能力与现有云服务(如 AWS)无缝集成。然而,直接调用 AWS API 存在认证复杂、上下文限制、数据格式不匹配等问题。GPT Actions 允许自定义 API 端点,但需要安全、可扩展的中间层。AWS Lambda 作为无服务器计算服务,提供弹性伸缩、按需付费的优势,结合 API Gateway 和 Cognito 可实现 OAuth 认证,确保只有授权用户才能触发函数。本教程解决的核心问题是:如何安全地将 ChatGPT 连接到 AWS 服务,并支持文件返回、数据预处理等高级场景。适用场景包括数据分析、业务自动化、第三方服务集成等。主要限制包括冷启动延迟、超时限制(默认 45 秒)、以及需要管理 IAM 权限和 VPC 配置。
核心原理
本教程的核心原理是利用 AWS SAM 模板定义基础设施即代码(IaC),自动化创建 Cognito 用户池(用于 OAuth 认证)、API Gateway(暴露 HTTP 端点)和 Lambda 函数(执行业务逻辑)。Cognito 授权器作为 API Gateway 的默认授权器,确保只有携带有效 access_token 的请求才能触发 Lambda。数据流如下:ChatGPT 发起请求 → API Gateway 验证 JWT 令牌 → 通过后调用 Lambda → Lambda 执行代码(如查询 Redshift、生成 CSV)→ 返回 JSON 或文件给 ChatGPT。关键设计决策包括:使用 Cognito 托管 UI 简化用户登录;将 Lambda 映射到 VPC 以访问私有资源;通过环境变量动态配置凭据;使用 SAM 模板实现一键部署。
架构分析
系统架构采用无服务器微服务模式,组件包括:1) Cognito 用户池:管理用户身份,支持 OAuth 2.0 授权码流程,提供托管 UI 和 JWT 令牌;2) API Gateway:作为 HTTP 入口,配置 Cognito 授权器,将请求路由到 Lambda;3) Lambda 函数:执行业务逻辑,可访问 VPC 内的 AWS 服务(如 Redshift、S3);4) S3 存储桶:用于存储文件(如 CSV、PDF)供返回;5) CloudFormation 堆栈:通过 SAM 模板统一管理资源。设计思想强调安全边界:所有请求必须通过 OAuth 认证,Lambda 函数不直接暴露公网,仅通过 API Gateway 访问。可扩展性:通过修改 SAM 模板添加新路由和函数,支持多环境部署。
完整实战教程
GPT Action 库(中间件):AWS Lambda
引言
这个特定的GPT Action概述了如何构建一个AWS Lambda函数。本文档帮助用户设置一个受OAuth保护的AWS函数,以连接到GPT Action以及一个示例应用程序。此示例使用AWS SAM(无服务器应用程序模型)来设置AWS堆栈。
价值 + 示例业务用例
价值:用户现在可以利用 ChatGPT 的能力连接到 AWS 函数。这使您能够连接到 AWS 中的任何服务,并在此之上运行代码/应用程序。这可以通过以下几种方式实现:
- 访问第三方服务,如 AWS Redshift、AWS DynamoDB、AWS S3 等等!
- 允许预处理来自 API 的文本响应(克服上下文限制,添加上下文或元数据作为示例)。
- 能够返回文件,而不是从第三方 API 检索文本。这对于数据分析时呈现 CSV 文件非常有用,或者带回一个 PDF 文件,ChatGPT 会将其视为上传文件。
示例用例:
- 用户需要在 Redshift 中查找数据,但需要在 ChatGPT 和 Redshift 之间有一个中间件应用程序来返回文件(数据分析的精确性以及大量数据)。
- 用户已经在 AWS 函数中构建了几个步骤,并且需要能够使用 ChatGPT 启动该过程。
应用信息与先决条件
我们将利用 AWS Lambda 服务来创建一个中间件函数。你可以通过访问以下链接来熟悉这一技术栈:
- Lambda 官网:https://aws.amazon.com/lambda/
- Lambda 文档:https://docs.aws.amazon.com/lambda/
- AWS SAM 文档:https://docs.aws.amazon.com/serverless-application-model/
前提条件
在开始之前,请确保你拥有一个 AWS 控制台,并具备创建以下资源的权限:Lambda 函数、S3 存储桶、应用程序堆栈、Cognito 用户池、Cognito 用户池应用程序客户端、API 网关、Lambda 角色、CloudFormation 堆栈(这看起来很多,但创建这些服务是自动化的!)。
创建 AWS Lambda 函数
要创建 AWS 函数,可以使用 AWS SAM。SAM 模板的示例可以在这里找到 [0]。
该模板包括:
- 用于 OAuth 的用户池和用户池客户端
- 确保函数只能由经过身份验证的用户调用的 Cognito 授权器
- 将 Lambda 函数映射到现有 VPC(用于连接其他 AWS 服务)
- 具有可动态设置的参数(例如:凭据/变量)
- 将 HTTP 路由映射到函数的 API 网关
此代码纯粹是信息性的,可帮助您入门,不需要预先存在的 AWS 资源。我们建议您映射现有的用户池(如果有),而不是创建新的用户池,并将 Lambda 设置在有权访问其他 AWS 资源的 VPC 中(如果您需要利用这些资源)。您可以在 RedShift cookbook 中看到此类设置的示例。
Cognito 授权器是确保您的函数只能由经过身份验证的用户调用/访问的关键,因此请确保在您的环境中正确设置它。
[0]
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: >
aws-middleware
AWS middleware function
Parameters:
CognitoUserPoolName:
Type: String
Default: MyCognitoUserPool
CognitoUserPoolClientName:
Type: String
Default: MyCognitoUserPoolClient
Resources:
MyCognitoUserPool:
Type: AWS::Cognito::UserPool
Properties:
UserPoolName: !Ref CognitoUserPoolName
Policies:
PasswordPolicy:
MinimumLength: 8
UsernameAttributes:
- email
Schema:
- AttributeDataType: String
Name: email
Required: false
MyCognitoUserPoolClient:
Type: AWS::Cognito::UserPoolClient
Properties:
UserPoolId: !Ref MyCognitoUserPool
ClientName: !Ref CognitoUserPoolClientName
GenerateSecret: true
MiddlewareApi:
Type: AWS::Serverless::Api
Properties:
StageName: Prod
Cors: "'*'"
Auth:
DefaultAuthorizer: MyCognitoAuthorizer
Authorizers:
MyCognitoAuthorizer:
AuthorizationScopes:
- openid
- email
- profile
UserPoolArn: !GetAtt MyCognitoUserPool.Arn
MiddlewareFunction:
Type: AWS::Serverless::Function
Properties:
CodeUri: aws-middleware/
Handler: app.lambda_handler
Runtime: python3.11
Timeout: 45
Architectures:
- x86_64
Events:
SqlStatement:
Type: Api
Properties:
Path: /my_route
Method: post
RestApiId: !Ref MiddlewareApi
Outputs:
MiddlewareApi:
Description: "API Gateway endpoint URL for Prod stage for SQL Statement function"
Value: !Sub "https://${MiddlewareApi}.execute-api.${AWS::Region}.amazonaws.com/Prod/my_route"
MiddlewareFunction:
Description: "SQL Statement Lambda Function ARN"
Value: !GetAtt MiddlewareFunction.Arn
MiddlewareFunctionIamRole:
Description: "Implicit IAM Role created for SQL Statement function"
Value: !GetAtt MiddlewareFunctionRole.Arn
CognitoUserPoolArn:
Description: "ARN of the Cognito User Pool"
Value: !GetAtt MyCognitoUserPool.Arn
你可以克隆 openai-cookbook 仓库,并从 lambda-middleware 目录中获取示例 Python 代码和 SAM 模板:
git clone https://github.com/pap-openai/aws-lambda-middleware
cd lambda-middleware
要构建并部署你的函数,请在此目录下运行以下命令
sam build
sam deploy --template-file template.yaml --stack-name aws-middleware --capabilities CAPABILITY_IAM
部署完成后,您可以在 AWS Lambda 上查看该应用程序:
你可以通过运行一个不带任何认证的 curl 命令来确认该函数在未认证的情况下不可访问:
curl -d {} <middleware_api_output_url_from_deploy_command>
这应该返回 {"message":"Unauthorized"}。
在 AWS Cognito 中设置身份验证
_可选:仅当您创建了用户池且未使用现有用户池时,才执行这些步骤_
让我们在新创建的用户池中创建一个用户。为此,请获取部署命令中 CognitoUserPoolArn 的输出,并获取 "/" 之后的值,其格式应为:your-region_xxxxx。
aws cognito-idp admin-create-user \
--user-pool-id "your-region_xxxxx" \
--username johndoe@example.com \
--user-attributes Name=email,Value=johndoe@example.com \
--temporary-password "TempPassword123"
现在,让我们确保创建一个可以登录的网页/域名。前往 AWS Cognito,选择新创建的用户池,然后进入“应用集成”选项卡:
点击“域”然后“创建 Cognito 域”来创建一个 Cognito 域。
向下滚动到您的用户池的“应用集成”页面上的 App client list:
选择你的应用客户端并编辑托管 UI:
并添加回调 URL、授权方案和 OAuth 作用域:
_请注意,当 ChatGPT 为你的操作认证生成回调 URL 时,你将回到此步骤。Postman URL 仅用于开发目的。_
你可以在 Postman 中测试此连接,在 <api_url> 的 Authorization 下,从 AWS 复制粘贴 client_id、client_secret 的值以及你为认证域设置的 URL,确保在 scope 中添加 openid 以获得有效的 access_token:

如果你现在在 Postman 中发起请求,使用刚刚获取的 access_token,你将得到一个成功的 JSON 返回:

在ChatGPT中创建操作
现在让我们将其集成到 ChatGPT 中。
创建一个操作(Action),并复制粘贴以下规范:
openapi: 3.1.0
info:
title: Success API
description: API that returns a success message.
version: 1.0.0
servers:
- url: https://3ho5n15aef.execute-api.us-east-1.amazonaws.com/Prod
description: Main production server
paths:
/my_route:
post:
operationId: postSuccess
summary: Returns a success message.
description: Endpoint to check the success status.
responses:
'200':
description: A JSON object indicating success.
content:
application/json:
schema:
type: object
properties:
success:
type: boolean
example: true
如果你尝试测试该操作(可以点击“测试”按钮),你会看到返回 401,因为你尚未通过身份验证。
现在让我们在操作中添加身份验证。
点击“身份验证”>“OAuth”。
接下来我们需要获取 AWS Cognito 的变量。转到你的用户池 > 用户池应用客户端。在那里你可以获取客户端 ID 和客户端密钥。
将这些值复制粘贴到 ChatGPT 中。现在让我们添加 Token URL。
在您的用户池中,您会找到之前为托管域创建的 URL。
我们将这个 URL 与 AWS 的 OAuth 路由 拼接起来。
- token:
<your_url>/oauth2/token - authorization:
<your_url>/oauth2/authorize
将这些复制粘贴到 ChatGPT 中。
在 scope 中,添加 openid 并点击保存。
使用 ChatGPT URL 配置 Cognito
现在回到你的 GPT(退出操作子视图),你会看到 ChatGPT 为身份验证提供的回调 URL:
获取此 URL 并编辑您的用户池应用客户端的托管 UI,然后保存更改:

测试函数
现在你可以再次测试这个操作了:
您将被重定向到 AWS Cognito 页面,您可以使用之前设置的凭据登录。
如果您现在让 GPT 执行相同的操作,它将正确回答,因为您现在已经通过身份验证,并且能够运行此功能!

结论
你现在已经在 ChatGPT 中设置了一个操作,它可以以认证的方式与你在 AWS 中的应用程序进行通信!本教程向你展示了如何从头开始使用用户名/密码创建 Cognito 池,不过,我们建议你根据自身需求来设置 Cognito(例如,将你自己的 IDP 插入 Cognito)。
此外,该函数未连接到任何其他服务,这正是能够安全地与 AWS Lambda 函数通信的优势所在。因此,你可以根据自己的需要调整代码和 AWS SAM 模板。一个更复杂函数的示例是 Redshift,它遵循这些步骤来创建函数和认证,但具有不同的代码/部署方式。
常见问题
常见错误及排查:1) 部署失败:检查 AWS 权限,确保有 CloudFormation、IAM 等权限;2) 401 Unauthorized:确认 Cognito 授权器配置正确,access_token 有效且包含 openid scope;3) 回调 URL 不匹配:在 ChatGPT 中获取回调 URL 后,必须更新 Cognito 应用客户端的回调 URL 设置;4) Lambda 超时:调整 SAM 模板中的 Timeout 参数,优化代码逻辑;5) VPC 连接问题:确保 Lambda 有正确的安全组和路由表,可访问目标服务;6) CORS 错误:在 API Gateway 中配置 CORS,允许 ChatGPT 域名。生产优化:使用 AWS X-Ray 监控性能,配置 Lambda 预留并发,使用 Secrets Manager 管理敏感信息,启用 CloudWatch 日志告警。
企业应用扩展
本教程的扩展方向:1) 集成更多 AWS 服务:如 DynamoDB、S3、SQS,通过修改 Lambda 代码和 SAM 模板实现;2) 自定义认证:将 Cognito 与现有 IdP(如 Okta、Azure AD)联合,实现企业 SSO;3) 文件处理:Lambda 生成 CSV/PDF 后上传至 S3,返回预签名 URL 给 ChatGPT;4) 异步任务:使用 Step Functions 编排长时任务,通过 WebSocket 或轮询返回结果;5) 多区域部署:使用 SAM 的部署配置实现多区域容灾;6) 成本优化:利用 Lambda 预留并发和 API Gateway 缓存降低费用。开发者可根据业务需求灵活调整模板和代码。
总结
本教程面向有编程基础的开发者,详细讲解如何构建一个受 OAuth 保护的 AWS Lambda 函数,并将其作为 GPT Action 的中间件。通过 AWS SAM 模板自动化部署 Cognito 用户池、API Gateway 和 Lambda 函数,实现 ChatGPT 与 AWS 服务的安全集成。教程涵盖环境准备、SAM 部署、Cognito 认证配置、ChatGPT Action 创建及测试,并深入分析架构设计、核心原理、常见错误与生产优化,帮助开发者快速构建可扩展的 AI 工程实践。
- --
内容来源与验证
- 内容等级:PREMIUM_A
- 质量等级:A
- 难度:中级
- 验证等级:V1
- 原文作者:pap-openai
- 原文日期:2024-08-09
- 来源许可:MIT
- 来源版本:
5853d669d1bb45cf3ce9aacb3f738e217675bec1 - 查看原文
站内还有更多完整实战教程
加入会员,解锁全部教程、完整代码与持续更新内容。
加入会员