标签: aws-api-gateway

测量 AWS Lambda 启动持续时间

我目前正在收集和记录我的函数的性能指标,我缺少的唯一指标是启动持续时间(我的函数非常大,压缩了大约 35MB)。我真的需要知道启动需要多长时间,更重要的是,它发生的频率(我感觉它发生的频率更高,因为我的并发执行限制已经提高)。

有没有办法在 Lambda 中检索这些信息?或者有人可以想到通过例如映射模板传递 API 网关调用的当前时间戳的可能性,以便我可以自己计算启动时间?

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

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

在 AWS API Gateway 中,如何在 Lambda(节点)中包含阶段参数作为事件变量的一部分?

我有一个名为“环境”的阶段变量设置。

我想将它POST作为 JSON 的一部分在请求中传递。

例子:

阶段变量

  • 环境:“发展”

JSON

{
  "name": "Toli",
  "company": "SomeCompany"
}
Run Code Online (Sandbox Code Playgroud)

event 变量应该看起来像;

{
  "name": "Toli",
  "company": "SomeCompany",
  "environment": "development"
}
Run Code Online (Sandbox Code Playgroud)

到目前为止,我能想到的最好的是以下映射模板(在集成请求下):

{
    "body" : $input.json('$'),
    "environment" : "$stageVariables.environment"
}
Run Code Online (Sandbox Code Playgroud)

然后在节点我做

exports.handler = function(event, context) {
    var environment = event.environment;
    // hack to merge stage and JSON
    event = _.extend(event.body, {
      environment : environment
    });
    ....
Run Code Online (Sandbox Code Playgroud)

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

2
推荐指数
1
解决办法
1167
查看次数

如何使用 Ruby Base64 模块对哈希进行编码

我正在尝试编码一个散列,我希望它返回一些我知道的值。这是我编写的用于编码的 ruby​​ 脚本。

policy = {
 "expiration": "2015-12-30T12:00:00.000Z",
 "conditions": [
   {"bucket": "sigv4examplebucket"},
   ["starts-with", "$key", "user/user1/"],
   {"acl": "public-read"},
   {"success_action_redirect": "http://sigv4examplebucket.s3.amazonaws.com/successful_upload.html"},
   ["starts-with", "$Content-Type", "image/"],
   {"x-amz-meta-uuid": "14365123651274"},
   {"x-amz-server-side-encryption": "AES256"},
   ["starts-with", "$x-amz-meta-tag", ""],
   {"x-amz-credential": "AKIAIOSFODNN7EXAMPLE/20151229/us-east-1/s3/aws4_request"},
   {"x-amz-algorithm": "AWS4-HMAC-SHA256"},
   {"x-amz-date": "20151229T000000Z" }
 ]
}.to_s

enc = Base64.encode64(policy)
Run Code Online (Sandbox Code Playgroud)

预期编码值:

eyAiZXhwaXJhdGlvbiI6ICIyMDE1LTEyLTMwVDEyOjAwOjAwLjAwMFoiLA0KICAiY29uZGl0aW9ucyI6IFsNCiAgICB7ImJ1Y2tldCI6ICJzaWd2NGV4YW1wbGVidWNrZXQifSwNCiAgICBbInN0YXJ0cy13aXRoIiwgIiRrZXkiLCAidXNlci91c2VyMS8iXSwNCiAgICB7ImFjbCI6ICJwdWJsaWMtcmVhZCJ9LA0KICAgIHsic3VjY2Vzc19hY3Rpb25fcmVkaXJlY3QiOiAiaHR0cDovL3NpZ3Y0ZXhhbXBsZWJ1Y2tldC5zMy5hbWF6b25hd3MuY29tL3N1Y2Nlc3NmdWxfdXBsb2FkLmh0bWwifSwNCiAgICBbInN0YXJ0cy13aXRoIiwgIiRDb250ZW50LVR5cGUiLCAiaW1hZ2UvIl0sDQogICAgeyJ4LWFtei1tZXRhLXV1aWQiOiAiMTQzNjUxMjM2NTEyNzQifSwNCiAgICB7IngtYW16LXNlcnZlci1zaWRlLWVuY3J5cHRpb24iOiAiQUVTMjU2In0sDQogICAgWyJzdGFydHMtd2l0aCIsICIkeC1hbXotbWV0YS10YWciLCAiIl0sDQoNCiAgICB7IngtYW16LWNyZWRlbnRpYWwiOiAiQUtJQUlPU0ZPRE5ON0VYQU1QTEUvMjAxNTEyMjkvdXMtZWFzdC0xL3MzL2F3czRfcmVxdWVzdCJ9LA0KICAgIHsieC1hbXotYWxnb3JpdGhtIjogIkFXUzQtSE1BQy1TSEEyNTYifSwNCiAgICB7IngtYW16LWRhdGUiOiAiMjAxNTEyMjlUMDAwMDAwWiIgfQ0KICBdDQp9

但我的 ruby​​ 脚本正在返回:

ezpleHBpcmF0aW9uPT4iMjAxNS0xMi0zMFQxMjowMDowMC4wMDBaIiwgOmNvbmRpdGlvbnM9Plt7OmJ1Y2tldD0++IjIwMTUxMjI5VDAwMDAwMFoifV19

当我使用https://www.base64encode.org/ 时,它返回的正是预期的内容。我从http://docs.aws.amazon.com/AmazonS3/latest/API/sigv4-post-example.html获取了预期值

我做得对吗?

ruby base64 amazon-s3 aws-api-gateway

2
推荐指数
1
解决办法
3823
查看次数

通过http请求从api网关导出swagger api定义?

我正在尝试按照 AWS 文档使用以下 http 请求从 api 网关导出 api 定义。知道为什么它不起作用吗?

curl -i -X GET -H "Accept: application/json" "https://apigateway.ap-northeast-1.amazonaws.com/restapis/<api-id>/stages/<stage-name>/exports/swagger"

错误: HTTP/1.1 403 Forbidden {"message":"Missing Authentication Token"}

swagger aws-api-gateway

2
推荐指数
1
解决办法
1282
查看次数

使用 AWS API Gateway 进行 API 版本控制

我在使用 API Gateway + Lambda 实现可行的版本控制方案时遇到问题。我的要求是在 API 级别进行主要版本控制,然后在服务级别进行次要版本控制。我的环境也分布在各个帐户中,因此暂存不是 env 传播的选项。有没有人使用 AWS API Gateway 成功实现 API 管理?

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

2
推荐指数
1
解决办法
4826
查看次数

lambda + api网关什么时候实际向客户端发送响应?

目前我已经设置了一个从api网关端点触发的lambda函数.目标是通过形成响应并首先触发回调来保持响应时间较短,然后继续与sns交互以将工作传递给其他lambda函数.但是,当我对端点运行火焰计时,我注意到了一些奇怪的行为.主要是响应时间似乎不断增加,此外还有502和504响应代码返回但没有500响应代码(如果我理解正确,则表示调用限制,因为429响应在api网关中映射到500).如果我删除异步操作,我会看到合理的响应时间,并且没有错误.为什么这是观察到的行为,当实际触发响应时,在nodejs事件循环中项目排队的顺序是否不起作用,或者lambda只是等待事件队列在发送响应之前清空?如果是后者,则异步交互中的错误会导致502和504响应吗?

amazon-web-services node.js aws-lambda aws-api-gateway

2
推荐指数
1
解决办法
1476
查看次数

AWS API Gateway + AWS Lambda中的CORS

我正在尝试使用AWS Lambda和API Gateway设置POST lambda函数.这个POST应该可以使用Javascript从现代浏览器调用,所以很自然地,我需要为此启用CORS.不幸的是,无论我做什么,服务器都会在Firefox中返回400错误.我在Gateway的POST功能上启用了CORS,并设置了一个包含所有必需头的OPTIONS功能,但我仍然得到:

Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at https://ua1c36to9i.execute-api.ap-southeast-2.amazonaws.com/beta. (Reason: CORS header ‘Access-Control-Allow-Origin’ missing).

它告诉我,我没有收到Access-Control-Allow-Origin标题,我可以通过查看"网络"标签中的响应来确认:

Content-Length: 181
Content-Type: application/json
Date: Sun, 23 Apr 2017 03:39:10 GMT
Via: 1.1 d0d3075c33572544a6859ec75d2258a1.cloudfront.net (CloudFront)
X-Amz-Cf-Id: EEMUjL78Bf1PSwt4E4QGPgTLXSD8sehiUCgy-XA7TC_1cKv3jxs9Rg==
X-Cache: Error from cloudfront
X-Firefox-Spdy: h2
x-amzn-RequestId: 6943b9bd-27d6-11e7-aaae-f36ce836982f
Run Code Online (Sandbox Code Playgroud)

标题X-Cache: Error from cloudfront似乎告诉我Lambda必须返回某种内部服务器错误,并且CORS仅在Gateway上启用HTTP 200请求.实际上,我的OPTIONS预检返回HTTP 200 OK,这表明CORS似乎启用得很好.但我不知道如何用lambda捕获错误并为CORS启用它,所以我不知道我的内部错误可能是什么.

但令我感到奇怪的是,如果我使用test-cors.org测试我的POST功能,它声称我得到了一个HTTP 200 OK.更奇怪的是,如果我复制它生成的确切代码来发出请求并将其放入我本地计算机上的测试HTML页面,我仍然会获得HTTP 400.这是怎么回事?

我的ajax电话:

var myData = JSON.parse(this.result);
console.log(result);
$.ajax({
    type: "POST",
    dataType: "json",
    url: "https://ua1c36to9i.execute-api.ap-southeast-2.amazonaws.com/beta",
    data: myData,
    headers: …
Run Code Online (Sandbox Code Playgroud)

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

2
推荐指数
1
解决办法
4763
查看次数

CloudFormation中的AWS API网关方法响应

我正在尝试设置我的API网关,因此它具有以下简单方法响应:

方法响应

方法响应详细信息

我正在使用CloudFormation,并且不断遇到错误。我相信这很简单,但花了数小时阅读文档后却陷入困境。这是我的方法资源(在YAML中):

MyMethod:
Type: "AWS::ApiGateway::Method"
Properties:
  AuthorizationType: "NONE"
  HttpMethod: "GET"
  Integration:
    Type: AWS
    Credentials: !GetAtt MyRole.Arn
    IntegrationHttpMethod: "POST"
    Uri:
      Fn::Join: [ "", [ "arn:aws:apigateway:", Ref: "AWS::Region", ":states:action/SendTaskSuccess" ] ]
    PassthroughBehavior: WHEN_NO_TEMPLATES
    RequestTemplates:
      application/json: |
        {
           "output": "\"Approve link was clicked.\"",
           "taskToken": "$input.params('taskToken')"
        }
    IntegrationResponses:
      - StatusCode: 200
        ResponseTemplates: {"application/json": "$input.json('$.body')"}
   RequestParameters:
    method.request.querystring.taskToken: false
  OperationName: succeed
  ResourceId: !Ref MyResource
  RestApiId: !Ref MyApi
Run Code Online (Sandbox Code Playgroud)

我需要一个MethodResponse属性吗?

aws-cloudformation aws-api-gateway

2
推荐指数
1
解决办法
2655
查看次数

AWS Cloudwatch正在截断日志

我已经使用AWS api网关创建了API。在阶段中,选中了“记录完整的请求/响应数据”,还选中了“启用CloudWatch Logs”。

当我查看cloudwatch中的日志时,我看到一些日志是“ TRUNCATED”。实际上,所有日志都将截断请求和响应body。有什么方法可以查看整个请求/响应。

由于将有多个集成点,因此有必要查看整个日志。

amazon-web-services amazon-cloudwatch aws-api-gateway

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

如何通过IP限制AWS Lambda或API网关?

我目前正在尝试使用S3静态网站,API Gateway和AWS Lambda设计无服务器应用程序。我想将此网站公开,所以每个用户没有API密钥。

我想防止将这些端点滥用到非常低的水平,例如给定的公共IP每5秒发出1个请求。

AWS Shield或其中任何一种服务都可能吗?

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

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