Lambda requirements for container images
To deploy a container image to Lambda, note the following requirements:
-
The container image must implement the Lambda Runtime API. The AWS
open-source implement the API. You can
add a runtime interface client to your preferred base image to make it compatible
with Lambda. -
The container image must be able to run on a read-only file system. Your function
code can access a
writable directory with 512 MB of storage. -
The default Lambda user must be able to read all the files required to run your function
code. Lambda
follows security best practices by defining a default Linux user with least-privileged
permissions. Verify
that your application code does not rely on files that other Linux users are restricted
from running. -
Lambda supports only Linux-based container images.
-
Lambda provides multi-architecture base images. However, the image you build for your
function must target
only one of the architectures. Lambda does not support functions that use multi-architecture
container
images.
Настройка сети для самостоятельно установленной Kafka
Инстансы Amazon EC2 с запущенной Kafka лучше всего разворачивать в приватных подсетях. Для того чтобы функция Lambda могла опрашивать инстансы Kafka, вам необходимо убедиться в том, что в публичной подсети каждой зоны доступности (AZ) запущен NAT Gateway.
В окружениях, предназначенных для тестирования и разработки, можно настроить маршрутизацию трафика через один NAT Gateway в одной AZ. Для производственных рабочих нагрузок в целях резервного дублирования рекомендуется, чтобы в каждой зоне доступности было развёрнуто по одному NAT Gateway. Шаги ниже помогут вам развернуть следующую архитектуру:
- Создайте VPC с публичными и приватными подсетями и NAT Gateway, обеспечивающим доступ в Интернет. Чтобы развернуть такую инфраструктуру с помощью AWS CloudFormation, используйте данный шаблон.
- Из консоли управления VPC отредактируйте группу безопасности по умолчанию, созданную этим шаблоном, чтобы разрешить входящий трафик на следующие порты:
- Custom TCP: порты 2888-3888 со всех IP-адресов.
- SSH (порт 22), только с вашего IP-адреса.
- Custom TCP: порт 2181 со всех IP-адресов.
- Custom TCP: порт 9092 со всех IP-адресов.
- Весь трафик от ресурсов в той же самой группе безопасности.
(Optional) Step 4: Clean up
To prevent unnecessary costs, delete the resources that you created as part of this
getting started exercise.
The following steps delete your HTTP API, your Lambda function, and associated resources.
To delete an HTTP API
-
Sign in to the API Gateway console at https://console.aws.amazon.com/apigateway.
-
On the APIs page, select an API. Choose Actions, and then choose
Delete. -
Choose Delete.
To delete a Lambda function
-
Sign in to the Lambda console at https://console.aws.amazon.com/lambda.
-
On the Functions page, select a function. Choose Actions, and
then choose Delete. -
Choose Delete.
To delete a Lambda function’s log group
-
In the Amazon CloudWatch console, open the .
-
On the Log groups page, select the function’s log group
(). Choose Actions, and then choose
Delete log group. -
Choose Delete.
To delete a Lambda function’s execution role
-
In the AWS Identity and Access Management console, open the .
-
Select the function’s role, for example,
. -
Choose Delete role.
-
Choose Yes, delete.
You can automate the creation and cleanup of AWS resources by using AWS CloudFormation
or AWS SAM. For example AWS CloudFormation
templates, see example
AWS CloudFormation templates.
Deploy and test the API
Deploy the API in the API Gateway console
-
Choose Deploy API from the Actions
dropdown menu. -
For Deployment stage, choose .
-
For Stage name, enter .
-
If desired, enter a Stage description.
-
If desired, enter a Deployment description.
-
Choose Deploy.
-
Note the API’s Invoke URL.
Use
browser and cURL to test an API with Lambda proxy integration
You can use a browser or cURL to test
your API.
To test requests using only query string parameters, you can type
the URL for the API’s resource into a browser address bar.
For example:
https://.execute-api..amazonaws.com/test/helloworld?name=John&city=Seattle
For other methods, you must use more advanced REST API testing utilities, such as
POSTMAN or cURL. This tutorial uses cURL. The cURL
command examples below assume that cURL is installed on your computer.
To test the deployed API using cURL:
-
Open a terminal window.
-
Copy the following cURL command and paste it into the terminal window,
replacing with your API’s
API ID and with the region
where your API is deployed.Note
If you’re running the command on Windows, use this syntax
instead:
You should get a successful response with a payload similar to the
following:
If you change to in the preceding method
request, you should get the same response.
To test the method, copy the following command and paste it
into the terminal window, replacing
with your API’s API ID and
with the region where your
API is deployed.
You should get a response similar to the result from the preceding
request, except that the request does not
have any payload. So the parameter will be .
Среда выполнения Lambda
Lambda-функции запускаются в изолированном (sandboxed) окружении, называемом среда выполнения. Таким образом обеспечивается изоляция одних функций от других, и выделяются необходимые ресурсы, такие как память, указанные в настройках Lambda-функции.
Lambda управляет жизненным циклом вычислительных ресурсов в автоматическом режиме, поэтому вы платите только за использованные ресурсы. Между запусками функций сервис Lambda «замораживает» среду выполнения. Она будет «разморожена», если сервису Lambda понадобится среда выполнения для последующих запусков.
До этого момента, только исполняемый процесс (runtime) мог влиять на жизненный цикл среды выполнения. Он взаимодействует с Runtime API посредством HTTP API endpoint, который находится внутри среды выполнения и взаимодействует с сервисом Lambda.
Lambda и Runtime API
Исполняемый процесс использует API для получения сообщений вызовов из Lambda и доставки их внутрь исполняемого кода функции. Затем он уведомляет сервис Lambda о результатах обработки переданного сообщения. После этого сервис Lambda снова «замораживает» среду выполнения.
До этого момента, исполняемый процесс Lambda проходил через две независимые фазы жизненного цикла в среде выполнения Lambda: Init и Invoke.
- Init: в Init фазе, Lambda сервис инициирует исполняемый процесс (runtime), и затем запускает код инициализации функции (код за пределами обработчика main). Данная фаза происходит или в момент первичного запуска, или заранее – в случае включения Provisioned Concurrency режима.
- Invoke: в Invoke фазе, исполняемый процесс (runtime) получает событие вызова от сервиса Lambda и запускает обработчик функции. Затем он возвращает результат вызова в Runtime API.
После окончания выполнения функции сервис Lambda «замораживает» среду выполнения и сохраняет её какое-то время на случай последущего вызова.
Если Lambda функция не получает вызовы в течение какого-то времени, сервис Lambda удаляет среду выполнения.
Предыдущий жизненный цикл Lambda
С появлением Extensions API расширения могут оказывать влияние, управлять и участвовать в жизненном цикле среды выполнения. Например, они могут использовать Extensions API для контроля «замораживания» среды выполнения сервиса Lambda.
Среда исполнения AWS Lambda с появлением Extensions API
Расширения инициализируются перед исполняемым процессом (runtime) и функцией. Затем они продолжают исполнение параллельно с функцией, получая больше возможностей по управлению её исполнением, и могут произвести какое-то действие во время окончания работы функции.
Расширения позволяют интегрироваться с сервисом Lambda путём следующих изменений в его жизненном цикле:
- Изменения фазы Init. Теперь существует три независимых Init задачи: Init расширения, Init исполняемого процесса, Init функции. Благодаря этому, у нас есть порядок запуска, где расширение и исполняемый процесс могут произвести операции по настройке перед запуском самой функции.
- Больше контроля во время запуска. Во время фазы Invoke, как и раньше, исполняемый процесс (runtime) получает событие вызова от сервиса Lambda и запускает обработчик функции. В дополнение к этому, расширения могут получать и обрабатывать события об изменениях в жизненном цикле от сервиса Lambda. Они могут запускать логику обработки в ответ на полученные события и информировать сервис Lambda об окончании обработки. Сервис Lambda «замораживает» среду выполнения после получения подтверждения от всех расширений и исполняемого процесса. Таким образом, расширения могут теперь влиять на процесс «заморозки»-«разморозки» среды выполнения.
- Фаза завершения работы: также расширения теперь имеют возможность выполнить действия при завершении работы среды выполнения за счёт появления фазы «завершения работы». Сервис Lambda посылает событие о завершении работы, которое даёт сигнал исполняемому процессу и расширению, что среда исполнения вот-вот закончит свою работу.
Новый жизненный цикл Lambda с появлением расширений
Каждая фаза жизненного цикла Lambda начинается с события от сервиса Lambda, отосланного исполняемому процессу и всем зарегистрированным расширениям. Исполняемый процесс и расширения уведомляют о завершении обработки запросом события Next от и Extensions API. Lambda «замораживает» среду выполнения и все расширения, когда не остаётся событий для обработки.
Жизненный цикл Lambda для среды выполнения, исполняемого процесса, расширений и функции.
Дополнительную информацию о фазах жизненного цикла и Extensions API смотрите в документации.
Настройка функции Lambda и привязка источника событий
Вы можете создать привязку источника событий для функции Lambda с помощью интерфейса командной строки AWS или AWS SDK, который предоставляет API CreateEventSourceMapping. В этом руководстве вы будете использовать консоль управления AWS для создания привязки источника событий.
Создайте функцию Lambda, которая использует самостоятельно установленный кластер Kafka и топик в качестве источника событий:
- В консоли управления Lambda нажмите Create function.
- Введите название функции и выберите Node.js 12.x в качестве среды выполнения.
- В разделе Permissions, подразделе Execution role выберите название роли, чтобы открыть консоль управления IAM.
- Нажмите Add inline policy и создайте новую политику с названием SelfHostedKafkaPolicy и следующими правами доступа. Замените секцию Resource на ARN ваших инстансов:
- Нажмите Create policy и убедитесь, что политика появилась в списке Permissions policies.
- Вернитесь в свойства функции Lambda, выберите раздел Configuration. В подразделе Designer нажмите Add trigger.
- В выпадающем списке выберите Apache Kafka
- В разделе Bootstrap servers добавьте IP-адреса обоих ранее созданных инстансов, добавив порт 9092.
- В поле Topic name введите ‘test’.
- Введите наиболее подходящие вам размер партии сообщений (batch size) и стартовый индекс сообщения (см. документацию, чтобы узнать больше).
- В поле VPC выберите VPC, созданную ранее шаблоном CloudFormation.
- В поле VPC subnets выберите обе приватные подсети.
- В поле VPC security groups выберите созданную группу безопасности.
- Нажмите Add.
Через несколько секунд состояние триггера в консоли Lambda изменится на Enabled. Спустя несколько минут, триггер начнёт получать сообщения из кластера Kafka.
Как расширения доставляются в Lambda и запускаются?
Вы добавляете расширения в виде слоёв Lambda, которые представляют собой ZIP архивы, содержащие библиотеки и другие зависимости.
Для добавления нового слоя используйте Консоль управления AWS, Интерфейс командной строки AWS (AWS CLI) или подходы «инфраструктура-как-код», с помощью AWS CloudFormation, AWS Serverless Application Model (AWS SAM) и Terraform.
Когда сервис Lambda запускает среду выполнения функции, он распаковывает файлы Расширений из слоя Lambda в папку . Затем Lambda проверяет наличие каких-либо расширений в папке и начинает процесс инициализации. Расширения должны быть исполняемыми файлами, такими как скрипты или запускаемые файлы. Расширения не могут изменять код функции, потому что папка с кодом функции доступна только на чтение.
Расширения могут запускаться в одном из двух режимов – внутренний и внешний.
- Внутренние расширения запускаются как часть исполняемого процесса, в том же процессе, что и код вашей функции. Расширения в таком режиме не используют отдельные процессы. Внутренние расширения позволяют изменять процесс запуска исполняемого процесса, используя специфичные для языка переменные окружения и скрипты-обёртки. Вы можете использовать переменные окружения для добавления утилит к исполняемым процессам Java Correto 8 и 11, Node.js 10 и 12 и .NET Core 3.1. Скрипты-обёртки (Wrapper scripts) позволяют передать управление запуском рантайма вашему скрипту с целью дополнительной конфигурации процесса запуска. Вы можете использовать скрипты-обёртки с js 10 и 12, Python 3.8, Ruby 2.7, Java 8 и 11 и .NET Core 3.1. Для дополнительной информации смотрите раздел документации «Modifying the runtime environment».
- Внешние расширения позволяют запускать отдельный процесс относительно исполняемого процесса, но в той же среде выполнения, что и Lambda-функция. Внешние расширения могут запускаться перед исполняемым процессом и могут продолжать работу после завершения исполняемого процесса. Внешние расширения работают с js 10 и 12, Python 3.7 и 3.8, Ruby 2.5 и 2.7, Java Corretto 8 и 11, .NET Core 3.1 и пользовательскими средами выполнения.
Внешние расширения могут быть написаны на языке программирования, отличающимся от языка Lambda-функции. Мы рекомендуем разрабатывать внешние расширения, используя компилируемый язык программирования, и распространять их в виде бинарных файлов (self-contained binary). Такой подход гарантирует совместимость со всеми поддерживаемыми средами выполнения. В случае использования некомпилируемых языков программирования, убедитесь, что вы включили необходимый исполняемый файл в ваше расширение.
Расширения запускаются в той же среде выполнения, что и функция, и делят с ней ресурсы: CPU, память и дисковое хранилище. Они также получают одинаковые переменные окружения и права доступа, используя ту же роль AWS Identity and Access Management (IAM), что и функция.
Чтобы узнать больше о ресурсах, безопасности и аспектах производительности расширений, читайте блог-пост «Introducing AWS Lambda extensions».
Примеры расширений и скриптов-обёрток для разработки ваших собственных расширений вы можете найти в GitHub репозитории.
Java: Using the Java inner exception to store the redirection URI
Because Java is a strongly typed language, the Lambda function return value contains the Java exception type which you cannot override (nor should you). Thus, you will be using a different property to retrieve the redirection URI:
API Gateway Settings | Value |
---|---|
Method Response: HTTP Status | 302 |
Integration Response: Header Mappings | Location: |
The parameter is accessible in the Lambda function Java runtime as an inner exception.
is a class that extends .
The full response from Lambda received by API Gateway is the following:
Because Lambda serializes the inner exception type to the outer . you can still use the same Lambda error regex in API Gateway to detect a redirect from .
API Gateway Settings | Value |
---|---|
Integration Response: Lambda Error Regex |
URI Request Parameters
The request uses the following URI parameters.
-
Up to 3583 bytes of base64-encoded data about the invoking client to pass to the function
in the context
object. -
The name of the Lambda function, version, or alias.
Name formats
-
Function name — (name-only), (with alias).
-
Function ARN — .
-
Partial ARN — .
You can append a version number or alias to any of the formats. The length constraint
applies only to the full ARN.
If you specify only the function name, it is limited to 64 characters in length.Length Constraints: Minimum length of 1. Maximum length of 170.
Pattern:
Required: Yes
-
-
Choose from the following options.
-
(default) — Invoke the function synchronously. Keep the connection open until
the function returns a response or times out. The API response includes the function
response and additional
data. -
— Invoke the function asynchronously. Send events that fail multiple times to the
function’s dead-letter queue (if it’s configured). The API response only includes
a status code. -
— Validate parameter values and verify that the user or role has permission to invoke
the function.
Valid Values:
-
-
Set to to include the execution log in the response. Applies to synchronously invoked functions
only.Valid Values:
-
Specify a version or alias to invoke a published version of the function.
Length Constraints: Minimum length of 1. Maximum length of 128.
Pattern:
Публикации в блоге
Announcing HTTP APIs for Amazon API Gateway
Джордж Мао
4 ДЕКАБРЯ 2019 Г.
Building a Multi‑region Serverless Application with Amazon API Gateway and AWS Lambda
Стефано Булиани (Stefano Buliani) и Магнус Бьоркман (Magnus Bjorkman)
13 НОЯБРЯ 2017 Г.
Announcing WebSocket APIs in Amazon API Gateway
Диего Магальяйнс
18 ДЕКАБРЯ 2018 Г.
Как предоставлять сложные инфраструктуры по запросу с помощью Amazon API Gateway и AWS Lambda
Бен Эйкхорст (Ben Eichorst) и Вероника Меглер (Veronika Megler)
12 СЕНТЯБРЯ 2017 Г.
Using Enhanced Request Authrorizers in Amazon API Gateway
Стефано Булиани
27 СЕНТЯБРЯ 2017 Г.
Удаление шаблонной логики подтверждения в своих API REST с помощью технологии подтверждения запросов Amazon API Gateway
Брайан Листон
11 АПРЕЛЯ 2017 Г.
Monetize your APIs in AWS Marketplace using Amazon API Gateway
Брайан Листон
01 ДЕКАБРЯ 2016 Г.
Защищенный доступ по API с использованием объединенных удостоверений Amazon Cognito, пулов пользователей Amazon Cognito и Amazon API Gateway
Эд Лима
19 ИЮНЯ 2017 Г.
Санкционирование доступа к Amazon API Gateway и AWS Lambda через прокси-ресурс с использованием пулов пользователей Amazon Cognito
Брайан Листон
03 ФЕВРАЛЯ 2017 Г.
Generate Your Own API Gateway Developer Portal
Брайан Листон
01 ДЕКАБРЯ 2016 Г.
Дополнительные советы AWS, рекомендации и руководства см. в следующих блогах.
Reporting batch item failures
When your Lambda function encounters an error while processing a batch, all messages
in that batch become
visible in the queue again by default, including messages that Lambda processed successfully.
As a result, your
function can end up processing the same message several times.
To avoid reprocessing all messages in a failed batch, you can configure your event
source mapping to make only
the failed messages visible again. To do this, when configuring your event source
mapping, include the value
in the list. This lets your function
return a partial success, which can help reduce the number of unnecessary retries
on records.
Report syntax
After you include in your event source mapping configuration, you can
return a list of the failed message IDs in your function response. For example, suppose
you have a batch of five
messages, with message IDs , , , , and
. Your function successfully processes , , and
. To make messages and visible again in your queue, your
response syntax should look like the following:
To return the list of failed message IDs in the batch, you can use a class
object or create your own custom class. Here is an example of a response that uses
the
object.
To use this feature, your function must gracefully handle errors. Have your function
logic catch all
exceptions and report the messages that result in failure in in your function
response. If your function throws an exception, the entire batch is considered a complete
failure.
Note
If you’re using this feature with a FIFO queue, your function should stop processing
messages after the
first failure and return all failed and unprocessed messages in . This helps
preserve the ordering of messages in your queue.
Success and failure conditions
Lambda treats a batch as a complete success if your function returns any of the following:
-
An empty list
-
A null list
-
An empty
-
A null
Lambda treats a batch as a complete failure if your function returns any of the following:
-
An invalid JSON response
-
An empty string
-
A null
-
An with a bad key name
-
An value with a message ID that doesn’t exist
CloudWatch metrics
To determine whether your function is correctly reporting batch item failures, you
can monitor the
and Amazon SQS metrics in
Amazon CloudWatch.
-
tracks the number of messages removed from your queue. If this
drops to 0, this is a sign that your function response is not correctly returning
failed messages. -
tracks how long the oldest message has stayed in your queue.
A sharp increase in this metric can indicate that your function is not correctly returning
failed
messages.
Next steps
For this example, you used the AWS Management Console to create a simple HTTP API.
The HTTP API invokes a Lambda
function and returns a response to clients.
The following are next steps as you continue to work with API Gateway.
-
Configure additional types of API integrations,
including:
To get help with Amazon API Gateway from the community, see the API Gateway
Discussion Forum. When you enter this forum, AWS might require you to sign in.
To get help with API Gateway directly from AWS, see the support options on the AWS Support page.
See also our frequently asked questions (FAQs), or
contact us directly.
Securing environment variables
For securing your environment variables, you can use server-side encryption to protect
your data at rest and
client-side encryption to protect your data in transit.
Note
To increase database security, we recommend that you use AWS Secrets Manager instead
of environment variables
to store database credentials. For more information, see Configuring database access for a Lambda
function.
Security at rest
Lambda always provides server-side encryption at rest with an AWS KMS key. By default,
Lambda uses an
AWS managed key. If this default behavior suits your workflow, you don’t need to set
anything else up. Lambda
creates the AWS managed key in your account and manages permissions to it for you.
AWS doesn’t charge you to
use this key.
If you prefer, you can provide an AWS KMS customer managed key instead. You might
do this to have control over rotation of
the KMS key or to meet the requirements of your organization for managing KMS keys.
When you use a customer managed key,
only users in your account with access to the KMS key can view or manage environment
variables on the
function.
Customer managed keys incur standard AWS KMS charges. For more information, see AWS Key Management Service pricing, in the AWS KMS product
pages.
Security in transit
For additional security, you can enable helpers for encryption in transit, which ensures
that your
environment variables are encrypted client-side for protection in transit.
To configure encryption for your environment variables
-
Use the AWS Key Management Service (AWS KMS) to create any customer managed keys for
Lambda to use for server-side and client-side
encryption. For more information, see Creating keys in the AWS Key Management Service Developer Guide. -
Using the Lambda console, navigate to the Edit environment variables page.
-
Open the of the Lambda console.
-
Choose a function.
-
Choose Configuration, then choose Environment variables from
the left navigation bar. -
In the Environment variables section, choose Edit.
-
Expand Encryption configuration.
-
-
Optionally, enable console encryption helpers to use client-side encryption to protect
your data in
transit.-
Under Encryption in transit, choose Enable helpers for encryption in
transit. -
For each environment variable that you want to enable console encryption helpers for,
choose
Encrypt next to the environment variable. -
Under AWS KMS key to encrypt in transit, choose a customer managed key that you created
at the beginning of
this procedure. -
Choose Execution role policy and copy the policy. This policy grants permission
to your function’s execution role to decrypt the environment variables.Save this policy to use in the last step of this procedure.
-
Add code to your function that decrypts the environment variables. Choose Decrypt secrets
snippet to see an example.
-
-
Optionally, specify your customer managed key for encryption at rest.
-
Choose
Use
a customer master key. -
Choose a customer managed key that you created at the beginning of this procedure.
-
-
Choose Save.
-
Set up permissions.
If you’re using a customer managed key with server-side encryption, grant permissions
to any AWS Identity and Access Management (IAM) users
or roles that you want to be able to view or manange environment variables on the
function. For more
information, see .If you’re enabling client-side encryption for security in transit, your function needs
permission to call
the API operation. Add the policy that you saved previously in this procedure to the
function’s execution role.
Managing permissions to your server-side
encryption KMS key
No AWS KMS permissions are required for your user or the function’s execution role
to use the default
encryption key. To use a customer managed key, you need permission to use the key.
Lambda uses your permissions
to create a grant on the key. This allows Lambda to use it for encryption.
-
– To view keys in the Lambda console.
-
, – To configure a customer managed key on a
function. -
– To view and manage environment variables that are encrypted with a
customer managed key.
You can get these permissions from your user account or from a key’s resource-based
permissions policy.
is provided by the managed policies for
Lambda. Key policies grant the remaining permissions to users in the Key users
group.
Users without permissions can still manage functions, but they can’t view environment
variables or manage them in the Lambda console. To prevent a user from viewing environment
variables, add a
statement to the user’s permissions that denies access to the default key, a customer
managed key, or all
keys.
Example IAM policy – Deny access by key ARN
For details on managing key permissions, see Using key policies
in AWS KMS in the AWS Key Management Service Developer Guide.