如何在AWS Lambda中运行C语言代码并对接API Gateway?
在AWS Lambda中运行C语言程序并对接API Gateway的实现方案
基础运行逻辑说明
- AWS Lambda原生支持的运行时包括Java、Go、PowerShell、Node.js、C#、Python、Ruby,非原生语言统一通过Custom Runtime机制承载,你提到的Runtime API就是Custom Runtime和Lambda服务交互的内置接口,核心交互逻辑完全固定,不需要依赖官方SDK就能实现。
- Lambda Custom Runtime的核心规则:你需要提供一个名为
bootstrap的可执行文件作为入口,Lambda启动执行环境后会自动运行这个文件;所有Runtime API的请求都发给环境变量AWS_LAMBDA_RUNTIME_API指定的本地环回地址,不需要公网访问。 - Lambda执行环境只有
/tmp目录具备写入权限,其余目录均为只读挂载,单次执行环境存活周期内/tmp目录下的文件可以复用,最大可用容量为10GB,你的C语言文件读写逻辑必须把文件路径放在这个目录下。
具体实现步骤
- 编写C语言核心逻辑
先实现你需要的文件读写能力,注意路径约束,最简示例代码如下:
#include <stdio.h> #include <string.h> #include <stdlib.h> // 示例:写入文件后读取内容返回 const char* run_file_io() { FILE* fp = fopen("/tmp/test.txt", "w+"); if (fp == NULL) { return "{\"statusCode\":500,\"body\":\"file open error\"}"; } fputs("C runtime on Lambda works", fp); fflush(fp); rewind(fp); static char resp_buf[2048] = {0}; char content[1024] = {0}; fread(content, 1, sizeof(content)-1, fp); fclose(fp); // 构造API Gateway代理集成要求的响应格式 snprintf(resp_buf, sizeof(resp_buf), "{\"statusCode\":200,\"headers\":{\"Content-Type\":\"text/plain\"},\"body\":\"%s\"}", content); return resp_buf; }- 编写C语言核心逻辑
- 实现Runtime API交互逻辑
你只需要用HTTP客户端(C语言推荐直接用libcurl)实现三个固定流程即可:
- 循环调用本地Runtime API的
/runtime/invocation/next端点,拉取新的触发请求,从响应头里拿到当前请求的Lambda-Runtime-Aws-Request-Id值,从响应体里拿到API Gateway传过来的请求参数、请求头等信息 - 拿到请求后调用你自己的业务逻辑(也就是上面写的文件读写函数)处理,拿到返回结果
- 如果处理成功,调用
/runtime/invocation/<请求ID>/response端点把结果回传;如果处理报错,调用/runtime/invocation/<请求ID>/error端点回传错误信息
编译的时候必须做静态编译,避免Lambda环境缺少依赖库无法运行,参考编译命令:gcc -o bootstrap main.c -lcurl -static,最终生成的可执行文件名必须是bootstrap。
- 实现Runtime API交互逻辑
- 部署Lambda函数
把编译好的bootstrap文件压缩成zip包,创建Lambda函数时运行时选择「自定义运行时(Amazon Linux 2)」,上传zip包,根据你的业务需求配置内存、超时时间即可。如果编译时遇到依赖兼容问题,直接在Amazon Linux 2的容器环境中编译,能100%匹配Lambda的运行环境。
- 部署Lambda函数
- 对接API Gateway
函数创建完成后,直接在API Gateway中创建HTTP/REST API,选择Lambda代理集成绑定你的函数即可。注意回传给API Gateway的响应必须包含statusCode、headers、body三个字段,否则API Gateway会返回格式错误。
- 对接API Gateway
避坑提示
- 绝对不要尝试向
/tmp之外的路径写入文件,会直接触发权限错误导致函数执行失败。 - 拉取事件的HTTP请求不要设置过短的超时,这个请求会阻塞直到有新的事件触发,最长阻塞时间和你配置的Lambda函数超时时间一致。
- 如果你的C程序依赖其他第三方库,静态编译的时候要把所有依赖都打进去,不要依赖Lambda环境自带的系统库。
内容的提问来源于stack exchange,提问作者Stéphane GRILLON
相关产品推荐
相关产品推荐

