簡體   English   中英

使用 CDK 創建步驟 Function 並依賴於不同項目擁有的其他 AWS 資源(如 Lambda)

[英]Using CDK to Create a Step Function With Dependencies on Other AWS Resources (Like a Lambda) Owned By Different Projects

我們在我們的應用程序中使用 AWS Step Functions。 我們有一個步驟 function 是我們使用 CDK 創建的,作為從存儲庫 A 部署應用程序 A 的一部分。該步驟 function 需要包括 lambda function 作為步驟之一。 我們遇到的問題是這個 lambda function 是在不同的存儲庫(存儲庫 B)中獨立創建和維護的。 當這兩種資源的創建在兩個不同的地方獨立發生時,我們不確定將一個 AWS 資源 (AWS Lambda) 與另一個 AWS 資源 (AWS Step Functions) 連接起來的最佳方式。

我們不想在每個環境中手動創建 lambda 或步驟 function(或兩者)。 這很耗時,容易出錯,而且我們會遇到很多這樣的情況。

我們目前最好的想法是,我們也許可以讓應用程序 A 創建步驟 function,但讓它創建並引用一個空的 lambda。最初步驟 function 當然不會完全發揮作用,但是當我們部署應用程序 B 時它可以查找空的 lambda function 並向其上傳新代碼。

而且,這樣我們就不會遇到首先部署應用程序 B 導致代碼無法運行的問題。 我們還可以處理相反的情況:應用程序 B 可以在上傳代碼之前創建 lambda function 如果它不存在的話。 然后,應用程序 A 可以在創建步驟 function 時查看 lambda function 是否已經存在,並直接在步驟 function 中引用 lambda function。

對這種方法的擔憂:

  • 這是額外的工作,給部署增加了很多復雜性,因此失敗的可能性更大
  • 我不確定我是否可以像這樣輕松地查找 lambda function(我猜它必須是名稱,因為我們在編寫代碼時不知道 ARN 是什么)。 但是如果名稱也發生變化,我們就會遇到問題,所以也許有一個預定義的 ID 或者我們可以用來查找它的東西。
  • 代碼在生產中失敗的可能性。 如果在部署到 QA 進行測試時,我們先部署應用程序 A,然后再部署應用程序 B,我們實際上只知道該場景有效。 那么,如果在投入生產時我們以相反的順序部署它們,它可能會崩潰。

對於這種事情有什么好的選擇,因為我想不出有什么好的。 我最好的想法是根本不使用 lambda,而是讓步驟 function 在 SQS 中排隊,然后應用程序 B 就可以從該隊列讀取沒有問題。 感覺這是一個足夠常見的場景,盡管必須有一些干凈的方法來使用 lambda 並且我不希望我對我可以在 AWS 中使用哪種服務類型的決定受到部署可行性的阻礙。

謝謝

您可以輕松地將現有的 Lambda function 包含在新的 CDK 創建的步驟 Function 中。使用Function.fromFunctionArn static 方法通過其 ARN 獲取對 88356004523.688 的只讀引用 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',
});

如果您不想在 CDK 堆棧中硬編碼 Lambda ARN,請將 ARN 保存到SSM Parameter Store Parameter 然后按名稱將其導入堆棧並將其傳遞給fromFunctionArn

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

編輯:可選擇將觸發器構造添加到您的 CDK 應用程序 A,以在部署之前確認應用程序 B Lambda 依賴項的存在。 觸發器是 CDK 的一項新功能,可讓您在部署期間運行 Lambda 代碼。 如果觸發器 Function 找不到外部 Lambda,則應返回錯誤,從而導致應用程序 A 的部署失敗。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM