首页 > 解决方案 > 在另一个区域中调用 Lambda 并在调用的区域中进行更改

问题描述

我很确定我知道答案,但我想我还是会问。有没有办法在另一个区域调用 Lambda 函数,但使用调用区域中的数据。我能够从另一个区域的一个区域调用 Lambda 函数,但是调用的函数针对它所在的区域运行。我试图做的是让被调用的函数在调用它的区域中进行更改。

例如,检查某些 ec2 配置并在必要时进行更改的 lambda 函数位于区域 1 中,我想在区域 2 中调用 lambda 函数。但是当我在区域 2 中调用该函数时,它针对 ec2s 运行在区域 1 中,而不是区域 2 中的 ec2 实例。有没有办法让区域 1 中的 lambda 函数针对区域 2 中的 ec2 实例运行,或者我只需要在每个区域中部署 lambda 函数。

我要避免的是对 lambda 函数进行更改,并且必须在所有区域部署它;而不是仅将其部署到单个区域并让所有区域调用该更新后的功能。

目前,我调用的 lambda 看起来像这样,

client = boto3.client('lambda', region_name='region 1')
 
def lambda_handler(event,context):
 
    response = client.invoke(
        FunctionName = 'Lambda_function_name',
        InvocationType = 'RequestResponse',
        Payload = json.dumps(event)
    )

标签: pythonamazon-web-servicesaws-lambda

解决方案


通常,使用 Python boto3 api,当您创建客户端时,您指定该客户端的区域。 https://stackoverflow.com/a/40377889/230055是一个有用的参考。因此,在您的代码中,您需要进行设置,以便在region_name创建客户端时给定的值是您传递给 lambda 的值。您想在 lambda 处理程序(或 lambda 处理程序调用的某些函数)中声明您的客户端,以便您可以传递一个变量。也许像

def lambda_handler(event, context):
    client = boto3.client('ec2', region_name=event['region_to_use'])

然后,作为调用 lambda 时发送的有效负载的一部分,您需要传递region_to_use密钥并指定您希望调用的 lambda 使用哪个区域。

您还可以通过 STS 担任角色来创建针对不同区域甚至不同帐户的客户端。因此,如果您使用这种方法,您可以让您的 lambdas 在您选择的任何区域/帐户中使用客户端。该方法取决于 STS 和承担角色。

这个对不同问题的回答显示了担任创建针对不同地区的客户的角色的一般过程。因此,只要您传递 lambda,您就会调用足够的信息,它知道它需要为其创建客户端的区域,并假设您已设置角色以允许 STS,那么您可以做您想做的事情。

如果您考虑一下,任何时候使用 boto3 api 时,您都是在为特定区域创建客户端。如果您在本地使用它,它可能使用您的凭证文件中指定的默认区域。但每次你做客户时,它都是针对一个地区的。因此,如果您可以在 Lambda 中创建客户端,则可以在 Lambda 中定位不同的区域。

顺便说一句,我已经完成了你要求做的事情——在一个区域有一个 lambda,它可以在其他区域工作。所以它绝对有效并且是可能的。


推荐阅读