Почему Lambda все еще использует старую версию zip-файла в S3 bucket? - PullRequest
0 голосов
/ 27 марта 2020

Я использую Terraform для создания лямбды и сегмента S3, двоичные файлы, которые использует лямбда, хранятся в этом баке, после того как я изменил содержимое двоичного файла, кажется, что лямбда все еще использует старый версия файла (я перезаписываю файл в корзине), как я могу сказать лямбде использовать последнюю версию файла в корзине?

1 Ответ

1 голос
/ 27 марта 2020

Лямбда-функция не будет обновлена ​​только из-за изменения файла в корзине S3.

Аналогично идее CloudFormation, как в AWS :: Lambda :: Код функции

Изменения в пакете развертывания в Amazon S3 не обнаруживаются автоматически во время стек обновлений. Чтобы обновить код функции, измените ключ объекта или версию в шаблоне.

В моем понимании, мы не знали бы, какой лямбда-код мы выполняем, если функция Lambda автоматически регистрирует изменения в S3. ведро. Как правильное управление выпуском, мы должны иметь возможность явно выпускать новое лямбда-развертывание (лучше избегать использования $ LATEST, но publi sh).

Необходимо запустить обновление лямбда-функции.

Одним из способов является использование атрибута source_code_ha sh ресурса Terraform aws_lambda_function, но файл должен быть локальным, а не S3, и его необходимо изменить, прежде чем запускать terraform.

Или измените местоположение объекта корзины S3 и установите новый путь к атрибуту s3_key функции aws_lambda_function. Например, для каждого нового выпуска создайте новую папку S3 "v1", "v2", "v3", ... и используйте новую папку (а также обновите псевдоним, предпочтительно).

resource "aws_lambda_function" "authorizer" {
  function_name    = "${var.lambda_authorizer_name}"
  source_code_hash = "${data.archive_file.lambda_authorizer.output_sha}" # <---
  s3_bucket        = "${aws_s3_bucket.package.bucket}"   
  s3_key           = "${aws_s3_bucket_object.lambda_authorizer_package.id}"   # <---

Или включите управление версиями S3 bucket и измените атрибут s3_object_version функции aws_lambda_function, либо используя version_id из aws_s3_bucket_object, либо после изменения файла в S3 и проверки идентификатора версии.

Один из них вызовет обновление, вызывающее UpdateFunctionCode API как в resource_aws_lambda_function. go.

func needsFunctionCodeUpdate(d resourceDiffer) bool {
    return d.HasChange("filename") || 
           d.HasChange("source_code_hash") || 
           d.HasChange("s3_bucket") || 
           d.HasChange("s3_key") || 
           d.HasChange("s3_object_version")
}

// UpdateFunctionCode in the API / SDK
func resourceAwsLambdaFunctionUpdate(d *schema.ResourceData, meta interface{}) error {
    conn := meta.(*AWSClient).lambdaconn

    ...
    codeUpdate := needsFunctionCodeUpdate(d)
    if codeUpdate {
        ...
        log.Printf("[DEBUG] Send Update Lambda Function Code request: %#v", codeReq)

        _, err := conn.UpdateFunctionCode(codeReq)
        if err != nil {
            return fmt.Errorf("Error modifying Lambda Function Code %s: %s", d.Id(), err)
        }
        ...
    }

В качестве альтернативы вызвать AWS CLI код функции обновления , который в основном код terraform aws_lambda_function работает.

...