跨区域调用AWS lambda

2024-05-13 05:22:08 发布

您现在位置:Python中文网/ 问答频道 /正文

我有三个lambda函数:boss,worker1,worker2。使用boto3.client.invoke时,我可以从boss调用worker1。这两个在同一区域。
worker2位于一个单独的区域。当试图从boss调用worker2时,返回以下错误:
“调用调用操作时发生错误(ResourceNotFoundException):'us-east-1'中的函数在此区域('us-west-2')中不可访问。”。 boss具有以下权限的执行角色:

{
"Version": "2012-10-17",
"Statement": [
    {
        "Action": [
            "lambda:InvokeFunction"
        ],
        "Effect": "Allow",
        "Resource": "arn:aws:lambda:*:*:*"
    }
]
}

请帮助澄清需要如何传递权限才能正常工作。 谢谢

编辑: 主人和工人1在美国西部2,工人1在美国东部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']

Tags: lambda函数clientjson区域response错误function
2条回答

谢谢大家的意见。@Michael sqlbot关于AWS客户端库默认向本地区域发送请求的评论帮助我找到了解决方案。对于Python,库是boto3。在阅读了docs之后,还不清楚如何设置区域。正是这个blog post提供了(简单的)答案:

cleint = boto3.client('lambda', region_name='us-west-2')

你说得对,Michael,一个lambda到另一个lambda在区域之间的用例是复杂的。我将在这里留下这个答案,以防其他新手在尝试让其他资源(lambda到ec2、lambda到s3等)跨区域工作时遇到同样的错误。
谢谢

需要设置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
)

很好,现在您需要通过Lambda函数的IAM角色向Lambdamaster授予权限。

+建议

您可以创建在区域us-east-1中执行lambda函数的API网关终结点。此终结点只能使用特定的API密钥来执行,以提供安全层。

并且从masterlambda函数执行对该端点的请求。

资源

相关问题 更多 >