Lambda函数配置两个不同Launch Template仅第一个生效问题排查
为什么只有第一个Launch Template执行成功?
嘿,我一眼就揪出问题所在了——你在代码里重复定义了lambda_handler函数!在Python里,当你写两个同名函数的时候,后面的函数会直接覆盖掉前面的那个。也就是说,你的Lambda实际运行时,只会执行最后那个调用lt_a的lambda_handler,第一个函数根本不会被触发。你看到的第一个Launch Template创建成功的实例,大概率是之前测试留下的,或者你搞反了实际执行的逻辑~
要解决这个问题,你需要把两个创建实例的逻辑合并到同一个lambda_handler里,而且别忘了指定不同的可用区(毕竟你的需求是部署到两个AZ)。这里给你修正后的代码:
import boto3 # 调用EC2资源 ec2 = boto3.resource('ec2') # 定义Launch Template lt = { 'LaunchTemplateName': 'My_Launch_Template', 'Version': '1' } lt_a = { 'LaunchTemplateName': 'My_Launch_Template_2', 'Version': '1' } def lambda_handler(event, context): # 用第一个Launch Template在目标AZ创建实例 instances_lt = ec2.create_instances( LaunchTemplate=lt, MinCount=1, MaxCount=1, Placement={'AvailabilityZone': 'us-east-1a'} # 替换成你要的第一个AZ ) print(f"从My_Launch_Template创建实例:{instances_lt[0].id}") # 用第二个Launch Template在另一个AZ创建实例 instances_lt_a = ec2.create_instances( LaunchTemplate=lt_a, MinCount=1, MaxCount=1, Placement={'AvailabilityZone': 'us-east-1b'} # 替换成你要的第二个AZ ) print(f"从My_Launch_Template_2创建实例:{instances_lt_a[0].id}")
几个关键点说明:
- 把两个创建实例的操作合并到同一个
lambda_handler里,这样Lambda触发时会依次执行这两个操作 - 通过
Placement参数显式指定可用区,确保两个实例部署到不同的AZ,完全符合你的需求 - 加入了打印语句,你可以在Lambda的日志里查看每个实例的创建情况,方便排查问题
另外,如果你的Launch Template本身已经指定了可用区,那可以去掉Placement参数,但显式指定会更稳妥,避免实例被随机分配到AZ。
内容的提问来源于stack exchange,提问作者charles uneze
相关产品推荐
相关产品推荐

