VPC管理Lambda访问私有API Gateway的IAM权限控制及签名示例请求
私有API Gateway的IAM访问控制与AWSv4签名实现示例
核心结论
要让VPC内的Lambda通过IAM权限访问私有API Gateway,必须给fetch请求添加AWSv4签名。私有API Gateway启用IAM授权后,会验证每个请求的签名有效性,以及发起请求的IAM实体(即Lambda的执行角色)是否具备调用该API的权限。
前置准备
- 给Lambda的执行角色添加
execute-api:Invoke权限,权限策略示例:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "execute-api:Invoke", "Resource": "arn:aws:execute-api:REGION:ACCOUNT_ID:API_ID/STAGE/*/*" } ] }
- 确保私有API Gateway已启用IAM授权(在API Gateway控制台的「授权」设置中选择「IAM」)
Lambda中带AWSv4签名的Fetch请求示例(Node.js)
使用AWS SDK v3的签名工具生成签名,无需手动拼接签名字段:
- 安装依赖(若Lambda采用部署包方式,需将这些依赖打包进部署包):
npm install @aws-sdk/signature-v4 @aws-sdk/util-uri-escape @aws-sdk/util-format-url node-fetch
- Lambda代码示例:
const { SignatureV4 } = require("@aws-sdk/signature-v4"); const { defaultProvider } = require("@aws-sdk/credential-provider-node"); const { formatUrl } = require("@aws-sdk/util-format-url"); const { uriEscapePath } = require("@aws-sdk/util-uri-escape"); const fetch = require("node-fetch"); const REGION = "us-east-1"; // 替换为你的API Gateway所属区域 const API_ENDPOINT = "https://your-api-id.execute-api.us-east-1.amazonaws.com/your-stage/your-path"; // 替换为你的私有API地址 exports.handler = async () => { // 初始化签名器,自动获取Lambda执行角色的凭证 const signer = new SignatureV4({ credentials: defaultProvider(), region: REGION, service: "execute-api", }); // 构造请求基础参数 const request = { method: "GET", // 替换为实际请求方法(POST/PUT等) hostname: new URL(API_ENDPOINT).hostname, path: uriEscapePath(new URL(API_ENDPOINT).pathname), headers: { "Content-Type": "application/json", }, // 若为POST请求,添加请求体:body: JSON.stringify({ key: "value" }) }; // 生成带签名的请求参数 const signedRequest = await signer.sign(request); // 格式化签名后的请求URL const signedUrl = formatUrl({ protocol: "https:", hostname: request.hostname, path: request.path, }); // 发起fetch请求 const response = await fetch(signedUrl, { method: request.method, headers: signedRequest.headers, // 若有请求体,添加:body: signedRequest.body }); const data = await response.json(); return { statusCode: response.status, body: JSON.stringify(data), }; };
关键说明
- 签名器会自动从Lambda执行环境中获取IAM凭证,无需硬编码密钥
- 私有API Gateway的VPC端点(若使用)无需额外配置签名逻辑,该逻辑对VPC内访问同样生效
- 若使用Python环境,可借助
botocore.auth.SigV4Auth类实现类似签名逻辑
内容的提问来源于stack exchange,提问作者hendry
相关产品推荐
相关产品推荐

