教學課程:搭配 Lambda 叫用動作使用變數 - AWS CodePipeline

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

教學課程:搭配 Lambda 叫用動作使用變數

Lambda 調用動作可以使用來自其他動作的變數作為其輸入的一部分,並連同其輸出傳回新變數。如需 中動作變數的相關資訊 CodePipeline,請參閱 變數參考

重要

作為建立管道的一部分,客戶提供的 S3 成品儲存貯體將由 CodePipeline 用於成品。(這與用於 S3 來源動作的儲存貯體不同。) 如果 S3 成品儲存貯體位於與管道帳戶不同的帳戶中,請確保 S3 成品儲存貯體由 AWS 帳戶 安全且可靠的 擁有。

在本教學結束時,您將擁有:

  • Lambda 叫用的動作:

    • 使用 CodeCommit 來源動作中的CommitId變數

    • 輸出三個新變數:dateTimetestRunIdregion

  • 使用 Lambda 調用動作的新變數以提供測試URL和測試執行 ID 的手動核准動作

  • 以新動作更新的管道

必要條件

開始之前,您必須準備好以下項目:

步驟 1:建立 Lambda 函數

使用下列步驟來建立 Lambda 函數和 Lambda 執行角色。建立 Lambda 函數後,您可以將 Lambda 動作新增至管道。

建立 Lambda 函數和執行角色
  1. 登入 AWS Management Console 並在 開啟 AWS Lambda 主控台https://console.aws.amazon.com/lambda/

  2. 選擇建立函數。將 Author from scratch (從頭開始編寫) 維持在選取狀態。

  3. Function name (函數名稱) 中,輸入您函數的名稱 (例如 myInvokeFunction)。在 Runtime (執行時間) 中,將預設選項維持在選取狀態。

  4. 展開 Choose or create an execution role (選擇或建立執行角色)。選擇 Create a new role with basic Lambda permissions (建立具備基本 Lambda 許可的新角色)

  5. 選擇建立函數

  6. 若要透過另一個動作使用變數,則必須將其傳遞給 Lambda 呼叫動作組態中的 UserParameters。您將在稍後教學中在我們的管道中設定動作,但您將新增程式碼,此程式碼會假設此變數將傳遞。

    const commitId = event["CodePipeline.job"].data.actionConfiguration.configuration.UserParameters;

    若要產生新變數,請將輸入上名為 outputVariables 的屬性設定為 putJobSuccessResult。請注意,您無法產生變數作為 putJobFailureResult 的一部分。

    const successInput = { jobId: jobId, outputVariables: { testRunId: Math.floor(Math.random() * 1000).toString(), dateTime: Date(Date.now()).toString(), region: lambdaRegion } };

    在您的新函數中,將 Edit code inline (編輯程式碼內嵌) 維持在選取狀態,並將以下範例程式碼貼到 index.js 的下方。

    import { CodePipeline } from '@aws-sdk/client-codepipeline'; export const handler = async (event, context) => { const codepipeline = new CodePipeline({}); // Retrieve the Job ID from the Lambda action const jobId = event["CodePipeline.job"].id; // Retrieve UserParameters const params = event["CodePipeline.job"].data.actionConfiguration.configuration.UserParameters; // The region from where the lambda function is being executed const lambdaRegion = process.env.AWS_REGION; // Notify CodePipeline of a successful job const putJobSuccess = async (message) => { const params = { jobId: jobId, outputVariables: { testRunId: Math.floor(Math.random() * 1000).toString(), dateTime: Date(Date.now()).toString(), region: lambdaRegion } }; try { await codepipeline.putJobSuccessResult(params); return message; } catch (err) { throw err; } }; // Notify CodePipeline of a failed job const putJobFailure = async (message) => { const params = { jobId: jobId, failureDetails: { message: JSON.stringify(message), type: 'JobFailed', externalExecutionId: context.invokeid } }; try { await codepipeline.putJobFailureResult(params); throw message; } catch (err) { throw err; } }; try { console.log("Testing commit - " + params); // Your tests here // Succeed the job return await putJobSuccess("Tests passed."); } catch (ex) { // If any of the assertions failed then fail the job return await putJobFailure(ex); } };
  7. 選擇 Save (儲存)。

  8. 複製畫面頂端的 Amazon Resource Name (ARN)。

  9. 最後,在 開啟 AWS Identity and Access Management (IAM) 主控台https://console.aws.amazon.com/iam/。修改 Lambda 執行角色以新增下列政策:AWSCodePipelineCustomActionAccess。如需建立 Lambda 執行角色或修改角色政策的步驟,請參閱 步驟 2:建立 Lambda 函數

步驟 2:將 Lambda 調用動作和手動核准動作新增至您的管道

在此步驟中,您將 Lambda 調用動作新增至管道。您會新增名為 Test (測試) 的動作,做為階段的一部分。動作類型是呼叫動作。您接著會在呼叫動作之後新增手動核准動作。

將 Lambda 動作和手動核准動作新增至管道
  1. 在 開啟 CodePipeline 主控台https://console.aws.amazon.com/codepipeline/

    隨即顯示與 AWS 您的帳戶相關聯的所有管道名稱。選擇您要新增動作的管道。

  2. 將 Lambda 測試動作新增至您的管道。

    1. 若要編輯管道,請選擇 Edit (編輯)。在現有管道中於來源動作之後新增階段。輸入階段的名稱,例如 Test

    2. 在新階段中,選擇新增動作的圖示。在 Action name (動作名稱) 中,輸入呼叫動作的名稱,例如 Test_Commit

    3. 動作提供者 中,選擇 AWS Lambda

    4. Input artifacts (輸入成品) 中,選擇您來源動作輸出成品的名稱,例如 SourceArtifact

    5. 函數名稱 中,選擇您建立的 Lambda 函數名稱。

    6. 使用者參數 中,輸入 CodeCommit 遞交 ID 的變數語法。這會建立輸出變數,解析至每次管道執行時要檢閱和核准的遞交。

      #{SourceVariables.CommitId}
    7. Variable namespace (變數命名空間) 中,新增命名空間名稱,例如 TestVariables

    8. 選擇完成

  3. 將手動核准動作新增到您的管道。

    1. 在您的管道仍處於編輯模式中時,於呼叫動作之後新增階段。輸入階段的名稱,例如 Approval

    2. 在新階段中,選擇新增動作的圖示。在 Action name (動作名稱) 中,輸入核准動作的名稱,例如 Change_Approval

    3. Action provider (動作提供者) 中,選擇 Manual approval (手動核准)

    4. URL 中,URL透過新增region變數的變數語法和CommitId變數來建構 。請確定您使用的是指派給提供輸出變數動作的命名空間。

      在此範例中,URL具有 CodeCommit 動作變數語法的 具有預設命名空間 SourceVariables。Lambda 區域輸出變數具備 TestVariables 命名空間。URL 看起來如下所示。

      https://#{TestVariables.region}.console.aws.amazon.com/codesuite/codecommit/repositories/MyDemoRepo/commit/#{SourceVariables.CommitId}

      Comments (註解) 中,透過新增 testRunId 變數的變數語法來建構核准訊息文字。在此範例中,URL具有 Lambda testRunId輸出變數變數語法的 具有TestVariables命名空間。輸入以下訊息。

      Make sure to review the code before approving this action. Test Run ID: #{TestVariables.testRunId}
  4. 選擇 Done (完成) 來關閉動作的編輯畫面,然後選擇 Done (完成) 來關閉階段的編輯畫面。如要儲存管道,請選擇 Done (完成)。已完成的管道現在包含結構,其中包含來源、測試、核准和部署階段。

    選擇 Release change (發行變更) 來透過管道結構執行最新的變更。

  5. 管道到達手動核准階段時,請選擇 Review (檢閱)。解析的變數會顯示為遞交 ID URL的 。您的核准者可以選擇 URL 來檢視遞交。

  6. 管道成功執行後,您也可以在 action execution history (動作執行歷史記錄) 頁面上檢視變數值。