é›¶æœåŠ¡å™¨éƒ¨ç½² AI 应用:Lambda Bedrock 卿µç¨‹å®žæˆ˜è®°å½•折è¾äº†ä¸¤å¤©ï¼Œç»ˆäºŽæŠŠä¸€å¥— Serverless AI 应用跑通了。从 Lambda 函数到 Bedrock 模型调用,踩了ä¸å°‘å‘,这里完整记录下æ¥ã€‚为什么è¦ç”¨ Serverless æž AI说实è¯ï¼Œä¸€å¼€å§‹æˆ‘也没想用 Lambda。我们团队有个需求——åšä¸€ä¸ªå†éƒ¨çŸ¥è¯†é—®ç”å·¥å·ï¼Œç”¨å¤§æ¨¡åž‹æ¥å›žç”技术问题。最åˆçš„æƒ³æ³•是起个 EC2 è·‘ FastAPIï¼Œä½†ç®—äº†ä¸‹æˆæœ¬ï¼š24 å°æ—¶æŒ‚ç€ EC2:就算用 t3.medium,一个月也è¦å‡ å美金实é™ä½¿ç”¨çŽ‡ï¼šå·¥ä½œæ—¶é—´å¤§æ¦‚ 8 å°æ—¶ï¼Œå‘¨æœ«åŸºæœ¬æ²¡äººç”¨çœŸæ£åœ¨å¤„ç†è¯·æ±‚的时间:å¯èƒ½ä¸€å¤©åŠ èµ·æ¥å°±å‡ åˆ†é’Ÿè¿™ä¸ªåˆ©ç”¨çŽ‡ä¹Ÿå¤ªä½Žäº†ã€‚åŽæ¥æƒ³åˆ° Lambda——按调用次数收费,没请求就是 $0,完美符åˆè¿™ä¸ªåœºæ™¯ã€‚æŠ€æœ¯æž¶æž„é•¿ä»€ä¹ˆæ ·æ•´ä¸ªé“¾è·¯å¶å®žä¸å¤æ‚:用户 → API Gateway → Lambda → Bedrock (Claude) → 返回结果用到的亚马逊云科技æœåŠ¡ï¼šAPI Gateway:HTTP å¥å£ï¼Œå¤„ç†è·¯ç”±å’Œè®¤è¯Lambda:业务逻辑,Python 3.12 runtimeBedrock:调用 Claude 3.5 Sonnet 模型IAM:æƒé™æŽ§åˆ¶ï¼ŒLambda 需è¦bedrock:InvokeModelæƒé™ç¬¬ä¸€æ¥ï¼šå†™ Lambda å‡½æ•°åˆæŠŠæ ¸å¿ƒé€»è¾‘è·‘é€šã€‚æ–°å»ºä¸€ä¸ªlambda_function.py:importjsonimportboto3 bedrockboto3.client(bedrock-runtime,region_nameus-east-1)deflambda_handler(event,context):# ä»Žè¯·æ±‚ä¸æ‹¿åˆ°ç”¨æˆ·é—®é¢˜bodyjson.loads(event.get(body,{}))questionbody.get(question,)ifnotquestion:return{statusCode:400,body:json.dumps({error:问题ä¸èƒ½ä¸ºç©º})}# 调用 Bedrock Clauderesponsebedrock.invoke_model(modelIdanthropic.claude-3-5-sonnet-20241022-v2:0,contentTypeapplication/json,acceptapplication/json,bodyjson.dumps({anthropic_version:bedrock-2023-05-31,max_tokens:2048,messages:[{role:user,content:question}]}))resultjson.loads(response[body].read())answerresult[content][0][text]return{statusCode:200,headers:{Content-Type:application/json},body:json.dumps({answer:answer})}这段代ç å°±åšäº†ä¸‰ä»¶äº‹ï¼šä»Ž API Gateway ä¼ è¿‡æ¥çš„ event 里拿问题调 Bedrock çš„ Claude 模型把回ç”返回去第二æ¥ï¼šéç½® IAM æƒé™Lambda 执行角色需è¦è¿™ä¸¤ä¸ªæƒé™ï¼š{Version:2012-10-17,Statement:[{Effect:Allow,Action:[bedrock:InvokeModel,bedrock:InvokeModelWithResponseStream],Resource:arn:aws:bedrock:us-east-1::foundation-model/anthropic.claude-3-5-sonnet-*},{Effect:Allow,Action:[logs:CreateLogGroup,logs:CreateLogStream,logs:PutLogEvents],Resource:arn:aws:logs:*:*:*}]}这里有个å‘——Bedrock 模型的 ARN æ ¼å¼è·Ÿå¶ä»–æœåŠ¡ä¸å¤ªä¸€æ ·ï¼Œè´¦å·é‚£æ®µæ˜¯ç©ºçš„(两个冒å·ä¹‹é—´æ²¡ä¸œè¥¿ï¼‰ã€‚第一次é的时候写æˆäº†arn:aws:bedrock:us-east-1:123456789:foundation-model/...,结果一直报 AccessDenied,查了åŠå¤©æ‰å‘现。第三æ¥ï¼šAPI Gateway 集æˆç”¨ HTTP APIï¼ˆä¸æ˜¯ REST API),更便宜更快:# 创建 HTTP APIaws apigatewayv2 create-api\--nameai-qa-api\--protocol-type HTTP# 创建 Lambda 集æˆaws apigatewayv2 create-integration\--api-id YOUR_API_ID\--integration-type AWS_PROXY\--integration-uri arn:aws:lambda:us-east-1:ACCOUNT:function:ai-qa\--payload-format-version2.0# 创建路由aws apigatewayv2 create-route\--api-id YOUR_API_ID\--route-keyPOST /ask踩å‘è®°å½•å‘ 1:Lambda è¶æ—¶Lambda é»˜è®¤è¶æ—¶æ˜¯ 3 秒,但 Bedrock è°ƒ Claude 一次å“应å¯èƒ½è¦ 5-15 ç§’ã€‚ç¬¬ä¸€æ¬¡æµ‹è¯•ç›´æŽ¥è¶æ—¶äº†ã€‚解决:把 Lambda è¶æ—¶æ”¹æˆ 30 ç§’ã€‚åœ¨æŽ§åˆ¶å°æ”¹æˆ–è€ç”¨ CLI:aws lambda update-function-configuration\--function-name ai-qa\--timeout30å‘ 2:冷å¯åŠ¨å»¶è¿ŸLambda 冷å¯åЍ Bedrock 首次调用,第一次请求å¯èƒ½è¦ç‰ 10 秒。åŽé¢å°±æ£å¸¸äº†ã€‚解决方案:éç½® Provisioned Concurrency(预置并å‘ï¼‰ï¼Œä¿æŒå‡ ä¸ªå®žä¾‹å¸¸çƒæˆ–è€ç”¨ CloudWatch Events 定时 pingï¼Œä¿æŒå‡½æ•°æ¸©çƒaws lambda put-provisioned-concurrency-config\--function-name ai-qa\--qualifierprod\--provisioned-concurrent-executions2å‘ 3:返回体大å°é™åˆ¶API Gateway åŒæ¥å“åº”ä¸Šé™ 10MB,Lambda è¿”å›žä¸Šé™ 6MBã€‚ä¸€èˆ¬é—®ç”æ²¡é—®é¢˜ï¼Œä½†å¦‚果让模型生æˆé•¿æ–‡ï¼Œè¦æ³¨æ„这个é™åˆ¶ã€‚å‘ 4:Bedrock åŒºåŸŸä¸æ˜¯æ‰€æœ‰åŒºåŸŸéƒ½æ”¯æŒ Bedrock。目å‰us-east-1å’Œus-west-2模型最å¨ã€‚å¦‚æžœä½ çš„ Lambda 在东京(ap-northeast-1),需è¦è·¨åŒºåŸŸè°ƒç”¨ Bedrock:bedrockboto3.client(bedrock-runtime,region_nameus-east-1)è·¨åŒºåŸŸè°ƒç”¨ä¼šå¢žåŠ 50-100ms 延迟,但对于 AI 应用æ¥è¯´è¿™ä¸ªå»¶è¿ŸåŸºæœ¬å¯ä»¥å¿½ç•¥ã€‚æˆæœ¬å¯¹æ¯”è·‘äº†ä¸€ä¸ªæœˆï¼Œå®žé™æ•°æ®ï¼šæ–¹æ¡ˆæœˆæˆæœ¬EC2 t3.medium 24/7~$30Lambda API Gateway~$3Lambda 方案çœäº† 90%ã€‚å½“ç„¶ï¼Œå¦‚æžœä½ çš„ QPS 很高(比如æ¯ç§’上百次请求),Lambda å而å¯èƒ½æ›´è´µã€‚按需选择就好。Lambda è®¡è´¹é€»è¾‘ï¼šæ¯æœˆå‰ 100 万次请求åè´¹ä¹‹åŽ $0.20/百万次å†å˜æŒ‰ GB-秒计费:$0.0000166667/GB-秒以 256MB å†å˜ã€å¹³å‡æ‰§è¡Œ 5 ç§’æ¥ç®—ï¼šæ¯æ¬¡è°ƒç”¨æˆæœ¬ ≈ $0.0000208一天 100 次 $0.002一个月 ≈ $0.06Bedrock 调用费是å¦ç®—的(按 token 计费),这里ä¸å±•开。进阶:æµå¼å“åº”ç”¨æˆ·ç‰ 10 秒看到完整回ç”,体验ä¸å¥½ã€‚æ”¹æˆæµå¼å“应,边生æˆè¾¹è¿”回:deflambda_handler(event,context):bodyjson.loads(event.get(body,{}))questionbody.get(question,)responsebedrock.invoke_model_with_response_stream(modelIdanthropic.claude-3-5-sonnet-20241022-v2:0,contentTypeapplication/json,acceptapplication/json,bodyjson.dumps({anthropic_version:bedrock-2023-05-31,max_tokens:2048,messages:[{role:user,content:question}]}))# æµå¼å¤„ç†éœ€è¦ Lambda Response Streamingchunks[]forevent_chunkinresponse[body]:chunkjson.loads(event_chunk[chunk][bytes])ifchunk[type]content_block_delta:chunks.append(chunk[delta][text])return{statusCode:200,body:json.dumps({answer:.join(chunks)})}真æ£çš„æµå¼éœ€è¦éåˆ Lambda Response Streaming(函数 URL RESPONSE_STREAM)或 WebSocket API。上é¢çš„å†™æ³•åªæ˜¯æŠŠæµå¼æŽ¥æ”¶åˆ°çš„å†å®¹æ‹¼èµ·æ¥ä¸€æ¬¡è¿”回,适åˆç®€å•场景。总结Lambda Bedrock æ AI åº”ç”¨ï¼Œæ ¸å¿ƒä¼˜åŠ¿å°±ä¸€ä¸ªå—:çœã€‚çœé’±ï¼ˆæŒ‰è°ƒç”¨è®¡è´¹ï¼‰ã€çœå¿ƒï¼ˆä¸ç”¨ç®¡æœåŠ¡å™¨ï¼‰ã€çœæ—¶ï¼ˆå‡ 个文件就能部署)。适åˆçš„场景:å†éƒ¨å·¥å·ã€é—®ç”机器人低频调用的 AI 功能(比如æ¯å¤©å‡ 百次)原型验è¯ã€å¿«é€Ÿä¸Šçº¿ä¸é€‚åˆçš„场景:高并å‘实时对è¯ï¼ˆWebSocket 场景建议用 ECS/EKSï¼‰éœ€è¦ GPU 推ç†çš„è‡ªå®šä¹‰æ¨¡åž‹å¦‚æžœä½ ä¹Ÿåœ¨è€ƒè™‘æ€Žä¹ˆä½Žæˆæœ¬ä¸Šçº¿ä¸€ä¸ª AI 功能,Lambda Bedrock å¯ä»¥è¯•试。📌 完整代ç å’Œ CloudFormation æ¨¡æ¿æˆ‘放在文末,有需è¦çš„直接拿走。所有代ç 基于亚马逊云科技 Lambda Python 3.12 è¿è¡Œæ—¶æµ‹è¯•通过。
零服务器部署 AI 应用:Lambda + Bedrock 全流程实战记录
é›¶æœåŠ¡å™¨éƒ¨ç½² AI 应用:Lambda Bedrock 卿µç¨‹å®žæˆ˜è®°å½•折è¾äº†ä¸¤å¤©ï¼Œç»ˆäºŽæŠŠä¸€å¥— Serverless AI 应用跑通了。从 Lambda 函数到 Bedrock 模型调用,踩了ä¸å°‘å‘,这里完整记录下æ¥ã€‚为什么è¦ç”¨ Serverless æž AI说实è¯ï¼Œä¸€å¼€å§‹æˆ‘也没想用 Lambda。我们团队有个需求——åšä¸€ä¸ªå†éƒ¨çŸ¥è¯†é—®ç”å·¥å·ï¼Œç”¨å¤§æ¨¡åž‹æ¥å›žç”技术问题。最åˆçš„æƒ³æ³•是起个 EC2 è·‘ FastAPIï¼Œä½†ç®—äº†ä¸‹æˆæœ¬ï¼š24 å°æ—¶æŒ‚ç€ EC2:就算用 t3.medium,一个月也è¦å‡ å美金实é™ä½¿ç”¨çŽ‡ï¼šå·¥ä½œæ—¶é—´å¤§æ¦‚ 8 å°æ—¶ï¼Œå‘¨æœ«åŸºæœ¬æ²¡äººç”¨çœŸæ£åœ¨å¤„ç†è¯·æ±‚的时间:å¯èƒ½ä¸€å¤©åŠ èµ·æ¥å°±å‡ åˆ†é’Ÿè¿™ä¸ªåˆ©ç”¨çŽ‡ä¹Ÿå¤ªä½Žäº†ã€‚åŽæ¥æƒ³åˆ° Lambda——按调用次数收费,没请求就是 $0,完美符åˆè¿™ä¸ªåœºæ™¯ã€‚æŠ€æœ¯æž¶æž„é•¿ä»€ä¹ˆæ ·æ•´ä¸ªé“¾è·¯å¶å®žä¸å¤æ‚:用户 → API Gateway → Lambda → Bedrock (Claude) → 返回结果用到的亚马逊云科技æœåŠ¡ï¼šAPI Gateway:HTTP å¥å£ï¼Œå¤„ç†è·¯ç”±å’Œè®¤è¯Lambda:业务逻辑,Python 3.12 runtimeBedrock:调用 Claude 3.5 Sonnet 模型IAM:æƒé™æŽ§åˆ¶ï¼ŒLambda 需è¦bedrock:InvokeModelæƒé™ç¬¬ä¸€æ¥ï¼šå†™ Lambda å‡½æ•°åˆæŠŠæ ¸å¿ƒé€»è¾‘è·‘é€šã€‚æ–°å»ºä¸€ä¸ªlambda_function.py:importjsonimportboto3 bedrockboto3.client(bedrock-runtime,region_nameus-east-1)deflambda_handler(event,context):# ä»Žè¯·æ±‚ä¸æ‹¿åˆ°ç”¨æˆ·é—®é¢˜bodyjson.loads(event.get(body,{}))questionbody.get(question,)ifnotquestion:return{statusCode:400,body:json.dumps({error:问题ä¸èƒ½ä¸ºç©º})}# 调用 Bedrock Clauderesponsebedrock.invoke_model(modelIdanthropic.claude-3-5-sonnet-20241022-v2:0,contentTypeapplication/json,acceptapplication/json,bodyjson.dumps({anthropic_version:bedrock-2023-05-31,max_tokens:2048,messages:[{role:user,content:question}]}))resultjson.loads(response[body].read())answerresult[content][0][text]return{statusCode:200,headers:{Content-Type:application/json},body:json.dumps({answer:answer})}这段代ç å°±åšäº†ä¸‰ä»¶äº‹ï¼šä»Ž API Gateway ä¼ è¿‡æ¥çš„ event 里拿问题调 Bedrock çš„ Claude 模型把回ç”返回去第二æ¥ï¼šéç½® IAM æƒé™Lambda 执行角色需è¦è¿™ä¸¤ä¸ªæƒé™ï¼š{Version:2012-10-17,Statement:[{Effect:Allow,Action:[bedrock:InvokeModel,bedrock:InvokeModelWithResponseStream],Resource:arn:aws:bedrock:us-east-1::foundation-model/anthropic.claude-3-5-sonnet-*},{Effect:Allow,Action:[logs:CreateLogGroup,logs:CreateLogStream,logs:PutLogEvents],Resource:arn:aws:logs:*:*:*}]}这里有个å‘——Bedrock 模型的 ARN æ ¼å¼è·Ÿå¶ä»–æœåŠ¡ä¸å¤ªä¸€æ ·ï¼Œè´¦å·é‚£æ®µæ˜¯ç©ºçš„(两个冒å·ä¹‹é—´æ²¡ä¸œè¥¿ï¼‰ã€‚第一次é的时候写æˆäº†arn:aws:bedrock:us-east-1:123456789:foundation-model/...,结果一直报 AccessDenied,查了åŠå¤©æ‰å‘现。第三æ¥ï¼šAPI Gateway 集æˆç”¨ HTTP APIï¼ˆä¸æ˜¯ REST API),更便宜更快:# 创建 HTTP APIaws apigatewayv2 create-api\--nameai-qa-api\--protocol-type HTTP# 创建 Lambda 集æˆaws apigatewayv2 create-integration\--api-id YOUR_API_ID\--integration-type AWS_PROXY\--integration-uri arn:aws:lambda:us-east-1:ACCOUNT:function:ai-qa\--payload-format-version2.0# 创建路由aws apigatewayv2 create-route\--api-id YOUR_API_ID\--route-keyPOST /ask踩å‘è®°å½•å‘ 1:Lambda è¶æ—¶Lambda é»˜è®¤è¶æ—¶æ˜¯ 3 秒,但 Bedrock è°ƒ Claude 一次å“应å¯èƒ½è¦ 5-15 ç§’ã€‚ç¬¬ä¸€æ¬¡æµ‹è¯•ç›´æŽ¥è¶æ—¶äº†ã€‚解决:把 Lambda è¶æ—¶æ”¹æˆ 30 ç§’ã€‚åœ¨æŽ§åˆ¶å°æ”¹æˆ–è€ç”¨ CLI:aws lambda update-function-configuration\--function-name ai-qa\--timeout30å‘ 2:冷å¯åŠ¨å»¶è¿ŸLambda 冷å¯åЍ Bedrock 首次调用,第一次请求å¯èƒ½è¦ç‰ 10 秒。åŽé¢å°±æ£å¸¸äº†ã€‚解决方案:éç½® Provisioned Concurrency(预置并å‘ï¼‰ï¼Œä¿æŒå‡ ä¸ªå®žä¾‹å¸¸çƒæˆ–è€ç”¨ CloudWatch Events 定时 pingï¼Œä¿æŒå‡½æ•°æ¸©çƒaws lambda put-provisioned-concurrency-config\--function-name ai-qa\--qualifierprod\--provisioned-concurrent-executions2å‘ 3:返回体大å°é™åˆ¶API Gateway åŒæ¥å“åº”ä¸Šé™ 10MB,Lambda è¿”å›žä¸Šé™ 6MBã€‚ä¸€èˆ¬é—®ç”æ²¡é—®é¢˜ï¼Œä½†å¦‚果让模型生æˆé•¿æ–‡ï¼Œè¦æ³¨æ„这个é™åˆ¶ã€‚å‘ 4:Bedrock åŒºåŸŸä¸æ˜¯æ‰€æœ‰åŒºåŸŸéƒ½æ”¯æŒ Bedrock。目å‰us-east-1å’Œus-west-2模型最å¨ã€‚å¦‚æžœä½ çš„ Lambda 在东京(ap-northeast-1),需è¦è·¨åŒºåŸŸè°ƒç”¨ Bedrock:bedrockboto3.client(bedrock-runtime,region_nameus-east-1)è·¨åŒºåŸŸè°ƒç”¨ä¼šå¢žåŠ 50-100ms 延迟,但对于 AI 应用æ¥è¯´è¿™ä¸ªå»¶è¿ŸåŸºæœ¬å¯ä»¥å¿½ç•¥ã€‚æˆæœ¬å¯¹æ¯”è·‘äº†ä¸€ä¸ªæœˆï¼Œå®žé™æ•°æ®ï¼šæ–¹æ¡ˆæœˆæˆæœ¬EC2 t3.medium 24/7~$30Lambda API Gateway~$3Lambda 方案çœäº† 90%ã€‚å½“ç„¶ï¼Œå¦‚æžœä½ çš„ QPS 很高(比如æ¯ç§’上百次请求),Lambda å而å¯èƒ½æ›´è´µã€‚按需选择就好。Lambda è®¡è´¹é€»è¾‘ï¼šæ¯æœˆå‰ 100 万次请求åè´¹ä¹‹åŽ $0.20/百万次å†å˜æŒ‰ GB-秒计费:$0.0000166667/GB-秒以 256MB å†å˜ã€å¹³å‡æ‰§è¡Œ 5 ç§’æ¥ç®—ï¼šæ¯æ¬¡è°ƒç”¨æˆæœ¬ ≈ $0.0000208一天 100 次 $0.002一个月 ≈ $0.06Bedrock 调用费是å¦ç®—的(按 token 计费),这里ä¸å±•开。进阶:æµå¼å“åº”ç”¨æˆ·ç‰ 10 秒看到完整回ç”,体验ä¸å¥½ã€‚æ”¹æˆæµå¼å“应,边生æˆè¾¹è¿”回:deflambda_handler(event,context):bodyjson.loads(event.get(body,{}))questionbody.get(question,)responsebedrock.invoke_model_with_response_stream(modelIdanthropic.claude-3-5-sonnet-20241022-v2:0,contentTypeapplication/json,acceptapplication/json,bodyjson.dumps({anthropic_version:bedrock-2023-05-31,max_tokens:2048,messages:[{role:user,content:question}]}))# æµå¼å¤„ç†éœ€è¦ Lambda Response Streamingchunks[]forevent_chunkinresponse[body]:chunkjson.loads(event_chunk[chunk][bytes])ifchunk[type]content_block_delta:chunks.append(chunk[delta][text])return{statusCode:200,body:json.dumps({answer:.join(chunks)})}真æ£çš„æµå¼éœ€è¦éåˆ Lambda Response Streaming(函数 URL RESPONSE_STREAM)或 WebSocket API。上é¢çš„å†™æ³•åªæ˜¯æŠŠæµå¼æŽ¥æ”¶åˆ°çš„å†å®¹æ‹¼èµ·æ¥ä¸€æ¬¡è¿”回,适åˆç®€å•场景。总结Lambda Bedrock æ AI åº”ç”¨ï¼Œæ ¸å¿ƒä¼˜åŠ¿å°±ä¸€ä¸ªå—:çœã€‚çœé’±ï¼ˆæŒ‰è°ƒç”¨è®¡è´¹ï¼‰ã€çœå¿ƒï¼ˆä¸ç”¨ç®¡æœåŠ¡å™¨ï¼‰ã€çœæ—¶ï¼ˆå‡ 个文件就能部署)。适åˆçš„场景:å†éƒ¨å·¥å·ã€é—®ç”机器人低频调用的 AI 功能(比如æ¯å¤©å‡ 百次)原型验è¯ã€å¿«é€Ÿä¸Šçº¿ä¸é€‚åˆçš„场景:高并å‘实时对è¯ï¼ˆWebSocket 场景建议用 ECS/EKSï¼‰éœ€è¦ GPU 推ç†çš„è‡ªå®šä¹‰æ¨¡åž‹å¦‚æžœä½ ä¹Ÿåœ¨è€ƒè™‘æ€Žä¹ˆä½Žæˆæœ¬ä¸Šçº¿ä¸€ä¸ª AI 功能,Lambda Bedrock å¯ä»¥è¯•试。📌 完整代ç å’Œ CloudFormation æ¨¡æ¿æˆ‘放在文末,有需è¦çš„直接拿走。所有代ç 基于亚马逊云科技 Lambda Python 3.12 è¿è¡Œæ—¶æµ‹è¯•通过。