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

如何在Ajax请求中传递IAM密钥调用API Gateway触发Lambda?

在前端Ajax请求中使用IAM身份验证调用AWS API Gateway

首先要明确:直接在前端代码中硬编码IAM用户的Access Key和Secret Access Key是非常危险的,因为前端代码完全公开,任何人都能获取这些密钥并滥用权限。生产环境强烈建议使用AWS Cognito身份池来获取临时STS凭证,而非使用长期IAM用户密钥。不过针对你的测试场景,下面是实现方法:

AWS_IAM认证的API请求需要对请求进行签名,而不是直接在请求里传递密钥。手动实现签名逻辑非常复杂,推荐使用AWS SDK for JavaScript来自动处理签名。

实现步骤

1. 引入AWS SDK for JavaScript

可以通过CDN在页面中引入:

<script src="https://sdk.amazonaws.com/js/aws-sdk-2.1000.0.min.js"></script>

2. 配置AWS凭证(仅测试用,生产禁用)

注意:绝对不要在生产环境的前端代码中硬编码长期IAM密钥,这里仅用于测试验证:

AWS.config.update({
  accessKeyId: 'YOUR_IAM_ACCESS_KEY',
  secretAccessKey: 'YOUR_IAM_SECRET_KEY',
  region: 'us-east-1' // 替换为你的API Gateway所在区域
});

3. 使用AWS SDK调用API Gateway

你可以选择适配原有Ajax逻辑的两种实现方式:

方式一:使用AWS SDK的API Gateway客户端

alert("subject area going to add to db");

// 初始化API Gateway客户端
const apiClient = new AWS.ApiGatewayManagementApi({
  endpoint: 'https://****.execute-api.us-east-1.amazonaws.com/test' // 替换为你的API Gateway阶段端点
});

// 构造请求参数
const params = {
  ConnectionId: 'ignored', // 非WebSocket API可以填任意值
  Data: JSON.stringify({ subjectAreaId: $('#subjectAreaId').val() })
};

// 发送请求
apiClient.postToConnection(params, function(err, data) {
  if (err) {
    alert("error: " + err.message);
    console.log(err, err.stack);
  } else {
    alert("you are able to invoke lambda function using api url");
    console.log(data);
  }
});

方式二:结合jQuery Ajax与AWS签名

如果你更习惯用jQuery,可以利用AWS SDK生成签名后的请求头:

AWS.config.update({
  accessKeyId: 'YOUR_IAM_ACCESS_KEY',
  secretAccessKey: 'YOUR_IAM_SECRET_KEY',
  region: 'us-east-1'
});

const request = new AWS.HttpRequest('https://****.execute-api.us-east-1.amazonaws.com/test/*******', 'us-east-1');
request.method = 'GET';
request.headers['Content-Type'] = 'application/json';
request.params = { subjectAreaId: $('#subjectAreaId').val() };

// 签名请求
const signer = new AWS.Signers.V4(request, 'execute-api');
signer.addAuthorization(AWS.config.credentials, new Date());

// 用jQuery发送签名后的请求
$.ajax({
  url: request.endpoint.href + '?' + $.param(request.params),
  type: request.method,
  headers: request.headers,
  dataType: 'json',
  crossDomain: true,
  success:function(response){
    alert("you are able to invoke lambda function using api url");
  },
  error: function (jqXHR, textStatus, errorThrown) {
    alert(jqXHR.responseText);
    alert("error ");
  }
});

关键安全与权限优化提醒

  • 禁止生产环境硬编码密钥:一旦泄露,攻击者可以使用该密钥执行所有IAM用户被允许的操作,严重威胁你的AWS资源安全。
  • 生产环境替代方案:使用AWS Cognito身份池,为前端用户提供临时的、权限受限的STS凭证。你可以配置身份池的未授权角色,仅允许调用指定的API Gateway资源,这样即使凭证泄露,也有过期时间且权限被严格限制。
  • 缩小IAM权限范围:你的IAM用户策略中Resource字段arn:aws:execute-api:*:account-id:*范围太广,建议缩小到具体的API Gateway资源ARN,比如arn:aws:execute-api:us-east-1:account-id:api-id/stage-name/GET/resource-path,进一步降低权限泄露的风险。

内容的提问来源于stack exchange,提问作者Maldanna Gk

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 08:07:55