terraform环境和更新单个资源

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}" 
} 

你需要不同的tfvarstfstate文件不同的环境。

假设您使用最新的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 
+0

感谢您的答复。挑战在于,对于这种用例,DEV,QA和PROD都在同一个帐户中。我最终做的是使用Terraform来管理lambda函数代码并通过aws cli更新别名。再次感谢。 – kilomo

+0

不明白你在说什么。当然,这些代码在同一个帐户内工作,你担心什么? – BMW