Использование CDK для создания пошаговой функции с зависимостями от других ресурсов AWS (например, Lambda), принадлежащих разным проектам

Мы используем AWS Step Functions в нашем приложении. У нас есть одношаговая функция, которую мы создаем с помощью CDK как часть развертывания приложения А из репозитория А. Эта пошаговая функция должна включать лямбда-функцию в качестве одного из шагов. Проблема заключается в том, что эта лямбда-функция создается и поддерживается независимо в другом репозитории (репозиторий B). Мы не знаем, как лучше всего связать один ресурс AWS (AWS Lambda) с другим ресурсом AWS (AWS Step Functions), когда создание этих двух ресурсов происходит независимо в двух разных местах.

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

Наша лучшая мысль на данный момент заключается в том, что мы могли бы может быть заставить приложение A создать пошаговую функцию, но создать и ссылаться на пустую лямбду. Первоначально функция step, конечно, не будет полностью функциональной, но затем, когда мы развернем приложение B, оно сможет искать эту пустую лямбда-функцию и загружать в нее новый код.

И, чтобы у нас не было проблемы, когда развертывание приложения B сначала приводит к неработающему коду. Мы также можем обработать противоположное условие: приложение B может создать лямбда-функцию перед загрузкой в ​​нее кода, если она еще не существует. Затем приложение A может посмотреть, существует ли уже лямбда-функция при создании пошаговой функции, и просто напрямую ссылаться на лямбда-функцию в пошаговой функции.

Проблемы с этим подходом:

  • Это дополнительная работа, которая значительно усложняет развертывание, что увеличивает вероятность сбоя.
  • Я не уверен, что смогу легко найти подобную лямбда-функцию в любом случае (я думаю, это должно быть по имени, поскольку мы не могли знать, каким будет ARN, когда мы пишем код). Но тогда у нас возникают проблемы, если имя тоже меняется, так что, возможно, есть предопределенный идентификатор или что-то, что мы могли бы использовать для его поиска.
  • Возможный сбой кода в рабочей среде. Если при развертывании в QA для тестирования мы развертываем приложение A, то приложение B, мы действительно знаем только, что сценарий работает. Если же при переходе к продакшну мы развернем их в обратном порядке, это может сломаться.

Какие есть хорошие варианты для такого рода вещей, потому что я не могу придумать ничего отличного. Моя лучшая идея заключается в том, чтобы вообще не использовать лямбда, а вместо этого пошаговая функция step ставит что-то в очередь в SQS, тогда приложение B может просто читать из этой очереди без проблем. Похоже, что это достаточно распространенный сценарий, хотя должен быть какой-то чистый способ сделать это с помощью лямбда, и я бы не хотел, чтобы мои решения о том, какой тип сервиса я могу использовать в AWS, были загнаны в угол из-за возможности развертывания.

Спасибо

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
38
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете легко включить существующую лямбда-функцию в новую пошаговую функцию, созданную CDK. Используйте статический метод Function.fromFunctionArn для получить доступную только для чтения ссылку на Lambda, используя его ARN. CDK использует ARN для добавления необходимых разрешений lambda:InvokeFunction к предполагаемой роли Step Functions.

import { aws_stepfunctions_tasks as tasks } from 'aws-cdk-lib';

const importedLambdaTask = new tasks.LambdaInvoke(this, 'ImportedLambdaTask', {
  lambdaFunction: lambda.Function.fromFunctionArn(
    this,
    'ImportedFunc',
    'arn:aws:lambda:us-east-1:123456789012:function:My-Lambda5C096DFA-RLhGGzBJSnMN'
  ),
  resultPath: '$.importedLambdaTask',
});

Если вы предпочитаете не жестко кодировать Lambda ARN в стеке CDK, сохраните ARN в Параметр SSM Сохранить параметр. Затем импортируйте его в стек по имени и передайте в fromFunctionArn:

const lambdaArnParam = ssm.StringParameter.fromStringParameterName(
  this,
  'ArnFromParamStore',
  'lambda-arn-saved-as-ssm-param'
);

Обновлено: при необходимости добавьте конструкцию Триггер в приложение CDK A, чтобы подтвердить существование лямбда-зависимости приложения B перед развертыванием. Триггеры — это новая функция CDK, позволяющая запускать лямбда-код во время развертывания. Функция триггера должна возвращать ошибку, если она не может найти внешнюю лямбду, что приводит к сбою развертывания приложения А.

Мне нравится идея использовать хранилище параметров (это и есть SSM, верно?) для записи лямбда-арна. У меня все еще есть проблема, что произойдет, если я попытаюсь создать пошаговую функцию до того, как будет создана лямбда-функция, но я думаю, в этом случае мы могли бы просто пропустить создание пошаговой функции и повторно развернуть приложение после его создания? Это не слишком невыполнимо, у нас все еще есть проблема, когда у нас может быть работающий код в тестировании, а не в рабочей среде, если мы развертываем приложения в другом порядке, что не очень хорошо.

omatase 05.05.2022 22:30

@omatase Да, параметры хранилища параметров SSM. Кроме того, я добавил совет о том, как проверять внешние зависимости с помощью Trigger.

fedonev 06.05.2022 11:16

Другие вопросы по теме