Рубрики
Без рубрики

Функция Lambda получила Я

Звучит без сервера, так что вы не вытащите волосы, когда тест не пройдет в 19 -й раз подряд!. Tagged с JavaScript, Python, Lambda, Terraform.

Я работаю над новым продуктом для стартапа, ориентированного на конфиденциальность. Мы защищаем клиентов от журнала, отслеживания и всего этого плохого, которое нам не нравилось.

Мы начинаем с расширения хрома в качестве MVP.

(Если вы знаете о расширении Chrome с> 30 000 пользователей, которые не были обновлены за 18 месяцев, напишите мне. Я заплачу реферальную комиссию.)

Внутри нашего расширения Chrome мы собираемся сделать несколько разных вещей. В основном защитите свою историю. Для этого нам нужно:

  • Создание аккаунта
  • Журнал учетной записи В
  • API, чтобы проверить

Я не хотел управлять всеми типичным дерьмом ECS/Docker/ELB/Route53, которое в наши дни обеспечивает услуги клиентам. Поэтому я решил написать эти услуги в без серверного стиля.

Этот пост подробно описывает некоторые общие ошибки, которые я сделал, и как я их исправил.

Одна вещь, которую следует отметить, я, как правило, не люблю добавлять пакеты, которые вводят еще один «диалект», чтобы выполнить работу. Когда я это сделал, это часто отвлекает то, что на самом деле происходит, и делает борьбу за отладок.

Я хочу остаться в простом JavaScript, Python или пойти как можно больше. Ошибки более предсказуемы и документы яснее. Это не значит, что мой путь – лучший, просто знайте, что этот блог сосредоточится только на моем личном подходе.

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

Первое, что нужно понять, когда вы создаете функцию лямбды, вы загружаете Zipped File с плоской структурой файла в Lambda.

Если вы используете Node, это означает, что вы должны застегнуть свой node_modules. Если вы используете Python, вы сделаете то же самое со своими требованиями.

Есть несколько простых способов сделать это:

В узле => Я создал файл с именем build_upload.sh. В этом файле содержится следующий код:

zip -r ./dev/lambda_function.zip ./node_modules/* ./main.js -x "./dev" && aws s3 cp ./dev/lambda_function.zip s3://$1-$2/$2/v$3/lambda_function.zip

Этот файл Bash занимает 3 переменных:

  • 1 доллар (например, разработчик)
  • $ 2 Имя (например, In-Stripe-Integration)
  • $ 3 Номер (например, 1,0,0)

Я решил установить эти переменные вот так. Порция S3://$ 1-2 объединяется, чтобы соответствовать моему имени ковша. Если вы назвали свое ведро по -разному, измените пример!

Рабочий пример с заполненными переменными будет:

bash build_upload.sh dev stripe-integration 1.0.0

Это заполнит код сверху и производит:

zip -r ./dev/lambda_function.zip ./node_modules/* ./main.js -x "./dev" && aws s3 cp ./dev/lambda_function.zip s3://dev-stripe-integration/stripe-integration/v1.0.0/lambda_function.zip

Затем появляется версия, управляемая в вашем ведре S3. Который позволяет вам откатиться в любой момент, необходимый. Существует бесконечное количество других вариантов настройки, которые вы можете получить, но это был самый простой способ получить рабочую сборку и последовательность развертывания.

В питоне,

zip -r9 ../lambda.zip * -x "bin/*" requirements.txt setup.cfg

Я бы посоветовал использовать Terraform для управления всем этим. Лучший способ сделать это – загрузить код в S3 Bucket => Получить самую последнюю версию через Terraform => развернуть на лямбда.

Я предоставил пример узла выше, показывающий, как это сделать. Python One строит только обновленный Zip локально.

Вот блок для ресурса Terraform:

resource "aws_lambda_function" "check_file_lambda" {
    filename = "${var.function_path}"
    function_name = "${var.function_name}"
    role = "${aws_iam_role.check_file_lambda.arn}"
    handler = "${var.handler}"
    runtime = "${var.runtime}"
    timeout = "${var.timeout}"
    source_code_hash = "${base64sha256(file("${var.function_path}"))}"
}

В Terraform у вас есть файл с именем varials.tfvars. Все упоминания $ {var.function_path} или аналогичные переменные, хранящиеся в этом файле. Эти переменные настроены с таким синтаксисом, как SO:

variable "function_path" {
    description: "The path to the lambda function package you're deploying"
}

Вы можете дополнительно добавить поле по умолчанию:

variable "function_path" {
    description: "The path to the lambda function package you're deploying"
    default: "../../lambda_function.zip"
}

Без поля по умолчанию командная строка побудит вас ввести определение по умолчанию при запуске плана Terraform или Terraform.

Двигаясь дальше, одно поле, на которое мы хотим обратить особое внимание, – это Source_code_hash. Это займет хэш нашего исходного кода и загрузку в новые версии Lambda, когда мы запускаем Terraform.

Вы также можете сделать эти другие способы, но, поскольку я использую Terraform для всего (S3, функций, Cronjobs, базы данных, маршрутизации и т. Д.), Я использую изменения через него. # Teamneveruseawsui

Это магическое маленькое поле сделает это, чтобы я мог застегнуть изменения и повторно развернуть из любого места.

Вы можете столкнуться с неспособностью редактировать код в онлайн -редакторе. Моя функция Python не позволила мне, но мой пакет узлов сделал. Для этого у меня в настоящее время нет отличного решения. Но если кто -то это сделает, пожалуйста, дайте мне знать!

Мне нравится писать код на основе функций. Это означает, что мой код очень часто выглядит так:

def initial_function():
        blah blah blah 
        blah blah blah 
        format_data(blah)

def format_data(blah):
        blah2 blah2 blah2
        blah2 blah2 blah2
        insert_data(blah2)

def insert_data(blah2):
        blah3 blah3 blah3 
        blah3 blah3 blah3

Одна ошибка, которую я совершил рано, – это не совсем понимание того, как интегрировать это в синтаксис функции лямбда:

def handler(event, context):

Для этого я изменил вышеперечисленное так, чтобы функция обработчика вызовал initial_function.

def handler(event, context):
    initial_function()

def initial_function():
        blah blah blah 
        blah blah blah 
        format_data(blah)

def format_data(blah):
        blah2 blah2 blah2
        blah2 blah2 blah2
        insert_data(blah2)

def insert_data(blah2):
        blah3 blah3 blah3 
        blah3 blah3 blah3
        return 

Вы можете перенести параметры из события, если вам нужно. Это основной пример, показывающий, как заставить ваш локальный код работать в Lambda.

Я сделал то же самое с узлом, показанным ниже:

Одно напоминание о ключе: как только ваша функция будет завершена, не забудьте вызвать обратный вызов. Обратный вызов (null, ответ показан ниже)

exports.handler = function (event, context, callback){
    .......... bunch of code here 
    .......... bunch of code here
    .......... bunch of code here
    .......... bunch of code here
    callback(null, response)

После того, как вы зашли так далеко, у вас должна быть проверена работающая функция Lambda через консоль. Вы просто нажимаете кнопку тестирования и проводите поддельный тест (если ваша функция зависит от параметров, то сделайте ее более реалистичным).

Вы также можете создать файл с именем invoke_lambda.sh

aws lambda invoke --region=us-east-1 --function-name=$1 $1.txt

Это занимает 1 переменную (как показано 1 долл. США). Имя функции. Он выводит результат функции в файл под названием function_name.txt.

Затем вы можете открыть его или прочитать через кошку из вашего терминала.

Это делает это очень легко, еще раз выяснить, что происходит, не открывая амазонки невозможным пользовательским интерфейсом.

Одной из проблем, с которой я столкнулся с нашей инфраструктурой соскоб, была Lambda Timing Out. Первоначально он установлен в 3 секунду. Я изменился до 30 и снова был золотым.

У вас также может закончиться память. Это общая проблема, с которой люди сталкиваются. У меня не было такой же проблемы Но если вы это сделаете, в Terraform есть слайдер или одно поле для обновления.

Следующий логический шаг – создать пользовательский домен из вашей функции Lambda. Итак, вы можете сделать что -то вроде:

https://api.kameronkales.com/stripe

Чтобы выполнить запрос получить функцию лямбда-интеграции полосы.

Я могу обновить это позже, если люди захотят узнать об этом. Это довольно просто:

  • Запросите сертификат от менеджера по сертификатам AWS
  • Сделайте проверку (DNS или электронная почта)
  • Установите CNAME так, чтобы ваш желаемый маршрут был доступен на вашем URL -адресах CloudFront Distribution
  • Сопоставьте/маршрут к этому домену на пользовательском доменном портале API Gateway.

Оригинал: “https://dev.to/kameronkales/lambda-function-got-ya-s-3j3o”