繁体   English   中英

如何将资源 output(EC2 实例 ID)作为环境变量传递给 Lambda function?

[英]How do I pass resource output (EC2 Instance ID) as an environment variable to a Lambda function in Terraform?

我有四个文件 ec2.tf、lambda.tf、variables.tf 和 outputs.tf。 在 ec2.tf 中创建了一个 EC2 实例,我希望将实例 ID 作为环境变量传递给 Lambda 创建资源。 我想通过 variables.tf 传递实例 ID。

# variables.tf

variable "runec2_lambda_env" {
  type = map(string)
  default = {
 # I want to pass the output as environment variable here 
    instanceid = "" 
    email      = "abc@xyz.com"
  }
}

# master/lambda.tf

resource "aws_lambda_function" "runec2" {
  filename         = "runec2.zip"
  function_name    = "runec2"
  role             = aws_iam_role.runec2_exec_role.arn
  handler          = "runec2.lambda_handler"
  source_code_hash = filebase64sha256("runec2.zip")
  runtime          = "python3.7"

  environment {
    variables = var.runec2_lambda_env
  }
}


# master/outputs.tf

output "server_id" {
  value = "${join(", ", aws_instance.automation_server.*.id)}"
}

# outputs.tf

 output "public_instance_ids" {
  value = "${module.master.server_id}"
}

# master/ec2.tf

resource "aws_instance" "automation_server" {
  instance_type        = var.instance_type
  ami                  = var.image_id
  iam_instance_profile = aws_iam_instance_profile.ec2_profile.name

  tags = {
    Name = "Automation Server"
  }
  user_data = data.template_file.user-init.rendered
}

变量是您希望能够使用tfvars文件设置或覆盖的东西,或者,如果它是一个模块,则使用模块参数。 另一个重要的部分是它们不支持插值。

如果要使用插值,则需要使用locals 您还可以使用局部变量来提供可以多次引用但不能像变量一样被覆盖的常量的等价物。

所以在这里你可能想要修改一些东西,以便你的email变量是可配置的,但你会自动将 EC2 实例 ID 插入 Lambda function 的环境变量中。

最简单的选项如下所示:

variable "email" {
  default = "abc@xyz.com"
}

resource "aws_lambda_function" "runec2" {
  filename         = "runec2.zip"
  function_name    = "runec2"
  role             = aws_iam_role.runec2_exec_role.arn
  handler          = "runec2.lambda_handler"
  source_code_hash = filebase64sha256("runec2.zip")
  runtime          = "python3.7"

  environment {
    variables = {
      email      = var.email
      instanceid = aws_instance.automation_server.arn
    }
  }
}

如果您真的想将环境变量定义为一个块,那么您将使用这样的本地变量:

variable "email" {
  default = "abc@xyz.com"
}

locals {
  runec2_lambda_env = {
    email      = var.email
    instanceid = aws_instance.automation_server.arn
  }
}

resource "aws_lambda_function" "runec2" {
  filename         = "runec2.zip"
  function_name    = "runec2"
  role             = aws_iam_role.runec2_exec_role.arn
  handler          = "runec2.lambda_handler"
  source_code_hash = filebase64sha256("runec2.zip")
  runtime          = "python3.7"

  environment {
    variables = local.runec2_lambda_env
  }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM