标签: aws-api-gateway

如何从执行角色有权这样做的 AWS Lambda 调用 AWS_IAM 授权的 API 网关终端节点?

我想从执行角色有权执行该 API 网关的执行 AWS Lambda 调用授权设置为 AWS_IAM 的 AWS API 网关端点。

在此处输入图片说明

无论如何,我是否可以使用我的 Lambda 的当前执行角色对 API Gateway 的 HTTPS 请求进行签名?

编辑:

查看http://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_use-resources.html,我可以使用 SDK 调用 AssumeRole 来承担有权执行 Api Gateway 的角色,然后提取可用于签署请求的密钥。

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

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

Kinesis Firehose 在没有分隔符逗号的情况下将 JSON 对象放入 S3

在发送数据之前,我使用 JSON.stringify 到数据,它看起来像这样

{"data": [{"key1": value1, "key2": value2}, {"key1": value1, "key2": value2}]}
Run Code Online (Sandbox Code Playgroud)

但是一旦它通过 AWS API Gateway 并且 Kinesis Firehose 将它放入 S3,它看起来像这样

    {
     "key1": value1, 
     "key2": value2
    }{
     "key1": value1, 
     "key2": value2
    }
Run Code Online (Sandbox Code Playgroud)

JSON 对象之间的分隔符逗号不见了,但我需要它来正确处理数据。

API 网关中的模板:

#set($root = $input.path('$'))
{
    "DeliveryStreamName": "some-delivery-stream",
    "Records": [
#foreach($r in $root.data)
#set($data = "{
    ""key1"": ""$r.value1"",
    ""key2"": ""$r.value2""
}")
    {
        "Data": "$util.base64Encode($data)"
    }#if($foreach.hasNext),#end
#end
    ]
}
Run Code Online (Sandbox Code Playgroud)

json amazon-web-services amazon-kinesis aws-api-gateway amazon-kinesis-firehose

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

修复 AWS API 网关不存在的 CORS“响应预检...”标头并放大

我一直在为下面的错误而苦苦挣扎。我已经尝试了很多教程和 stackoverflow 答案,但没有一个解决方案可以解决我的问题。

从源“ http://localhost:3000 ”访问 XMLHttpRequest at ' https://xxx '已被 CORS 策略阻止:对预检请求的响应未通过访问控制检查:否 'Access-Control-Allow-Origin ' 请求的资源上存在标头。

我正在使用 SAM 无服务器来创建我的 api。

模板.yaml:

Globals:
  Function:
    Timeout: 10
  Api:
    Cors:
      AllowMethods: "'DELETE,GET,HEAD,OPTIONS,PATCH,POST,PUT'"
      AllowHeaders: "'Content-Type,X-Amz-Date,Authorization,X-Api-Key,X-Amz-Security-Token'"
      AllowOrigin: "'*'"
Run Code Online (Sandbox Code Playgroud)

我的 lambda 函数: 我的 GET 响应和 OPTIONS 响应都返回以下标头:

headers: {
  "Access-Control-Allow-Headers": "'Content-Type,X-Amz-Date,Authorization,X-Api-Key,X-Amz-Security-Token'",
  "Access-Control-Allow-Origin": "'*'",
  "Access-Control-Allow-Methods": "'DELETE,GET,HEAD,OPTIONS,PATCH,POST,PUT'"
}
Run Code Online (Sandbox Code Playgroud)

我的 API 使用放大进入我的 ReactJs 应用程序:

API.get(apiName, path, {
   headers: {
      "Access-Control-Allow-Origin": "*",
      // "Access-Control-Allow-Headers": "Content-Type,X-Amz-Date,Authorization,X-Api-Key,x-requested-with",
      // "Access-Control-Allow-Methods": "OPTIONS,POST,GET,PUT,DELETE",
      // 'Content-Type': 'application/json'
   }
})
Run Code Online (Sandbox Code Playgroud)

我已经在我的 template.yaml、我的 lambda 函数和我的 reactJs 项目中尝试了 Access-Control-Allow-Headers、Access-Control-Allow-Methods …

javascript sam aws-cloudformation aws-api-gateway aws-serverless

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

如何使用 AWS API Gateway 为 CORS 预检请求设置配额

我正在使用 AWS Lambda 和 API Gateway 构建无服务器应用程序。为了防止 DDOS 攻击执行大量请求并花费我很多钱,我设置了一个带有请求配额的使用计划(例如 10K 请求/月)。这需要调用者将 API 密钥作为标头传递。

这看起来效果很好,但我还需要为此服务启用 CORS。为此,我需要允许未经授权的 OPTIONS 请求(“CORS 预检”请求),因为浏览器不支持在那里发送任何特殊标头。但后来我似乎找不到强制执行配额的方法,我又回到了原点:这些请求的数量不受控制可能会花费不可预见的金额。有什么办法可以排除这种可能性吗?

amazon-web-services cors aws-api-gateway

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

如何使用Facebook验证API网关呼叫?

问题:我想使用Facebook身份验证授权我的Amazon API Gateway托管REST API用户.

我的理解:我知道Amazon Cognito可用于验证用户身份,称为联合身份.然后,我看到使用Amazon Cognito您的用户池验证API客户端,该客户端对Cognito用户池进行身份验证.我还发现使用Amazon API Gateway自定义授权器可以使用自定义授权.但是,我没有找到链接API网关使用Cognito Federated Identities(即Facebook这里)进行身份验证.我们是否可以使用与联合身份用户池相同的过程,还是应该像在自定义授权人中那样使用?我有点困惑.任何帮助是极大的赞赏.

提前致谢.

authentication amazon-web-services amazon-cognito aws-api-gateway amazon-cognito-facebook

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

AWS API Gateway/Cognito Userpools/Lambdas无法传递呼叫者凭据

我正在使用Lambda后端开发AWS API Gateway实现.我使用API​​ Gateway与Cognito Userpools(相当新的)集成,而不是使用Lambda构建自定义授权程序(这是在集成之前的推荐方式).

我创建了一个概念验证(javascript),用Cognito对用户进行身份验证,然后使用这些凭据调用API Gateway.因此,基本上,对API网关的结束调用是使用我在Authorization标头中从Cognito(result.idToken.jwtToken)收到的JWT令牌.这一切都有效,我可以验证只有使用此令牌才能访问API.

一切正常,但现在我想在我的Lambda中访问Cognito身份; 例如身份ID或姓名或电子邮件.我已经阅读了如何映射所有参数,但实际上我只是在集成请求中使用标准的"Method Request Passthrough"模板.我记录了lambda中的所有参数,所有'cognito'参数都是空的.

我查看了许多类似的问题,并且他们都建议在集成请求中启用"使用调用者凭据调用"复选框.这很有道理.

但是,只有在使用AWS_IAM作为授权时才能启用此复选框,如果您选择了您的cognito UserPool ,则不能启用此复选框.所以它是不可能选择它并且实际上是禁用的.

在这种情况下有人知道该怎么做吗?这仍然在进行中,还是有理由不能启用此功能并在Lambda中获取认证凭据?

非常感谢.

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

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

从AWS-API网关发布到Lambda

我有一个简单的C#Aws Lambda函数,它成功通过Lambda控制台测试进行测试,但如果从API网关(我从Lambda触发器选项生成)调用了502(Bad Gateway)失败,并且如果我使用postman. (此初始功能具有开放访问权限(无安全性))

// request header
    Content-Type: application/json

//  request body
    {
        "userid":22,
        "files":["File1","File2","File3","File4"]
    }
Run Code Online (Sandbox Code Playgroud)

我在日志中得到的错误是:

Wed Feb 08 14:14:54 UTC 2017 : Endpoint response body before transformations: {
  "errorType": "NullReferenceException",
  "errorMessage": "Object reference not set to an instance of an object.",
  "stackTrace": [
    "at blahblahmynamespace.Function.FunctionHandler(ZipRequest input, ILambdaContext context)",
    "at lambda_method(Closure , Stream , Stream , ContextInfo )"
  ]
}
Run Code Online (Sandbox Code Playgroud)

似乎发布的对象没有传递给lambda输入参数.

代码如下

// Lambda function
     public LambdaResponse FunctionHandler(ZipRequest input, ILambdaContext context)
        {
            try
            {
                var logger = context.Logger;
                var …
Run Code Online (Sandbox Code Playgroud)

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

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

如何在 AWS API Gateway 中调试“缺少身份验证令牌”?

我有一个代理到 AWS Lambda 函数的 API 网关资源。这对于传递尾随路径参数 ( /periodicals/{tail+})效果很好,但由于我希望这些参数是可选的,因此我还向ANY更高层的资源 ( /periodicals)添加了一个方法:

从 AWS 控制台中测试该方法时,这很有效。但是,直接从我的浏览器对该资源执行请求会导致以下响应:

{"message":"Missing Authentication Token"}
Run Code Online (Sandbox Code Playgroud)

有了这个标题:

x-amzn-errortype: MissingAuthenticationTokenException
Run Code Online (Sandbox Code Playgroud)

它还有一个x-cache带有值的标题Error from cloudfront,所以我猜它可能与 CloudFront 有关。我还没有明确设置 CloudFront,也不知道如何检查?

我想我阅读了有关此错误消息的每个线程,但它们似乎都不适用于我:

  • 我的方法不需要授权:
  • 我很确定 URL 是正确的。当我在浏览器中访问/periodicals/whatever(即{tail+}资源)时,它工作正常,但对于/periodicals.
  • CORS 已启用,因为两个资源都指向处理 CORS 并适用于子路径的相同 Lambda 函数。
  • HTTP 动词应该无关紧要,因为它正在侦听 ANY.
  • 无论我是否添加斜杠,结果都是一样的。
  • API 已部署。
  • 我认为 API 资源对我的 Lambda 函数有足够的权限,因为我可以从 AWS 控制台成功执行它:

感谢@Lakindu,一个有趣的观察是在 Stages 视图中的资源下方没有列出任何方法:

我还能做些什么来找出问题所在?

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

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

如何在Cloudformation中获取区域AWS API网关的自定义域的目标域名?

我正在尝试在AWS上创建一个多区域无服务器应用程序.我按照这里给出的说明进行操作.我正在使用无服务器框架,它使用Cloudformation脚本在AWS上创建所有资源.

我想为API网关创建一个自定义域作为区域端点.创建区域端点时,它会生成目标域.我想知道如何在Cloudformation脚本中获取目标域的值?

当我创建Edge优化端点时,我使用该DistributionDomainName属性获取CloudFront部署的值.但是,在创建区域端点时,我没有看到目标域名的任何属性.我尝试使用DistributionDomainName区域端点的属性,但它会抛出一个错误,表示没有DistributionDomainName.

以下是我脚本的一部分 -

# Creates a custom domain for the ApiGateway
customDomain:
  Type: 'AWS::ApiGateway::DomainName'
  Properties:
    DomainName: ${self:custom.domain}
    EndpointConfiguration:
      Types:
        - REGIONAL
    RegionalCertificateArn: ${self:custom.certificateArn}

# Insert a DNS record in route53 hosted zone to redirect from the custom domain to CF distribution
dnsRecord:
  Type: AWS::Route53::RecordSet
  Properties:
    Region: ${self:provider.region}
    SetIdentifier: ${self:provider.region}
    HostedZoneId: ${self:custom.hostedZoneId}
    Name: ${self:custom.domain}
    Type: CNAME
    TTL: 60
    ResourceRecords:
      - "Fn::GetAtt": [customDomain, DistributionDomainName]
Run Code Online (Sandbox Code Playgroud)

请帮忙.谢谢!

UPDATE

Cloudformation现在通过RegionalDomainName属性返回区域域名.它可以用作Fn:GetAtt : [customDomain, …

regional amazon-web-services aws-cloudformation aws-api-gateway serverless-framework

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

限制访问应用程序负载均衡器的最佳方法是什么?

理想情况下,我想锁定我的ALB,以便只能通过API网关访问它.

我已经研究过是否我可以API网关与入站规则联系起来 - 不过,我发现,API网关不能与IP地址或安全组关联.我也研究了面向内部的ALB,但由于VPC链接仅支持NLB,因此我无法使用它们.

任何帮助将不胜感激 - 我一直在寻找网关设置,但找不到此选项.

解决这个问题的最佳方法是什么,以便尽可能限制ALB?

aws-api-gateway aws-security-group aws-load-balancer

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