为了账号安全,请及时绑定邮箱和手机立即绑定

通过API Gateway和Lambda函数与Amazon Bedrock模型进行交互

照片由 Levi KyivUnsplash 拍摄

介绍: 接下来的内容将为您介绍...

在这篇文章里,我们将探讨如何通过一个安全的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

部署一下:

  1. 克隆这个代码库:使用下面的链接:代码库
    git clone https://gitlab.com/Andr1500/api-gateway-lambda-bedrock.git

这行命令是用来克隆一个GitLab仓库。请确保你已经安装了Git并且有相应的权限克隆这个仓库。更多相关信息可以通过访问仓库的主页来获取。

  1. 启动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授权器的增加,这样,解决方案更加安全,可以有效防止未经授权的访问。

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消