我正在尝试使用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)
我错过了什么?
我坚持使用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/
在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文档和示例不包括此用例.
似乎我的问题可能与此类似.
我的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) 我在亚马逊的ApiGateway创建了一个资源.它指向Lambda函数.这是受到本机移动应用程序(android和ios)的影响,它已经在野外.
我现在想要修改Lambda函数,但我认为无法将我的ApiGateway资源更改为指向lambda的别名.这是我第一次使用这些技术,我发现在aws控制台中没有简单的机制来管理它.
如何修改我的ApiGateway资源以指向我的lambda别名,以便我可以在不影响现有客户端的情况下编辑主干?
我正在尝试将Amazon API网关放在应用程序负载均衡器之前,这样可以平衡流向我的ECS群集的流量,我的所有微服务都部署在那里.使用API网关的动机是通过lambda函数使用自定义授权程序.
系统图
在亚马逊语中(https://aws.amazon.com/api-gateway/faqs/):" 对后端操作的代理请求也需要在Internet上公开访问 ".这迫使我让ELB公开(面向互联网)而不是内部.然后,我需要一种方法来确保只有 API网关才能访问VPC外部的ELB.
我的第一个想法是在API Gatway中使用客户端证书,但ELB似乎不支持它.
任何想法都将受到高度赞赏!
我有两个关于 AWS SAM 和部署的问题。
\n我\xe2\x80\x99m 阅读文档并检查这样的示例,并且我\xe2\x80\x99m 仍然不太确定如何使用我的 SAM 模板单独部署到staging和production环境。是否像部署一个具有新名称(例如sam deploy \xe2\x80\x94stack-name my-app-staging和 )的新堆栈一样简单sam deploy \xe2\x80\x94stack-name my-app-production?
在下面的例子中,我有一个问题。如果我的 SAM 模板包含具有三个可能值的Parameters名称MyEnvironment,则部署如何知道在部署堆栈时使用这三个值中的哪个值?就像我会怎么说使用值stagingor production?这是我部署时会自动询问的问题还是我必须在 CLI 上提供的问题?
在AWS API Gateway中,是否可以以某种方式重命名API实例?
我没有在UI上看到该选项,但也许可以通过使用一些API调用.
我有一个运行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
我正在为我的环境创建AWS Cloudformation模板,但我找不到为API Gateway方法启用CORS的方法.
我可以使用AWS控制台配置它(这是官方文档),但是如何在Cloudformation模板中执行此操作?
aws-api-gateway ×10
aws-lambda ×5
ajax ×1
amazon-ecs ×1
amazon-elb ×1
amazon-iam ×1
aws-sam ×1
cors ×1
jquery ×1
postman ×1
terraform ×1