You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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的签名工具生成签名,无需手动拼接签名字段:

  1. 安装依赖(若Lambda采用部署包方式,需将这些依赖打包进部署包):
npm install @aws-sdk/signature-v4 @aws-sdk/util-uri-escape @aws-sdk/util-format-url node-fetch
  1. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 12:29:53