我有三个lambda函数:boss,worker1,worker2。当使用boto3.client.invoke时,我可以从boss调用worker1。这两个人在同一地区
worker2位于一个单独的区域。当试图从boss调用worker2时,会返回以下错误:
“调用Invoke操作时发生错误(ResourceNotFoundException):来自'us-east-1'的函数在此区域中不可访问('us-west-2')”。
boss具有执行角色,具有以下权限:
{
"Version": "2012-10-17",
"Statement": [
{
"Action": [
"lambda:InvokeFunction"
],
"Effect": "Allow",
"Resource": "arn:aws:lambda:*:*:*"
}
]
}
请帮助说明如何传达权限以使其发挥作用。 感谢
编辑: master和worker1在us-west-2中,worker1在us-east-1中 以下是用于从master调用worker的代码:
def lambda_handler(event, context):
function_name = "arn:aws:lambda:us-east-1-...:function:worker_2"
lambda_client = boto3.client('lambda')
payload = json.dumps({"body-json": "payload string")
response = lambda_client.invoke(
FunctionName = function_name,
Payload = payload
)
response_payload = response['Payload'].read()
response_arr = json.loads(response_payload)
return response_arr['answer']
答案 0 :(得分:5)
感谢大家的投入。 @ Michael-sqlbot关于AWS客户端库默认向本地区域发送请求的评论是帮助我找到解决方案的。对于Python,库是boto3。阅读Remix后,尚不清楚如何设置该区域。正是这个docs提供了(简单的)答案:
cleint = boto3.client('lambda', region_name='us-west-2')
你是对的迈克尔,区域之间一个lambda到另一个lambda的用例是错综复杂的。我将在这里留下这个答案,以防其他任何新的boto3在尝试获取其他资源(lambda到ec2,lambda到s3等)以跨区域工作时遇到相同的错误。
感谢
答案 1 :(得分:0)
您需要将worker2
lambda函数的区域设置如下:
arn:aws:lambda:us-east-1-...:function:worker_2
因此,代码看起来会是:
function_name = "arn:aws:lambda:us-east-1-...:function:worker_2"
lambda_client = boto3.client('lambda')
payload = json.dumps({"body-json": "payload string")
response = lambda_client.invoke(
FunctionName = function_name,
Payload = payload
)
很好,现在您需要通过master
lambda函数的IAM角色向Lambda master
授予权限。
您可以创建一个API网关端点,在端口us-east-1
中执行lambda函数。此端点只能使用特定的API密钥执行,以提供一层安全性。
从master
lambda函数执行对该端点的请求。
答案 2 :(得分:-1)
let lambda = new AWS.Lambda({region: region})
之后你应该做 lambda.invoke
这会成功!