介绍: 接下来的内容将为您介绍...
在这篇文章里,我们将探讨如何通过一个安全的API网关和Lambda函数来与Amazon Bedrock模型互动。API Gateway使用Lambda Authorizer来确保安全,确保只有经过授权的请求才能访问Bedrock模型。这种设置提供了一种可扩展且安全的方法,将机器学习模型集成到应用程序中。
关于这个项目:
在这个项目中,我们设置了Amazon Bedrock模型,一个API网关和,以及两个Lambda函数:一个是“Authorizer” Lambda函数,它充当访问控制的角色,另一个是“Main” Lambda函数,这个函数向该Bedrock模型发送请求。我们还使用系统管理器的参数存储来安全存储授权令牌。注:API Gateway和Lambda为技术术语。
目前,AWS 不支持通过 AWS CLI 直接访问 Amazon Bedrock 服务,而需要通过 AWS 控制台进行访问。参数存储中的令牌是通过 AWS CLI 创建的,因为 CloudFormation 目前还不支持创建 SecureString 类型的参数。如需更多信息,请参阅 AWS CloudFormation SSM Parameter 文档。
所有其余资源 — Lambda 函数和 API 网关 — 都是使用 CloudFormation 创建的,确保基础设施以代码形式进行管理,并且易于部署和维护。
这个项目基于我之前的一个项目,该项目介绍了使用API Gateway、Lambda Authorizer和Secrets Manager构建无服务器架构的方法(点击此处阅读更多)。在当前版本中,我们改用Parameter Store来存储令牌,以节省成本,并在主Lambda函数和Bedrock模型之间增加了必要的连接。
基础设施架构
在 infrastructure/root.yaml
CloudFormation 模板中的主要 Lambda 函数配置和 IAM 角色配置:
参数:
BedrockModelId:
类型: String
默认: ''
资源:
MainLambdaFunction:
类型: AWS::Lambda::Function
属性:
FunctionName: MainLambdaFunction
Description: 调用Bedrock模型
Runtime: python3.12
Handler: index.lambda_handler
Role: !GetAtt MainLambdaExecutionRole.Arn
Timeout: 30
MemorySize: 512
Environment:
变量:
BEDROCK_MODEL_ID: !Ref BedrockModelId
Code:
ZipFile: |
import json
import boto3
from botocore.exceptions import ClientError
bedrock_runtime = boto3.client('bedrock-runtime')
def lambda_handler(event, context):
try:
model_id = os.environ['BEDROCK_MODEL_ID']
# 验证请求中的输入
input_text = event.get("queryStringParameters", {}).get("inputText")
if not input_text:
raise ValueError("请求查询参数中必须包含输入文本。")
# 准备调用Bedrock模型的有效载荷
payload = json.dumps({
"inputText": input_text,
"textGenerationConfig": {
"maxTokenCount": 8192,
"stopSequences": [],
"temperature": 0,
"topP": 1
}
})
# 调用Bedrock模型接口
response = bedrock_runtime.invoke_model(
modelId=model_id,
contentType="application/json",
accept="application/json",
body=payload
)
# 检查响应体为空并正确处理
if 'body' not in response or not response['body']:
raise ValueError("响应体为空。")
response_body = json.loads(response['body'].read().decode('utf-8'))
return {
'statusCode': 200,
'body': json.dumps(response_body)
}
except ClientError as e:
return {
'statusCode': 500,
'body': json.dumps({"error": "与Bedrock API交互时发生错误"})
}
except ValueError as e:
return {
'statusCode': 400,
'body': json.dumps({"error": str(e)})
}
except Exception as e:
return {
'statusCode': 500,
'body': json.dumps({"error": "内部服务器错误"})
}
MainLambdaExecutionRole:
类型: AWS::IAM::Role
属性:
RoleName: MainLambdaExecutionRole
AssumeRolePolicyDocument:
版本: '2012-10-17'
语句:
- 效果: Allow
Principal:
服务:
- lambda.amazonaws.com
动作:
- sts:AssumeRole
ManagedPolicyArns:
- arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole
策略:
- 策略名称: BedrockAccessPolicy
策略文档:
版本: '2012-10-17'
语句:
- 效果: Allow
动作:
- bedrock:InvokeModel
- bedrock:ListFoundationModels
资源: '*'
先决条件:
在开始之前,请确保满足以下条件:
- 拥有一个可以创建资源的AWS账户。
- 在您的本地机器上安装AWS CLI。
部署一下:
- 克隆这个代码库:使用下面的链接:代码库。
git clone https://gitlab.com/Andr1500/api-gateway-lambda-bedrock.git
这行命令是用来克隆一个GitLab仓库。请确保你已经安装了Git并且有相应的权限克隆这个仓库。更多相关信息可以通过访问仓库的主页来获取。
- 启动Amazon Bedrock模型。
在 AWS 控制台中找到 Amazon Bedrock 服务。
依次点击 开始使用 -> 请求模型访问 -> 修改模型访问,选择您所在区域中的合适模型(例如 Titan Text G1(Express))-> 下一步 > -> 提交。
等待几分钟后,刷新页面,你会看到“访问已授予”的信息。
请求访问基础模型
进入概览页面 -> 选择提供该模型的提供商 -> 选择模型 -> 查看该模型的API请求详情。不同模型的API请求配置会有所不同。
基岩模型API请求设置
在 AWS Systems Manager 参数存储中创建访问令牌。
aws ssm put-parameter --name "AuthorizationLambdaToken" --value "token_value_secret" --type "SecureString"
4. 填写 infrastructure/root.yaml
中所有必要的参数,以及 scripts/retrieve_invoke_url.sh
脚本中的参数,然后创建 CloudFormation 堆栈。
aws cloudformation create-stack \
--stack-name apigw-lambda-bedrock \
--template-body file://infrastructure/root.yaml \
--capabilities CAPABILITY_NAMED_IAM \
--disable-rollback
创建一个名为 apigw-lambda-bedrock 的堆栈,并使用指定的模板文件,同时禁用回滚功能。
5. 使用 scripts/retrieve_invoke_url.sh
脚本来调用 URL,获取 Stage 的调用 URL。
6. 从 CLI 测试 Bedrock 模型、主 Lambda 函数和 API 请求。必须使用 outfile
选项来保存响应内容到某个文件中这一点,因为根据 [aws bedrock-runtime invoke-model](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/bedrock-runtime/invoke-model.html)
和 [aws lambda invoke](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/invoke.html)
文档,outfile
选项是必需的。
CLI 的测试
zh: Postman的测试
7. 从SM Parameter Store中删除token,并删除CloudFormation堆栈中的token。
aws ssm delete-parameter --name "AuthorizationLambdaToken"
aws cloudformation delete-stack --stack-name apigw-lambda-bedrock
这些命令用于删除指定的参数和堆栈。
所以,结论是:
通过使用API Gateway、Lambda函数以及Amazon Bedrock模型,我们可以构建一个既可扩展又高效的解决方案,用于在无服务器环境中部署机器学习模型的应用。借助Lambda授权器的增加,这样,解决方案更加安全,可以有效防止未经授权的访问。
共同学习,写下你的评论
评论加载中...
作者其他优质文章