GPT Actions 库 - AWS 中间件:AWS Lambda 集成指南

本教程面向有编程基础的开发者,详细讲解如何构建一个受 OAuth 保护的 AWS Lambda 函数,并将其作为 GPT Action 的中间件。通过 AWS SAM 模板自动化部署 Cognito 用户池、API Gateway 和 Lambda 函数,实现 ChatGPT 与 AWS 服务的安全集成。教程涵盖环境准备、SAM 部署、Cognito 认证配置、ChatGPT Action 创建及测试,并深入分析架构设计、核心原理、常见错误与生产优化,帮助开发者快速构建可扩展的 AI 工程实践。

技术背景

随着大语言模型(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 Lambda 服务来创建一个中间件函数。你可以通过访问以下链接来熟悉这一技术栈:

前提条件

在开始之前,请确保你拥有一个 AWS 控制台,并具备创建以下资源的权限:Lambda 函数、S3 存储桶、应用程序堆栈、Cognito 用户池、Cognito 用户池应用程序客户端、API 网关、Lambda 角色、CloudFormation 堆栈(这看起来很多,但创建这些服务是自动化的!)。

创建 AWS Lambda 函数

要创建 AWS 函数,可以使用 AWS SAM。SAM 模板的示例可以在这里找到 [0]。

该模板包括:

此代码纯粹是信息性的,可帮助您入门,不需要预先存在的 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 上查看该应用程序:

assets/images/17643d497aa3e438.png你可以通过运行一个不带任何认证的 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,选择新创建的用户池,然后进入“应用集成”选项卡:

assets/images/bc43a56fef32509e.png点击“域”然后“创建 Cognito 域”来创建一个 Cognito 域。

assets/images/106ffb7132b8e0f3.png向下滚动到您的用户池的“应用集成”页面上的 App client list:

assets/images/c623a47b8ff8be60.png选择你的应用客户端并编辑托管 UI:

assets/images/ffbd0f7d1a4b955e.png并添加回调 URL、授权方案和 OAuth 作用域:

assets/images/9e68645fa2297b31.png_请注意,当 ChatGPT 为你的操作认证生成回调 URL 时,你将回到此步骤。Postman URL 仅用于开发目的。_

你可以在 Postman 中测试此连接,在 <api_url> 的 Authorization 下,从 AWS 复制粘贴 client_id、client_secret 的值以及你为认证域设置的 URL,确保在 scope 中添加 openid 以获得有效的 access_token:

assets/images/458a75b8dbbd3f8.png

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

https://raw.githubusercontent.com/openai/openai-cookbook/main/images/aws_lambda_14.png

在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 和客户端密钥。

assets/images/52e21187e99a70dd.png将这些值复制粘贴到 ChatGPT 中。现在让我们添加 Token URL。

在您的用户池中,您会找到之前为托管域创建的 URL。

assets/images/a6d97378739ee764.png我们将这个 URL 与 AWS 的 OAuth 路由 拼接起来。

将这些复制粘贴到 ChatGPT 中。

在 scope 中,添加 openid 并点击保存。

使用 ChatGPT URL 配置 Cognito

现在回到你的 GPT(退出操作子视图),你会看到 ChatGPT 为身份验证提供的回调 URL:

assets/images/b0fba96177925b97.png获取此 URL 并编辑您的用户池应用客户端的托管 UI,然后保存更改:

assets/images/db48739015d77c06.png

测试函数

现在你可以再次测试这个操作了:

assets/images/77b6cc9db8f07c39.png您将被重定向到 AWS Cognito 页面,您可以使用之前设置的凭据登录。

如果您现在让 GPT 执行相同的操作,它将正确回答,因为您现在已经通过身份验证,并且能够运行此功能!

assets/images/815ddfba62647789.png

结论

你现在已经在 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 工程实践。

内容来源与验证

继续系统学习

站内还有更多完整实战教程

加入会员,解锁全部教程、完整代码与持续更新内容。

加入会员
查看全部API 与工程实践教程