AWS 上的项目

构建现代 Web 应用程序

部署 Web 应用程序、连接到数据库和分析用户行为

模块 2:在 Web 服务器上托管您的应用程序

在本模块中,您将新建一个使用 AWS Fargate 托管的微服务。 

概览

在本模块中,您将新建一个使用 AWS Fargate 托管的微服务,以便您的 Mythical Mysfits 网站可与应用程序后端集成。

AWS FargateAmazon Elastic Container Service (ECS) 中的部署选项,让您无需管理任何集群或服务器即可部署容器。对于 Mythical Mysfits 后端,我们将使用 Python 并在网络负载均衡器之后的 Docker 容器中创建一个 Flask 应用程序。以上操作将构成前端网站的微服务后端。

我们为什么选择 Fargate?

我们在此选择 Fargate 是因为它是构建长时间运行进程(例如,适用于 Web、移动和 PaaS 平台的微服务后端)的理想选择。借助 Fargate,您可以控制容器和灵活选择其运行时间,无需担心预置或扩展服务器的问题。它提供对联网、安全性和服务间通信的完全控制,并与 AWS 服务本机集成,以提供安全性、联网、访问控制、开发人员工具、监控和日志记录。

除 Fargate 以外,客户还可以根据其计算需求选择使用 AWS Lambda。Lambda 不仅具有与 Fargate 相同的无服务器优势,也非常适合需要实时响应数据更改、系统状态变化或用户操作的数据驱动型应用程序。我们将在模块 5 中更为详细地讨论 Lambda,因为我们将用它来分析站点上的客户行为。

实施说明

按照下面的分步说明创建您的 AWS Fargate 服务。因该模块较大,因此我们将其拆分为 3 个子模块。在模块 2A 中,您将设置核心基础设施,用于您的服务部署。在模块 2B 中,您将使用 AWS Fargate 部署您的服务。最后,在模块 2C 中,您将使用 AWS Code Services 设置自动部署。

模块 2A:设置核心基础设施

在创建我们的服务前,我们需要创建服务将使用的核心基础设施环境,其中包括 Amazon VPC 中的联网基础设施和 AWS Identity and Access Management Roles,后者将定义 ECS 和我们的容器在 AWS 上所具有的权限。

我们将使用 AWS CloudFormation 来完成此步骤。AWS CloudFormation 是能以编程方式预置您在 JSON 或 YAML 文件中声明的 AWS 资源(称为 CloudFormation 模板)的一项服务,可实现基础设施即代码的通用最佳实践。 

  • 我们在 /module-2/cfn/core.yml 中提供了用于创建所有所需网络和安全资源的 CloudFormation 模板。此模板将创建以下资源:

    • Amazon VPC – 包含 10.0.0.0/16 私有 IP 空间中四个子网(两个公有子网和两个私有子网)的网络环境,以及所有所需的路由表配置。此网络的子网是在单独的 AWS 可用区 (AZ) 中创建的,以在 AWS 区域中实现跨多个物理设施的高可用性。详细了解可用区如何帮助您实现高可用性
    • 两个 NAT 网关(每个公有子网各一个)– 使让我们最终要部署到私有子网的容器能连接 Internet,以下载必要的程序包等。
    • DynamoDB VPC 终端节点 – 我们的微服务后端最终将与 Amazon DynamoDB 集成,以实现持久性(将在模块 3 中说明)。
    • 安全组 – 允许您的 Docker 容器通过网络负载均衡器从 Internet 接收端口 8080 上的流量。
    • IAM 角色 – 创建 Identity and Access Management 角色。这些资源将在整个研讨会中使用,以使您创建的 AWS 服务或资源可以访问其他 AWS 服务,例如 DynamoDB、S3 等。

    要创建这些资源,请在 Cloud9 终端中运行以下命令(创建堆栈大约需要 10 分钟):

    aws cloudformation create-stack --stack-name MythicalMysfitsCoreStack --capabilities CAPABILITY_NAMED_IAM --template-body file://~/environment/aws-modern-application-workshop/module-2/cfn/core.yml

    您可以通过 AWS 控制台或通过运行以下命令来检查堆栈创建的状态:

    aws cloudformation describe-stacks --stack-name MythicalMysfitsCoreStack

    运行 describe-stacks 命令,直到显示状态 "StackStatus": "CREATE_COMPLETE"。

    描述堆栈

    (单击可缩放)

    收到此响应即表示 CloudFormation 已完成对上述所有核心网络和安全资源的预置,您可以继续执行下一步操作。请等待上述堆栈显示“CREATE_COMPLETE”,然后再继续下一步骤。

    您将在整个研讨会的其余部分使用此命令输出的值。您可以运行以下命令,将上述 describe-stacks 命令直接输出到 IDE 中的新文件,该文件将存储为 cloudformation-core-output.json:

    aws cloudformation describe-stacks --stack-name MythicalMysfitsCoreStack > ~/environment/cloudformation-core-output.json

模块 2B:使用 AWS Fargate 部署服务

接下来,您将创建一个 Docker 容器镜像,其中包含将 Mythical Mysfits 后端作为使用 Flask 创建的微服务 API 运行所需的所有代码和配置。我们将在 Cloud9 中构建 Docker 容器镜像,然后将其推送到 Amazon Elastic Container Registry,当使用 Fargate 创建服务时,可以从中拉取。

架构图

浏览器到负载均衡器到 Fargate
  • A:构建 Docker 镜像

    运行服务后端所需的所有代码都存储在您克隆到 Cloud9 IDE 中的存储库的 /module-2/app/ 目录中。如果您想查看使用 Flask 创建服务 API 的 Python 代码,请查看 /module-2/app/service/mythicalMysfitsService.py 文件。

    由于 Docker 已安装在您创建的 Cloud9 IDE 上,为了在本地构建 Docker 镜像,我们只需在 Cloud9 终端中运行以下两个命令:  

    首先,将目录更改为 ~/environment/module-2/app

    cd ~/environment/aws-modern-application-workshop/module-2/app

    您可以从之前 CloudFormation **describe-stacks 的输出中获取您的账户 ID 和默认区域

    在下面的命令中,将 REPLACE_ME_ACCOUNT_ID 替换为您的账户 ID,将 REPLACE_ME_REGION 替换为您的默认区域,以使用包含 Docker 指令的 Dockerfile 文件构建 Docker 镜像。该命令使用 -t 选项标记 Docker 镜像,并使用特定的标记格式,以便稍后将该镜像推送至 Amazon Elastic Container Registry 服务。

    拥有账户 ID 后,便可以准备构建 Docker 镜像了:

    docker build . -t REPLACE_ME_AWS_ACCOUNT_ID.dkr.ecr.REPLACE_ME_REGION.amazonaws.com/mythicalmysfits/service:latest

    您将看到 Docker 下载并安装应用程序所需的所有必要依赖项包,然后输出已构建镜像的标记。复制此镜像标记以供后续引用下面显示的示例标记是:111111111111.dkr.ecr.us-east-1.amazonaws.com/mythicalmysfits/service:latest

    Successfully built 8bxxxxxxxxab
    Successfully tagged 111111111111.dkr.ecr.us-east-1.amazonaws.com/mythicalmysfits/service:latest
    B:在本地测试服务

    我们来在 Cloud9 中对镜像进行本地测试,以确保一切都按预期运行。复制通过上一个命令生成的镜像标记,然后运行以下命令以“在本地”部署容器(实际上是在 AWS 中的 Cloud9 IDE 内!):

    docker run -p 8080:8080 REPLACE_ME_WITH_DOCKER_IMAGE_TAG

    之后,您将看到 Docker 报告您的容器已在本地启动并运行:

     * Running on http://0.0.0.0:8080/ (Press CTRL+C to quit)

    为了使用本地请求测试我们的服务,我们将在 Cloud9 IDE 中打开内置 Web 浏览器,该浏览器可用于预览在 IDE 实例上运行的应用程序。

    要打开预览 Web 浏览器,在 Cloud9 菜单栏中选择“Preview”>“Preview Running Application”

    preview-menu

     

    此操作将在 IDE 中打开另一个面板,可在该面板上使用 Web 浏览器。在预览浏览器地址栏中,将 /mysfits 附加到 URI 结尾,然后按 ENTER

    address-bar

    如果操作成功,您将看到该服务的响应是返回了存储在 `/aws-modern-application-workshop/module-2/app/service/mysfits-response.json` 中的 JSON 文档。

    测试服务完成后,您可以通过在 PC 或 Mac 上按 CTRL-c 来停止该操作。

    C:将 Docker 镜像推送至 Amazon ECR

    在本地成功测试服务后,就可以在 Amazon Elastic Container Registry (Amazon ECR) 中创建容器镜像存储库,并将我们的镜像推送至该存储库中。为创建注册表,请运行以下命令,该命令将在为您的账户创建的默认 AWS ECR 注册表中创建一个新存储库。

    aws ecr create-repository --repository-name mythicalmysfits/service

    对此命令的响应将包含有关已创建存储库的其他元数据。为了将容器镜像推送至新存储库中,我们需要为 Docker 客户端获取存储库的身份验证凭证。

    运行下面的命令,该命令将返回一个检索 Docker 客户端凭证的登录命令,然后将自动执行该命令(包括包含以下 $ 命令的完整命令)。如果命令成功,将报告“Login Succeeded”。

    $(aws ecr get-login --no-include-email)

    接下来,使用上面复制的标记将您创建的镜像推送至 ECR 存储库中。使用此命令,Docker 会将您的镜像及其依赖的所有镜像推送至 Amazon ECR:

    docker push REPLACE_ME_WITH_DOCKER_IMAGE_TAG

    运行以下命令,以查看存储在 ECR 存储库中的新推送的 Docker 镜像:

    aws ecr describe-images --repository-name mythicalmysfits/service
  • A:创建 AWS Fargate 集群

    现在,我们的 ECR 中有可用的镜像了,我们可以使用 AWS Fargate 将其部署到 Amazon ECS 上托管的服务中。在最后一个模块中,您在 Cloud9 中通过终端本地测试的同一个服务现将部署在云中,并可在网络负载均衡器之后公开访问。

    首先,我们将在 Amazon Elastic Container Service (ECS) 中创建一个集群。这表示要向其部署服务容器的“服务器”的集群。之所以用引号来强调服务器,是因为您将用到 AWS Fargate。借助 Fargate,您可以指定将容器部署到集群,而不必亲自预置或管理任何服务器。

    要在 ECS 中新建一个集群,请运行以下命令

    aws ecs create-cluster --cluster-name MythicalMysfits-Cluster
    B:创建 AWS CloudWatch Logs 组

    接下来,我们将在 AWS CloudWatch Logs 中新建一个日志组。AWS CloudWatch Logs 是用于日志收集和分析的服务。容器生成的日志将作为此特定组的一部分被自动推送到 AWS CloudWatch Logs 中。这在使用 AWS Fargate 时尤为重要,因为您将无法访问运行容器的服务器基础设施。

    要在 CloudWatch Logs 中创建新的日志组,请运行以下命令

    aws logs create-log-group --log-group-name mythicalmysfits-logs
    C:注册 ECS 任务定义

    我们已为容器日志将被推送到的位置创建了一个集群并定义了一个日志组,现在就可以注册 ECS 任务定义。ECS 中的任务是一组应安排在一起的容器镜像。任务定义声明该容器组以及这些容器所需的资源和配置。您将使用 AWS CLI 创建一个新的任务定义,用以说明如何将新的容器镜像安排到我们刚刚创建的 ECS 集群中。

    我们提供了一个 JSON 文件,作为 CLI 命令的输入。

    在 IDE 中打开 ~/environment/aws-modern-application-workshop/module-2/aws-cli/task-definition.json。

    使用您创建的资源中的相应值替换指示的值

    这些值将从您早前复制的 CloudFormation 响应以及您早前推送到 ECR 的 Docker 镜像标记中提取,例如:REPLACE_ME_ACCOUNT_ID.dkr.ecr.us-east-1.amazonaws.com/mythicalmysfits/service:latest

    替换 task-definition.json 中的值并将其保存。执行以下命令在 ECS 中注册新的任务定义:

    aws ecs register-task-definition --cli-input-json file://~/environment/aws-modern-application-workshop/module-2/aws-cli/task-definition.json
  • A:创建网络负载均衡器

    注册了新的任务定义后,我们就可以预置服务堆栈中所需的基础设施了。我们会将网络负载均衡器 (NLB) 预置在我们的服务层前面,而不是直接将服务公开到 Internet 上。这使我们的前端网站代码能够与单个 DNS 名称进行通信,而我们的后端服务可以根据需要或在出现故障并需要预置新容器时弹性扩展。

    要预置新 NLB,请在 Cloud9 终端中执行以下 CLI 命令(从您保存的 CloudFormation 输出中检索 subnetId):

    aws elbv2 create-load-balancer --name mysfits-nlb --scheme internet-facing --type network --subnets REPLACE_ME_PUBLIC_SUBNET_ONE REPLACE_ME_PUBLIC_SUBNET_TWO > ~/environment/nlb-output.json

    成功完成此命令后,将在 IDE 中创建一个名为 nlb-output.json 的新文件。在后续步骤中,您将用到 DNSName、VpcId 和 LoadBalancerArn。

    B:创建负载均衡器目标组

    接下来,使用 CLI 创建 NLB 目标组。对于负载均衡器接收以进行转发的请求,目标组允许 AWS 资源将自身注册为目标。我们的服务容器将自动注册到此目标,以便它们在预置时可以接收来自 NLB 的流量。此命令包含一个需要替换的值,即您的 vpc-id,该值可以在 CloudFormation 返回的先前保存的 MythicalMysfitsCoreStack 输出中找到。

    aws elbv2 create-target-group --name MythicalMysfits-TargetGroup --port 8080 --protocol TCP --target-type ip --vpc-id REPLACE_ME_VPC_ID --health-check-interval-seconds 10 --health-check-path / --health-check-protocol HTTP --healthy-threshold-count 3 --unhealthy-threshold-count 3 > ~/environment/target-group-output.json

    完成此命令后,其输出将保存到 IDE 中的 target-group-output.json。您将在后续步骤中引用 TargetGroupArn 值。

    C:创建负载均衡器侦听器

    接下来,使用 CLI 为 NLB 创建负载均衡器侦听器。这将通知负载均衡器:对于在特定端口上接收到的请求,应将其转发到已注册到上述目标组的目标中。请确保使用目标组的相应 ARN 和在之前的步骤中保存的 NLB 来替换这两个指示值:

    aws elbv2 create-listener --default-actions TargetGroupArn=REPLACE_ME_NLB_TARGET_GROUP_ARN,Type=forward --load-balancer-arn REPLACE_ME_NLB_ARN --port 80 --protocol TCP
  • A:为 ECS 创建服务相关角色

    如果您以前使用过 ECS,可以跳过这一步,进入下一步。如果您以前从未使用过 ECS,我们需要在 IAM 中创建一个**服务相关角色**,该角色可授予 ECS 服务自己在您的账户内发出 ECS API 请求的权限。这是必须执行的操作,因为当您在 ECS 中创建服务时,该服务将调用您账户中的 API,以执行诸如拉取 Docker 镜像、创建新任务等操作。

    如果不创建此角色,则不会授予 ECS 服务执行所需操作的权限。要创建此角色,请在终端中执行以下命令:  

    aws iam create-service-linked-role --aws-service-name ecs.amazonaws.com

    如果上述命令返回角色已存在的错误,您可以忽略此错误,它表示以前在您的账户中自动创建过此角色。

    B:创建服务

    在创建和配置 NLB 并向 ECS 服务授予适当权限后,我们就可以创建实际的 ECS **服务**,我们的容器将在该服务上运行,并将自行注册到负载均衡器以接收流量。我们为 CLI 输入添加了一个 JSON 文件,此文件位于:`~/environment/aws-modern-application-workshop/module-2/aws-cli/service-definition.json`。此文件包含要创建的服务的所有配置详细信息,包括应使用 **AWS Fargate** 启动此服务的指示,这意味着您不必在目标集群内预置任何服务器。在此服务中,作为所使用任务的一部分而安排的容器,将在完全由 AWS 管理的集群上运行。

    在 IDE 中打开 ~/environment/aws-modern-application-workshop/module-2/aws-cli/service-definition.json,并替换 REPLACE_ME 的指示值。保存该值,然后运行以下命令来创建服务:

    aws ecs create-service --cli-input-json file://~/environment/aws-modern-application-workshop/module-2/aws-cli/service-definition.json
    C:测试服务

    复制创建 NLB 时保存的 DNS 名称,并使用 Cloud9 中的预览浏览器(或任何 Web 浏览器,因为现在我们的服务可在 Internet 上访问)向其发送请求。尝试向 mysfits 资源发送请求:

    http://mysfits-nlb-123456789-abc123456.elb.us-east-1.amazonaws.com/mysfits

    在 Cloud9 中对 Docker 容器进行本地测试时,如果收到与我们早前收到的 JSON 响应相同的响应,则意味着 Flask API 已在 AWS Fargate 上启动并运行。

    注意:此网络负载均衡器仅支持 HTTP (http://) 请求,因为它没有安装 SSL/TLS 证书。对于本教程,请确保仅使用 http:// 提交请求,因为 https:// 请求将无法正常工作。

  • A:替换 API 终端节点

    接下来,我们需要将网站与新的 API 后端集成,而不是使用之前上传到 S3 的硬编码数据。您需要更新以下文件,以便对 API 调用使用相同的 NLB URL(不包括 /mysfits 路径):/module-2/web/index.html

    在 Cloud9 中打开该文件,并用 NLB URL 替换下面引号之间突出显示的区域:

    before-replace

    粘贴后,该行应如下所示:

    after-replace
    B:上传到 S3

    要将此文件上传到 S3 托管的网站,请再次使用模块 1 期间创建的存储桶名称,并运行以下命令

    aws s3 cp ~/environment/aws-modern-application-workshop/module-2/web/index.html s3://INSERT-YOUR-BUCKET-NAME/index.html

    使用在模块 1 最后使用的相同 URL 打开您的网站,以查看新的 Mystical Mysfits 网站,该网站正在从在部署到 AWS Fargate 的 Docker 容器中运行的 Flask API 检索 JSON 数据!

模块 2C:使用 AWS Code Services 自动部署

现在,您已启动并运行了一个服务,您可能会需要要对 Flask 服务进行代码更改。向服务部署新功能时,如果每次都必须完成以上所有相同步骤,则会影响您的开发速度。这时候就要借助持续集成和持续交付 (CI/CD) 了!

在本模块中,您将创建一个完全托管的 CI/CD 堆栈,该堆栈自动将您对代码库所做的所有代码更改发送到您在上一模块创建的服务中。

架构图

构建动态网站架构 – Cloud9、代码工具、Fargate
  • A:为管道构件创建 S3 存储桶

    我们需要创建另一个 S3 存储桶,用于存储在 CI/CD 管道执行过程中创建的临时构件。为这些构件选择一个新的存储桶名称,并使用以下 CLI 命令创建一个存储桶:

    aws s3 mb s3://REPLACE_ME_CHOOSE_ARTIFACTS_BUCKET_NAME

    接下来,该存储桶需要存储桶策略,以定义对存储在其中的数据所具有的权限。但与我们允许任何人访问的网站存储桶不同,只有我们的 CI/CD 管道才能访问此存储桶。我们在 ~/environment/aws-modern-application-workshop/module-2/aws-cli/artifacts-bucket-policy.json 中提供了此策略所需的 JSON 文件。

    打开此文件,您需要替换其中的几个字符串,以添加早前作为 MythicalMysfitsCoreStack 的一部分创建的 ARN,以及您为 CI/CD 构件新选择的存储桶名称。

    修改并保存此文件后,执行以下命令向您的 CI/CD 管道授予访问此存储桶的权限:

    aws s3api put-bucket-policy --bucket REPLACE_ME_ARTIFACTS_BUCKET_NAME --policy file://~/environment/aws-modern-application-workshop/module-2/aws-cli/artifacts-bucket-policy.json
    B:创建 CodeCommit 存储库

    您需要一个地方来推送和存储您的代码。为此,可使用 CLI 创建一个 **AWS CodeCommit 存储库**:

    aws codecommit create-repository --repository-name MythicalMysfitsService-Repository
    C:创建 CodeBuild 项目

    具有存储代码的存储库和用于 CI/CD 构件的 S3 存储桶后,我们就可以添加到 CI/CD 堆栈以实现构建服务。这将通过创建 AWS CodeBuild 项目来实现。每当触发构建执行操作时,AWS CodeBuild 都将自动为我们的配置预置构建服务器,并执行构建 Docker 镜像所需的步骤,然后将其新版本推送到我们创建的 ECR 存储库(之后在构建完成时关闭服务器)。

    构建步骤(即打包 Python 代码并构建/推送 Docker 容器)包含在 ~/environment/aws modern application workshop/module-2/app/buildspec.yml 文件中。创建 buildspec.yml 文件是为了说明 CodeBuild 在 CodeBuild 项目中执行构建所需的步骤。

    要创建 CodeBuild 项目,需要使用特定于您的资源的参数来更新另一个 CLI 输入文件。该文件位于 ~/environment/aws-modern-application-workshop/module-2/aws-cli/code-build-project.json。替换此文件中的值,步骤类似于您之前在 MythicalMysfitsCoreStackOutput 中执行的操作。保存更改后,使用 CLI 执行以下操作以创建项目:

    aws codebuild create-project --cli-input-json file://~/environment/aws-modern-application-workshop/module-2/aws-cli/code-build-project.json
    D:创建 CodePipeline 管道

    最后,我们需要一种方法来将 CodeCommit 存储库与 CodeBuild 项目持续集成,这样每当有代码更改被推送到存储库时,系统都将自动执行构建。然后,我们需要一种方法来持续将这些新构建的构件传送到我们 ECS 中的服务中。AWS CodePipeline 是将这些操作集合在一个管道中的服务,您将在下一步创建该管道。

    您在 CodePipeline 中的管道将执行上述操作。每当有代码更改被推送至 CodeCommit 存储库时,CodePipeline 都会将最新的代码传送到 AWS CodeBuild 项目中,以执行构建。当通过 CodeBuild 成功构建管道后,CodePipeline 将使用 CodeBuild 执行推送到 ECR 中的最新容器镜像来执行到 ECS 的部署。

    所有这些步骤都在 JSON 文件中定义,前提是您将其用作 AWS CLI 的输入来创建管道。此文件位于 ~/environment/aws-modern-application-workshop/module-2/aws-cli/code-pipeline.json,打开此文件并替换其中所需的属性,然后保存此文件。

    保存后,使用以下命令在 CodePipeline 中创建管道

    aws codepipeline create-pipeline --cli-input-json file://~/environment/aws-modern-application-workshop/module-2/aws-cli/code-pipeline.json
    E:启用对 ECR 镜像存储库的自动访问

    在 CI/CD 管道成功执行端到端之前,我们还有最后一个步骤。有了 CI/CD 管道,你就无需再手动将容器镜像推送至 ECR。CodeBuild 现在将推送新映像。

    我们需要使用 ECR 存储库策略*为 CodeBuild 授予在镜像存储库上执行操作的权限。策略文档需要使用通过 MythicalMysfitsCoreStack 创建的 CodeBuild 角色的特定 ARN 进行更新,该策略文档位于 ~/environment/aws-modern-application-workshop/module-2/aws-cli/ecr-policy.json

    更新并保存此文件,然后运行以下命令以创建策略

    aws ecr set-repository-policy --repository-name mythicalmysfits/service --policy-text file://~/environment/aws-modern-application-workshop/module-2/aws-cli/ecr-policy.json

    成功创建策略后,您将拥有一个正在运行的端到端 CI/CD 管道,可将代码更改自动传送至 ECS 中的服务中。

  • A:将 Git 与 AWS CodeCommit 结合使用

    为了测试新管道,我们需要在 Cloud9 IDE 中配置 git 并将其与 CodeCommit 存储库集成。

    AWS CodeCommit 为 git 提供了一个凭证帮助程序,可用于简化集成过程。

    在终端上按顺序运行以下命令,以将 git 配置为与 AWS CodeCommit 配合使用(如果操作成功,则两者都不会报告任何响应):

    git config --global user.name "REPLACE_ME_WITH_YOUR_NAME"
    git config --global user.email REPLACE_ME_WITH_YOUR_EMAIL@example.com
    git config --global credential.helper '!aws codecommit credential-helper $@'
    git config --global credential.UseHttpPath true

    接下来,使用终端将 IDE 中的目录更改为环境目录:

    cd ~/environment/

    现在,我们就可以使用以下终端命令来克隆我们的存储库了:

    git clone https://git-codecommit.REPLACE_REGION.amazonaws.com/v1/repos/MythicalMysfitsService-Repository

    这会提示我们的存储库是空的! 我们来使用以下命令将应用程序文件复制到我们的存储库目录来修复此问题:

    cp -r ~/environment/aws-modern-application-workshop/module-2/app/* ~/environment/MythicalMysfitsService-Repository/
    B:推送代码更改

    现在,我们在模块 2 中创建 Fargate 服务时所使用的完整服务代码存储在刚从 AWS CodeCommit 克隆的本地存储库中。在提交更改前,我们来对 Flask 服务进行更改,以演示我们创建的 CI/CD 管道能够正常运行。在 Cloud9 中,打开存储在 ~/environment/MythicalMysfitsService-Repository/service/mysfits-response.json 中的文件,并将其中的一个 mysfits 的期限更改为其他值,然后保存该文件。

    保存该文件后,将目录更改为新存储库目录:

    cd ~/environment/MythicalMysfitsService-Repository/

    然后,运行以下 git 命令以推送代码更改。

    git add .
    git commit -m "I changed the age of one of the mysfits."
    git push

    将更改推送至存储库后,您可以在 AWS 控制台中打开 CodePipeline 服务,查看更改在 CI/CD 管道中的进度。提交代码更改后,将这些更改部署到运行于 Fargate 中的实时服务大约需要 5 到 10 分钟。

    在此期间,当更改被签入 CodeCommit 存储库时,AWS CodePipeline 将编排触发管道执行、触发 CodeBuild 项目以启动新构建,以及检索由 CodeBuild 推送到 ECR 的 Docker 镜像,并为在服务中运行的现有容器的耗尽连接执行自动 ECS 更新服务操作,以将其替换为新构建的镜像。在浏览器中刷新 Mythical Mysfits 网站,以查看更改是否生效。

    您可以通过此处的 CodePipeline 控制台查看代码更改进度(无需执行任何操作,只需查看操作自动执行!):AWS CodePipeline

    模块 2 到此结束。

下一模块:存储 mysfit 数据。