我正在 $connect 路由上设置一个带有自定义授权方的 AWS API Gateway Websockets,如下所述:
我的问题是——我如何获得 connectionID,即我可以用来稍后向该连接的客户端广播的标识符?
我正在研究微服务架构,我想聚合来自两个微服务的数据。
例如,Frontend 调用 API Gateway,API Gateway 调用两个微服务 Customer 和 Order 微服务。客户微服务返回客户详细信息,订单微服务返回客户所有订购的产品。
这是使用 Ocelot 或 Azure API 管理从两个微服务聚合后 API 网关返回的格式。
格式 1
{
"Customers":[
{
"customerId":1001,
"customerName":"Tom"
},
{
"customerId":1002,
"customerName":"Jerry"
}
],
"Orders":[
{
"CustomerId":1001,
"Orders":[
{
"ProductId":"PRO1",
"ProductName":"Books"
},
{
"ProductId":"PRO2",
"ProductName":"Pens"
}
]
},
{
"CustomerId":1002,
"Orders":[
{
"ProductId":"PRO3",
"ProductName":"Pencils"
},
{
"ProductId":"PRO4",
"ProductName":"Toys"
}
]
}
]
}
Run Code Online (Sandbox Code Playgroud)
我想要的格式是格式 2。
格式 2
{
"OrderDetails":[
{
"customerId":1001,
"customerName":"Tom",
"Orders":[
{
"ProductId":"PRO1",
"ProductName":"Books"
},
{
"ProductId":"PRO2",
"ProductName":"Pens"
}
] …Run Code Online (Sandbox Code Playgroud) azure-api-management microservices aws-api-gateway api-gateway ocelot
我有这个 api(方法 get)连接到一个 lambda 函数,该函数从数据库中进行简单的选择,如果我用带有 null body 的 postman 测试端点,它确实可以工作(如果我理解,postman 不在同一个 CORS 下)政策),以及在浏览器上键入端点。

但是,当我尝试从简单的 js 中进行提取时,出现错误:从原点“http://localhost”在“...”处获取的访问已被 CORS 策略阻止:没有“Access-Control-Allow” -Origin'标头存在于所请求的资源上。如果不透明响应满足您的需求,请将请求模式设置为“no-cors”以在禁用 CORS 的情况下获取资源。
我在 API Gateway 中启用了 CORS,均使用启用 CORS 选项
并在创建新资源时启用 API Gateway CORS
如果我使用网关测试我的端点,我还会发现 Allow-content-allow-origin : * 位于我的响应标头中:

我应该怎么做才能解决这个问题?
这是 JS 获取:
console.log("pre fetch");
Show();
console.log("post fetch");
function Show(){
fetch("...").then(onResponse);//.then(onJson);
}
function onResponse(response){
console.log(response);
return response.json();
}
Run Code Online (Sandbox Code Playgroud)
我删除了 onJson 以避免混淆,但即使如此,它仍然存在同样的问题。
我正在尝试使用AWS API Gateway创建新服务,但我发现浏览器会自动调用OPTIONS方法以获取CORS信息.
问题是AWS API Gateway不提供配置CORS头的本机方式.
是否可以创建Lambda脚本以响应OPTIONS方法?
我找不到任何显示如何执行此操作的文档,因此我尽力弄明白(这不是常见的用例)吗?我已经设置了我的资源以使用IAM身份验证,设置CORS等.然后我部署了它,并下载了生成的SDK.
在客户端,我使用AWS.CognitoIdentityCredentials中的凭据和apigClientFactory.newClient.当我尝试发布到我的资源时,我收到403错误响应,没有正文.
响应标头包含: x-amz-ErrorType: UnrecognizedClientException
这个错误可能来自其他一些AWS服务(它们会像那样冒泡)吗?如果是这样,我怎么知道哪一个?还有什么可能导致错误?
我正在使用测试测试客户端的代码如下所示:
function onFacebookLogin(fbtoken) {
// get cognito credentials
AWS.config.credentials = new AWS.CognitoIdentityCredentials({
IdentityPoolId: 'us-east-1:abcd6789-1234-567a-b123-12ab34cd56ef',
Logins: {'graph.facebook.com': fbtoken}
});
AWS.config.credentials.get(function(err) {
if (err) {return console.error('Credentials error: ', err);}
/* I'm assuming that this is what I use for accessKey and secretKey */
var credentials = AWS.config.credentials;
apigClient = apigClientFactory.newClient({
accessKey: credentials.accessKeyId,
secretKey: credentials.secretAccessKey
});
});
}
Run Code Online (Sandbox Code Playgroud) javascript amazon-web-services amazon-cognito aws-lambda aws-api-gateway
说我有这个HTML:
<img src="http://example.com/pic"/>
Run Code Online (Sandbox Code Playgroud)
我想做的是将example.com/pic映射到AWS API Gateway端点.
然后该端点将调用lambda函数.
该lambda函数将从s3存储桶中读取随机图像并将其返回.
因此,我的目标是使用标准HTML图像标记,最后得到s3存储桶中的图像,但是通过lambda中的一些决策代码来决定要返回的图像.
我知道你可以使用s3直接提供静态内容(因此lambda可以决定什么图像).我也知道我可以在lambda中做一些事情,比如b64编码响应,然后在客户端处理它,但我的目标是使用标准的HTML IMG标记.
这可能吗?
我已经尝试将ResponseStreamHandler(Java SDK)用于lambda并返回图像的字节数组,并且还添加了API网关配置以不将输出映射到JSON,但似乎没有任何效果!
我期待使用API Gateway和Lambda构建API业务流程层.
对于我的基本用例,我希望在Lambda中有一个Python脚本,它只会从客户端(在本例中为移动应用程序)中继API网关收到的请求,并将外部HTTPS服务作为后端调用.
我的问题是:我们的移动客户端今天使用客户端证书与我们的HTTPS端点通信.如何在新的API Gateway + Lambda设置中拦截该客户端证书?
就像在标题中一样.我尝试使用云形成将API网关方法与SQS集成.我缺少的是SQS的正确URI.如果你们中的任何人已经这样做了,那么URI应该是什么样的?
我想出了类似的东西,但不知道在哪里放置SQS ARN
"arn:aws:apigateway:${AWS::Region}:sqs:action/SendMessage"
Run Code Online (Sandbox Code Playgroud)
以下是该方法的完整配置:
PostMethod:
Type: "AWS::ApiGateway::Method"
Properties:
ApiKeyRequired: "true"
HttpMethod: "POST"
ResourceId: !Ref "SomeResource"
RestApiId: !Ref "SomeRestApi"
Integration:
IntegrationHttpMethod: "POST"
IntegrationResponses:
- StatusCode: 200
Type: "AWS"
Uri: "arn:aws:apigateway:${AWS::Region}:sqs:action/SendMessage"
Run Code Online (Sandbox Code Playgroud)
如果你与lambda函数集成,这里是一个URI的例子:
arn:aws:apigateway:us-west-2:lambda:path//2015-03-31/functions/arn:aws:lambda:us-west-2:123412341234:function:function_name/invocations
-
Run Code Online (Sandbox Code Playgroud) 我想要:
我该如何做到这一点?
在路线53中,根据我的理解,我只能指向一个云端分布,因此我选择启用S3/CloudFront的存储桶.
因此,最终结果应该是,按优先级/映射的顺序:
我能以什么方式实现这一目标?如果没有,我有什么选择,因为我需要在Web浏览器中弯曲到相同的原始要求.
amazon-s3 amazon-web-services amazon-cloudfront amazon-route53 aws-api-gateway
尝试发布到我在API网关中创建的API:
{
"Message": "User: anonymous is not authorized to perform: execute-api:Invoke on resource: arn:aws:execute-api:us-west-2:***********:jrr7u1ekrr/v0/POST/user"
}
Run Code Online (Sandbox Code Playgroud)
如何更新CloudFormation中的策略以使POST端点公开可用?我在声明带有AWS::ApiGateway::RestApi资源类型的API 。
API政策属性为:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": "*",
"Action": "execute-api:Invoke",
"Resource": "execute-api:/*/POST/user"
}
]
}
Run Code Online (Sandbox Code Playgroud) aws-api-gateway ×10
aws-lambda ×5
api-gateway ×2
cors ×2
amazon-s3 ×1
api ×1
java ×1
javascript ×1
ocelot ×1
websocket ×1