【发布时间】:2021-04-13 23:01:52
【问题描述】:
我正在尝试从我已使用 IAM 授权方保护的 lambda 函数调用 AWS ApiGateway HTTP 端点,但是我无法从我的 lambda 函数中获得任何东西来工作。
我已经使用 Postman 测试了端点,当我选择“AWS 签名”作为授权类型并输入我的本地凭证时,可以确认它可以工作,因此端点的设置方式不是问题。这一定是我如何从 Lambda 发送请求的问题。额外的挑战是将标头添加到 GraphQL API 请求中。
这就是我的 lambda 函数的样子:
import { ApolloServer } from 'apollo-server-lambda';
import { APIGatewayProxyEvent, Callback, Context } from 'aws-lambda';
import { ApolloGateway, RemoteGraphQLDataSource } from '@apollo/gateway';
import aws4 from 'aws4';
const userServiceUrl = process.env.USER_SERVICE_URL;
const {hostname, pathname} = new URL(userServiceUrl);
class AuthenticatedDataSource extends RemoteGraphQLDataSource {
willSendRequest({request}) {
console.log('request is: ', request);
const opts: Record<string, any> = {
service: 'execute-api',
region: process.env.AWS_REGION,
host: hostname,
path: pathname,
body: JSON.stringify({query: request.query}),
method: 'POST'
}
aws4.sign(opts);
console.log('opts are: ', opts);
request.http.headers.set('X-Amz-Date', opts.headers['X-Amz-Date']);
request.http.headers.set('Authorization', opts.headers['Authorization']);
request.http.headers.set('X-Amz-Security-Token', opts.headers['X-Amz-Security-Token']);
}
}
无论我尝试什么,我总是会收到 403 禁止错误,并且请求永远不会到达授权方背后的实际端点。我尝试删除正文,尝试将本地凭据硬编码到 aws4 调用中,但都不起作用。我的预感是我的签名调用在某种程度上是错误的,但是当我将它与我在互联网上找到的几个示例进行比较时,我看不出任何明显的错误。
任何可以为我指明正确方向的资源将不胜感激。我发现的大多数示例都是特定于前端的,所以我知道这可能会误导我。
【问题讨论】:
标签: node.js aws-lambda aws-api-gateway amazon-iam apollo-server