标签: aws-api-gateway

AWS API Gateway Websockets——connectionID 在哪里?

我正在 $connect 路由上设置一个带有自定义授权方的 AWS API Gateway Websockets,如下所述:

https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-websocket-api-route-keys-connect-disconnect.html

我的问题是——我如何获得 connectionID,即我可以用来稍后向该连接的客户端广播的标识符?

amazon-web-services websocket aws-api-gateway api-gateway

12
推荐指数
5
解决办法
7906
查看次数

API Gateway 上的数据聚合

我正在研究微服务架构,我想聚合来自两个微服务的数据。

例如,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

12
推荐指数
1
解决办法
5385
查看次数

CORS 策略阻止了从 '' from origin '' 获取数据的访问:请求的资源上不存在 'Access-Control-Allow-Origin' 标头

我有这个 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 以避免混淆,但即使如此,它仍然存在同样的问题。

cors aws-lambda aws-api-gateway

12
推荐指数
1
解决办法
9万
查看次数

在AWS Lambda上配置CORS响应头?

我正在尝试使用AWS API Gateway创建新服务,但我发现浏览器会自动调用OPTIONS方法以获取CORS信息.

问题是AWS API Gateway不提供配置CORS头的本机方式.

是否可以创建Lambda脚本以响应OPTIONS方法?

amazon-web-services cors aws-lambda aws-api-gateway

11
推荐指数
2
解决办法
2万
查看次数

如何将Cognito与生成的Javascript SDK一起使用?

我找不到任何显示如何执行此操作的文档,因此我尽力弄明白(这不是常见的用例)吗?我已经设置了我的资源以使用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

11
推荐指数
1
解决办法
1536
查看次数

AWS API Gateway和Lambda返回图像

说我有这个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,但似乎没有任何效果!

java api amazon-web-services aws-lambda aws-api-gateway

11
推荐指数
4
解决办法
1万
查看次数

AWS API Gateway和AWS Lambda - 处理客户端证书

我期待使用API​​ Gateway和Lambda构建API业务流程层.

对于我的基本用例,我希望在Lambda中有一个Python脚本,它只会从客户端(在本例中为移动应用程序)中继API网关收到的请求,并将外部HTTPS服务作为后端调用.

我的问题是:我们的移动客户端今天使用客户端证书与我们的HTTPS端点通信.如何在新的API Gateway + Lambda设置中拦截该客户端证书?

amazon-web-services aws-lambda aws-api-gateway

11
推荐指数
1
解决办法
3954
查看次数

如何将API网关与SQS集成

就像在标题中一样.我尝试使用云形成将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)

amazon-web-services aws-cloudformation aws-api-gateway

11
推荐指数
2
解决办法
7083
查看次数

同一域上的CloudFront和API网关服务

我想要:

  • 在我的域www.example.com上分发网站的静态部分(html,css,js).
  • 将API网关服务放在我的域下的文件夹www.example.com/v1下.

我该如何做到这一点?

在路线53中,根据我的理解,我只能指向一个云端分布,因此我选择启用S3/CloudFront的存储桶.

因此,最终结果应该是,按优先级/映射的顺序:

  • www.example.com/v1/*< - > API网关< - > Lambda < - > DynamoDB
  • www.example.com/*< - > CloudFront < - > S3存储桶内容

我能以什么方式实现这一目标?如果没有,我有什么选择,因为我需要在Web浏览器中弯曲到相同的原始要求.

amazon-s3 amazon-web-services amazon-cloudfront amazon-route53 aws-api-gateway

11
推荐指数
1
解决办法
2141
查看次数

AWS API Gateway:匿名用户无权执行API

尝试发布到我在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)

amazon-web-services aws-cloudformation aws-api-gateway

11
推荐指数
3
解决办法
9190
查看次数