如何提取Terraform创建的EC2实例ID并传入Lambda的Python脚本?
如何用Terraform自动传递EC2实例ID给Lambda脚本
我想用Terraform创建EC2实例和Lambda函数,让Lambda负责启停该EC2。但Lambda启动EC2的Python脚本里需要指定实例ID,请问怎么把Terraform创建的EC2实例ID自动注入到Python脚本里?
现有代码:
EC2实例Terraform代码
resource "aws_instance" "app_server" { ami = "ami-0ed752ea0f62749af" instance_type = "t2.micro" tags = { Name = "Instance_test" } }
Lambda函数Terraform代码
# 获取并转换Python文件为ZIP data "archive_file" "zipit_lambda_start" { type = "zip" source_file = "index_lambda_start.py" output_path = "lambda_function_start.zip" } # 引入IAM角色模块 module "role" { source = "../IAM_POLICY_IAM_ROLE" } # 创建Lambda函数 resource "aws_lambda_function" "lambda_start_ec2" { filename = "lambda_function_start.zip" function_name = "StartEC2Instance" role = module.role.role_lambda_test_arn handler = "index.lambda_handler" source_code_hash = "${data.archive_file.zipit_lambda_start.output_base64sha256}" runtime = "python3.9" timeout = 10 }
Lambda启动EC2的Python脚本
import boto3 region = 'eu-west-1' instances = ['i-0e6**********c3'] ec2 = boto3.client('ec2', region_name=region) def lambda_handler(event, context): ec2.start_instances(InstanceIds=instances) print('started your instances: ' + str(instances))
解决方案
方法一:使用Terraform模板生成Lambda代码
通过Terraform的templatefile函数,将EC2实例ID动态注入到Python脚本中,再打包成ZIP包。
- 将Python脚本改为模板文件(例如命名为
index_lambda_start.tpl),把硬编码的实例ID替换为模板变量:
import boto3 region = 'eu-west-1' instances = ['${instance_id}'] ec2 = boto3.client('ec2', region_name=region) def lambda_handler(event, context): ec2.start_instances(InstanceIds=instances) print('started your instances: ' + str(instances))
- 修改Terraform的
archive_file数据源,使用templatefile生成带实例ID的脚本并打包:
data "archive_file" "zipit_lambda_start" { type = "zip" source_content = templatefile("${path.module}/index_lambda_start.tpl", { instance_id = aws_instance.app_server.id }) output_path = "lambda_function_start.zip" }
Terraform执行时会自动将aws_instance.app_server.id的值替换到模板中,生成包含正确实例ID的Python脚本。
方法二:通过Lambda环境变量传递实例ID
这种方法无需修改脚本打包流程,而是将实例ID存储在Lambda的环境变量中,脚本从环境变量读取值。
- 修改Python脚本,从环境变量获取实例ID:
import boto3 import os region = 'eu-west-1' instances = [os.environ['INSTANCE_ID']] ec2 = boto3.client('ec2', region_name=region) def lambda_handler(event, context): ec2.start_instances(InstanceIds=instances) print('started your instances: ' + str(instances))
- 在Lambda的Terraform配置中添加环境变量:
resource "aws_lambda_function" "lambda_start_ec2" { filename = "lambda_function_start.zip" function_name = "StartEC2Instance" role = module.role.role_lambda_test_arn handler = "index.lambda_handler" source_code_hash = data.archive_file.zipit_lambda_start.output_base64sha256 runtime = "python3.9" timeout = 10 # 添加环境变量配置 environment { variables = { INSTANCE_ID = aws_instance.app_server.id } } }
Lambda运行时,脚本通过os.environ['INSTANCE_ID']即可获取到Terraform创建的EC2实例ID。
内容的提问来源于stack exchange,提问作者user15915737
相关产品推荐
相关产品推荐

