Преводът на статията е подготвен специално за студентите в курса . Интересувате ли се да се развивате в тази област? Гледайте мастер-класса на Егор Зуев (TeamLead в компанията InBit) и се присъединете към най-близката група на курса: стартиране на 26 септември.

Все повече хора преминават към AWS Lambda заради мащабируемостта, производителността, спестяванията и възможността да обработват милиони и дори трилиони заявки на месец. За това не е нужно да управлявате инфраструктурата, на която работи услугата. Автоматичното мащабиране позволява обработката на хиляди едновременно заявки в секунда. Смятам, че AWS Lambda се нарича с право един от най-търсените услуги на AWS.
AWS Lambda
AWS Lambda е събитийно-ориентирана услуга за безсървърни изчисления, която позволява изпълнение на код без нужда от отделяне и администриране на сървъри и допълва други услуги на AWS на базата на потребителска логика. Lambda автоматично реагира на различни събития (така наречените тригери), например на HTTP заявки през Amazon API Gateway, промяна на данни в кошници Amazon S3 или таблици Amazon DynamoDB; или можете да стартирате собствения си код чрез API повиквания, използвайки AWS SDK и преходи между състоянията в AWS Step Functions.
Lambda изпълнява код на високодостъпна изчислителна инфраструктура и изцяло отговаря за администрирането на основната платформа, включително поддръжка на сървърите и операционната система, разпределение на ресурси, автоматично мащабиране, мониторинг на кода и водене на журнали. Тоест, достатъчно е да качите своя код и да настроите как и кога трябва да бъде изпълняван. В замяна, услугата ще се погрижи за неговото стартиране и ще осигури високата достъпност на вашето приложение.
Кога да преминете на Lambda?
AWS Lambda е удобна изчислителна платформа, подходяща за много приложения, разбира се, ако езикът и средата за изпълнение на вашия код се поддържат от услугата. Если искате да се съсредоточите върху кода и бизнес логиката, като поверите на външен доставчик поддръжката на сървърите, разпределянето на ресурси и мащабирането на разумна цена, определено трябва да преминете към AWS Lambda.
Lambda е идеален за изграждане на софтуерни интерфейси, а ако използвате услугата заедно с API Gateway, можете значително да намалите разходите и да достигнете по-бързо до пазара. Има различни начини за използване на функции Lambda и варианти за организиране на безсървърна архитектура — всеки може да избере нещо подходящо в зависимост от поставената цел.
Lambda позволява изпълнение на широк спектър от задачи. Така благодарение на поддръжката на CloudWatch можете да създавате отложени задачи и да автоматизирате отделни процеси. Няма ограничения по характера и интензивността на използването на услугата (вземат се предвид разходът на памет и времето), така че нищо не ви пречи да работите планомерно върху пълноценен микросервис на основата на Lambda.
Тук можете да създавате услуги, ориентирани към действия, които не се изпълняват постоянно. Типичен пример е мащабирането на изображения. Дори в случай на разпределени системи, функциите Lambda не губят актуалността си.
И така, ако не искате да се занимавате с разпределяне и администриране на изчислителни ресурси — опитайте AWS Lambda; ако не ви трябват тежки, ресурсоемки изчисления — също опитайте AWS Lambda; ако вашият код се изпълнява периодично — правилно, трябва да опитате AWS Lambda.
Сигурност
Към момента няма оплаквания относно сигурността. От друга страна, тъй като много от вътрешните процеси и особености на реализацията на тази модел на AWS Lambda са скрити от управляваната среда на потребителя, някои общоприети правила за облачна сигурност губят актуалността си.
Както повечето услуги на AWS, Lambda се предоставя на принципа на споделена отговорност между AWS и клиента по отношение на сигурността и спазването на нормативни изисквания. Този принцип намалява оперативното натоварване на клиента, тъй като AWS поема задълженията по обслужването, администрирането и контрола на компонентите на услугата — от операционната система на хоста и нивото на виртуализация до физическата сигурност на инфраструктурните обекти.
Когато говорим конкретно за AWS Lambda, AWS отговаря за управлението на подлежащата инфраструктура, свързаните основни услуги, операционната система и приложната платформа. В същото време клиентът носи отговорност за сигурността на своя код, съхранението на конфиденциални данни, контрола на достъпа до тях, както и до услугата и ресурсите на Lambda (Identity and Access Management, IAM), включително в рамките на използваните функции.
На схемата по-долу е представена модел на споделена отговорност, приложим към AWS Lambda. Сферата на отговорност на AWS е оцветена в оранжево, а отговорността на клиента — в синьо. Както виждате, AWS поема повече отговорност за приложенията, разгръщани на услугата.

Модел на споделена отговорност, приложим към AWS Lambda
Изпълнителна среда на Lambda
Основното предимство на Lambda е, че като изпълнява функция от ваше име, услугата сама предоставя необходимите ресурси. Можете да не губите време и усилия в администриране на системи и да се концентрирате върху бизнес логиката и писането на код.
Услугата Lambda е разделена на две плоскости. Първата е плоскост на управление. Според Уикипедия, плоскостта на управление (control plane) е част от мрежата, отговорна за транспортиране на сигнален трафик и маршрутизиране. Тя е основен компонент, вземащ глобални решения относно предоставянето, обслужването и разпределението на работните натоварвания. Освен това, плоскостта на управление играе ролята на мрежова топология на доставчика на решение, отговорна за маршрутизацията на трафика и управлението му.
Втората плоскост е плоскостта на данни. Тя, подобно на плоскостта на управление, има своите задачи. Плоскостта на управление предоставя API за управление на функциите (CreateFunction, UpdateFunctionCode) и контролира взаимодействието на Lambda с други услуги на AWS. Плоскостта на данни управлява API повикванията (Invoke API), който стартира функциите на Lambda. След повикването на функцията, плоскостта на управление предоставя или избира съществуваща, предварително подготвена за тази функция изпълнителна среда, а след това изпълнява кода в нея.
AWS Lambda поддържа множество програмни езици, включително Java 8, Python 3.7, Go, NodeJS 8, .NET Core 2 и други, чрез съответните среди за изпълнение. AWS редовно ги актуализира, разпространява корекции за сигурността и извършва други операции по поддръжката на тези среди. Lambda позволява използването на и други езици при условие, че самите вие внедрите съответната среда за изпълнение. В такъв случай ще трябва да се грижите за нейната поддръжка, включително следенето за сигурността.
Как всичко това работи и как услугата ще изпълни вашите функции?
Всяка функция работи в една или няколко изолирани среди, които съществуват само в рамките на жизнения цикъл на тази функция и след това се унищожават. Всяка среда едновременно изпълнява само един извикване, но тя се използва повторно, ако настъпи множество последователни извиквания на една и съща функция. Всички среди за изпълнение работят на виртуални машини с хардуерна виртуализация — на т.нар. microVM. Всяка microVM се назначава на конкретен AWS акаунт и може многократно да се използва от среди за изпълнение на различни функции в този акаунт. MicroVM са опаковани в структурни блокове на хардуерната платформа Lambda Worker, която се притежава и управлява от AWS. Една и съща среда за изпълнение не може да се използва от различни функции, тъй като microVM са уникални за различни AWS акаунти.

Модел на изолация в AWS Lambda
Изолацията на средите за изпълнение е реализирана с помощта на няколко механизма. На най-високо ниво, всяка среда има отделни копия на следните компоненти:
- Код на функцията
- Всички слоеве на Lambda, избрани за функцията
- Среда за изпълнение на функцията
- Минимално потребителско пространство на базата на Amazon Linux
За изолация на различни среди за изпълнение се прилагат следните механизми:
- cgroups — ограничение на достъпа до ресурси на CPU, памет, пропускна способност на хранилището и мрежата за всяка среда за изпълнение;
- namespaces — групиране на идентификатори на процеси, идентификатори на потребители, мрежови интерфейси и други ресурси, управлявани от ядрото на Linux. Всяка среда за изпълнение работи в собствено пространство от имена;
- seccomp-bpf — ограничаване на системните повиквания, които могат да се използват в средата за изпълнение;
- iptables и таблици за маршрутизиране — изолация на средите за изпълнение една от друга;
- chroot — предоставяне на ограничен достъп до подлежащата файлова система.
В комбинация с проприетарни технологии за изолация, механизмите, изброени по-горе, осигуряват надежно разделение на изпълнителни среди. Така изолираните среди не могат да имат достъп до данни от други среди и да ги изменят.
Въпреки че няколко изпълнителни среди на един акаунт AWS могат да работят на един microVM, при никакви обстоятелства microVM не могат да се споделят между различни акаунти AWS. За изолация на microVM в AWS Lambda се използват само два механизма: EC2 инстанции и Firecracker. Изолацията на гости в Lambda, основана на EC2 инстанции, се прилага от 2015 година. Firecracker е нов хипервизор с отворен код, специално разработен от AWS за безсървърни работни натоварвания и представен през 2018 година. Физическото оборудване, на което работят microVM, се споделя между работни натоварвания на различни акаунти.
Запазване на среди и състояния на процеси
Въпреки че изпълнителните среди на Lambda са уникални за различни функции, същата функция може да бъде извиквана повторно, тоест средата на изпълнение може да съществува няколко часа, преди да бъде унищожена.
Във всяка среда на изпълнение Lambda съществува файловата система с разрешение за запис, достъпна през директорията /tmp. Съдържанието ѝ не може да бъде достъпвано от други среди на изпълнение. Що се отнася до запазването на състояния на процесите, записаните файлове в /tmp съществуват през целия жизнен цикъл на средата на изпълнение. Това позволява събиране на резултатите от няколко извиквания, което е особено полезно за такава скъпоструваща операция, като зареждане на модели на машинно обучение.
Предаване на данни от извиквания
Интерфейсът Invoke API може да се използва в два режима: в режим на събития и в режим "запитване — отговор". В режим на събития извикването се добавя в опашка за по-късно изпълнение. В режим "запитване — отговор" функцията се извиква моментално с предоставеното полезно натоварване, след което се връща отговор. И в двата случая функцията се изпълнява в средата на Lambda, но с различни пътища за полезното натоварване.
При типизиране на повик «запитване — отговор» полезният товар постъпва от API за обработка на запитвания (API Caller), като AWS API Gateway или AWS SDK, в балансировчика на натоварването и след това — в услугата за извикване на Lambda (Invoke Service). Последната определя подходящата среда за изпълнение на функцията и предава там полезния товар, за да завърши повикването. Балансировчикът на натоварването получава трафик с TLS защита през Интернет. Трафикът в рамките на услугата Lambda — след балансировчика на натоварването — преминава през вътрешния VPC в определен AWS регион.

Модел на обработка на повиквания в AWS Lambda: режим «запитване — отговор»
Събитийните повиквания могат да се извършват незабавно или да се добавят в опашка. В някои случаи опашката се реализира чрез услугата Amazon SQS (Amazon Simple Queue Service), която предава повикванията на услугата за извикване на Lambda чрез вътрешен опрашващ процес (poller). Предаваният трафик е защитен с TLS, като не е предвидено допълнително криптиране на данните, съхранявани в Amazon SQS.
Събитийните повиквания не връщат отговори — всяка информация за отговор Lambda Worker просто игнорира. Повикванията на базата на събития от Amazon S3, Amazon SNS, CloudWatch и други източници се обработват от услугата Lambda в режим на събития. Повикванията от потоците Amazon Kinesis и DynamoDB, повикванията от опашките SQS, балансировчика на приложения и API Gateway се обработват в режим «запитване — отговор».
Мониторинг
Можете да извършвате мониторинг и одит на функциите на Lambda с помощта на различни механизми и услуги на AWS, включително следните.
Amazon CloudWatch
Събира различни статистически данни, като брой запитвания, продължителност на изпълнението на запитванията и брой запитвания, завършили с грешка.
Amazon CloudTrail
Позволява водене на журнали, непрекъснат мониторинг и запазване на информация за активността във вашия AWS акаунт, свързана с вашата инфраструктура. Ще имате пълна хронология на действията, извършени чрез конзолата AWS Management Console, AWS SDK, инструменти за команден ред и други AWS услуги.
AWS X-Ray
Осигурява пълна видимост на всички етапи на обработка на запитванията във вашето приложение, базирана на картата на неговите вътрешни компоненти. Позволява анализиране на приложенията по време на разработка и в производствена среда.
AWS Config
Можете да проследите промените в конфигурацията на функциите Lambda (включително тяхното изтриване) и средата на изпълнение, таговете, имената на обработчиците, размера на кода, разпределението на паметта, настройките за време на чакане и параметрите за паралелизъм, както и ролята на изпълнението на Lambda IAM, подсетите и свързването на групите за сигурност.
Заключение
AWS Lambda предлага мощен набор от инструменти за изграждане на безопасни и мащабируеми приложения. Много от методите за осигуряване на сигурност и спазване на нормативни изисквания в AWS Lambda не се различават от тези, използвани в останалите услуги на AWS, въпреки че има и изключения. Към март 2019 г. Lambda съответства на изискванията SOC 1, SOC 2, SOC 3, PCI DSS, Закона за продължителността и отчетността на медицинското застраховане на САЩ (HIPAA) и други регулации. Затова, когато обмисляте внедряването на следващото приложение, разгледайте услугата AWS Lambda — тя може да е точно за вашата задача.
Източник: habr.com
