Amazon web services Lambda通过API网关调用Lambda
我好像没法让它工作。我通过C9创建了2个lambda。我使用boto3从一个lambda调用另一个lambda。通过C9一切似乎都很好,但当我发布并尝试通过API网关访问时,我总是收到端点请求超时错误 我知道这不可能是一个超时问题,因为我已经设置了yaml文件,以便有足够的时间执行,而lambda现在只返回一个字符串,非常简单 这是我当前的yaml文件。我想知道在第二个yaml中是否需要包含API网关的某些权限 Lambda1Amazon web services Lambda通过API网关调用Lambda,amazon-web-services,aws-lambda,boto3,Amazon Web Services,Aws Lambda,Boto3,我好像没法让它工作。我通过C9创建了2个lambda。我使用boto3从一个lambda调用另一个lambda。通过C9一切似乎都很好,但当我发布并尝试通过API网关访问时,我总是收到端点请求超时错误 我知道这不可能是一个超时问题,因为我已经设置了yaml文件,以便有足够的时间执行,而lambda现在只返回一个字符串,非常简单 这是我当前的yaml文件。我想知道在第二个yaml中是否需要包含API网关的某些权限 Lambda1 AWSTemplateFormatVersion: '2010-09
AWSTemplateFormatVersion: '2010-09-09'
Transform: 'AWS::Serverless-2016-10-31'
Description: An AWS Serverless Specification template describing your function.
Resources:
api:
Type: 'AWS::Serverless::Function'
Properties:
Description: ''
Handler: api/lambda_function.lambda_handler
MemorySize: 256
Role: 'arn:aws:iam::820788395625:role/service-role/api_int-role'
Runtime: python3.6
Timeout: 30
VpcConfig:
SecurityGroupIds:
- ...
SubnetIds:
- ...
Policies: AWSLambdaFullAccess
Lambda2
AWSTemplateFormatVersion: '2010-09-09'
Transform: 'AWS::Serverless-2016-10-31'
Description: An AWS Serverless Specification template describing your function.
Resources:
api:
Type: 'AWS::Serverless::Function'
Properties:
Description: ''
Handler: api/lambda_function.lambda_handler
MemorySize: 512
Role: 'arn:aws:iam::820788395625:role/service-role/api_int-role'
Runtime: python3.6
Timeout: 15
VpcConfig:
SecurityGroupIds:
- ...
SubnetIds:
- ...
我刚刚设置了一个直接指向Lambda2的API网关端点,它没有返回任何问题。所以
API网关->Lambda 2工作
API网关->Lambda 1->Lambda 2不工作
因此,出于某种原因,当我想通过Lambda 1通过API网关调用Lambda 2时,它不起作用
下面是调用第二个Lambda的代码
import json
import boto3
def lambda_handler(event, context):
print('call boto3 client')
lambda_client = boto3.client('lambda', region_name='us-east-1')
print('boto3 client called')
print('invoke lambda')
env_response = lambda_client.invoke(
FunctionName='cloud9-apiAlpha-api-TBSOYXLVBCLX',
InvocationType='RequestResponse',
Payload=json.dumps(event)
)
print('lambda invoked')
print('env_response')
print(env_response)
print(env_response['Payload'])
print(env_response['Payload'].read())
return {
'statusCode': 200,
'headers': {
'Content-Type': 'application/json',
'Access-Control-Allow-Methods': 'POST,GET,OPTIONS,PUT,DELETE',
'Access-Control-Allow-Origin': '*'
},
'body': 'HELLO WORLD!',
'isBase64Encoded': False
}
现在,当我查看日志时,它会打印“invoke lambda”,但随后会停止并超时1。如果没有一些配置,则无法从另一个lambda调用lambda。在.yml文件中,必须指定权限才能调用另一个Lambda。这可以通过在provider属性下添加iamRoleStatements部分来实现 或 通过将简单策略AWSLambdaRole添加到附加到lambda函数_1的现有角色
如果您使用的是InvocationType=RequestResponse,那么您可以从函数2返回一些响应。最终找到了解决方案。我的问题的答案是Lambda 1和Lambda 2通过VPC运行,因此没有互联网连接。一旦我从Lambda 1中删除了VPC,Lambda 2的调用就没有任何问题了
只是想与大家分享一下,以防我可以为其他人节省一周的调试时间。LOL您的角色是否有执行另一个lambda的适当权限?api_int-roleCan您能告诉我们如何调用lambda的实际代码吗?@AminAhmedKhan我被告知该角色有权执行另一个任务lambda@yorodm我已经分享了调用第二个lambdaI的代码如果您有超时问题,那么您可以异步调用lambda,或者增加调用lambdaI的超时阈值这是在C9中创建的,有一个模板。yml那么我也需要一个serverless.yml吗?我想你的lambda已经附加了一个现有角色,那么附加这个策略AWSLambdaRole是值得的。因此,在您的案例中,不需要对.yml文件进行任何更改,抱歉,如果我无法正确解释这些内容,那么一定有权限问题,因为在日志中,它会访问invoke_resp=lambda_client.invoke,然后挂起并最终超时OK,所以看起来这样做会使它工作负载=bytesencoded_payloadnice one json.loads应该会这样做
provider:
name: aws
runtime: <runtime goes here> # e.g. python3.6 or nodejs6.10
iamRoleStatements:
- Effect: Allow
Action:
- lambda:InvokeFunction
Resource: "*"
global LAMBDA_CLIENT
if not LAMBDA_CLIENT:
LAMBDA_CLIENT = boto3.client('lambda')
try:
encoded_payload = json.dumps({'message': 'this is an invokcation call form lambda_1'}).encode(UTF_8)
invoke_resp = lambda_client.invoke(
FunctionName='function_2',
InvocationType='RequestResponse',
Payload=encoded_payload)
status_code = invoke_resp['StatusCode']
if status_code != 200:
LOGGER.error('error ')
paylaod = invoke_resp['Payload'].read()
resp = json.loads(payload)
print(resp)
except Exception: