

# SEC11-BP06 以编程方式部署软件
<a name="sec_appsec_deploy_software_programmatically"></a>

尽可能以编程方式部署软件。通过采取这种做法，可以降低由于人为错误导致部署失败或引入意外问题的可能性。

 **期望结果：**您测试的工作负载版本就是您部署的版本，每次都一致地执行部署。您可以将工作负载的配置外部化，这有助于您无需更改即可部署到不同的环境。您使用软件包的加密签名来验证环境之间没有任何变化。

**常见反模式：**
+  手动将软件部署到生产环境中。
+  手动对软件进行更改，以适应不同的环境。

**建立此最佳实践的好处：**
+  增强对软件发布过程的信心。
+  降低了失败的更改对业务功能造成影响的风险。
+  由于更改风险降低，从而加快了发布节奏。
+  针对部署过程中的意外事件的自动回滚功能。
+  能够以加密方式证明所测试的软件是部署的软件。

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

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

 要维护稳健且可靠的应用程序基础设施，应实施安全和自动化的部署实践。这种做法涉及从生产环境中移除持久的人员访问权限，使用 CI/CD 工具进行部署，以及将特定于环境的配置数据外部化。通过采用这种方法，您可以增强安全性，降低人为错误的风险，并简化部署流程。

 您可以构建自己的 AWS 账户结构，以便从生产环境中移除持久的人员访问权限。这种做法可以最大限度地降低未经授权的更改或意外修改的风险，从而提高生产系统的完整性。您可以使用 [AWS CodeBuild](https://aws.amazon.com/codebuild/) 和 [AWS CodePipeline](https://aws.amazon.com/codepipeline/) 之类的 CI/CD 工具来执行部署，而不是使用直接人员访问权限。您可以使用这些服务来自动执行构建、测试和部署流程，从而减少手动干预并提高一致性。

 为了进一步增强安全性和可追溯性，您可以在测试应用程序包后对其进行签名，并在部署期间验证这些签名。为此，请使用诸如 [AWS Signer](https://docs.aws.amazon.com/signer/latest/developerguide/Welcome.html) 或 [AWS Key Management Service（AWS KMS）](https://aws.amazon.com/kms/)之类的加密工具。通过对软件包进行签名和验证，您可以确保仅将经过授权和验证的代码部署到您的环境中。

 此外，您的团队可以适当地设计工作负载，以便从外部源（例如 [AWS Systems Manager Parameter Store](https://docs.aws.amazon.com/systems-manager/latest/userguide/systems-manager-parameter-store.html)）获得特定于环境的配置数据。这种做法可将应用程序代码与配置数据分开，这有助于您独立管理和更新配置，而无需修改应用程序代码本身。

 为简化基础设施的预置和管理，可以考虑使用基础设施即代码（IaC）工具，例如 [AWS CloudFormation](https://aws.amazon.com/cloudformation/) 或 [AWS CDK](https://aws.amazon.com/cdk/)。可以使用这些工具来定义基础设施即代码，从而提高不同环境中部署的一致性和可重复性。

 考虑使用金丝雀部署来验证软件是否成功部署。金丝雀部署涉及在部署到整个生产环境之前，先对一部分实例或用户推出更改。然后，您可以监控更改的影响并在必要时进行回滚，从而最大限度地降低出现广泛问题的风险。

 按照 [Organizing Your AWS Environment Using Multiple Accounts](https://docs.aws.amazon.com/whitepapers/latest/organizing-your-aws-environment/organizing-your-aws-environment.html) 白皮书中列出的建议进行操作。本白皮书提供了有关将环境（例如开发、暂存和生产）分离到不同 AWS 账户的指导，这种划分可以进一步增强安全性和隔离性。

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

1.  **设置 AWS 账户结构**：
   +  按照 [Organizing Your AWS Environment Using Multiple Accounts](https://docs.aws.amazon.com/whitepapers/latest/organizing-your-aws-environment/organizing-your-aws-environment.html) 白皮书中的指导，为不同的环境（例如开发、暂存和生产）创建单独的 AWS 账户。
   +  为每个账户配置适当的访问控制和权限，以限制人员对生产环境的直接访问权限。

1.  **实施 CI/CD 管道**：
   +  使用 [AWS CodeBuild](https://aws.amazon.com/codebuild/) 和 [AWS CodePipeline](https://aws.amazon.com/codepipeline/) 之类的服务设置 CI/CD 管道。
   +  将管道配置为自动构建、测试应用程序代码，并将其部署到相应的环境。
   +  将代码存储库与 CI/CD 管道相集成，以实现版本控制和代码管理。

1.  **签署并验证应用程序包**：
   +  在应用程序包经过测试和验证后，使用 [AWS Signer](https://docs.aws.amazon.com/signer/latest/developerguide/Welcome.html) 或 [AWS Key Management Service（AWS KMS）](https://aws.amazon.com/kms/)对其进行签名。
   +  在将应用程序包部署到目标环境之前，配置部署过程来验证应用程序包的签名。

1.  **使配置数据外部化**：
   +  将特定于环境的配置数据存储在 [AWS Systems Manager Parameter Store](https://docs.aws.amazon.com/systems-manager/latest/userguide/systems-manager-parameter-store.html) 中。
   +  修改应用程序代码，以便在部署或运行时期间从 Parameter Store 检索配置数据。

1.  **实施基础设施即代码（IaC）**：
   +  使用 [AWS CloudFormation](https://aws.amazon.com/cloudformation/) 或 [AWS CDK](https://aws.amazon.com/cdk/) 之类的 IaC 工具来定义和管理基础设施即代码。
   +  创建 CloudFormation 模板或 CDK 脚本，来为应用程序预置和配置必要的 AWS 资源。
   +  将 IaC 与 CI/CD 管道集成，以便在应用程序代码更改的同时自动部署基础设施变更。

1.  **实施金丝雀部署**：
   +  将您的部署流程配置为支持金丝雀部署，也即，在将更改部署到整个生产环境之前，先向一部分实例或用户推出这些更改。
   +  使用诸如 [AWS CodeDeploy](https://aws.amazon.com/codedeploy/) 或 [AWS ECS](https://aws.amazon.com/ecs/) 之类的服务来管理金丝雀部署并监控更改的影响。
   +  实施回滚机制，如果在金丝雀部署期间检测到问题，则还原到之前的稳定版本。

1.  **监控和审计**：
   +  设置监控和日志记录机制，来跟踪部署、应用程序性能和基础设施更改。
   +  使用诸如 [Amazon CloudWatch](https://aws.amazon.com/cloudwatch/) 和 [AWS CloudTrail](https://aws.amazon.com/cloudtrail/) 之类的服务来收集和分析日志和指标。
   +  实施审计和合规性检查，以验证对安全最佳实践和监管要求的遵守情况。

1.  **持续改进：**
   +  定期审查和更新您的部署实践，并纳入从以前的部署中吸取的反馈和经验教训。
   +  尽可能地实现部署过程自动化，以减少手动干预和潜在的人为错误。
   +  与跨职能团队（例如运营或安全）合作，来协调并持续改进部署实践。

 通过执行这些步骤，可以在 AWS 环境中实施安全的自动化部署实践，从而增强安全性，降低人为错误的风险，并简化部署过程。

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

 **相关最佳实践：**
+  [SEC11-BP02 在整个开发和发布生命周期中执行自动化测试](sec_appsec_automate_testing_throughout_lifecycle.md) 
+  [DL.CI.2 Trigger builds automatically upon source code modifications](https://docs.aws.amazon.com/wellarchitected/latest/devops-guidance/dl.ci.2-trigger-builds-automatically-upon-source-code-modifications.html) 

 **相关文档：**
+  [通过有效的治理加快 AWS 上的部署](https://aws.amazon.com/blogs/architecture/accelerate-deployments-on-aws-with-effective-governance/) 
+  [自动实现无需干预的安全部署](https://aws.amazon.com/builders-library/automating-safe-hands-off-deployments/) 
+  [Code signing using AWS Certificate Manager Private CA and AWS Key Management Service asymmetric keys](https://aws.amazon.com/blogs/security/code-signing-aws-certificate-manager-private-ca-aws-key-management-service-asymmetric-keys/) 
+  [Code Signing, a Trust and Integrity Control for AWS Lambda](https://aws.amazon.com/blogs/aws/new-code-signing-a-trust-and-integrity-control-for-aws-lambda/) 

 **相关视频：**
+  [无需干预：在亚马逊自动实现持续交付管道](https://www.youtube.com/watch?v=ngnMj1zbMPY) 

 **相关示例：**
+  [Blue/Green deployments with AWS Fargate](https://catalog.us-east-1.prod.workshops.aws/workshops/954a35ee-c878-4c22-93ce-b30b25918d89/en-US) 