2017-04-25 157 views
1

我正在使用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}" 
} 

回答

0

你需要不同的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