Мы используем AWS Step Functions в нашем приложении. У нас есть одношаговая функция, которую мы создаем с помощью CDK как часть развертывания приложения А из репозитория А. Эта пошаговая функция должна включать лямбда-функцию в качестве одного из шагов. Проблема заключается в том, что эта лямбда-функция создается и поддерживается независимо в другом репозитории (репозиторий B). Мы не знаем, как лучше всего связать один ресурс AWS (AWS Lambda) с другим ресурсом AWS (AWS Step Functions), когда создание этих двух ресурсов происходит независимо в двух разных местах.
Мы бы не хотели вручную создавать лямбда-функции или пошаговые функции (или и то, и другое) в каждой среде. Это отнимает много времени, подвержено ошибкам, и у нас будет много таких ситуаций.
Наша лучшая мысль на данный момент заключается в том, что мы могли бы может быть заставить приложение A создать пошаговую функцию, но создать и ссылаться на пустую лямбду. Первоначально функция step, конечно, не будет полностью функциональной, но затем, когда мы развернем приложение B, оно сможет искать эту пустую лямбда-функцию и загружать в нее новый код.
И, чтобы у нас не было проблемы, когда развертывание приложения B сначала приводит к неработающему коду. Мы также можем обработать противоположное условие: приложение B может создать лямбда-функцию перед загрузкой в нее кода, если она еще не существует. Затем приложение A может посмотреть, существует ли уже лямбда-функция при создании пошаговой функции, и просто напрямую ссылаться на лямбда-функцию в пошаговой функции.
Проблемы с этим подходом:
Какие есть хорошие варианты для такого рода вещей, потому что я не могу придумать ничего отличного. Моя лучшая идея заключается в том, чтобы вообще не использовать лямбда, а вместо этого пошаговая функция step ставит что-то в очередь в SQS, тогда приложение B может просто читать из этой очереди без проблем. Похоже, что это достаточно распространенный сценарий, хотя должен быть какой-то чистый способ сделать это с помощью лямбда, и я бы не хотел, чтобы мои решения о том, какой тип сервиса я могу использовать в AWS, были загнаны в угол из-за возможности развертывания.
Спасибо
Вы можете легко включить существующую лямбда-функцию в новую пошаговую функцию, созданную 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, позволяющая запускать лямбда-код во время развертывания. Функция триггера должна возвращать ошибку, если она не может найти внешнюю лямбду, что приводит к сбою развертывания приложения А.
@omatase Да, параметры хранилища параметров SSM. Кроме того, я добавил совет о том, как проверять внешние зависимости с помощью Trigger
.
Мне нравится идея использовать хранилище параметров (это и есть SSM, верно?) для записи лямбда-арна. У меня все еще есть проблема, что произойдет, если я попытаюсь создать пошаговую функцию до того, как будет создана лямбда-функция, но я думаю, в этом случае мы могли бы просто пропустить создание пошаговой функции и повторно развернуть приложение после его создания? Это не слишком невыполнимо, у нас все еще есть проблема, когда у нас может быть работающий код в тестировании, а не в рабочей среде, если мы развертываем приложения в другом порядке, что не очень хорошо.