本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
建立您的 AWS SAM 範本
建立指定基礎結構中元件的 AWS SAM 範本檔案。
若要建立您的 AWS SAM 範本
-
建立名為
SAM-Tutorial
的目錄。 -
在
SAM-Tutorial
目錄中,建立名為template.yml
的檔案。 -
將下列 YAML 程式碼複製到
template.yml
中。這是您的 AWS SAM 範本。AWSTemplateFormatVersion : '2010-09-09' Transform: AWS::Serverless-2016-10-31 Description: A sample SAM template for deploying Lambda functions. Resources: # Details about the myDateTimeFunction Lambda function myDateTimeFunction: Type: AWS::Serverless::Function Properties: Handler: myDateTimeFunction.handler Runtime: nodejs18.x # Instructs your myDateTimeFunction is published to an alias named "live". AutoPublishAlias: live # Grants this function permission to call lambda:InvokeFunction Policies: - Version: "2012-10-17" Statement: - Effect: "Allow" Action: - "lambda:InvokeFunction" Resource: '*' DeploymentPreference: # Specifies the deployment configuration Type: Linear10PercentEvery1Minute # Specifies Lambda functions for deployment lifecycle hooks Hooks: PreTraffic: !Ref beforeAllowTraffic PostTraffic: !Ref afterAllowTraffic # Specifies the BeforeAllowTraffic lifecycle hook Lambda function beforeAllowTraffic: Type: AWS::Serverless::Function Properties: Handler: beforeAllowTraffic.handler Policies: - Version: "2012-10-17" # Grants this function permission to call codedeploy:PutLifecycleEventHookExecutionStatus Statement: - Effect: "Allow" Action: - "codedeploy:PutLifecycleEventHookExecutionStatus" Resource: !Sub 'arn:aws:codedeploy:${AWS::Region}:${AWS::AccountId}:deploymentgroup:${ServerlessDeploymentApplication}/*' - Version: "2012-10-17" # Grants this function permission to call lambda:InvokeFunction Statement: - Effect: "Allow" Action: - "lambda:InvokeFunction" Resource: !Ref myDateTimeFunction.Version Runtime: nodejs18.x # Specifies the name of the Lambda hook function FunctionName: 'CodeDeployHook_beforeAllowTraffic' DeploymentPreference: Enabled: false Timeout: 5 Environment: Variables: NewVersion: !Ref myDateTimeFunction.Version # Specifies the AfterAllowTraffic lifecycle hook Lambda function afterAllowTraffic: Type: AWS::Serverless::Function Properties: Handler: afterAllowTraffic.handler Policies: - Version: "2012-10-17" Statement: # Grants this function permission to call codedeploy:PutLifecycleEventHookExecutionStatus - Effect: "Allow" Action: - "codedeploy:PutLifecycleEventHookExecutionStatus" Resource: !Sub 'arn:aws:codedeploy:${AWS::Region}:${AWS::AccountId}:deploymentgroup:${ServerlessDeploymentApplication}/*' - Version: "2012-10-17" Statement: # Grants this function permission to call lambda:InvokeFunction - Effect: "Allow" Action: - "lambda:InvokeFunction" Resource: !Ref myDateTimeFunction.Version Runtime: nodejs18.x # Specifies the name of the Lambda hook function FunctionName: 'CodeDeployHook_afterAllowTraffic' DeploymentPreference: Enabled: false Timeout: 5 Environment: Variables: NewVersion: !Ref myDateTimeFunction.Version
此範本指定下列項目。如需詳細資訊,請參閱AWS SAM 範本概念。
- 一個名為 Lambda 函數
myDateTimeFunction
-
發佈此 Lambda 函數時,範本中的
AutoPublishAlias
行會將其連結至名為的別名live
。在本教學課程稍後,此函數的更新會透 AWS CodeDeploy 過逐步將生產流量從原始版本轉移到更新版本來觸發部署。 - 兩個 Lambda 部署驗證功能
-
下列 Lambda 函數會在 CodeDeploy 生命週期掛接期間執行。函數中的程式碼會驗證已更新的
myDateTimeFunction
是否部署完成。驗證測試的結果會傳遞給 CodeDeploy 使用其PutLifecycleEventHookExecutionStatus
API 方法。如果驗證測試失敗,部署會失敗並轉返。-
CodeDeployHook_beforeAllowTraffic
會在BeforeAllowTraffic
勾點期間執行。 -
CodeDeployHook_afterAllowTraffic
會在AfterAllowTraffic
勾點期間執行。
兩個函數的名稱以
CodeDeployHook_
開頭。此CodeDeployRoleForLambda
角色只允許在名稱以此前置詞開頭的 Lambda 函數中呼叫 Lambdainvoke
方法。如需詳細資訊,請參閱 CodeDeploy API 參考PutLifecycleEventHookExecutionStatus中的AppSpec AWS Lambda 部署的「掛鉤」部分和。 -
- 自動偵測更新的 Lambda 函數
-
AutoPublishAlias
一詞告知框架偵測myDateTimeFunction
函數何時變更,然後使用live
別名部署此函數。 - 部署組態
-
部署組態會決定 CodeDeploy應用程式將流量從原始版本的 Lambda 函數轉移到新版本的速率。此範本指定預先定義的部署組態
Linear10PercentEvery1Minute
。注意
您無法在 AWS SAM 範本中指定自訂部署組態。如需詳細資訊,請參閱 Create a Deployment Configuration。
- 部署生命週期勾點函數
-
Hooks
區段指定在生命週期事件勾點期間執行的函數。PreTraffic
指定在BeforeAllowTraffic
勾點期間執行的函數。PostTraffic
指定在AfterAllowTraffic
勾點期間執行的函數。 - 讓 Lambda 叫用另一個 Lambda 函數的許可
-
指定的
lambda:InvokeFunction
權限會授與 S AWS AM 應用程式所使用的角色叫用 Lambda 函數的權限。當CodeDeployHook_beforeAllowTraffic
和CodeDeployHook_afterAllowTraffic
函數在驗證測試期間叫用部署的 Lambda 函數時,這是必需的。