

# OPS06-BP02 测试部署
<a name="ops_mit_deploy_risks_test_val_chg"></a>

 使用与生产环境相同的部署配置、安全控制、步骤和程序，在预生产环境中测试发布程序。验证所有部署步骤是否按预期完成，如检查文件、配置和服务。通过功能测试、集成测试和负载测试以及运行状况检查等各种监控方法，进一步测试所有更改。通过这些测试，可以及早发现部署问题，并有机会在进入生产之前规划和缓解问题。

 可以创建临时的并行环境来测试每项更改。使用基础设施即代码（IaC）自动部署测试环境，有助于减少所涉及的工作量，确保稳定性、一致性和更快的功能交付。

 **期望结果：**组织采用了包含测试部署在内的测试驱动型开发文化。这样可以确保团队专注于实现业务价值，而不是管理发布版本。各团队在发现部署风险后尽早参与进来，确定适当的缓解方案。

 **常见反模式：**
+  在发布生产版本期间，未经测试的部署会导致问题频发，需要进行故障排除和上报。
+  发布版本包含用于更新现有资源的基础设施即代码（IaC）。不确定 IaC 是会成功运行，还是会对资源造成影响。
+  在应用程序中部署一项新功能。此功能未按预期运行，并且在受影响的用户报告之前都无从了解问题。
+  您更新了证书。您不小心将证书安装到了错误的组件上，而这却没有被发现，于是因为无法建立与网站的安全连接而影响网站访客。

 **建立此最佳实践的好处：**在预生产环境中对部署程序及其引入的更改进行全面测试，可最大限度地减少部署步骤对生产的潜在影响。这增强了生产版本发布过程中的信心，并最大限度地减少了运营支持，而且不会减慢更改交付速度。

 **在未建立这种最佳实践的情况下暴露的风险等级：**高 

## 实施指导
<a name="implementation-guidance"></a>

 测试部署过程与测试部署所产生的更改同样重要。要完成这一步骤，可以在尽可能接近生产环境的预生产环境中测试部署步骤。可以在投入生产之前发现一些常见问题，如部署步骤不完整、不正确或配置错误。此外，还可以测试恢复步骤。

 **客户示例** 

 作为持续集成和持续交付（CI/CD）管道的一部分，AnyCompany Retail 在类似生产的环境中执行为客户发布基础设施和软件更新所需的既定步骤。该管道包含预检查过程，用于在部署之前检测资源中的偏差（检测在 IaC 之外对资源执行的更改），以及验证 IaC 在启动时采取的操作。该管道会验证部署步骤，例如在向负载均衡器重新注册之前，验证特定文件和配置是否已准备就绪，服务是否处于正在运行状态，以及是否正确响应本地主机上的运行状况检查。此外，所有更改都要进行一系列自动测试，如功能测试、安全测试、回归测试、集成测试和负载测试。

### 实施步骤
<a name="implementation-steps"></a>

1.  执行预安装检查，模拟生产环境打造预生产环境。

   1.  使用[偏差检测](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-stack-drift.html)功能，检测是否在 CloudFormation 之外更改了资源。

   1.  使用[更改集](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-updating-stacks-changesets.html)功能，验证堆栈更新的意图是否与 CloudFormation 在启动更改集时所采取的操作相匹配。

1.  这会触发 [AWS CodePipeline](https://docs.aws.amazon.com/codepipeline/latest/userguide/approvals.html) 中的手动批准步骤，以授权部署到预生产环境。

1.  使用 [AWS CodeDeploy AppSpec](https://docs.aws.amazon.com/codedeploy/latest/userguide/application-specification-files.html) 文件等部署配置来定义部署和验证步骤。

1.  在适用的情况下，[将 AWS CodeDeploy 与其他 AWS 服务集成](https://docs.aws.amazon.com/codedeploy/latest/userguide/integrations-aws.html)，或[将 AWS CodeDeploy 与合作伙伴的产品和服务集成](https://docs.aws.amazon.com/codedeploy/latest/userguide/integrations-partners.html)。

1.  使用 Amazon CloudWatch、AWS CloudTrail 和 Amazon SNS 事件通知[监控部署](https://docs.aws.amazon.com/codedeploy/latest/userguide/monitoring.html)。

1.  执行部署后的自动化测试，包括功能测试、安全测试、回归测试、集成测试和负载测试。

1.  部署问题[疑难解答](https://docs.aws.amazon.com/codedeploy/latest/userguide/troubleshooting.html)。

1.  成功验证上述步骤后应启动手动审批工作流程，授权部署到生产环境。

 **实施计划的工作量级别：**高 

## 资源
<a name="resources"></a>

 **相关最佳实践：**
+  [OPS05-BP02 测试并验证更改](ops_dev_integ_test_val_chg.md) 

 **相关文档：**
+ [AWS Builders' Library \$1 自动实现无需干预的安全部署 \$1 测试部署](https://aws.amazon.com/builders-library/automating-safe-hands-off-deployments/#Test_deployments_in_pre-production_environments)
+ [AWS 白皮书 \$1 在 AWS 上练习持续集成和持续交付](https://docs.aws.amazon.com/whitepapers/latest/practicing-continuous-integration-continuous-delivery/testing-stages-in-continuous-integration-and-continuous-delivery.html)
+ [The Story of Apollo - Amazon's Deployment Engine](https://www.allthingsdistributed.com/2014/11/apollo-amazon-deployment-engine.html)
+  [How to test and debug AWS CodeDeploy locally before you ship your code](https://aws.amazon.com/blogs/devops/how-to-test-and-debug-aws-codedeploy-locally-before-you-ship-your-code/) 
+ [Integrating Network Connectivity Testing with Infrastructure Deployment](https://aws.amazon.com/blogs/networking-and-content-delivery/integrating-network-connectivity-testing-with-infrastructure-deployment/)

 **相关视频：**
+ [re:Invent 2020 \$1 Testing software and systems at Amazon](https://www.youtube.com/watch?v=o1sc3cK9bMU)

 **相关示例：**
+ [Tutorial \$1 Deploy and Amazon ECS service with a validation test](https://docs.aws.amazon.com/codedeploy/latest/userguide/tutorial-ecs-deployment-with-hooks.html)