我试图通过AWS API Gateway调用Lambda函数。 当我提到身份验证类型为NONE时它工作正常但API变为公共,任何有url的人都可以访问我的API。 为了使API调用安全,我使用身份验证类型AWS_IAM和 还将AmazonAPIGatewayInvokeFullAccess策略附加到我的用户,但收到此错误:
'''
Storing the return result into RDD
'''
session = driver.session()
result = session.run('MATCH (n:Hobby) RETURN n.hobby AS hobby,id(n) As id LIMIT 10')
session.close()
'''
Pulling the keys
'''
keys = result.peek().keys()
'''
Reading all the property values and storing it in a list
'''
values=list()
for record in result:
rec= list()
for key in keys:
rec.append(record[key])
values.append(rec)
'''
Converting list of values into a pandas dataframe
'''
df = DataFrame(values, columns=keys)
print df
'''
Converting the pandas DataFrame to Spark DataFrame
'''
sqlCtx = SQLContext(sc)
spark_df = sqlCtx.createDataFrame(df)
print spark_df.show()
'''
Converting the Pandas DataFrame to SparkRdd (via Spark Dataframes)
'''
rdd = spark_df.rdd.map(tuple)
print rdd.take(10)
我不知道我在这里缺少什么。
答案 0 :(得分:68)
我因为一个愚蠢的理由而失去了一些时间:
创建舞台时,显示的链接不包含URL的资源部分:
API网址 https://1111.execute-api.us-east-1.amazonaws.com/dev
API +资源网址 https://1111.execute-api.us-east-1.amazonaws.com/dev/get-list
缺少 / get-list
当然,您需要检查方法配置是否如下所示:
答案 1 :(得分:15)
我认为您是直接尝试访问API链接,这不会起作用,因为API使用IAM角色进行保护,您必须提供AWS身份验证,即访问密钥和密钥。
使用Postman Chrome扩展程序测试您的API: http://docs.aws.amazon.com/apigateway/latest/developerguide/how-to-use-postman-to-call-api.html
答案 2 :(得分:8)
请确保您首先在“阶段”树中单击特定的“资源”,因为这将填充具有完整路径到资源(而不只是根路径)的URL:
其他原因,请参见http://www.awslessons.com/2017/aws-api-gateway-missing-authentication-token/
答案 3 :(得分:5)
我刚遇到同样的问题,如果无法找到资源,它似乎也会显示此消息。
在我的情况下,我更新了API,但忘了重新部署。在将更新的API部署到我的舞台后,问题得以解决。
答案 4 :(得分:4)
在文档中找到了这个:
如果使用了AWS_IAM授权,您将使用签名版本4协议对请求进行签名。
Signing request with Signature Version 4
您还可以为您的API生成SDK。
How to generate an SDK for an API in API Gateway
为您选择的平台生成SDK后,第6步提到如果您使用AWS凭据,则会对API的请求进行签名:
要使用AWS凭据初始化API Gateway生成的SDK,请使用类似于以下内容的代码。如果您使用AWS凭据,则将对API的所有请求进行签名。这意味着您必须为每个请求设置适当的CORS Accept标头:
var apigClient = apigClientFactory.newClient({
accessKey: 'ACCESS_KEY',
secretKey: 'SECRET_KEY',
});
答案 5 :(得分:3)
如果您启用了AWS_IAM身份验证,则必须使用AWS Signature Version 4使用AWS凭据对您的请求进行签名。
注意:登录AWS控制台不会自动在浏览器中向您的API发出请求。
答案 6 :(得分:3)
答案 7 :(得分:2)
就我而言,我错过了在 api 末尾添加 '/' 反斜杠。
这么愚蠢的错误。
https://le9dq5l9.execute-api.eu-west-1.amazonaws.com/v1/putdoctorinfo/
答案 8 :(得分:2)
我尝试了上述所有方法,如果您按照上述答案进行了所有步骤,但仍未解决问题,则:
我之所以这样,是因为当我创建“ METHOD REQUEST”(请参阅第2步如何进入此菜单)时,在“ Authorization”中选择“ AWS_IAM” 在测试api之后,在aws测试选项中,我在“邮递员”中尝试 那么我会理解“方法请求”中的“授权”中的“无”
我将其更改为无,但是我认为AWS需要重新部署它,如我所解释的
答案 9 :(得分:1)
如果您使用的端点类型为 PRIVATE 的API,请确保:
您正在从您的AWS账户内调用API(例如:从在您的账户中创建的EC2实例)
在EC2实例中的路由〜/ .aws / credentials(此路由用于linux实例)中的EC2实例中放置必要的凭据(访问和密钥),如果IAM用户使用MFA aws_session_token 也需要。
使用基于vpce(vpc端点)的URL。示例:卷曲https://vpce-0c0471b7test-jkznizi5.execute-api.us-east-1.vpce.amazonaws.com/dev/api/v1/status
请参阅: https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-private-apis.html
答案 10 :(得分:1)
根据我的经验,请检查以下步骤:
在 API 网关端,确保添加正确的路径并在所需的阶段发布资源。对于一些像路径参数(/user/{user_id})这样的url模式需要多加注意检查。
确保为此资源配置正确的options方法,因为有时是 CORS 导致此问题。
在 Lambda 端,确保指定正确的处理程序名称作为入口点。
请始终检查您的 lambda 的 cloudwatch 日志,以帮助您确定 lambda 方面的问题。
答案 11 :(得分:0)
当您调用错误的api端点时,通常会出现此错误。 检查您正在调用的api端点,然后在api网关上进行验证。
答案 12 :(得分:0)
作为记录,如果您不使用凭据,则在POST / PUT方法中将请求验证器设置为“验证正文,查询字符串参数和HEADERS”时,也会显示此错误”,或其他选项“验证查询字符串参数和HEADERS”。...在这种情况下,它将在标头上查找凭据并拒绝请求。综上所述,如果您不想发送凭据并希望使其保持打开状态,则不应在请求验证器中设置该选项(将其设置为NONE或验证正文)
答案 13 :(得分:0)
有时,当您调用错误的api时会显示此消息
检查您的api端点
答案 14 :(得分:0)
看起来(截至2019年4月),AWS API Gateway出于各种原因引发此异常-主要是在您遇到API Gateway无法访问的端点时(无论是因为未部署,还是在某些情况下)不支持该特定HTTP方法的地方。
我希望网关发送更合适的错误代码,例如不支持HTTP 405方法或找不到HTTP 404,而不是通用的HTTP 403禁止访问。
答案 15 :(得分:0)
贡献力量:
我有一个类似的错误,因为我的返回响应中没有这样的'body':
返回{ '状态代码':200, 'body':“如果替换,必须包含body标签,否则将不起作用” }
答案 16 :(得分:0)
我遇到了相同的问题,可以通过以下方法解决:
GET方法测试
https://54wtstq8d2.execute-api.ap-southeast-2.amazonaws.com/dev/echo/hello
Authorization tab ->
• select type(AWS signature)
• Add AccessKey and SecretKey
答案 17 :(得分:0)
如果您为具有AmazonAPIGatewayInvokeFullAccess权限的服务器设置IAM角色,则仍需要在每个请求上传递标头。您可以使用aws-requests-auth库在python中执行以下操作:
import requests
from aws_requests_auth.boto_utils import BotoAWSRequestsAuth
auth = BotoAWSRequestsAuth(
aws_host="API_ID.execute-api.us-east-1.amazonaws.com",
aws_region="us-east-1",
aws_service="execute-api"
)
response = requests.get("https://API_ID.execute-api.us-east-1.amazonaws.com/STAGE/RESOURCE", auth=auth)
答案 18 :(得分:0)
在我看来,这是很愚蠢的事情。 我已经习惯了使用POST创建新实体,并且由于“缺少身份验证令牌”而失败。我由于某种原因错过了它的定义,因为它可以正常工作。
答案 19 :(得分:0)
首先,检查您在lamda函数中创建的API是否已在您的AWS项目中注册。为此,请转到AWS控制台中的API网关。如果未注册,请注册。这是此问题的主要原因。
您甚至可以在 aws.export.js 文件中看到存在与API ['/items']
相对应的路径。
您的API必须在那里,否则它不会将安全令牌附加到请求中。只需为此在控制台的项目云逻辑中注册它即可。
如果在那里,请使用上述解决方案
http://docs.aws.amazon.com/apigateway/latest/developerguide/how-to-use-postman-to-call-api.html