Руководство по URL-адресам функций AWS Lambda

Долгое время основным способом вызова функции AWS Lambda через HTTP(S) было размещение перед ней API-шлюза. Хотя это хорошо работает (и до сих пор является обязательным шаблоном для многих и многих случаев использования serverless), иногда разработчики хотели «просто вызвать функцию AWS Lambda», отправив сетевой запрос.

Представляем URL-адреса функций AWS Lambda — новую функцию в AWS Lambda, которая позволяет вызывать функции Lambda без API-шлюза.

Что такое URL-адрес функции Lambda?

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

https://vg7sczk62ycloct63yi3wjpoj40sgkuz.lambda-url.eu-central-1.on.aws/
Войти в полноэкранный режим Выйти из полноэкранного режима

или, в общем случае:

https://<url-id>.lambda-url.<region>.on.aws/
Войти в полноэкранный режим Выйти из полноэкранного режима

URL лямбда-функции может указывать либо на $LATEST, либо на определяемый пользователем псевдоним. Несмотря на отсутствие необходимости в дополнительных ресурсах (например, API Gateway или ALB), URL функции — это отдельный ресурс CloudFormation, который должен быть предоставлен отдельно.

Как создать URL-адрес функции AWS Lambda?

Вы можете создать URL-адрес функции AWS Lambda через:

  • AWS Management Console (команда Cloudash не рекомендует использовать так называемый ClickOps для производственного использования, вместо него используйте IaC)
  • AWS CLI
  • AWS CloudFormation
  • AWS Serverless Application Model (AWS SAM)
  • AWS CDK

Не могли бы вы привести пример?

Конечно, вот как можно создать функцию AWS Lambda + и url функции для ее прямого вызова с помощью AWS CDK:

import * as cdk from "aws-cdk-lib";
import { Construct } from "constructs";

export class LambdaUrlStack extends cdk.Stack {
  constructor(scope: Construct, id: string, props?: cdk.StackProps) {
    super(scope, id, props);

    const myLambda = new cdk.aws_lambda.Function(this, "myLambda", {
      code: cdk.aws_lambda.Code.fromAsset("lambda"),
      handler: "index.handler",
      runtime: cdk.aws_lambda.Runtime.NODEJS_16_X,
    });

    const lambdaUrl = new cdk.aws_lambda.CfnUrl(this, "lambdaUrl", {
      targetFunctionArn: myLambda.functionArn,
      authType: cdk.aws_lambda.FunctionUrlAuthType.NONE,
    });
  }
}
Войти в полноэкранный режим Выход из полноэкранного режима

И да, authType: cdk.aws_lambda.FunctionUrlAuthType.NONE не совсем безопасен. Продолжайте читать, чтобы узнать больше:

Безопасность и модель аутентификации для URL-адресов функций лямбда

Контроль доступа к URL-адресам функций Lambda осуществляется с помощью параметра AuthType в сочетании с политиками на основе ресурсов, привязанными к конкретной функции.

Цитируя AWS docs, существует два возможных значения параметра AuthType:

  • AWS_IAM — Lambda использует AWS Identity and Access Management (IAM) для аутентификации и авторизации запросов на основе политики идентификации IAM принципала и политики на основе ресурсов функции. Выберите эту опцию, если вы хотите, чтобы только аутентифицированные пользователи и роли IAM вызывали вашу функцию через URL-адрес функции.

  • NONE — Lambda не выполняет никакой аутентификации перед вызовом вашей функции. Однако политика вашей функции, основанная на ресурсах, действует всегда и должна предоставить публичный доступ, прежде чем URL вашей функции сможет принимать запросы. Выберите эту опцию, чтобы разрешить публичный, неаутентифицированный доступ к URL вашей функции.

AWS_IAM тип авторизации

Когда URL лямбда-функции имеет AWS_IAM AuthType, то тот, кто должен вызвать этот конкретный URL лямбда-функции, должен иметь разрешение lambda:InvokeFunctionUrl для конкретной лямбда-функции.

Примечание: lambda:InvokeFunctionUrl отличается от lambda:InvokeFunction, поэтому вам может потребоваться соответствующая настройка ваших IAM разрешений при выборе использования этой функции.

NONE тип авторизации

Если для URL лямбда-функции AuthType установлено значение NONE, то любой неаутентифицированный пользователь с URL вашей функции может вызвать вашу функцию — будьте осторожны. Это может быть полезно, когда вы хотите разрешить публичный доступ к URL вашей функции, например, через веб-браузер.

Даже если тип auth установлен на NONE и Lambda не использует IAM для аутентификации запросов к URL функции, тот, кто пытается вызвать функцию, должен иметь разрешения lambda:InvokeFunctionUrl.

Пример политики вызова URL функции для всех неаутентифицированных принципалов:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": "*",
            "Action": "lambda:InvokeFunctionUrl",
            "Resource": "arn:aws:lambda:us-east-1:123456789012:function:my-function",
            "Condition": {
                "StringEquals": {
                    "lambda:FunctionUrlAuthType": "NONE"
                }
            }
        }
    ]
}
Войти в полноэкранный режим Выйти из полноэкранного режима

Источник

При создании URL функции с типом аутентификации NONE через AWS Console или AWS SAM, перечисленные выше утверждения политики на основе ресурсов будут автоматически созданы для вас. При использовании, например, AWS SDK вам нужно будет создать его самостоятельно, пример того, как это можно сделать, приведен ниже:

import * as cdk from "aws-cdk-lib";
import { Construct } from "constructs";

export class LambdaUrlStack extends cdk.Stack {
  constructor(scope: Construct, id: string, props?: cdk.StackProps) {
    super(scope, id, props);

    const myLambda = new cdk.aws_lambda.Function(this, "myLambda", {
      code: cdk.aws_lambda.Code.fromAsset("lambda"),
      handler: "index.handler",
      runtime: cdk.aws_lambda.Runtime.NODEJS_16_X,
    });

    const lambdaUrl = new cdk.aws_lambda.CfnUrl(this, "lambdaUrl", {
      targetFunctionArn: myLambda.functionArn,
      authType: cdk.aws_lambda.FunctionUrlAuthType.NONE,
    });

    const lambdaPermission = new cdk.CfnResource(this, "lambdaPermission", {
      type: "AWS::Lambda::Permission",
      properties: {
        Action: "lambda:InvokeFunctionUrl",
        FunctionName: myLambda.functionArn,
        Principal: "*",
        FunctionUrlAuthType: "NONE",
      },
    });
  }
}
Войти в полноэкранный режим Выход из полноэкранного режима

Ценообразование

URL-адреса функций Lambda включены в стоимость AWS Lambda — за использование этой функции не взимается дополнительная плата (и вы можете сэкономить на отказе от использования API Gateway).

Ограничения

URL-адреса функций Lambda имеют те же ограничения, что и функции AWS Lambda:

  • 6 МБ размер полезной нагрузки ответа и запроса
  • По умолчанию от 1 000 до десятков тысяч TPS
  • 15-минутный тайм-аут

Короче говоря — нет никаких дополнительных затрат, никаких дополнительных ограничений на таймаут и полезную нагрузку при выборе использования URL-адресов Lambda-функций.

Ознакомьтесь с официальной документацией AWS, чтобы узнать больше.

Итак, в чем же разница между функциональными URL и API Gateway? Являются ли функциональные URL объективно лучше?

Не совсем, всегда есть компромисс.

Функциональные URL API Gateway REST API Функциональные URL
HTTPS Да Да
Ограничение полезной нагрузки 6 МБ (с AWS Lambda) 6 МБ
Максимальный таймаут 29 секунд До 15 минут
Создание SDK Да Нет
Стоимость от $3,50/миллион для первых 333 миллионов Бесплатно
AWS WAF Да Нет
Планы использования Да Нет
Проверка и преобразование запросов/ответов Да Нет

Источник — AWS Summit SF 2022 — Best practices for building interactive applications with AWS Lambda (CON302)

Функциональные URL имеют значительно увеличенный тайм-аут (до 15 минут) по сравнению с API Gateway + Lambda, но при этом сильно снижены возможности ограничения безопасности/использования.

Процитируем сообщение блога Announcing AWS Lambda Function URLs:

Функциональные URL лучше всего подходят для случаев, когда вам необходимо реализовать однофункциональный микросервис с публичной конечной точкой, не требующий расширенной функциональности API Gateway, такой как проверка запросов, дросселирование, пользовательские авторизаторы, пользовательские доменные имена, планы использования или кэширование. […] Это также самый простой способ вызывать ваши функции Lambda во время исследований и разработок, не выходя из консоли Lambda и не интегрируя дополнительные сервисы.

Используйте API Gateway, чтобы воспользоваться такими возможностями, как JWT/настраиваемые авторизаторы, проверка и преобразование запросов/ответов, планы использования, встроенная поддержка AWS WAF и так далее.

Узнайте больше в документации по URL-адресам лямбда-функций.

Оцените статью
devanswers.ru
Добавить комментарий