使用CDK创建依赖于不同项目拥有的其他AWS资源(如Lambda)的阶跃函数



我们在应用程序中使用AWS步进函数。我们使用CDK创建了一个步骤函数,作为从存储库a部署的应用程序a的一部分。该步骤函数需要包含一个lambda函数作为其中一个步骤。我们遇到的问题是,这个lambda函数是在不同的存储库(存储库B)中独立创建和维护的。当这两个资源的创建在两个不同的地方独立发生时,我们不确定连接一个AWS资源(AWS lambda)和另一个AWS资源(AWS Step Functions)的最佳方式。

我们不希望在每个环境中手动创建lambda或阶跃函数(或两者)。这是耗时的,容易出错的,我们将会有很多这样的情况发生。

我们目前最好的想法是我们可以也许让应用程序A创建阶跃函数,但让它创建并引用一个空的lambda。当然,最初阶跃函数不会完全起作用,但是当我们部署应用程序B时,它可以查找空的lambda函数并向其上传新代码。

并且,这样我们就不会有首先部署应用程序B导致代码不工作的问题。我们也可以处理相反的情况:如果lambda函数不存在,应用程序B可以在将代码上传到它之前创建它。然后,应用程序A可以在创建阶跃函数时查看lambda函数是否已经存在,并直接在阶跃函数中引用lambda函数。

关于此方法的注意事项:

  • 这是额外的工作,并为部署增加了很多复杂性,因此更有可能失败
  • 我不确定我可以很容易地查找这样的lambda函数(我猜它必须是通过名称,因为我们不知道什么是ARN,当我们写代码)。但是如果名字也改变了,我们就会有问题,所以也许有一个预定义的ID或其他我们可以用来查找它的东西。
  • 生产环境中代码失败的可能性。如果在部署到QA进行测试时,我们先部署应用程序A,然后再部署应用程序B,那么我们实际上只知道该场景有效。如果,然后,在生产环境中,我们以相反的顺序部署它们,它可能会崩溃。

对于这种事情有什么好的选择吗?因为我想不出什么好的。我最好的想法是根本不使用lambda,而是让step函数step在SQS中排队,然后应用程序B可以从队列中读取,没有问题。感觉这是一个足够常见的场景,但必须有一些干净的方法来使用lambda,我不希望我在AWS中使用哪种服务类型的决定受到部署可行性的阻碍。

感谢

您可以轻松地将现有Lambda函数包含在新的cdk创建的Step function中。使用Function.fromFunctionArn静态方法使用其ARN获取对Lambda的只读引用。CDK使用ARN将必要的lambda:InvokeFunction权限添加到步骤函数的假定角色中。

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 Lambda依赖的存在。触发器是一个新的CDK特性,允许您在部署期间运行Lambda代码。如果无法找到外部Lambda, Trigger Function应该返回一个错误,从而导致应用程序A的部署失败。

最新更新