View a markdown version of this page

部署和更新 Lambda 受管執行個體函數 - AWS Lambda

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

部署和更新 Lambda 受管執行個體函數

當您更新 Lambda 受管執行個體函數時,Lambda 會在將流量轉移到受管執行個體之前,為新函數版本佈建執行環境。您可以透過選取部署策略來控制部署速度和安全性。本主題說明 Lambda 受管執行個體函數可用的部署策略,以及如何以基礎設施即程式碼 (IaC) 定義它們。

注意

部署函數之前,您必須有容量提供者。如需詳細資訊,請參閱 Lambda 受管執行個體的容量提供者。

部署策略

Lambda 受管執行個體支援下列發行新函數版本的策略。選擇符合您想要在推展期間保留多少控制項的策略。滾動更新是最簡單的選項。藍/綠和金絲雀部署可讓您進一步控制流量如何移至新版本。

滾動更新

若要執行滾動更新,請將變更發佈至函數的$LATEST.PUBLISHED版本。 $LATEST.PUBLISHED 是 Lambda 受管執行個體特有的版本類型,您可以使用新程式碼或組態重新發佈,而不是維護編號版本。當您使用不合格的 Amazon Resource Name (ARN) 叫用 Lambda 受管執行個體函數時,Lambda 會叫用 $LATEST.PUBLISHED版本。如需詳細資訊,請參閱Lambda 受管執行個體中的 $LATEST.PUBLISHED 版本。

每次重新發佈 時$LATEST.PUBLISHED,Lambda 都會逐漸將受管執行個體上的執行環境取代為新版本,而不需要您直接管理透過函數別名轉移的流量。這是最簡單的策略。

當您想要將流量從舊版本自動逐步轉移到新版本時,請使用滾動更新,而且您不需要直接控制傳送至每個版本的流量百分比來管理部署或回復。

具有加權別名的藍/綠部署

在藍/綠部署中,您將新版本與目前版本一起發佈,並使用具有路由組態的別名,將一定百分比的流量傳送至新版本。您可以透過別名限定 ARN 叫用 函數。若要轉返部署,您可以增加新版本的權重;若要轉返部署,請將權重移回先前的版本。

下列範例使用 AWS CLI 將 10% 的流量傳送至版本,2而版本1繼續提供剩餘的 90%。

aws lambda update-alias \ --function-name my-managed-instance-function \ --name production \ --function-version 1 \ --routing-config AdditionalVersionWeights={"2"=0.1}

在此命令中:

  • my-managed-instance-function 是函數的名稱。

  • production 是您叫用之別名的名稱。

  • --function-version 1 是繼續接收剩餘流量的版本。

  • AdditionalVersionWeights={"2"=0.1} 會將 10% 的流量傳送至版本 2。

若要轉返,請清除路由組態,讓所有流量回到穩定的版本。

aws lambda update-alias \ --function-name my-managed-instance-function \ --name production \ --function-version 1 \ --routing-config '{}'

在此命令中, 會--routing-config '{}'清除路由組態,讓所有流量回到 版本 中的 --function-version版本1。

使用 AWS CodeDeploy 進行 Canary 部署

若要自動化藍/綠流量轉移,請使用 AWS CodeDeploy。CodeDeploy 會根據部署組態,將流量從目前版本轉移到新版本,例如,將 10% 的流量傳送到新版本,等待五分鐘,然後轉移其餘的流量。如果與部署相關聯的 CloudWatch 警示在輪班期間進入警示狀態,CodeDeploy 會自動轉返部署。

如需適用於 Lambda 的 CodeDeploy 部署組態的詳細資訊,請參閱 AWS CodeDeploy 使用者指南中的 Lambda 運算平台上的部署組態。

選擇 $LATEST.PUBLISHED 和具有別名的數值版本

這兩種部署模型都會逐步推出變更。無論您是使用加權別名更新$LATEST.PUBLISHED或轉移流量,Lambda 受管執行個體都會以步驟中的新版本取代舊版本的執行環境,而不是一次全部。此方法可在推出期間維持執行個體使用率的效率。Lambda 不會預先佈建完整的第二組執行環境,而是以增量方式取代它們:在每個步驟中,它會從舊版本回收容量,然後再推出新版本的下一批次,因此推展會避免達到基準容量的兩倍。

$LATEST.PUBLISHED 推出進度

當您發佈更新至 時$LATEST.PUBLISHED,Lambda 會開始逐步推出新版本。在每個步驟中,Lambda 會建立新的執行環境,最高可達舊版本總數的 20%,並逐漸取代舊版本的執行環境。

兩個因素決定推展需要多長時間:

  • 初始化時間 - 每個步驟會等待新的執行環境初始化,然後再繼續。如果初始化需要 10 分鐘,每個步驟會等待至少 10 分鐘。

  • 調用持續時間 - 在 Lambda 可以移除舊的執行環境之前,其進行中的調用必須完成 (排空)。如果您的平均調用持續時間為 5 分鐘,則每個步驟平均耗盡大約需要 5 分鐘。

由於 Lambda 受管執行個體保持較高的執行個體使用率,因此初始化和耗盡都會導致總部署時間。具有長時間初始化或長時間執行調用的函數需要更長的時間才能完全推出。

具有別名的數值版本如何進行

加權別名更新以相同方式逐步更新。當您將別名上的路由權重從 90% 第 1 版和 10% 第 2 版變更為 100% 第 2 版時,Lambda 受管執行個體會將第 1 版執行環境緩慢取代為第 2 版,而不會佈建過多的執行個體容量。

當您想要更緊密地控制逐步推展和版本特定的可觀測性時,請使用具有別名的數值版本。由於每個版本都是不同的限定詞,因此您可以在提升變更之前,先比較 Canary 的每個版本指標和穩定的版本。如需詳細資訊,請參閱檢視 Lambda 函數的指標。

在部署之後設定擴展

您部署的每個函數版本都有自己的擴展組態,可控制 Lambda 為該版本維護的執行環境數量下限和上限。在發佈版本後設定擴展組態,讓新版本能夠以您預期的容量提供流量。

下列範例會設定特定版本的擴展組態。2 將 取代為您的版本編號或 取代為 $LATEST.PUBLISHED。

aws lambda put-function-scaling-config \ --function-name my-managed-instance-function \ --qualifier 2 \ --function-scaling-config MinExecutionEnvironments=3,MaxExecutionEnvironments=20

使用基礎設施做為程式碼管理部署

您可以使用基礎設施做為程式碼來定義和部署 Lambda 受管執行個體函數及其容量提供者,包括 AWS CloudFormation、 AWS 雲端開發套件 (AWS CDK) 和第三方工具,例如 HashiCorp Terraform。將您的容量提供者、函數、版本和別名建模為資源,以便您的部署策略可重現且可檢閱。

當您使用 IaC 管理 Lambda 受管執行個體部署時,請謹記下列考量:

  • 發佈版本以啟用變更。只有在容量提供者的執行個體發佈之後,新的函數版本才會在執行個體上變成作用中。將您想要保持服務的每個版本建模,例如,藍/綠輪班的兩側,做為自己的資源。

  • 擴展組態是每個版本。將最小和最大執行環境設定套用至每個版本或 $LATEST.PUBLISHED。如果您的 IaC 工具未直接建立擴展組態的模型,請在部署後使用 put-function-scaling-config AWS CLI 命令進行設定。

  • 當您使用 AWS Cloud Control API 時,部署套件必須來自 Amazon S3。Cloud AWS Control API 僅接受函數的程式碼做為 Amazon S3 位置或容器映像 URI,而非本機上傳的 .zip 檔案。如果您的 IaC 工具使用此 API,請先將部署套件上傳至 S3 儲存貯體,並依儲存貯體和金鑰加以參考。使用版本控制的儲存貯體,以偵測物件的更新。

範例:CloudFormation 範本

下列 CloudFormation 範本顯示藍/綠部署。它建立容量提供者、Lambda 受管執行個體函數、兩個已發佈版本 (每個版本都有自己的函數擴展組態),以及名為 的別名production,可將 90% 的流量路由至穩定版本,10% 路由至 Canary 版本。若要提升 Canary,請將別名設定為 FunctionVersion Canary 版本,並移除 RoutingConfig。若要復原,請移除 ,RoutingConfig讓所有流量回到穩定的版本。將子網路、安全群組、角色和 Amazon S3 值取代為您自己的值。

AWSTemplateFormatVersion: '2010-09-09' Description: Lambda Managed Instances blue/green deployment with a weighted alias Resources: MyCapacityProvider: Type: AWS::Lambda::CapacityProvider Properties: CapacityProviderName: my-capacity-provider VpcConfig: SubnetIds: - subnet-0123456789abcdef0 SecurityGroupIds: - sg-0123456789abcdef0 PermissionsConfig: CapacityProviderOperatorRoleArn: arn:aws:iam::111122223333:role/my-capacity-provider-operator-role InstanceRequirements: Architectures: - arm64 MyFunction: Type: AWS::Lambda::Function Properties: FunctionName: my-managed-instance-function Role: arn:aws:iam::111122223333:role/my-function-execution-role Runtime: python3.13 Handler: index.lambda_handler Architectures: - arm64 Code: S3Bucket: my-deployment-bucket S3Key: function.zip CapacityProviderConfig: LambdaManagedInstancesCapacityProviderConfig: CapacityProviderArn: !GetAtt MyCapacityProvider.Arn # Stable version - receives the majority of traffic StableVersion: Type: AWS::Lambda::Version Properties: FunctionName: !Ref MyFunction FunctionScalingConfig: MinExecutionEnvironments: 10 MaxExecutionEnvironments: 50 # Canary version - receives a small percentage of traffic CanaryVersion: Type: AWS::Lambda::Version Properties: FunctionName: !Ref MyFunction FunctionScalingConfig: MinExecutionEnvironments: 3 MaxExecutionEnvironments: 20 ProductionAlias: Type: AWS::Lambda::Alias Properties: FunctionName: !Ref MyFunction Name: production FunctionVersion: !GetAtt StableVersion.Version RoutingConfig: AdditionalVersionWeights: - FunctionVersion: !GetAtt CanaryVersion.Version FunctionWeight: 0.1

範例:CDK

下列 CDK 範例 (TypeScript) 使用aws-cdk-lib/aws-lambda模組中的層級 1 (L1) 建構來定義相同的容量提供者和函數。 operatorRole和 executionRole是堆疊中其他位置定義的 IAM 角色。

import * as cdk from 'aws-cdk-lib'; import * as lambda from 'aws-cdk-lib/aws-lambda'; const capacityProvider = new lambda.CfnCapacityProvider(this, 'MyCapacityProvider', { capacityProviderName: 'my-capacity-provider', vpcConfig: { subnetIds: ['subnet-0123456789abcdef0'], securityGroupIds: ['sg-0123456789abcdef0'], }, permissionsConfig: { capacityProviderOperatorRoleArn: operatorRole.roleArn, }, instanceRequirements: { architectures: ['arm64'], }, }); const fn = new lambda.CfnFunction(this, 'MyFunction', { functionName: 'my-managed-instance-function', role: executionRole.roleArn, runtime: 'python3.13', handler: 'index.lambda_handler', architectures: ['arm64'], code: { s3Bucket: 'my-deployment-bucket', s3Key: 'function.zip' }, capacityProviderConfig: { lambdaManagedInstancesCapacityProviderConfig: { capacityProviderArn: capacityProvider.attrArn, }, }, functionScalingConfig: { minExecutionEnvironments: 3, maxExecutionEnvironments: 20, }, publishToLatestPublished: true, }); fn.addDependency(capacityProvider);

範例:使用 AWS CodeDeploy 進行 Canary 部署

下列 CDK 範例 (TypeScript) 使用 AWS CodeDeploy 自動將流量轉移到新的函數版本。會將 10% 的流量LambdaDeploymentGroup傳送至新版本 5 分鐘,然後轉移其餘的流量。如果 CloudWatch 警示在部署期間進入警示狀態,CodeDeploy 會轉返至先前的版本。

fn 是上一個範例中CfnFunction的 L1。由於 CodeDeploy LambdaDeploymentGroup可與層級 2 (L2) 別名和函數建構搭配使用,因此請透過 ARN 匯入 L1 函數,並從中建置版本和別名。

import * as cdk from 'aws-cdk-lib'; import * as lambda from 'aws-cdk-lib/aws-lambda'; import * as codedeploy from 'aws-cdk-lib/aws-codedeploy'; import * as cloudwatch from 'aws-cdk-lib/aws-cloudwatch'; // Import the L1 function so that L2 constructs can reference it. const importedFn = lambda.Function.fromFunctionArn(this, 'ImportedFunction', fn.attrArn); // Publish the version that CodeDeploy shifts traffic to. const canaryVersion = new lambda.CfnVersion(this, 'CanaryVersion', { functionName: fn.ref, }); // Create the alias that CodeDeploy shifts traffic on. const alias = new lambda.Alias(this, 'ProductionAlias', { aliasName: 'production', version: lambda.Version.fromVersionAttributes(this, 'CanaryVersionRef', { lambda: importedFn, version: canaryVersion.attrVersion, }), }); // Roll back automatically if this alarm fires during the deployment. const errorAlarm = new cloudwatch.Alarm(this, 'ErrorAlarm', { metric: importedFn.metricErrors({ period: cdk.Duration.minutes(1) }), threshold: 5, evaluationPeriods: 1, comparisonOperator: cloudwatch.ComparisonOperator.GREATER_THAN_OR_EQUAL_TO_THRESHOLD, }); new codedeploy.LambdaDeploymentGroup(this, 'CanaryDeployment', { alias, deploymentConfig: codedeploy.LambdaDeploymentConfig.CANARY_10PERCENT_5MINUTES, alarms: [errorAlarm], autoRollback: { failedDeployment: true, deploymentInAlarm: true, }, });

後續步驟