在另一个区域中调用Lambda,并在被调用的区域中进行更改



我很确定我知道答案,但我还是想问一下。是否有一种方法可以在另一个区域调用Lambda函数,但利用被调用区域中的数据。我能够从一个区域调用另一个区域的Lambda函数,但是被调用的函数与它所在的区域相反。我试图做的是让被调用的函数在它被调用的区域进行更改。

例如,lambda函数检查某些ec2配置并在必要时进行更改,它位于区域1,而我想在区域2中调用lambda函数。但是当我在区域2中调用函数时,它针对区域1中的ec2s而不是区域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)
)

通常,使用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假设角色来创建针对不同区域甚至不同帐户的客户端。因此,如果使用这种方法,您可以使lambda使用您选择的任何区域/帐户的客户端。方法取决于STS和假设角色。

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

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

顺便说一句,我已经做了你要求做的事情——在一个区域有一个lambda在其他区域工作。所以这绝对是可行的。