使用同步sam sync到簡介 AWS 雲端 - AWS Serverless Application Model

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

使用同步sam sync到簡介 AWS 雲端

指 AWS Serverless Application Model 令行介面 (AWS SAMCLI) sam sync 指令提供可快速將本機應用程式變更同步至的選項 AWS 雲端。sam sync在開發應用程式時使用以下目的:

  1. 自動偵測並將本機變更同步至 AWS 雲端.

  2. 自訂要將哪些本機變更同步至 AWS 雲端.

  3. 在雲端準備您的應用程式以進行測試和驗證。

您可以使用sam sync建立快速開發工作流程,縮短將本機變更同步至雲端以進行測試和驗證所需的時間。

注意

建議在開發環境中使用此sam sync命令。對於生產環境,我們建議使用sam deploy或設定持續整合與傳遞 (CI/CD) 管線。如需進一步了解,請參閱部署您的應用程式和資源 AWS SAM

sam sync命令是的一部分 AWS SAM Accelerate。 AWS SAM Accelerate提供的工具可用來加速在中開發和測試無伺服器應用程式的體驗。 AWS 雲端

自動偵測並將本機變更同步至 AWS 雲端

sam sync使用--watch選項運行以開始將應用程序同步到 AWS 雲端. 這會執行以下操作:

  1. 建置您的應用程式 — 此程序類似於使用sam build指令。

  2. 部署您的應用程式 — AWS SAMCLI 將您的應用程式部署到 AWS CloudFormation 使用預設設定。會使用下列預設值:

    1. AWS 在您的.aws使用者資料夾中找到認證和一般組態設定。

    2. 應用程式samconfig.toml檔案中的應用程式部署設定。

    如果找不到預設值, AWS SAMCLI會通知您並結束同步處理程序。

  3. 注意本地變化 — AWS SAMCLI 仍在運行並監視應用程序的本地更改。這是該--watch選項提供的內容。

    依預設,此選項可能會開啟。如需預設值,請參閱應用程式的samconfig.toml檔案。以下是範例 檔案:

    ... [default.sync] [default.sync.parameters] watch = true ...
  4. 本機變更同步至 AWS 雲端 — 當您進行本機變更時,會 AWS 雲端 透過最快速的方法 AWS SAMCLI偵測這些變更並同步至。視變更類型而定,可能會發生下列情況:

    1. 如果您更新的資源支援 AWS 服務 API,則 AWS SAMCLI會使用它來部署您的變更。這會導致快速同步以更新中的資源 AWS 雲端。

    2. 如果您更新的資源不支援 AWS 服務 API,則 AWS SAMCLI會執行 AWS CloudFormation 部署。這會更新您在中的整個應用程式 AWS 雲端。雖然沒有那麼快,但它確實可以防止您手動初始化部署。

由於該sam sync命令會自動更新中的應用程式 AWS 雲端,因此建議僅用於開發環境。當您執行時sam sync,系統會要求您確認:

**The sync command should only be used against a development stack**.

Confirm that you are synchronizing a development stack.

Enter Y to proceed with the command, or enter N to cancel:
 [Y/n]: ENTER

自訂要將哪些本機變更同步至 AWS 雲端

提供自訂要同步到的本機變更的選項 AWS 雲端。這可以加快在雲中查看本地更改以進行測試和驗證所需的時間。

例如,提供僅同步程式碼變更的--code選項,例如 AWS Lambda 函數程式碼。在開發過程中,如果您專注於 Lambda 程式碼,這樣可以快速將您的變更導入雲端以進行測試和驗證。以下是範例:

$ sam sync --code --watch

若只要同步特定 Lambda 函數或層的程式碼變更,請使用--resource-id選項。以下是範例:

$ sam sync --code --resource-id HelloWorldFunction --resource-id HelloWorldLayer

在雲端準備您的應用程式以進行測試和驗證

sam sync令會自動尋找可用於在中更新應用程式的最快方法。 AWS 雲端這可以加快您的開發和雲端測試工作流程。透過使用 AWS 服務 API,您可以快速開發、同步處理和測試支援的資源。如需實際操作範例,請參閱單元 6-完整 AWS SAM 研討會中的 AWS SAM 加速

sam 同步指令的選項

以下是您可以用來修改sam sync指令的一些主要選項。如需所有選項的清單,請參閱sam sync

執行一次性 AWS CloudFormation 部署

使用--no-watch此選項可關閉自動同步。以下是範例:

$ sam sync --no-watch

AWS SAMCLI將執行一次性 AWS CloudFormation 部署。此sam deploy指令會將sam build和指令執行的動作群組在一起。

略過初始 AWS CloudFormation 部署

您可以自訂每次執行時sam sync是否需要 AWS CloudFormation 部署。

  • 提供--no-skip-deploy-sync以在每次執行時sam sync都需要 AWS CloudFormation 部署。這可確保您的本機基礎結構同步到 AWS CloudFormation,防止漂移。使用此選項確實會為您的開發和測試工作流程增加額外的時間。

  • 提供--skip-deploy-sync以使 AWS CloudFormation 部署可選。 AWS SAMCLI會將您的本機 AWS SAM 範本與已部署的 AWS CloudFormation 範本進行比較,如果未偵測到變更,則會略過初始 AWS CloudFormation 部署。將本機變更同步至時,略過 AWS CloudFormation 部署可以節省時間 AWS 雲端。

    如果未偵測到任何變更,仍 AWS SAMCLI會在下列情況下執行 AWS CloudFormation 部署:

    • 如果自上次 AWS CloudFormation 部署以來已有 7 天或更長時間。

    • 如果偵測到大量 Lambda 函數程式碼變更,讓 AWS CloudFormation 部署成為更新應用程式的最快速方法。

以下是範例:

$ sam sync --skip-deploy-sync

從嵌套堆棧同步資源

從巢狀堆疊同步資源的步驟
  1. 使用提供根堆疊--stack-name

  2. 使用下列格式識別巢狀堆疊中的資源:nestedStackId/resourceId

  3. 使用提供嵌套堆棧中的資源--resource-id

    以下是範例:

    $ sam sync --code --stack-name sam-app --resource-id myNestedStack/HelloWorldFunction

如需建立巢狀應用程式的詳細資訊,請參閱使用嵌套應用程序重複使用代碼和資源 AWS SAM

指定要更新的特定 AWS CloudFormation 堆疊

若要指定要更新的特定 AWS CloudFormation 堆疊,請提供選--stack-name項。以下是範例:

$ sam sync --stack-name dev-sam-app

通過在源文件夾中構建項目來加快構建時間

對於支持的運行時和構建方法,您可以使用該--build-in-source選項直接在源文件夾中構建項目。默認情況下, AWS SAM CLI構建在臨時目錄中,其中涉及複製源代碼和項目文件。使用--build-in-source,直接在源文件夾中 AWS SAM CLI構建,通過消除將文件複製到臨時目錄的需要來加快構建過程。

如需支援的執行階段和建置方法的清單,請參閱 --build-in-source

指定不會啟動同步的檔案和資料夾

使用此選--watch-exclude項可指定任何在更新時不會啟動同步的檔案或資料夾。如需有關此選項的詳細資訊,請參閱 --watch-exclude

以下是排除與我們HelloWorldFunction函數關聯的package-lock.json文件的示例:

$ sam sync --watch --watch-exclude HelloWorldFunction=package-lock.json

執行此命令時, AWS SAM CLI將啟動同步處理程序。這包含下列項目:

  • 執行sam build以建置您的函數,並準備應用程式以進行部署。

  • 執行sam deploy以部署您的應用程式。

  • 注意應用程式的變更。

當我們修改package-lock.json文件時, AWS SAM CLI不會啟動同步。當另一個檔案更新時, AWS SAM CLI將啟動同步,其中將包含package-lock.json檔案。

以下是指定子堆疊的 Lambda 函數的範例:

$ sam sync --watch --watch-exclude ChildStackA/MyFunction=database.sqlite3

故障診斷

若要疑難排解 AWS SAMCLI,請參閱AWS SAMCLI疑難排

範例

使用山姆同步來更新你好世界應用程序

在這個例子中,我們通過初始化示例 Hello World 應用程序開始。若要進一步瞭解此應用程式,請參閱教學課程:部署 Hello World 應用程式

執行會sam sync開始建置和部署程序。

$ sam sync The SAM CLI will use the AWS Lambda, Amazon API Gateway, and AWS StepFunctions APIs to upload your code without performing a CloudFormation deployment. This will cause drift in your CloudFormation stack. **The sync command should only be used against a development stack**. Confirm that you are synchronizing a development stack. Enter Y to proceed with the command, or enter N to cancel: [Y/n]: Queued infra sync. Waiting for in progress code syncs to complete... Starting infra sync. Manifest file is changed (new hash: 3298f13049d19cffaa37ca931dd4d421) or dependency folder (.aws-sam/deps/0663e6fe-a888-4efb-b908-e2344261e9c7) is missing for (HelloWorldFunction), downloading dependencies and copying/building source Building codeuri: /Users/.../Demo/sync/sam-app/hello_world runtime: python3.9 metadata: {} architecture: x86_64 functions: HelloWorldFunction Running PythonPipBuilder:CleanUp Running PythonPipBuilder:ResolveDependencies Running PythonPipBuilder:CopySource Build Succeeded Successfully packaged artifacts and wrote output template to file /var/folders/45/5ct135bx3fn2551_ptl5g6_80000gr/T/tmpx_5t4u3f. Execute the following command to deploy the packaged template sam deploy --template-file /var/folders/45/5ct135bx3fn2551_ptl5g6_80000gr/T/tmpx_5t4u3f --stack-name <YOUR STACK NAME> Deploying with following values =============================== Stack name : sam-app Region : us-west-2 Disable rollback : False Deployment s3 bucket : aws-sam-cli-managed-default-samclisourcebucket-1a4x26zbcdkqr Capabilities : ["CAPABILITY_NAMED_IAM", "CAPABILITY_AUTO_EXPAND"] Parameter overrides : {} Signing Profiles : null Initiating deployment ===================== 2023-03-17 11:17:19 - Waiting for stack create/update to complete CloudFormation events from stack operations (refresh every 0.5 seconds) --------------------------------------------------------------------------------------------------------------------------------------------- ResourceStatus ResourceType LogicalResourceId ResourceStatusReason --------------------------------------------------------------------------------------------------------------------------------------------- CREATE_IN_PROGRESS AWS::CloudFormation::Stack sam-app Transformation succeeded CREATE_IN_PROGRESS AWS::CloudFormation::Stack AwsSamAutoDependencyLayerNestedSt - ack CREATE_IN_PROGRESS AWS::IAM::Role HelloWorldFunctionRole - CREATE_IN_PROGRESS AWS::IAM::Role HelloWorldFunctionRole Resource creation Initiated CREATE_IN_PROGRESS AWS::CloudFormation::Stack AwsSamAutoDependencyLayerNestedSt Resource creation Initiated ack CREATE_COMPLETE AWS::IAM::Role HelloWorldFunctionRole - CREATE_COMPLETE AWS::CloudFormation::Stack AwsSamAutoDependencyLayerNestedSt - ack CREATE_IN_PROGRESS AWS::Lambda::Function HelloWorldFunction - CREATE_IN_PROGRESS AWS::Lambda::Function HelloWorldFunction Resource creation Initiated CREATE_COMPLETE AWS::Lambda::Function HelloWorldFunction - CREATE_IN_PROGRESS AWS::ApiGateway::RestApi ServerlessRestApi - CREATE_IN_PROGRESS AWS::ApiGateway::RestApi ServerlessRestApi Resource creation Initiated CREATE_COMPLETE AWS::ApiGateway::RestApi ServerlessRestApi - CREATE_IN_PROGRESS AWS::ApiGateway::Deployment ServerlessRestApiDeployment47fc2d - 5f9d CREATE_IN_PROGRESS AWS::Lambda::Permission HelloWorldFunctionHelloWorldPermi - ssionProd CREATE_IN_PROGRESS AWS::Lambda::Permission HelloWorldFunctionHelloWorldPermi Resource creation Initiated ssionProd CREATE_IN_PROGRESS AWS::ApiGateway::Deployment ServerlessRestApiDeployment47fc2d Resource creation Initiated 5f9d CREATE_COMPLETE AWS::ApiGateway::Deployment ServerlessRestApiDeployment47fc2d - 5f9d CREATE_IN_PROGRESS AWS::ApiGateway::Stage ServerlessRestApiProdStage - CREATE_IN_PROGRESS AWS::ApiGateway::Stage ServerlessRestApiProdStage Resource creation Initiated CREATE_COMPLETE AWS::ApiGateway::Stage ServerlessRestApiProdStage - CREATE_COMPLETE AWS::Lambda::Permission HelloWorldFunctionHelloWorldPermi - ssionProd CREATE_COMPLETE AWS::CloudFormation::Stack sam-app - --------------------------------------------------------------------------------------------------------------------------------------------- CloudFormation outputs from deployed stack ---------------------------------------------------------------------------------------------------------------------------------------------- Outputs ---------------------------------------------------------------------------------------------------------------------------------------------- Key HelloWorldFunctionIamRole Description Implicit IAM Role created for Hello World function Value arn:aws:iam::012345678910:role/sam-app-HelloWorldFunctionRole-BUFVMO2PJIYF Key HelloWorldApi Description API Gateway endpoint URL for Prod stage for Hello World function Value https://pcrx5gdaof.execute-api.us-west-2.amazonaws.com/Prod/hello/ Key HelloWorldFunction Description Hello World Lambda Function ARN Value arn:aws:lambda:us-west-2:012345678910:function:sam-app-HelloWorldFunction-2PlN6TPTQoco ---------------------------------------------------------------------------------------------------------------------------------------------- Stack creation succeeded. Sync infra completed. Infra sync completed. CodeTrigger not created as CodeUri or DefinitionUri is missing for ServerlessRestApi.

部署完成後,我們會修改程HelloWorldFunction式碼。會 AWS SAMCLI偵測到此變更,並將我們的應用程式同步到 AWS 雲端. 由於 AWS Lambda 支援 AWS 服務 API,因此會執行快速同步。

Syncing Lambda Function HelloWorldFunction...
Manifest is not changed for (HelloWorldFunction), running incremental build
Building codeuri: /Users/.../Demo/sync/sam-app/hello_world runtime: python3.9 metadata: {} architecture: x86_64 functions: HelloWorldFunction
Running PythonPipBuilder:CopySource
Finished syncing Lambda Function HelloWorldFunction.

接下來,我們在應用程序的 AWS SAM 模板中修改我們的 API 端點。我們變更/hello/helloworld

AWSTemplateFormatVersion: '2010-09-09' Transform: AWS::Serverless-2016-10-31 ... Resources: HelloWorldFunction: ... Properties: ... Events: HelloWorld: Type: Api Properties: Path: /helloworld Method: get

由於 Amazon API Gateway 資源不支援 AWS 服務 API,因此會 AWS SAMCLI自動執行 AWS CloudFormation 部署。下面是一個示例輸出:

Queued infra sync. Waiting for in progress code syncs to complete... Starting infra sync. Manifest is not changed for (HelloWorldFunction), running incremental build Building codeuri: /Users/.../Demo/sync/sam-app/hello_world runtime: python3.9 metadata: {} architecture: x86_64 functions: HelloWorldFunction Running PythonPipBuilder:CopySource Build Succeeded Successfully packaged artifacts and wrote output template to file /var/folders/45/5ct135bx3fn2551_ptl5g6_80000gr/T/tmpuabo0jb9. Execute the following command to deploy the packaged template sam deploy --template-file /var/folders/45/5ct135bx3fn2551_ptl5g6_80000gr/T/tmpuabo0jb9 --stack-name <YOUR STACK NAME> Deploying with following values =============================== Stack name : sam-app Region : us-west-2 Disable rollback : False Deployment s3 bucket : aws-sam-cli-managed-default-samclisourcebucket-1a4x26zbcdkqr Capabilities : ["CAPABILITY_NAMED_IAM", "CAPABILITY_AUTO_EXPAND"] Parameter overrides : {} Signing Profiles : null Initiating deployment ===================== 2023-03-17 14:41:18 - Waiting for stack create/update to complete CloudFormation events from stack operations (refresh every 0.5 seconds) --------------------------------------------------------------------------------------------------------------------------------------------- ResourceStatus ResourceType LogicalResourceId ResourceStatusReason --------------------------------------------------------------------------------------------------------------------------------------------- UPDATE_IN_PROGRESS AWS::CloudFormation::Stack sam-app Transformation succeeded UPDATE_IN_PROGRESS AWS::CloudFormation::Stack AwsSamAutoDependencyLayerNestedSt - ack UPDATE_COMPLETE AWS::CloudFormation::Stack AwsSamAutoDependencyLayerNestedSt - ack UPDATE_IN_PROGRESS AWS::ApiGateway::RestApi ServerlessRestApi - UPDATE_COMPLETE AWS::ApiGateway::RestApi ServerlessRestApi - CREATE_IN_PROGRESS AWS::ApiGateway::Deployment ServerlessRestApiDeployment8cf30e - d3cd UPDATE_IN_PROGRESS AWS::Lambda::Permission HelloWorldFunctionHelloWorldPermi Requested update requires the ssionProd creation of a new physical resource; hence creating one. UPDATE_IN_PROGRESS AWS::Lambda::Permission HelloWorldFunctionHelloWorldPermi Resource creation Initiated ssionProd CREATE_IN_PROGRESS AWS::ApiGateway::Deployment ServerlessRestApiDeployment8cf30e Resource creation Initiated d3cd CREATE_COMPLETE AWS::ApiGateway::Deployment ServerlessRestApiDeployment8cf30e - d3cd UPDATE_IN_PROGRESS AWS::ApiGateway::Stage ServerlessRestApiProdStage - UPDATE_COMPLETE AWS::ApiGateway::Stage ServerlessRestApiProdStage - UPDATE_COMPLETE AWS::Lambda::Permission HelloWorldFunctionHelloWorldPermi - ssionProd UPDATE_COMPLETE_CLEANUP_IN_PROGRE AWS::CloudFormation::Stack sam-app - SS DELETE_IN_PROGRESS AWS::Lambda::Permission HelloWorldFunctionHelloWorldPermi - ssionProd DELETE_IN_PROGRESS AWS::ApiGateway::Deployment ServerlessRestApiDeployment47fc2d - 5f9d DELETE_COMPLETE AWS::ApiGateway::Deployment ServerlessRestApiDeployment47fc2d - 5f9d UPDATE_COMPLETE AWS::CloudFormation::Stack AwsSamAutoDependencyLayerNestedSt - ack DELETE_COMPLETE AWS::Lambda::Permission HelloWorldFunctionHelloWorldPermi - ssionProd UPDATE_COMPLETE AWS::CloudFormation::Stack sam-app - --------------------------------------------------------------------------------------------------------------------------------------------- CloudFormation outputs from deployed stack ---------------------------------------------------------------------------------------------------------------------------------------------- Outputs ---------------------------------------------------------------------------------------------------------------------------------------------- Key HelloWorldFunctionIamRole Description Implicit IAM Role created for Hello World function Value arn:aws:iam::012345678910:role/sam-app-HelloWorldFunctionRole-BUFVMO2PJIYF Key HelloWorldApi Description API Gateway endpoint URL for Prod stage for Hello World function Value https://pcrx5gdaof.execute-api.us-west-2.amazonaws.com/Prod/hello/ Key HelloWorldFunction Description Hello World Lambda Function ARN Value arn:aws:lambda:us-west-2:012345678910:function:sam-app-HelloWorldFunction-2PlN6TPTQoco ---------------------------------------------------------------------------------------------------------------------------------------------- Stack update succeeded. Sync infra completed. Infra sync completed.

進一步了解

如需所有sam sync選項的描述,請參閱sam sync