terraform环境和更新单个资源
问题描述:
我正在使用Terraform连续部署lambda函数。 lambda模块创建函数和初始化别名[DEV,QA,PROD]。当更改时,source_code_hash
已更新,Terraform更新代码。面临的挑战是,当我想更新从DEV到QA的别名时,它会更新整个堆栈。代码如下。感谢您的帮助。terraform环境和更新单个资源
$ cat main.tf
module "sample" {
source = "./lambda"
name = "sample"
runtime = "nodejs6.10"
role = "${aws_iam_role.iam_role_for_lambda.arn}"
filename = "../Archive.zip"
source_code_hash = "${base64sha256(file("../Archive.zip"))}"
source_dir = "../sample"
alias = "${var.env_name}"
}
$ cat module/main.tf
resource "aws_lambda_function" "lambda" {
filename = "${var.filename}"
function_name = "${var.name}"
role = "${var.role}"
handler = "${var.name}.${var.handler}"
runtime = "${var.runtime}"
source_code_hash = "${data.archive_file.lambda_zip.output_base64sha256}"
publish = "true"
}
resource "aws_lambda_alias" "lambda_alias" {
count = "2"
name = "${element(var.alias, count.index)}"
#name = "${var.alias}"
description = "${var.name}"
function_name = "${aws_lambda_function.lambda.arn}"
function_version = "${aws_lambda_function.lambda.version}"
}
答
你需要不同的tfvars
和tfstate
文件不同的环境。
假设您使用最新的terraform版本。
创造一种环境文件夹(例如,env
),并设置<env>-backend.tf
和<env>.tfvars
文件为每个环境
$ cat main.tf
terraform {
required_version = ">= 0.9.1"
backend "s3" {
encrypt = "true"
}
}
$ cat env/dev-backend.tf
bucket = "terraform-<change-to-s3-global-unique-id>"
key = "terraform/dev/terraform.tfstate"
kms_key_id = "xxxx-xxxx-xxxx-xxxx"
$ cat env/dev.tfvars
env_name = dev
做QA和PROD环境相同。
所以你应该罚款下方运行命令来获取相同lambda
TF代码在不同的环境中工作
rm -rf .terraform
export env="dev"
terraform init -backend=true -backend-config=env/${env}-backend.tf
terraform plan -var-file=./env/${env}.tfvars
感谢您的答复。挑战在于,对于这种用例,DEV,QA和PROD都在同一个帐户中。我最终做的是使用Terraform来管理lambda函数代码并通过aws cli更新别名。再次感谢。 – kilomo
不明白你在说什么。当然,这些代码在同一个帐户内工作,你担心什么? – BMW