标签: aws-api-gateway

AWS ApiGateway请求路径映射+ lambda

我知道有很多关于映射请求数据的问题,但是没有人帮助过我.所以,我想要实现的是一个映射到lambda的API端点.当存储桶触发404时,将转发对该端点的请求,并通过请求路径将参数传递给lambda,例如:/ {image_name}/{width}/{height}.我的lambda代码只是调用context.succeed(event, context);

在方法请求配置中,自动创建请求路径的参数, 证明.

在集成请求中,我创建了三个映射模板:plain/text,plain/html,application/json,定义与bellow相同:

#set($inputRoot = $input.path('$'))
{
    "name": $input.params('name'),
    "width" : $input.params('width'),
    "height" : $input.params('height'),
    "params": $input.params(),
    "resourcePath": $context.resourcePath,
}
Run Code Online (Sandbox Code Playgroud)

当我打电话给一个chrome rest客户端时,我得到:

从控制台调用测试时,我得到以下响应:{"Type":"User","message":"Could not parse request body into json."} 当我调用curl或者只是在浏览器中打开URL时,得到的响应 相同.

但是在控制台测试调用的日志中我看到:

Execution log for request test-request
Tue Sep 08 09:10:20 UTC 2015 : Starting execution for request: test-invoke-request
Tue Sep 08 09:10:20 UTC 2015 : API Key: test-invoke-api-key
Tue Sep 08 09:10:20 UTC 2015 : Method request path: {name=name, width=100, height=100}
Tue Sep 08 …
Run Code Online (Sandbox Code Playgroud)

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

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

AWS Cognito HTTP身份验证

我尝试使用AWS API Gateway,Lambda和Cognito设置测试API,以确保访问安全。由于我是AWS领域的新手,因此我不确定如何使用例如 我首先必须通过Cognito和客户端登录的客户端上的请求库创建到AWS服务的“已登录”发布请求。AWS Api,然后使用我得到的信息来创建一个已签名的请求,如下所示:http : //docs.aws.amazon.com/general/latest/gr/sigv4_signing.html

如果我走错了路,请告诉我并指出正确的方向:)

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

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

AWS API网关返回400错误请求,但Postman正常工作

我正在使用SendGrid Parse API(https://sendgrid.com/blog/parse-webhook-tutorial/)将传入的电子邮件正文过帐到AWS API Gateway。

当我将webhook发送到requestb.in时,我得到的响应很好。

当我使用Postman伪造对服务器的请求时,我得到了正确的响应。

但是,当我告诉SendGrid将Webhook发送到我的服务器时,我收到来自SendGrid的400错误响应错误,并且我的服务器再也没有受到攻击(因此,我认为API网关抛出了该错误)。

有什么简单的我想念的吗?我尝试设置CORS,但不是(或者我设置错了)。

我很沮丧

谢谢!

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

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

AWS API Gateway缓存POST数据

我打开了高速缓存GET请求,但它也适用于POST,因为后期有它目前缓存POST一次和棍棒与它不管POST身体没有查询字符串.

有没有办法为POST方法关闭它或告诉缓存帖子正文有密钥缓存它?

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

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

如何在AWS Lambda中验证Cognito访问令牌以允许Gateway API调用?

我想要做的是为我的Lambda函数设置API网关,在DynamoDB中保存一些(或者我想仅为登录用户使用的其他东西).但我不明白如何验证AccessToken以及如何从中获取用户.

我在AWS论坛上发现了这篇文章,我决定尝试方法1.

Cognito用户池+ API网关+ API网关自定义授权程序+ Cognito用户池访问令牌.

所以现在我已登录用户:

var authenticationData = {
  Username : 'username', // your username here
  Password : 'password', // your password here
};
var authenticationDetails = new AWSCognito.CognitoIdentityServiceProvider.AuthenticationDetails(authenticationData);

var cognitoUser = new AWSCognito.CognitoIdentityServiceProvider.CognitoUser(userData);
cognitoUser.authenticateUser(authenticationDetails, {
  onSuccess: function (result) {
    console.log('access token + ' + result.getAccessToken().getJwtToken());
....
Run Code Online (Sandbox Code Playgroud)

和他的accessToken.我还在API调用中设置了自定义API网关自定义授权程序.

现在我应该验证访问令牌并决定是允许还是拒绝方法调用.但我不明白该怎么做以及如何从令牌中检索用户?

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

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

指定的域名标识符无效

在尝试创建AWS::ApiGateway::BasePathMapping通过CloudFormation时,我收到以下错误:

Invalid domain name identifier specified
Run Code Online (Sandbox Code Playgroud)

以下是我的CloudFormation模板应该创建的部分AWS::ApiGateway::BasePathMapping:

{
    "Parameters": {
        "ApiDomainName": {
            "Description": "The domain name for the API",
            "Type": "String"
        }
    },
    "Resources": {
        "ApiBasePathMapping": {
            "Type": "AWS::ApiGateway::BasePathMapping",
            "Properties": {
                "DomainName": {
                    "Ref": "ApiDomainName"   
                },
                "RestApiId": {
                    "Ref": "RepositoryApi"
                },
                "Stage": {
                    "Ref": "ApiProductionStage"
                }
            },
            "DependsOn": [
                "ApiProductionStage"
            ]
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

文件并没有提及,它需要什么特别的DomainName,但该资源的文档似乎缺乏一些信息(它没有列出,例如产出,即使是有Distribution Domain Name作为例子创建).

堆栈的其余部分按预期工作.我试图将此资源添加为更改集.我拥有我想要使用的域名,并且我已在ACM中为此域创建了证书.

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

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

使用Api Gateway和Lambda导出CSV

我想做什么:

我想要做的是有一个url,它会向调用者返回一个CSV文件,该文件本质上是一个数据导出.我希望这仍然是一个无服务器的解决方案.

我做了什么:

我用我想要的URL创建了一个AWS API Gateway.我创建了一个lambda,它将查询数据库并创建该数据的CSV字符串.该数据放在JSON对象中并返回.然后,API网关从json对象获取CSV数据,并使用适当的标头将CSV返回给调用者,以指示它是CSV和附件.从浏览器测试我会像我预期的那样自动下载.

我看到的问题:

这很有效,直到有大量的数据,我开始得到"体型太长".

我试图解决:

我做了一些谷歌搜索,我看到其他人有类似的问题.在一个解决方案中,我看到他们返回了他们创建的文件的链接.这个解决方案似乎对他们可行,因为他们有一台服务器 对于我的无服务器架构,它似乎有点棘手.我可以把文件存储到S3然后我必须返回一个链接到S3.这似乎可以工作,但感觉不像我错过配置选项.它也感觉就像通过返回s3 url来暴露实现.

我一直在寻找教程和人们做类似事情的例子,我没有找到任何东西.

我的问题:

有没有办法做到这一点?还有其他我不知道的解决方案吗?如何从较大尺寸的API网关返回文件,在本例中为CSV

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

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

为AWS APIGateway创建VPC链接时,“ NLB ARN格式错误”

我按照该教程创建了到我的私人Elb平衡器的VPC链接。 https://docs.aws.amazon.com/apigateway/latest/developerguide/set-up-api-with-vpclink-cli.html

但是它失败了,并收到错误消息“ statusMessage”:“ NLB ARN格式错误”。

我确实通过elbv2 cli找到了具有相同ARN的ELB,因此ARN必须是合法的。

我找不到解决问题的文件。有人可以帮助我吗?谢谢。

我所做的如下。

$ aws elbv2 describe-load-balancers --load-balancer-arns arn:aws:elasticloadbalancing:ap-northeast-1:846239845603:loadbalancer/app/v2-api-balancer/db49ab0ecaef1de8

{
"LoadBalancers": [
{
"Scheme": "internal",
"SecurityGroups": [
"sg-9282b8f4"
],
"LoadBalancerArn": "arn:aws:elasticloadbalancing:ap-northeast-1:846239845603:loadbalancer/app/v2-api-balancer/db49ab0ecaef1de8",
"State": {
"Code": "active"
},
"CreatedTime": "2017-10-18T04:27:28.780Z",
"VpcId": "vpc-dbe3f2be",
"DNSName": "internal-v2-api-balancer-988454399.ap-northeast-1.elb.amazonaws.com",
"AvailabilityZones": [
{
"SubnetId": "subnet-7642062e",
"ZoneName": "ap-northeast-1c"
},
{
"SubnetId": "subnet-c454fa8d",
"ZoneName": "ap-northeast-1b"
}
],
"IpAddressType": "ipv4",
"Type": "application",
"LoadBalancerName": "v2-api-balancer",
"CanonicalHostedZoneId": "Z14GRHDCWA56QT"
}
]
}
Run Code Online (Sandbox Code Playgroud)
$ aws apigateway create-vpc-link \ 
--name my-test-vpc-link-1 \
--target-arns "arn:aws:elasticloadbalancing:ap-northeast-1:846239845603:loadbalancer/app/v2-api-balancer/db49ab0ecaef1de8" 

{
"name": "my-test-vpc-link-1",
"targetArns": [ …
Run Code Online (Sandbox Code Playgroud)

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

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

如何使用无服务器框架通过AWS API网关返回用Node.js编写的AWS Lambda函数的错误?

我正在编写供内部使用的API,并且这是我第一次使用无服务器框架。我正在Node.js中编写Lambda函数,并使用AWS API Gateway进行连接。

在某些情况下,我想返回一个自定义错误消息,而我试图编写一个允许我执行此操作的函数。现在,每当Lambda进程失败时,我都会从API收到一条标准消息。在代码中,如果我尝试使用杀死进程process.exit(1),即使我已经使用callback()以下命令返回了错误,也会收到一般错误:

{
    "message": "Internal server error"
}
Run Code Online (Sandbox Code Playgroud)

如果不使用process.exit(1),我会callback()在日志中看到通过错误返回的错误,但是该过程继续进行,最终超时:

{
    "message": "Endpoint request timed out"
}
Run Code Online (Sandbox Code Playgroud)

我已经尝试了几种使用该callback()方法返回错误的方法,但是到目前为止,我还没有成功。我试过这种方法:

async function return_error(callback, context, error, returnCode){
  console.error("FATAL ERROR: ", error);
  let ErrorObj = {
    errorType : "InternalServerError",
    httpStatus : 500,
    requestId : context.awsRequestId,
    errorMessage : error
}
  callback(JSON.stringify(ErrorObj));
  process.exit(1);
}
Run Code Online (Sandbox Code Playgroud)

还有这个:

async function return_error(callback, error, returnCode){
  console.error("FATAL ERROR: ", error);
  callback({
    isBase64Encoded: false,
    statusCode: returnCode,
    headers: { 'Content-Type': 'application/json' …
Run Code Online (Sandbox Code Playgroud)

node.js aws-lambda aws-api-gateway serverless-framework serverless

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

我应将哪种类型的TypeTypescript的AWS Lambda响应返回给AWS API网关方法响应套件?

我想在AWS lambda上构建适当的打字稿项目。

现在,我有以下定义:

export type HttpResponse = {
  statusCode: number;
  headers: {};
  body: string;
}

export async function readCollection (event, context, callback): Promise<HttpResponse>{

  console.log(event); // Contains incoming request data (e.g., query params, headers and more)

  const data =  [
    {
      id: "a7b5bf50-0b5b-11e9-bc65-6bfc39f23288",
      name: "some thing",
      uri: `/notifications/a7b5bf50-0b5b-11e9-bc65-6bfc39f23288`
    }
  ]

  const response = {
    statusCode: 200,
    headers: {
    },
    body: JSON.stringify({
      status: "ok",
      data: data
     })
  };

  return response;
};
Run Code Online (Sandbox Code Playgroud)

除了使用自定义HttpResponse类型,我还想使用一个官方定义。

但是我要导入和返回哪种正式类型?

typescript aws-lambda aws-api-gateway

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