我在 api 网关后面有一个 lambda 函数。当使用Invoke URL触发时,此功能工作正常。调用 URL 是阶段下方法选项卡中提供的链接。
\n\n\n\n\n\n我想为我的 api 设置自定义域,因此我按照标准程序设置 ACM 证书。除此之外,我还在route53中设置了域(api.tarkshala.com)。检查下面给出的屏幕截图。
\n\n\n\n\n\n\n\n但是,当我使用 Cloudfront 链接(d3pn2j4magp6tp.cloudfront.net)或使用 POSTMAN 的域名(api.tarkshala.com)访问 API 时,它最终会变成403 Forbidden。
\n\n我不知道我到底错过了什么?
\n\n响应标头如下所示:
\n\nConnection \xe2\x86\x92keep-alive\nContent-Length \xe2\x86\x9223\nContent-Type \xe2\x86\x92application/json\nDate \xe2\x86\x92Fri, 13 Apr 2018 03:17:25 GMT\nVia \xe2\x86\x921.1 a1cf0e6cf29b584b5fe1ada9ccee9758.cloudfront.net (CloudFront)\nX-Amz-Cf-Id \xe2\x86\x929Jh5HeQIuDNfm5WGlTae34oYZ7BiN3nI2VlH_8PJHLQ0mr2C20njJQ==\nX-Cache \xe2\x86\x92Error from cloudfront\nx-amz-apigw-id \xe2\x86\x92FQoiyF1phcwFVrg=\nx-amzn-ErrorType \xe2\x86\x92ForbiddenException\nx-amzn-RequestId \xe2\x86\x923013c239-3ec9-11e8-abe6-53449bcfc96c\nRun Code Online (Sandbox Code Playgroud)\n\n回复:
\n\n{\n "message": "Forbidden"\n}\nRun Code Online (Sandbox Code Playgroud)\n 我正在尝试在单个堆栈中部署 S3 静态网站和 API 网关/lambda。
S3 静态站点中的 javascript 调用 lambda 来填充 HTML 列表,但它需要知道用于 lambda 集成的 API 网关 URL。
目前,我像这样生成了一个 RestApi ......
const handler = new lambda.Function(this, "TestHandler", {
runtime: lambda.Runtime.NODEJS_10_X,
code: lambda.Code.asset("build/test-service"),
handler: "index.handler",
environment: {
}
});
this.api = new apigateway.RestApi(this, "test-api", {
restApiName: "Test Service"
});
const getIntegration = new apigateway.LambdaIntegration(handler, {
requestTemplates: { "application/json": '{ "statusCode": "200" }' }
});
const apiUrl = this.api.url;
Run Code Online (Sandbox Code Playgroud)
但是在 cdk 部署上,apiUrl =
"https://${Token[TOKEN.39]}.execute-api.${Token[AWS::Region.4]}.${Token[AWS::URLSuffix.1]}/${Token[TOKEN.45]}/"
因此,直到静态站点需要该值之后,才会解析/生成 url。
如何计算/查找/获取 API 网关 URL 并更新 cdk …
我正在使用 API Gateway websocket 连接,并且我已阅读此限制:
https://docs.aws.amazon.com/apigateway/latest/developerguide/limits.html
它说 WebSocket API 的连接持续时间限制为 2 小时。这是否意味着我无法保持连接超过 2 小时?如果是,解决方法是什么?我是否必须每 2 小时重新建立一次连接才能保持连接?
我想使用 AWS CDK 来定义 API 网关和 APIG 将代理到的 lambda。
OpenAPI 规范支持x-amazon-apigateway-integration对 Swagger 规范的自定义扩展(在此处详细说明),为此需要 lambda 的调用 URL。如果 lambda 定义在与 API 相同的堆栈中,我在 OpenAPI 规范中看不到如何提供它。我能想到的最好的方法是使用 lambda 定义一个堆栈,然后从中获取输出并运行sed以在 OpenAPI 规范中执行查找和替换以插入 uri,然后使用此修改创建第二个堆栈OpenAPI 规范。
例子:
/items:
post:
x-amazon-apigateway-integration:
uri: "arn:aws:apigateway:eu-west-2:lambda:path/2015-03-31/functions/arn:aws:lambda:eu-west-2:123456789012:function:MyStack-SingletonLambda4677ac3018fa48679f6-B1OYQ50UIVWJ/invocations"
passthroughBehavior: "when_no_match"
httpMethod: "POST"
type: "aws_proxy"
Run Code Online (Sandbox Code Playgroud)
一季度。这似乎是一个鸡与蛋的问题,以上是唯一的方法吗?
我尝试使用SpecRestApi CDK 构造的defaultIntegration属性。该文件指出:
除非指定了集成,否则用作此 API 中创建的所有方法的默认值的集成。
这似乎应该能够使用 CDK 规范中定义的 lambda 定义默认集成,因此所有方法都使用此集成,而无需提前知道 lambda 的 uri。
因此我试过这个:
SingletonFunction myLambda = ...
SpecRestApi openapiRestApi = SpecRestApi.Builder.create(this, "MyApi")
.restApiName("MyApi")
.apiDefinition(ApiDefinition.fromAsset("openapi.yaml"))
.defaultIntegration(LambdaIntegration.Builder.create(myLambda)
.proxy(false)
.build())
.deploy(true) …Run Code Online (Sandbox Code Playgroud) amazon-web-services swagger aws-lambda aws-api-gateway openapi
OpenID 提供商在众所周知的 URL 上发布其元数据。在 Okta 中,它看起来像这样:https://dev-599740.okta.com/oauth2/default/.well-known/oauth-authorization-server AWS Cognito 用户池是否有类似的 URL?如果不是,我如何找到 AWS Cognito 用户池的以下端点?
amazon-web-services amazon-cognito aws-api-gateway ibm-api-management aws-userpools
我正在使用 AWS Amplify 创建 Lambda 函数、REST API 和 Cognito 用户池。我想检索向端点发出请求的 Cognito 用户,以便我可以访问他们的用户属性。
我为该功能选择了无服务器 Express 模板:
应用程序.js
app.post('/do-something', async (req, res) => {
// The user pool ID is available as an environment variable.
// I want to get the user and use their user attributes here.
});
Run Code Online (Sandbox Code Playgroud)
客户端配置根据当前用户的令牌设置 Authorization 标头:
应用程序.js
Amplify.configure({
API: {
endpoints: [
{
name: "sampleCloudApi",
endpoint: "https://xyz.execute-api.us-east-1.amazonaws.com/Development",
custom_header: async () => {
return { Authorization: `Bearer ${(await Auth.currentSession()).getIdToken().getJwtToken()}` }
}
}
]
}
});
Run Code Online (Sandbox Code Playgroud)
事件 ( …
amazon-web-services amazon-cognito aws-lambda aws-api-gateway aws-amplify
我正在学习 AWS,并且正在深入研究 API Gateway。但我不清楚API网关中资源和方法之间的区别。我的想法是方法是资源的一部分,并且它们面向客户。而资源是一个更广泛的类别,涉及更多内容。如果有人可以帮助我以更简单和直观的方式识别它们之间的区别,我将不胜感激。我已经浏览了文档和一些 YouTube 视频。
我正在创建一个webhook来接收来自第三方服务的通知,他们将数据发送到具有内容类型的POST主体中application/x-www-form-urlencoded.
但它会产生同样的错误:
{"message": "Could not parse request body into json: Unrecognized token \'name\': was expecting \'null\', \'true\', \'false\' or NaN\n at [Source: [B@456fe137; line: 1, column: 6]"}
Run Code Online (Sandbox Code Playgroud)
我可以通过以下curl调用重现错误:
% curl -v -X POST -d 'name=Ignacio&city=Tehuixtla' https://rl9b6lh8gk.execute-api.us-east-1.amazonaws.com/prod/mandrillListener
* Trying 54.230.227.63...
* Connected to rl9b6lh8gk.execute-api.us-east-1.amazonaws.com (54.230.227.63) port 443 (#0)
* TLS 1.2 connection using TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
* Server certificate: *.execute-api.us-east-1.amazonaws.com
* Server certificate: Symantec Class 3 Secure Server CA - G4
* Server certificate: VeriSign Class 3 Public Primary Certification Authority …Run Code Online (Sandbox Code Playgroud) 我使用无服务器创建了一个lambda函数.此函数在GET请求上通过API网关触发,并应从缓冲区返回pdf文件.我正在使用html-pdf创建缓冲区并尝试使用以下命令返回pdf文件
let response = {
statusCode: 200,
headers: {'Content-type' : 'application/pdf'},
body: buffer.toString('base64'),
isBase64Encoded : true,
};
return callback(null, response);
Run Code Online (Sandbox Code Playgroud)
但浏览器只是无法加载pdf,所以我不确切知道如何将pdf文件直接返回到浏览器.无法找到解决方案.
lambda amazon-web-services node.js aws-api-gateway serverless-framework
我的设置目前看起来像:
API Gateway --- ALB --- ECS Cluster --- NodeJS Applications
|
-- Lambda
Run Code Online (Sandbox Code Playgroud)
我还在API网关上设置了自定义域名(更新:我使用了默认的API网关链接并遇到了同样的问题,我认为这不是自定义域名问题)
当ECS集群中的1个服务通过API网关调用另一个服务时,我得到了
主机名/ IP与证书的altnames不匹配:"Host:someid.ap-southeast-1.elb.amazonaws.com.不在证书的altnames中:DNS:*.execute-api.ap-southeast-1.amazonaws. COM"
为什么是这样?
UPDATE
我注意到当我启动调用API网关的本地服务器时,我收到类似的错误:
{
"error": "Hostname/IP doesn't match certificate's altnames: \"Host: localhost. is not in the cert's altnames: DNS:*.execute-api.ap-southeast-1.amazonaws.com\""
}
Run Code Online (Sandbox Code Playgroud)
如果我尝试禁用HTTPS检查:
const response = await axios({
method: req.method,
url,
baseURL,
params: req.params,
query: req.query,
data: body || req.body,
headers: req.headers,
httpsAgent: new https.Agent({
: false // <<=== HERE!
})
})
Run Code Online (Sandbox Code Playgroud)
我得到了这个......
{
"message": "Forbidden"
}
Run Code Online (Sandbox Code Playgroud)
当我直接在Postman上调用底层API网关URL时,它工作......不知何故,它让我想起了CORS,服务器似乎阻止了我的服务器localhost或ECS/ELB访问我的API网关?
它可能很令人困惑,所以我尝试的总结:
rejectUnauthorized: false …https amazon-web-services node.js amazon-elb aws-api-gateway
aws-api-gateway ×10
aws-lambda ×4
node.js ×2
amazon-elb ×1
aws-amplify ×1
aws-cdk ×1
https ×1
lambda ×1
openapi ×1
swagger ×1
websocket ×1