DevOps - AWS 解决方案
DevOps 是一种将软件开发 (Dev) 和 IT 运营 (Ops) 结合在一起的工作方式。它专注于团队合作、自动化和快速交付更新,以加快软件开发生命周期 (SDLC)。
DevOps 的主要原则
DevOps 的主要原则包括 −
- 持续集成 (CI) − 频繁将代码合并到共享存储库中。
- 持续交付 (CD) − 自动化部署以加快发布速度。
- 基础设施即代码 (IaC) − 使用代码管理基础设施以实现一致性和更轻松的扩展。
- 监控和反馈 −实时了解性能和问题。
AWS 在 DevOps 工作流中的重要性
AWS 为我们提供了强大的工具,使 DevOps 顺利运行 −
- 可扩展性和灵活性 − EC2、Lambda 和 ECS/EKS 等服务会调整基础设施以处理不断变化的工作负载。
- 端到端工具链 − CodePipeline、CodeBuild 和 CodeDeploy 等工具支持 CI/CD 流程的每一步。
- 自动化 − AWS CloudFormation 和 CDK 帮助我们自动化和重复基础设施设置。
- 全球影响力 − AWS 的全球网络可实现可靠且低延迟的部署。
AWS 使我们更容易遵循 DevOps 最佳实践。它还加快了我们交付应用程序的速度。
用于 DevOps 的关键 AWS 服务
AWS 为我们提供了许多专为 DevOps 设计的服务。这些服务有助于实现自动化、扩展和简化工作流程。
| 服务 | 描述 | 主要功能 |
|---|---|---|
| AWS CodePipeline | 帮助我们自动化 CI/CD 工作流程。它构建、测试和部署应用程序。 |
|
| AWS CodeBuild | 托管构建服务。它编译代码、运行测试并创建工件。 |
|
| AWS CodeDeploy | 自动部署到 EC2、Lambda 和本地服务器。 |
|
| AWS CodeCommit | 用于私有 Git 的托管源代码控制服务存储库。 |
|
| AWS CloudFormation | 使用基础设施即代码 (IaC) 自动设置和管理 AWS 资源。 |
|
AWS 上的持续集成和交付
当我们在 AWS 上使用 CI/CD 工作流时,它使集成代码更改、运行测试和跨环境部署变得顺畅且一致。 CodePipeline、CodeBuild 和 CodeDeploy 等 AWS 服务协同工作,为这些任务创建可靠的管道。
使用 AWS CodePipeline 构建 CI/CD 管道
AWS CodePipeline 帮助我们构建完整的 CI/CD 工作流。它自动执行从源代码控制到部署的步骤。管道可以基于代码提交等事件或设置的时间表启动。
示例
查看以下示例 −
源阶段 − 我们将管道设置为跟踪 GitHub 存储库中的更改。
ActionProvider: GitHub RepositoryName: my-app BranchName: main
构建阶段 − 使用 AWS CodeBuild 编译和测试应用程序。
部署阶段 − AWS CodeDeploy 可以将最终工件推送到 EC2 或 Lambda。
CodePipeline 实时运行每个阶段。它还为我们提供详细的日志以调试任何问题。
使用 AWS CodeBuild 自动构建
AWS CodeBuild 编译我们的代码、运行测试并创建构建输出。它适用于多种编程语言和环境。我们可以使用预定义的构建映像或自定义 Docker 映像。
示例 buildspec.yml
version: 0.2
phases:
install:
commands:
- echo Installing dependencies
- npm install
build:
commands:
- echo Building the app
- npm run build
artifacts:
files:
- '**/*'
与 CodePipeline 链接时,CodeBuild 会自动处理构建阶段。每次提交都会触发经过测试和编译的工件。
使用 AWS CodeDeploy 的部署策略
AWS CodeDeploy 处理应用程序部署到 EC2、Lambda 甚至本地服务器。它提供不同的策略来确保顺利更新并最大程度地减少停机时间:
就地部署 − 更新现有实例。最适合允许少量停机的小型应用程序。
蓝/绿部署 − 使用更新的代码创建新设置并缓慢移动流量。通过保持旧版本就绪来避免停机。
EC2 的示例 AppSpec.yml
version: 0.0
os: linux
files:
- source: /src
destination: /var/www/html
hooks:
BeforeInstall:
- location: scripts/install_dependencies.sh
timeout: 300
ApplicationStart:
- location: scripts/start_server.sh
借助 CodeDeploy,我们可以使用 Amazon CloudWatch 监控部署。如果出现故障,它可以自动回滚。
通过将 CodePipeline、CodeBuild 和 CodeDeploy 结合使用,AWS 为我们提供了可扩展、安全且高效的 CI/CD 流程。它使我们的工作流程可靠且易于管理。
使用 AWS 实现基础设施即代码 (IaC)
基础设施即代码 (IaC) 是 DevOps 中的重要实践。它让我们可以使用代码来管理基础设施,而不是手动执行操作。AWS 拥有 CloudFormation 和 AWS 云开发工具包 (CDK) 等实用工具。这些工具可帮助我们实现自动化、保持一致性并扩展我们的基础设施。
使用 AWS CloudFormation
AWS CloudFormation 可帮助我们使用 JSON 或 YAML 中的模板创建和管理 AWS 资源。这些模板描述了我们基础设施中的所有内容,例如 EC2 实例、VPC、Lambda 函数等。这让我们每次都能一致地部署相同的基础设施。
CloudFormation 很好,因为我们只需要告诉它我们想要什么。它会负责配置和管理依赖项。
示例:CloudFormation 模板
这是一个创建 S3 存储桶的简单 CloudFormation YAML 模板 −
AWSTemplateFormatVersion: '2010-09-09'
Resources:
MyS3Bucket:
Type: 'AWS::S3::Bucket'
Properties:
BucketName: my-awesome-bucket
使用此模板,CloudFormation 会自动创建一个具有我们提供的名称的 S3 存储桶。如果我们更改模板(例如添加 EC2 实例),CloudFormation 将自动更新基础设施。这可以使一切保持一致并减少人为错误。
CloudFormation 还支持堆栈更新、更改集和嵌套堆栈等功能。这些功能可帮助我们管理更大、更复杂的基础设施。我们还可以将 CloudFormation 与其他 AWS DevOps 工具(如 CodePipeline)一起使用,以自动在 CI/CD 管道中创建我们的基础设施。
AWS CDK 简介
AWS CDK 是一个框架,可帮助我们使用 Python、TypeScript、Java 和 C# 等编程语言定义云基础设施。它让开发人员能够使用更高级别的概念而不是低级细节,从而使 IaC 变得更加简单。
借助 CDK,我们使用构造(预构建的 AWS 服务)来隐藏 CloudFormation 的复杂部分。CDK 获取我们的代码并将其转换为 CloudFormation 模板。然后使用此模板创建资源。
示例:Python 中的 CDK
以下是我们如何在 Python 中使用 AWS CDK 定义 S3 存储桶 −
from aws_cdk import core
import aws_cdk.aws_s3 as s3
class S3BucketStack(core.Stack):
def __init__(self, scope: core.Construct, id: str, **kwargs) -> None:
super().__init__(scope, id, **kwargs)
s3.Bucket(self, "MyS3Bucket", bucket_name="my-awesome-bucket")
app = core.App()
S3BucketStack(app, "S3BucketStack")
app.synth()
在此示例中,S3BucketStack 类定义了一个 S3 存储桶,app.synth() 创建了 CloudFormation 模板。CDK 通过使用面向对象的概念简化了我们的工作,从而减少了重复代码并帮助开发人员提高工作效率。
CDK 还使使用 VPC 或 ECS 集群 等更高级的概念变得更加容易。我们不必处理详细的资源。例如,我们只需几行代码就可以使用应用程序负载均衡器定义 Amazon ECS 集群。这使得 CDK 非常适合那些喜欢使用代码而不是长 YAML 或 JSON 模板的开发人员。
在 AWS 中为 DevOps 进行监控和记录
以下 AWS 工具用于监控和记录 DevOps 管道中的活动 -
用于监控的 AWS CloudWatch
CloudWatch 帮助我们实时监控 AWS 资源和应用程序。它收集和跟踪指标、日志和事件。我们可以根据某些阈值设置警报以自动扩展或获取通知。
示例
为 EC2 CPU 使用率设置警报 −
aws cloudwatch put-metric-alarm --alarm-name HighCPUUsage --metric-name CPUUtilization --namespace AWS/EC2 --statistic Average --period 300 --threshold 80 --comparison-operator GreaterThanThreshold --dimensions Name=InstanceId,Value=i-1234567890abcdef0
用于审计的 AWS CloudTrail
CloudTrail 跟踪并记录 AWS 中执行的所有 API 调用。它让我们可以全面了解整个账户的操作。它帮助我们监控和记录活动以确保安全性和合规性。我们可以将 CloudTrail 与 CloudWatch 连接起来,以自动发出可疑活动的警报。
示例
设置跟踪以审计 Lambda 调用。
使用 Amazon OpenSearch 进行集中日志记录
OpenSearch(以前称为 Elasticsearch)为我们提供了可扩展的日志记录解决方案。我们可以从许多来源(例如 EC2、Lambda、CloudWatch)收集日志并将其存储在 OpenSearch 中。 Kibana 与 OpenSearch 配合使用,帮助我们分析和可视化日志。
示例
将日志从 EC2 推送到 OpenSearch,以便于存储和分析。
AWS 上的 DevOps 管道中的安全性
以下 AWS 解决方案用于在 DevOps 管道中实现安全性 −
实现 IAM 角色和权限
我们使用 IAM(身份和访问管理) 角色来控制谁可以访问 DevOps 管道中的 AWS 资源。始终根据最小特权原则授予权限(仅授予所需的权限)。
示例
创建一个允许部署到 EC2 但不删除资源的 IAM 角色。
使用 AWS Secrets Manager 管理机密
AWS Secrets Manager 帮助我们存储和管理敏感信息,如数据库密码和 API 密钥。它与其他 AWS 服务配合使用,可自动将机密注入应用程序。
示例
将数据库密码存储在 Secrets Manager 中,并使用 AWS Secrets Manager SDK 在 Lambda 函数中安全地访问它们。
保护 CI/CD 管道
我们使用IAM 角色和策略来控制对 CodePipeline、CodeBuild 等服务的访问。机密信息(例如 API 密钥)应存储在 AWS Secrets Manager 中,而不是代码存储库中。确保 CodeBuild 和 CodePipeline 中的所有工件和日志都已加密。
示例
使用 aws kms encrypt 保护管道中的敏感数据。
DevOps 工作流中的扩展和弹性
在本节中,我们重点介绍了有助于在 DevOps 工作流中实现扩展和弹性的 AWS 工具 −
使用 AWS Elastic Beanstalk 进行自动扩展
Elastic Beanstalk 会根据需求自动调整 EC2 实例的数量。它根据我们设置的阈值处理扩展。
示例
为 Elastic Beanstalk 环境设置自动扩展,以更好地处理流量高峰。
使用 Amazon ECS / EKS 管理容器化应用程序
Amazon ECS(Elastic Container Service)和Amazon EKS(Elastic Kubernetes Service)使管理容器变得更加容易。ECS 与 AWS Fargate 配合使用以运行无服务器容器。EKS 帮助我们管理 Kubernetes 集群,以实现更灵活的应用程序。
示例
使用 ECS 服务自动扩展,根据 CPU 使用率扩展容器。
使用 AWS 故障注入模拟器确保弹性
AWS 故障注入模拟器 让我们可以模拟故障并测试系统的弹性。它帮助我们发现应用程序中的弱点并提高容错能力。
示例
模拟网络故障,查看应用程序如何应对中断并改进恢复计划。
结论
在本章中,我们解释了 DevOps 工作流的所有重要 AWS 服务和实践。我们研究了使用 AWS CloudWatch 进行监控、使用 CloudTrail 进行审计以及使用 OpenSearch 进行集中日志记录。我们还讨论了如何使用 IAM 角色、AWS Secrets Manager 以及弹性和可扩展性的最佳实践来保护 CI/CD 管道。我们介绍了 Elastic Beanstalk、ECS/EKS 和 AWS 故障注入模拟器等服务。
通过使用这些 AWS 工具,DevOps 团队可以更好地实现自动化、提高安全性、确保可扩展性并使系统更具弹性。这可以实现更快、更可靠的软件交付。

