You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何提取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包。

  1. 将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))
  1. 修改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的环境变量中,脚本从环境变量读取值。

  1. 修改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))
  1. 在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 01:39:56