标签: aws-api-gateway

签名已过期:现在早于错误:InvalidSignatureException

我正在尝试使用AWS API Gateway和IAM授权的一个小例子.AWS API Gateway生成以下端点:

https://xyz1234.execute-api.us-east-2.amazonaws.com/Users/users
Run Code Online (Sandbox Code Playgroud)

使用POST操作,没有参数.

最初我关闭了这个POST方法的IAM,我使用Postman验证了结果.然后我创建了一个新的IAM用户并将AmazonAPIGatewayInvokeFullAccess策略附加到用户,从而授予调用任何API的权限.为POST方法启用了IAM.

然后我去了Postman - 并使用AccessKey,Secret Key,AWS Region as us-east-2和Service Name 添加了Authorization,execute-api并尝试执行请求,但我得到InvalidSignatureException错误,403为返回码.

正文包含以下信息:

Signature expired: 20170517T062414Z is now earlier than 20170517T062840Z (20170517T063340Z - 5 min.)" 
Run Code Online (Sandbox Code Playgroud)

我错过了什么?

amazon-web-services amazon-iam postman aws-api-gateway

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

AWS API网关没有"Access-Control-Allow-Origin"标头

我坚持使用API​​网关的问题,我已经在这个AWS论坛上完成了所有其他的SO答案,并且已经通过他们的文档,但仍然没有乐趣.

我正在尝试使用AWS API网关设置API,该网关调用Lambda函数,该函数读取/写入DynamoDB中的表.

DynamoDB的Lambda函数正在运行.我在AWS中创建了一个API,并为它创建了一个GET和OPTIONS方法.我读AWS并没有强制执行只有GET/POST的选项,但是当没有OPTIONS方法时我在我的ajax调用中遇到了预检错误,所以我添加了一个.

目前为了取得进展,我没有使用API​​密钥或授权.我可以使用POSTMAN成功调用我的GET方法,POSTMAN返回DynamoDB表的内容.

但是当我尝试使用JQuery ajax调用时,我得到了

No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'null' is therefore not allowed access.
Run Code Online (Sandbox Code Playgroud)

我可以看到在网络选项卡下使用Chrome开发工具,OPTIONS方法返回状态200,GET返回状态200,但出现上述错误.

我已尝试在OPTIONS和GET方法上启用CORS,在每次更改后重新部署API,尝试了以下(http://enable-cors.org/server_awsapigateway.html)但总是得到相同的错误安慰.

我正在从桌面上的文件执行ajax调用,因此origin是null,因为页面将部署到S3作为JS中的单个Web页面应用程序.

当我在我的GET和OPTIONS上启用CORS时,我可以看到Access-Control-Allow-Headers是'Content-Type,X-Amz-Date,Authorization,X-Api-Key,X-Amz-Security-Token'和Access-Control-Allow-Origin*是'*'

我的Ajax调用如下所示.我也尝试复制POSTMAN使用的确切标题,它具有Authorization标头集(我现在已在AWS中关闭)但我总是得到相同的错误

var awsHeaders = {};
awsHeaders['X-Amz-Date'] = '20161127T171734';

$('#add, #cloud').click(function() {

    $.ajax({

        type: 'GET',
        headers: awsHeaders,
        dataType : "json",
        url: '...',
        success: function (res) {

            console.log('response in GET:');
            console.log(res);

        },
        error: function(data) {
            console.log('in error');
            console.log(data);
        }

    });

});
Run Code Online (Sandbox Code Playgroud)

任何人都可以阐明我可能会失踪的东西吗?

非常感谢

更新 请参阅下面的答案,关于我如何根据DigitalKapteain评论解决这个问题 - 在我的Lambda函数的响应中设置'Access-Control-Allow-Origin':'*'标题.我在AWS文档中查找了这个,但无法找到它.此链接描述了Lambda和Lambda Proxy之间的区别,并说明了使用CORS时要执行的操作https://serverless.com/framework/docs/providers/aws/events/apigateway/

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

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

在Terraform中,如何在请求路径中使用变量指定API网关端点?

在AWS API Gateway中,我将端点定义为/users/{userId}/someAction,并且我尝试使用terraform重新创建此端点

我会开始像某样链接的gateway_resource链......

resource "aws_api_gateway_resource" "Users" {
  rest_api_id = "${var.rest_api_id}" 
  parent_id = "${var.parent_id}" 
  path_part = "users"
}

//{userId} here?

resource "aws_api_gateway_resource" "SomeAction" {
  rest_api_id = "${var.rest_api_id}" 
  parent_id = "${aws_api_gateway_resource.UserIdReference.id}"
  path_part = "someAction"
}
Run Code Online (Sandbox Code Playgroud)

然后我在其中定义了aws_api_gateway_method其他所有内容.

如何在terraform中定义此端点?terraform文档和示例不包括此用例.

amazon-web-services terraform aws-api-gateway

25
推荐指数
1
解决办法
8117
查看次数

API网关 - 发布multipart\form-data

似乎我的问题可能与类似.

我的API网关中有一个API,我正在通过POST的multipart/form-data文件的端点进行HTTP代理.

如果我直接调用http端点(而不是通过API网关) - 使用邮递员,它按预期工作,但是,使用API​​网关端点(通过邮递员)失败.

我已经比较了两个似乎相同的请求(通过fiddler和CloudWatch日志):

请求直接API调用(工作):

POST https://domainname/api/v1/documents HTTP/1.1
Host: api.service
Connection: keep-alive
Content-Length: 202
Authorization: AuthToken
Postman-Token: a75869d6-1d64-6b9f-513d-a80ac192c8e1
Cache-Control: no-cache
Origin: chrome-extension://fhbjgbiflinjbdggehcddcbncdddomop
docMetaInfo: some extra data needed
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryB85rsPlMffA2fziS
Accept: */*
Accept-Encoding: gzip, deflate, br
Accept-Language: en-US,en;q=0.8

------WebKitFormBoundaryB85rsPlMffA2fziS
Content-Disposition: form-data; name=""; filename="Test.txt"
Content-Type: text/plain

This is a test Text File
------WebKitFormBoundaryB85rsPlMffA2fziS--
Run Code Online (Sandbox Code Playgroud)

来自API网关的请求(不工作):

POST https://GATEWAY_domainname/api/v1/documents HTTP/1.1
Host: api-Gateway.service
Connection: keep-alive
Content-Length: 202
Authorization: …
Run Code Online (Sandbox Code Playgroud)

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

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

如何将ApiGateway指向特定的Lambda别名

我在亚马逊的ApiGateway创建了一个资源.它指向Lambda函数.这是受到本机移动应用程序(android和ios)的影响,它已经在野外.

我现在想要修改Lambda函数,但我认为无法将我的ApiGateway资源更改为指向lambda的别名.这是我第一次使用这些技术,我发现在aws控制台中没有简单的机制来管理它.

如何修改我的ApiGateway资源以指向我的lambda别名,以便我可以在不影响现有客户端的情况下编辑主干?

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

24
推荐指数
3
解决办法
7959
查看次数

ELB和ECS群集前的Amazon API网关

我正在尝试将Amazon API网关放在应用程序负载均衡器之前,这样可以平衡流向我的ECS群集的流量,我的所有微服务都部署在那里.使用API​​网关的动机是通过lambda函数使用自定义授权程序.

系统图

在此输入图像描述

在亚马逊语中(https://aws.amazon.com/api-gateway/faqs/):" 对后端操作的代理请求也需要在Internet上公开访问 ".这迫使我让ELB公开(面向互联网)而不是内部.然后,我需要一种方法来确保只有 API网关才能访问VPC外部的ELB.

我的第一个想法是在API Gatway中使用客户端证书,但ELB似乎不支持它.

任何想法都将受到高度赞赏!

amazon-web-services amazon-ecs amazon-elb aws-api-gateway

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

如何使用 AWS SAM 部署到不同环境

我有两个关于 AWS SAM 和部署的问题。

\n

我\xe2\x80\x99m 阅读文档并检查这样的示例,并且我\xe2\x80\x99m 仍然不太确定如何使用我的 SAM 模板单独部署到stagingproduction环境。是否像部署一个具有新名称(例如sam deploy \xe2\x80\x94stack-name my-app-staging和 )的新堆栈一样简单sam deploy \xe2\x80\x94stack-name my-app-production

\n

在下面的例子中,我有一个问题。如果我的 SAM 模板包含具有三个可能值的Parameters名称MyEnvironment,则部署如何知道在部署堆栈时使用这三个值中的哪个值?就像我会怎么说使用值stagingor production?这是我部署时会自动询问的问题还是我必须在 CLI 上提供的问题?

\n

在此输入图像描述

\n

aws-lambda aws-api-gateway aws-serverless aws-sam

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

如何重命名AWS API Gateway API实例?

在AWS API Gateway中,是否可以以某种方式重命名API实例?

我没有在UI上看到该选项,但也许可以通过使用一些API调用.

aws-api-gateway

23
推荐指数
4
解决办法
6956
查看次数

如何调试AWS Api Gateway&Lambda的"AWS/ApiGateway 5XXError"

我有一个运行lambda函数的API网关资源.我正在使用来自Api Gateway的AWS Generated SDK调用API网关资源.

这是我的客户端堆栈跟踪的一部分似乎相关:

Caused by: com.amazonaws.mobileconnectors.apigateway.ApiClientException: {"message": "Internal server error"} (Service: DevnetcountableClient; Status Code: 500; Error Code: null; Request ID: 348e8f98-6f55-11e6-97f6-098c2caf220f)
at com.amazonaws.mobileconnectors.apigateway.ApiClientHandler.handleResponse(ApiClientHandler.java:255) at com.amazonaws.mobileconnectors.apigateway.ApiClientHandler.invoke(ApiClientHandler.java:88)
    at java.lang.reflect.Proxy.invoke(Proxy.java:393)
    at $Proxy1.accountCreatePost(Unknown Source)
Run Code Online (Sandbox Code Playgroud)

现在看AWS控制台,我的API网关仪表板内我看到的请求进来并导致"AWS/ApiGateway 5XXError".但是有0个日志(我可以找到).我的lambda函数似乎没有被调用,也没有显示lambda日志.

现在这是我的lambda看起来像:

module.exports.createAccount = function(event, context, cb) {
    console.log('createAccount');
    console.log(event);
    console.log(context);
    console.log(cb);
    cb(null, {status: 'SUCCESS', message: 'I ran!'});
};
Run Code Online (Sandbox Code Playgroud)

我该怎么做才能调试这个?

编辑:好的,这是将所有内容整合在一起的cloudformation脚本.

{
   "AWSTemplateFormatVersion":"2010-09-09",
   "Description":"The AWS CloudFormation template for this Serverless application",
   "Resources":{
      "ServerlessDeploymentBucket":{
         "Type":"AWS::S3::Bucket"
      },
      "IamRoleLambda":{
         "Type":"AWS::IAM::Role",
         "Properties":{
            "AssumeRolePolicyDocument":{
               "Version":"2012-10-17",
               "Statement":[
                  {
                     "Effect":"Allow",
                     "Principal":{
                        "Service":[
                           "lambda.amazonaws.com"
                        ] …
Run Code Online (Sandbox Code Playgroud)

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

23
推荐指数
1
解决办法
6715
查看次数

在Cloudformation模板中为API网关启用CORS

我正在为我的环境创建AWS Cloudformation模板,但我找不到为API Gateway方法启用CORS的方法.

我可以使用AWS控制台配置它(这是官方文档),但是如何在Cloudformation模板中执行此操作?

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

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