- 文档
- 教程
- DevOps
- 运维
【免费下载链接】devops-exercises
Linux, Jenkins, AWS, SRE, Prometheus, Docker, Python, Ansible, Git, Kubernetes, Terraform, OpenStack, SQL, NoSQL, Azure, GCP, DNS, Elastic, Network, Virtualization. DevOps Interview Questions
本指南以 url_function 练习 及其官方解答为主线,完整演示如何在 AWS 中创建一个 Python 3 Lambda 函数,并通过 API Gateway 将其暴露为可通过浏览器 URL 直接访问的 HTTP 接口。读完本文,你将掌握 Lambda 函数的创建与测试、IAM 权限模型(角色 + 策略模板)、API Gateway 的资源/方法/映射模板配置,以及?name=mario这类查询参数如何被注入到 Lambda 事件中并返回Hello Mario的全链路原理。
练习目标与整体架构
url_function是 AWS 练习清单中 Lambda 分类下的第二个动手任务,紧接 hello_function。它的目标非常具体:
创建一个基础的 AWS Lambda 函数,当你在浏览器中输入一个 URL 时,函数被触发执行。
翻译成架构语言,就是两个核心环节:
- Lambda 函数本体:一段无服务器代码,接收事件(event)并返回响应;
- API Gateway 触发器:把公网 HTTP 请求转发给 Lambda,充当"用户 ↔ Lambda"之间的安全网关。
整条链路为:
浏览器输入 URL(如 .../hello?name=mario) │ ▼ API Gateway(REST API,GET /hello) │ 注入 { "name": "$input.params('name')" } ▼ Lambda 函数(lambda_handler) │ ▼ 浏览器显示:Hello Mario这与 AWS 官方推荐的无服务器实践一致——绝不把 Lambda 直接暴露给终端用户,而是用 API Gateway 作为前置端点(详见下文"为什么必须加 API Gateway"一节)。
第一步:在 Lambda 控制台创建函数
在 Lambda 控制台点击Create function,按以下要点配置:
| 配置项 | 本练习取值 | 说明 |
|---|---|---|
| 函数名称 | urlFunction | 后续 API Gateway 集成时要用到该名称 |
| 运行时 | Python3 | Lambda 原生支持 Python 3 运行时 |
| 权限 | 创建新角色(从 AWS 策略模板创建) | 函数需要独立的最小权限身份 |
| 策略模板 | Simple Microservice Permissions | 该模板授予函数写 CloudWatch Logs 等微服务基础权限 |
这里的权限配置体现了 Lambda 的核心安全模型:函数通过IAM 角色获得权限,而不是在代码里硬编码凭证。Simple Microservice Permissions模板对应的正是 AWS README 的 Lambda 问答中提到的"基础 Lambda 权限仅允许向 CloudWatch Logs 上传日志"——这也是为什么练习后续能直接在 CloudWatch 中查看函数日志。
编写函数代码:认识 lambda_handler 与事件注入
创建函数后,在控制台内置代码编辑器中粘贴如下代码:
import json def lambda_handler(event, context): firstName = event['name'] return 'Hello ' + firstName这是 Lambda 的标准入口约定:
event:触发事件的 JSON 对象。在本练习中,它由 API Gateway 的映射模板构造,包含从 URL 查询参数提取的name字段;context:运行时信息(如函数名、剩余执行时间),本例未使用;- 返回值:会被 API Gateway 包装为 HTTP 响应正文,最终呈现在浏览器中。
event['name']这种"直接按键取值"的写法,要求调用方必须提供name键。如果你希望在缺少参数时优雅降级,可以改用event.get('name', 'World')——这是生产代码中常见的健壮性写法。
事件结构并非一成不变,不同触发器注入的event形状完全不同。仓库中的 s3-lambda.py 展示了 S3 触发器场景下的真实事件解析:
def lambda_handler(event, context): print(event) # 先打印原始事件,便于调试 bucket_name = event['Records'][0]['s3']['bucket']['name'] object_key = event['Records'][0]['s3']['object']['key'] ... return { 'statusCode': 200, 'body': json.dumps("Lambda function executed successfully !!") }对比可见:S3 事件走event['Records']数组逐条处理,而 API Gateway 事件则直接包含你映射好的字段。调试时先print(event)观察原始结构,再写取值逻辑,是处理任何 Lambda 触发器的不二法门。
定义并运行测试:验证函数逻辑
在控制台点击Test,选择Create new test event,配置:
- Event name:
TestEvent(自定义) - Event JSON:
{ "name": "Spyro" }点击Create后,在测试事件下拉框选中TestEvent并点击Test:
- 预期看到
Execution result: succeeded,返回结果为Hello Spyro; - 前往AWS CloudWatch可看到与该次执行对应的日志流(log stream),这是排查函数问题的第一现场。
验证要点:这一步是在没有 API Gateway 的情况下,用模拟事件直接驱动函数,从而把"函数逻辑正确性"与"网关配置正确性"两个问题解耦——先保证函数本身没问题,再接入触发器,排错会容易得多。
定义触发器:用 API Gateway 把函数暴露为 URL
进入API Gateway 控制台,按以下顺序操作:
- 点击
New API Option,填写 API 名称与描述后创建; - 创建资源:
Actions -> Create Resource,填写资源名称,路径设为/hello,确认创建; - 创建方法:选中刚创建的资源,点击
Create Method,选择GET; - 集成类型选择
Lambda Function,填入此前创建的函数名urlFunction,确保与函数处于同一区域,然后确认权限设置(API Gateway 会自动为调用 Lambda 添加所需权限); - 修改 Body Mapping Templates:再次选中资源,将映射模板改为:
{ "name": "$input.params('name')" }这行模板是整条链路的关键:它把 HTTP 查询参数?name=xxx中的xxx提取出来,构造成 Lambda 期望的event结构; 6. 保存后点击Actions -> Deploy API完成部署。
映射模板原理:$input.params('name')是 API Gateway 的 Velocity 模板语法,用于读取请求中的查询参数。模板执行后,Lambda 收到的event就变成{"name": "mario"},从而命中函数里的event['name']。如果省略这一步,Lambda 会因event中没有name键而报KeyError。
运行函数:浏览器 URL 调用验证
部署完成后:
- 在 API Gateway 控制台的Stages(阶段)菜单中,选择刚才创建的 API,点击
GET方法; - 页面会给出Invoke URL(调用 URL),形如
https://<api-id>.execute-api.<region>.amazonaws.com/<stage>/hello; - 在 URL 末尾追加查询参数,使最终地址形如
.../hello?name=mario; - 在浏览器中打开该地址,即可看到返回结果
Hello Mario。
至此,完整的"浏览器输入 URL → API Gateway → Lambda → 返回文本"链路打通。你可以更换name的值做多次验证,也可以回到 CloudWatch 观察每次请求对应的日志流,确认触发记录。
深入理解:为什么必须用 API Gateway 暴露 Lambda?
本练习的设计绝非偶然,它对应了 AWS README 的 Lambda 问答中明确指出的架构要点:
用户不应直接访问 AWS Lambda。若要向用户暴露 Lambda 函数,正确做法是在用户与函数之间设置 API Gateway 端点。
直接暴露 Lambda 会带来两个问题:
- 安全:绕过网关等于把函数执行能力直接暴露给公网,缺乏鉴权、限流、缓存等 HTTP 层的控制手段;
- 易用性:用户只能通过 AWS 签名等非 HTTP 方式调用,无法直接在浏览器中访问。
API Gateway 则提供 HTTPS 端点、API 密钥、阶段(stage)管理与部署版本控制、请求/响应转换(即本练习的映射模板)等能力,让"函数"成为标准 Web 服务。这正是"用户 → API Gateway → Lambda"三层模型的核心理由。
更进阶的方向:IaC 与周边练习
本仓库的 AWS README 顶部说明特别提示:
提供的解答基于 AWS 控制台,建议使用 IaC 技术(如 Terraform、Pulumi)来完成练习。
因此,urlFunction的实战流程也可以迁移到基础设施即代码:在 Terraform 中声明aws_lambda_function资源、aws_api_gateway_rest_api与映射模板,实现一键部署与版本化。仓库中 web_app_lambda_dynamodb/terraform/main.tf 即展示了用 Terraform 声明 Lambda 配套资源(DynamoDB 表)的写法,可作为把练习"代码化"的参考起点。
此外,完成本练习后,建议顺带复习 AWS README 的 Lambda 知识点:Lambda 按执行时长与资源计费(函数闲置不收费)、支持 Python/Ruby/Go/Node.js/PowerShell/C# 等运行时、典型使用场景(S3 上传事件处理、SNS/SQS 消息触发、配合 CloudWatch Events 做定时任务)——这些背景能让你的实操理解从"会做"升级为"懂原理"。
小结
本文完整复刻了 url_function 解答 的四个阶段:建函数 → 写代码 → 模拟测试 → 网关触发。核心收获有三点:一是lambda_handler(event, context)的标准入口与事件取值方式;二是 IAM 角色/策略模板为函数提供最小权限的实践;三是 API Gateway 的映射模板{ "name": "$input.params('name')" }如何把 URL 查询参数安全地注入 Lambda。掌握这条链路后,你便拥有了搭建"浏览器可访问的无服务器接口"的最小可运行模板,可为后续接入数据库、消息队列等更复杂的 Lambda 练习打下基础。
- 文档
- 教程
- DevOps
- 运维
【免费下载链接】devops-exercises
Linux, Jenkins, AWS, SRE, Prometheus, Docker, Python, Ansible, Git, Kubernetes, Terraform, OpenStack, SQL, NoSQL, Azure, GCP, DNS, Elastic, Network, Virtualization. DevOps Interview Questions
相关推荐
devops-exercises AWS 实战:用 Lambda 与 API Gateway 构建 URL 触发的无服务器函数
devops exercises AWS 实战:用 Lambda 与 API Gateway 构建 URL 触发的无服务器函数 导读 本文基于 devops e
文档教程DevOps运维Dagger TypeScript SDK 的 Check 类:解析 `dagger check` 校验机制的完整 API
Dagger TypeScript SDK 的 Check 类:解析 dagger check 校验机制的完整 API 导读 Check 是 Dagger Ty
文档教程DevOps运维JSON:API无服务器函数:AWS Lambda与API Gateway
JSON:API无服务器函数:AWS Lambda与API Gateway 你还在为API开发的复杂部署流程烦恼吗?还在担心服务器维护成本和扩展性问题吗?本文将
后端API设计
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考