Terraform удаляет старую версию AWS Lambda Layer вместо создания новой - PullRequest
0 голосов
/ 12 февраля 2019

Я создал лямбда-слой AWS и создал код terraform, который развертывает его на AWS.Я хочу, чтобы каждый раз, когда я создавал новую версию слоя, он развертывался как новая версия без удаления старой.Однако сейчас он делает обратное и просто добавляет новую версию, но удаляет старую.Как это изменить?

Вот мой код terraform

provider "aws" {
  region = "eu-central-1"
}

resource "aws_s3_bucket_object" "object_lambda_common_layer" {
  bucket = "tm-bamboo-deploys"
  key = "lambda/layers/lambda_common_layer/lambda_common_layer_${data.archive_file.layer_zip_lambda_common_layer.output_base64sha256}.zip"
  source = "${data.archive_file.layer_zip_lambda_common_layer.output_path}"
  etag = "${data.archive_file.layer_zip_lambda_common_layer.output_md5}"
  depends_on = [
    "data.archive_file.layer_zip_lambda_common_layer"]
}

data "archive_file" "layer_zip_lambda_common_layer" {
  type = "zip"
  source_dir = "../../src"
  output_path = "../../lambda_common_layer.zip"
}

resource "aws_lambda_layer_version" "lambda_common_layer" {
  layer_name = "lambda_common_layer"
  s3_bucket = "${aws_s3_bucket_object.object_lambda_common_layer.bucket}"
  s3_key = "${aws_s3_bucket_object.object_lambda_common_layer.key}"
  s3_object_version = "${aws_s3_bucket_object.object_lambda_common_layer.version_id}"
  source_code_hash = "${data.archive_file.layer_zip_lambda_common_layer.output_base64sha256}"
  description = "Common layer providing logging"
  compatible_runtimes = ["python3.6"]
}

terraform {
  backend "s3" {
    bucket         = "tfstate-dev-tm"
    region         = "eu-central-1"
    key            = "service/lambda/layers/lambda_common_layer.tfenv"
    dynamodb_table = "terraform_locks"
  }
}

План Terraform

Refreshing Terraform state in-memory prior to plan...
The refreshed state will be used to calculate this plan, but will not be
persisted to local or remote state storage.

data.archive_file.layer_zip_lambda_common_layer: Refreshing state...
aws_s3_bucket_object.object_lambda_common_layer: Refreshing state... (ID: lambda/layers/lambda_common_layer/lambda_common_layer.zip)
aws_lambda_layer_version.lambda_common_layer: Refreshing state... (ID: arn:aws:lambda:eu-central-1:XXXXXXXXXXXX:layer:lambda_common_layer:12)

------------------------------------------------------------------------

An execution plan has been generated and is shown below.
Resource actions are indicated with the following symbols:
-/+ destroy and then create replacement

Terraform will perform the following actions:

-/+ aws_lambda_layer_version.lambda_common_layer (new resource required)
      id:                             "arn:aws:lambda:eu-central-1:XXXXXXXXXXXX:layer:lambda_common_layer:12" => <computed> (forces new resource)
      arn:                            "arn:aws:lambda:eu-central-1:XXXXXXXXXXXX:layer:lambda_common_layer" => <computed>
      compatible_runtimes.#:          "1" => "1"
      compatible_runtimes.4000986591: "python3.6" => "python3.6"
      created_date:                   "2019-02-12T11:09:19.948+0000" => <computed>
      description:                    "Common layer providing logging" => "Common layer providing logging"
      layer_arn:                      "arn:aws:lambda:eu-central-1:XXXXXXXXXXXX:layer:lambda_common_layer:12" => <computed>
      layer_name:                     "lambda_common_layer" => "lambda_common_layer"
      s3_bucket:                      "tm-bamboo-deploys" => "tm-bamboo-deploys"
      s3_key:                         "lambda/layers/lambda_common_layer/lambda_common_layer.zip" => "lambda/layers/lambda_common_layer/lambda_common_layer_tjn78HvsQ6vIUKxcXg+jnawPvwxyCgflesbNwz8o1Xc=.zip" (forces new resource)
      s3_object_version:              "" => "${aws_s3_bucket_object.object_lambda_common_layer.version_id}" (forces new resource)
      source_code_hash:               "tjn78HvsQ6vIUKxcXg+jnawPvwxyCgflesbNwz8o1Xc=" => "tjn78HvsQ6vIUKxcXg+jnawPvwxyCgflesbNwz8o1Xc="
      source_code_size:               "350" => <computed>
      version:                        "12" => <computed>

-/+ aws_s3_bucket_object.object_lambda_common_layer (new resource required)
      id:                             "lambda/layers/lambda_common_layer/lambda_common_layer.zip" => <computed> (forces new resource)
      acl:                            "private" => "private"
      bucket:                         "tm-bamboo-deploys" => "tm-bamboo-deploys"
      content_type:                   "binary/octet-stream" => <computed>
      etag:                           "d14b146b3478f1cdfa0dee3ada2fe79c" => "484a7fe7ce87c8c88ca5bf038b6bd426"
      key:                            "lambda/layers/lambda_common_layer/lambda_common_layer.zip" => "lambda/layers/lambda_common_layer/lambda_common_layer_tjn78HvsQ6vIUKxcXg+jnawPvwxyCgflesbNwz8o1Xc=.zip" (forces new resource)
      server_side_encryption:         "" => <computed>
      source:                         "../../lambda_common_layer.zip" => "../../lambda_common_layer.zip"
      storage_class:                  "STANDARD" => <computed>
      version_id:                     "" => <computed>


Plan: 2 to add, 0 to change, 2 to destroy.

------------------------------------------------------------------------

Note: You didn't specify an "-out" parameter to save this plan, so Terraform
can't guarantee that exactly these actions will be performed if
"terraform apply" is subsequently run.

1 Ответ

0 голосов
/ 12 февраля 2019

Это предполагаемое поведение терраформы.Он отслеживает состояние и модуль.Если он видит какие-либо изменения, требующие принудительного воссоздания от провайдера, он уничтожает старое и создает новое.

Если вы хотите сохранить старое, также создайте новое, одну вещь, которую я могу предложитьпоскольку для поддержания состояния tfstate вы используете динамические блоки S3 и ведро S3, вам нужно изменить key в вашем блоке terraform, а затем вручную поддерживать версии всех лямбда-слоев, которые вы создали.В будущем, если вы хотите уничтожить какую-либо версию, просто используйте ключ, который вы использовали для создания этого лямбда-слоя, и запустите terraform destroy.

Так пример: первый раз, когда вы используете это:

terraform {
  backend "s3" {
    bucket         = "tfstate-dev-tm"
    region         = "eu-central-1"
    key            = "service/lambda/layers/lambda_common_layer_v1.tfstate"
    dynamodb_table = "terraform_locks"
  }
}

Затем во второй раз, когда вы захотите создать новый лямбда-слой, измените терраформу на:

terraform {
  backend "s3" {
    bucket         = "tfstate-dev-tm"
    region         = "eu-central-1"
    key            = "service/lambda/layers/lambda_common_layer_v2.tfstate"
    dynamodb_table = "terraform_locks"
  }
}

Теперь он создаст новый лямбда-слой.Как только вы захотите удалить свой старый лямбда-слой, вы можете сделать это снова:

terraform {
      backend "s3" {
        bucket         = "tfstate-dev-tm"
        region         = "eu-central-1"
        key            = "service/lambda/layers/lambda_common_layer_v1.tfstate"
        dynamodb_table = "terraform_locks"
      }
    }

и запустить terraform destroy, и он удалит ваш старый лямбда-слой.

Только проблема с этим Iсмотрите, если вы измените ваш основной модуль, который фактически обеспечивает ваш ресурс, то это может создать проблему, когда вы фактически уничтожаете старую версию лямбда-слоя.Если возможно, вы можете попробовать скопировать terraform и назначить версию фактическому файлу terraform, а не внутреннему ключу terraform, чтобы впоследствии можно было без проблем уничтожить этот ответ, как если бы вы имели исходную версию файла terraform, с помощью которой он был фактически создан.Надеюсь, это поможет.

...