教程:部署无服务器应用程序 - Amazon CodeCatalyst

教程:部署无服务器应用程序

在本教程中,您将了解如何使用工作流构建、测试无服务器应用程序并将其部署为 CloudFormation 堆栈。

本教程中的应用程序是一个输出“Hello World”消息的简单 Web 应用程序。该应用程序包含一个 AWS Lambda 函数和一个 Amazon API Gateway,可使用 AWS Serverless Application Model(AWS SAM)AWS CloudFormation 的扩展)来构建它。

先决条件

开始前的准备工作:

  • 您需要一个带有已连接的 AWS 账户的 CodeCatalyst 空间。有关更多信息,请参阅创建空间

  • 在您的空间中,您需要一个空项目,其名称为:

    codecatalyst-cfn-project

    使用从头开始选项来创建此项目。

    有关更多信息,请参阅在 Amazon CodeCatalyst 中创建空项目

  • 在您的项目中,您需要一个 CodeCatalyst 环境,其名称为:

    codecatalyst-cfn-environment

    按如下方式配置此环境:

    • 选择任何类型,例如非生产

    • 将您的 AWS 账户连接到该类型。

    • 对于默认 IAM 角色,选择任何角色。稍后需要指定另一个角色。

    有关更多信息,请参阅部署到 AWS 账户和 VPC 中

步骤 1:创建源存储库

在此步骤中,您将在 CodeCatalyst 中创建源存储库。此存储库用于存储教程的源文件,例如 Lambda 函数文件。

有关源存储库的更多信息,请参阅创建源存储库

创建源存储库
  1. 在 CodeCatalyst 的导航窗格中,选择代码,然后选择源存储库

  2. 选择添加存储库,然后选择创建存储库

  3. 存储库名称中,输入:

    codecatalyst-cfn-source-repository
  4. 选择创建

现在,您已经创建了一个名为 codecatalyst-cfn-source-repository 的存储库。

步骤 2:创建 AWS 角色

在此步骤中,您将创建以下 AWS IAM 角色:

  • 部署角色 – 向 CodeCatalyst 部署 AWS CloudFormation 堆栈操作授予权限,以访问您的 AWS 账户以及您将在其中部署无服务器应用程序的 CloudFormation 服务。部署 AWS CloudFormation 堆栈操作是您的工作流的一部分。

  • 构建角色 – 向 CodeCatalyst 构建操作授予权限,以访问您的 AWS 账户并对将存储您的无服务器应用程序的 Amazon S3 进行写入操作。构建操作是您的工作流的一部分。

  • 堆栈角色 – 向 CloudFormation 授予权限,以读取和修改您稍后将提供的 AWS SAM 模板中指定的资源。还向 CloudWatch 授予权限。

有关 IAM 角色的更多信息,请参阅《AWS Identity and Access Management 用户指南》中的 IAM 角色

注意

要节省时间,您可以创建一个名为 CodeCatalystWorkflowDevelopmentRole-spaceName 角色的角色,而不是前面列出的三个角色。有关更多信息,请参阅为您的账户和空间创建 CodeCatalystWorkflowDevelopmentRole-spaceName 角色。了解 CodeCatalystWorkflowDevelopmentRole-spaceName 角色具有非常广泛的权限,这可能会带来安全风险。我们建议您仅在教程和安全要求较低的场景中使用此角色。本教程假定您创建的是前面列出的三个角色。

注意

还需要一个 Lambda 执行角色,但您无需立即创建此角色,因为当您在步骤 5 中运行工作流时,sam-template.yml 文件会为您创建它。

创建部署角色
  1. 按如下步骤操作,为角色创建策略:

    1. 登录到 AWS。

    2. 打开 IAM 控制台:https://console.aws.amazon.com/iam/

    3. 在导航窗格中,选择策略

    4. 选择创建策略

    5. 选择 JSON 选项卡。

    6. 删除现有代码。

    7. 粘贴以下代码:

      { "Version": "2012-10-17", "Statement": [{ "Action": [ "cloudformation:CreateStack", "cloudformation:DeleteStack", "cloudformation:Describe*", "cloudformation:UpdateStack", "cloudformation:CreateChangeSet", "cloudformation:DeleteChangeSet", "cloudformation:ExecuteChangeSet", "cloudformation:SetStackPolicy", "cloudformation:ValidateTemplate", "cloudformation:List*", "iam:PassRole" ], "Resource": "*", "Effect": "Allow" }] }
      注意

      第一次使用该角色运行工作流操作时,请在资源策略语句中使用以下通配符,然后在策略可用后使用资源名称缩小策略范围。

      "Resource": "*"
    8. 选择下一步:标签

    9. 选择下一步:审核

    10. 名称中,输入:

      codecatalyst-deploy-policy
    11. 选择创建策略

      现在,您已经创建了权限策略。

  2. 按如下步骤操作,创建部署角色:

    1. 在导航窗格中,选择角色,然后选择创建角色

    2. 选择自定义信任策略

    3. 删除现有的自定义信任策略。

    4. 添加以下自定义信任策略:

      { "Version": "2012-10-17", "Statement": [ { "Sid": "", "Effect": "Allow", "Principal": { "Service": [ "codecatalyst-runner.amazonaws.com", "codecatalyst.amazonaws.com" ] }, "Action": "sts:AssumeRole" } ] }
    5. 选择下一步

    6. 权限策略中,搜索 codecatalyst-deploy-policy 并选中其复选框。

    7. 选择下一步

    8. 对于角色名称,输入:

      codecatalyst-deploy-role
    9. 对于角色描述,输入:

      CodeCatalyst deploy role
    10. 选择创建角色

    现在,您已创建一个具有信任策略和权限策略的部署角色。

  3. 按如下步骤操作,获取部署角色 ARN:

    1. 在导航窗格中,选择角色

    2. 在搜索框中,输入刚创建的角色的名称(codecatalyst-deploy-role)。

    3. 从列表中选择该角色。

      此时将显示该角色的摘要页面。

    4. 在顶部,复制 ARN 值。

    现在,您已创建具有相应权限的部署角色并已获取其 ARN。

创建构建角色
  1. 按如下步骤操作,为角色创建策略:

    1. 登录到 AWS。

    2. 打开 IAM 控制台:https://console.aws.amazon.com/iam/

    3. 在导航窗格中,选择策略

    4. 选择创建策略

    5. 选择 JSON 选项卡。

    6. 删除现有代码。

    7. 粘贴以下代码:

      { "Version": "2012-10-17", "Statement": [{ "Action": [ "s3:PutObject", "iam:PassRole" ], "Resource": "*", "Effect": "Allow" }] }
      注意

      第一次使用该角色运行工作流操作时,请在资源策略语句中使用以下通配符,然后在策略可用后使用资源名称缩小策略范围。

      "Resource": "*"
    8. 选择下一步:标签

    9. 选择下一步:审核

    10. 名称中,输入:

      codecatalyst-build-policy
    11. 选择创建策略

      现在,您已经创建了权限策略。

  2. 按如下步骤操作,创建构建角色:

    1. 在导航窗格中,选择角色,然后选择创建角色

    2. 选择自定义信任策略

    3. 删除现有的自定义信任策略。

    4. 添加以下自定义信任策略:

      { "Version": "2012-10-17", "Statement": [ { "Sid": "", "Effect": "Allow", "Principal": { "Service": [ "codecatalyst-runner.amazonaws.com", "codecatalyst.amazonaws.com" ] }, "Action": "sts:AssumeRole" } ] }
    5. 选择下一步

    6. 权限策略中,搜索 codecatalyst-build-policy 并选中其复选框。

    7. 选择下一步

    8. 对于角色名称,输入:

      codecatalyst-build-role
    9. 对于角色描述,输入:

      CodeCatalyst build role
    10. 选择创建角色

    现在,您已创建一个具有信任策略和权限策略的构建角色。

  3. 按如下步骤操作,获取构建角色 ARN:

    1. 在导航窗格中,选择角色

    2. 在搜索框中,输入刚创建的角色的名称(codecatalyst-build-role)。

    3. 从列表中选择该角色。

      此时将显示该角色的摘要页面。

    4. 在顶部,复制 ARN 值。

    现在,您已创建具有相应权限的构建角色并已获取其 ARN。

创建堆栈角色
  1. 使用要用于部署堆栈的账户登录 AWS。

  2. 通过 https://console.aws.amazon.com/iam/ 打开 IAM 控制台。

  3. 按如下步骤操作,创建堆栈角色:

    1. 在导航窗格中,选择角色

    2. 选择创建角色

    3. 选择 AWS 服务

    4. 使用案例部分中,从下拉列表中选择 CloudFormation

    5. 选择 CloudFormation 单选按钮。

    6. 选择底部的下一步

    7. 使用搜索框找到以下权限策略,然后选中它们对应的复选框。

      注意

      如果您搜索一个策略,但该策略未显示,请务必选择清除筛选条件,然后重试。

      • CloudWatchFullAccess

      • AWSCloudFormationFullAccess

      • IAMFullAccess

      • AWSLambda_FullAccess

      • AmazonAPIGatewayAdministrator

      • AmazonS3FullAccess

      • AmazonEC2ContainerRegistryFullAccess

      第一个策略可用于访问 CloudWatch,以便在警报发生时启用堆栈回滚。

      其余策略使 AWS SAM 能够访问本教程中将部署的堆栈中的服务和资源。有关授予权限的更多信息,请参阅 AWS Serverless Application Model 开发人员指南 权限

    8. 选择下一步

    9. 对于角色名称,输入:

      codecatalyst-stack-role
    10. 选择创建角色

  4. 按如下步骤操作,获取堆栈角色的 ARN:

    1. 在导航窗格中,选择角色

    2. 在搜索框中,输入刚创建的角色的名称(codecatalyst-stack-role)。

    3. 从列表中选择该角色。

    4. 摘要部分中,复制 ARN 值。稍后您将需要用到它。

    现在,您已创建具有相应权限的堆栈角色并已获取其 ARN。

步骤 3:将 AWS 角色添加到 CodeCatalyst

在此步骤中,您将构建角色(codecatalyst-build-role)和部署角色(codecatalyst-deploy-role)添加到空间中的 CodeCatalyst 账户连接。

注意

您无需将堆栈角色(codecatalyst-stack-role)添加到连接。这是因为在使用部署角色在 CodeCatalyst 和 AWS 之间建立连接CloudFormation(不是 CodeCatalyst)将使用堆栈角色。由于 CodeCatalyst 不使用堆栈角色来获取对 AWS 的访问权限,因此无需将其与账户连接关联。

将构建角色和部署角色添加到账户连接
  1. 在 CodeCatalyst 中,导航到您的空间。

  2. 选择 AWS accounts (账户)。此时将显示账户连接列表。

  3. 选择代表您在其中创建构建角色和部署角色的 AWS 账户的账户连接。

  4. 选择在 AWS 管理控制台中管理角色

    这将显示将 IAM 角色添加到 Amazon CodeCatalyst 空间页面。您可能需要登录才能访问该页面。

  5. 选择添加您在 IAM 中创建的现有角色

    这将显示一个下拉列表。该列表显示所有具有包含 codecatalyst-runner.amazonaws.com.rproxy.goskope.comcodecatalyst.amazonaws.com 服务主体的信任策略的 IAM 角色。

  6. 在该下拉列表中,选择 codecatalyst-build-role,然后选择添加角色

  7. 选择添加 IAM 角色,再选择添加您在 IAM 中创建的现有角色,然后在下拉列表中选择 codecatalyst-deploy-role。选择 Add role (添加角色)

    现在,您已将构建角色和部署角色添加到您的空间。

  8. 复制 Amazon CodeCatalyst 显示名称的值。您稍后在创建工作流时将需要此值。

步骤 4:创建 Amazon S3 存储桶

在此步骤中,您将创建可在其中存储无服务器应用程序的部署包 .zip 文件的 Amazon S3 存储桶。

创建 Amazon S3 存储桶
  1. 通过以下网址打开 Simple Storage Service(Amazon S3)控制台:https://console.aws.amazon.com/s3/

  2. 在主窗格中,选择创建存储桶

  3. 对于存储桶名称,输入:

    codecatalyst-cfn-s3-bucket
  4. 对于 AWS Region(亚马逊云科技区域),选择一个区域。本教程假设您选择了美国西部(俄勒冈州)us-west-2。有关 Amazon S3 支持的区域的信息,请参阅《AWS 一般参考》中的 Amazon Simple Storage Service endpoints and quotas

  5. 在页面底部选择创建存储桶

现在,您已经在美国西部(俄勒冈州)us-west-2 区域中创建了一个名为 codecatalyst-cfn-s3-bucket 的存储桶。

步骤 5:添加源文件

在此步骤中,您将多个应用程序源文件添加到 CodeCatalyst 源存储库。hello-world 文件夹包含您将部署的应用程序文件。tests 文件夹包含单元测试。文件夹结构如下所示:

. |— hello-world | |— tests | |— unit | |— test-handler.js | |— app.js |— .npmignore |— package.json |— sam-template.yml |— setup-sam.sh

.npmignore 文件

.npmignore 文件指明 npm 应从应用程序包中排除哪些文件和文件夹。在本教程中,npm 将排除 tests 文件夹,因为它不是应用程序的一部分。

添加 .npmignore 文件
  1. 通过访问 https://codecatalyst.aws/ 打开 CodeCatalyst 控制台。

  2. 选择您的项目 codecatalyst-cfn-project

  3. 在导航窗格中,选择代码,然后选择源存储库

  4. 从源存储库列表中,选择您的存储库 codecatalyst-cfn-source-repository

  5. 文件中,选择创建文件

  6. 对于文件名,输入:

    .npmignore
  7. 在文本框中,输入以下代码:

    tests/*
  8. 选择提交,然后再次选择提交

    现在,您已在存储库的根目录中创建名为 .npmignore 的文件。

package.json 文件

package.json 文件包含有关您的 Node 项目的重要元数据,例如项目名称、版本号、描述、依赖项以及描述如何运行应用程序并与之交互的其他详细信息。

本教程中的 package.json 包括依赖项列表和 test 脚本。测试脚本执行以下操作:

  • 通过使用 mocha,测试脚本运行 hello-world/tests/unit/ 中指定的单元测试,并使用 xunit 报告器将结果写入 junit.xml 文件。

  • 通过使用 Istanbul (nyc),测试脚本使用 clover 报告器生成代码覆盖率报告(clover.xml)。有关更多信息,请参阅 Istanbul 文档中的 Using alternative reporters

添加 package.json 文件
  1. 在存储库中的文件中,选择创建文件

  2. 对于文件名,输入:

    package.json
  3. 在文本框中,输入以下代码:

    { "name": "hello_world", "version": "1.0.0", "description": "hello world sample for NodeJS", "main": "app.js", "repository": "https://github.com/awslabs/aws-sam-cli/tree/develop/samcli/local/init/templates/cookiecutter-aws-sam-hello-nodejs", "author": "SAM CLI", "license": "MIT", "dependencies": { "axios": "^0.21.1", "nyc": "^15.1.0" }, "scripts": { "test": "nyc --reporter=clover mocha hello-world/tests/unit/ --reporter xunit --reporter-option output=junit.xml" }, "devDependencies": { "aws-sdk": "^2.815.0", "chai": "^4.2.0", "mocha": "^8.2.1" } }
  4. 选择提交,然后再次选择提交

    现在,您已将名为 package.json 的文件添加到存储库的根目录。

sam-template.yml 文件

sam-template.yml 文件包含有关部署 Lambda 函数和 API Gateway 并将它们一起配置的说明。它遵循扩展了 AWS CloudFormation 模板规范的 AWS Serverless Application Model template specification

在本教程中,您将使用 AWS SAM 模板而不是常规 AWS CloudFormation 模板,因为 AWS SAM 提供了一种有用的 AWS::Serverless::Function 资源类型。此类型执行许多后台配置,您通常必须写出这些配置才能使用基本 CloudFormation 语法。例如,AWS::Serverless::Function 创建一个 Lambda 函数、Lambda 执行角色和启动该函数的事件源映射。如果要使用基本 CloudFormation 来编写配置,则必须对所有这些配置进行编码。

本教程使用的是预先编写的模板,您可以使用构建操作在工作流中生成一个模板。有关更多信息,请参阅部署 AWS CloudFormation 堆栈

添加 sam-template.yml 文件
  1. 在存储库中的文件中,选择创建文件

  2. 对于文件名,输入:

    sam-template.yml
  3. 在文本框中,输入以下代码:

    AWSTemplateFormatVersion: '2010-09-09' Transform: AWS::Serverless-2016-10-31 Description: > serverless-api Sample SAM Template for serverless-api # More info about Globals: https://github.com/awslabs/serverless-application-model/blob/master/docs/globals.rst Globals: Function: Timeout: 3 Resources: HelloWorldFunction: Type: AWS::Serverless::Function # For details on this resource type, see https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlessfunction Properties: CodeUri: hello-world/ Handler: app.lambdaHandler Runtime: nodejs12.x Events: HelloWorld: Type: Api # For details on this event source type, see https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#api Properties: Path: /hello Method: get Outputs: # ServerlessRestApi is an implicit API created out of the events key under Serverless::Function # Find out about other implicit resources you can reference within AWS SAM at # https://github.com/awslabs/serverless-application-model/blob/master/docs/internals/generated_resources.rst#api HelloWorldApi: Description: "API Gateway endpoint URL for the Hello World function" Value: !Sub "https://${ServerlessRestApi}.execute-api.${AWS::Region}.amazonaws.com/Prod/hello/" HelloWorldFunction: Description: "Hello World Lambda function ARN" Value: !GetAtt HelloWorldFunction.Arn HelloWorldFunctionIamRole: Description: "Implicit Lambda execution role created for the Hello World function" Value: !GetAtt HelloWorldFunctionRole.Arn
  4. 选择提交,然后再次选择提交

    现在,您已将名为 sam-template.yml 的文件添加到存储库的根文件夹下。

setup-sam.sh 文件

setup-sam.sh 文件包含有关下载和安装 AWS SAM CLI 实用工具的说明。工作流使用此实用工具来打包 hello-world 源。

添加 setup-sam.sh 文件
  1. 在存储库中的文件中,选择创建文件

  2. 对于文件名,输入:

    setup-sam.sh
  3. 在文本框中,输入以下代码:

    #!/usr/bin/env bash echo "Setting up sam" yum install unzip -y curl -LO https://github.com/aws/aws-sam-cli/releases/latest/download/aws-sam-cli-linux-x86_64.zip unzip -qq aws-sam-cli-linux-x86_64.zip -d sam-installation-directory ./sam-installation-directory/install; export AWS_DEFAULT_REGION=us-west-2

    在上述代码中,将 us-west-2 替换为您的 AWS 区域。

  4. 选择提交,然后再次选择提交

    现在,您已将名为 setup-sam.sh 的文件添加到存储库的根目录。

app.js 文件

app.js 包含 Lambda 函数代码。在本教程中,代码返回文本 hello world

添加 app.js 文件
  1. 在存储库中的文件中,选择创建文件

  2. 对于文件名,输入:

    hello-world/app.js
  3. 在文本框中,输入以下代码:

    // const axios = require('axios') // const url = 'http://checkip.amazonaws.com/'; let response; /** * * Event doc: https://docs.aws.amazon.com/apigateway/latest/developerguide/set-up-lambda-proxy-integrations.html#api-gateway-simple-proxy-for-lambda-input-format * @param {Object} event - API Gateway Lambda Proxy Input Format * * Context doc: https://docs.aws.amazon.com/lambda/latest/dg/nodejs-prog-model-context.html * @param {Object} context * * Return doc: https://docs.aws.amazon.com/apigateway/latest/developerguide/set-up-lambda-proxy-integrations.html * @returns {Object} object - API Gateway Lambda Proxy Output Format * */ exports.lambdaHandler = async (event, context) => { try { // const ret = await axios(url); response = { 'statusCode': 200, 'body': JSON.stringify({ message: 'hello world', // location: ret.data.trim() }) } } catch (err) { console.log(err); return err; } return response };
  4. 选择提交,然后再次选择提交

    现在,您已创建名为 hello-world 的文件夹和名为 app.js 的文件。

test-handler.js 文件

test-handler.js 文件包含 Lambda 函数的单元测试。

添加 test-handler.js 文件
  1. 在存储库中的文件中,选择创建文件

  2. 对于文件名,输入:

    hello-world/tests/unit/test-handler.js
  3. 在文本框中,输入以下代码:

    'use strict'; const app = require('../../app.js'); const chai = require('chai'); const expect = chai.expect; var event, context; describe('Tests index', function () { it('verifies successful response', async () => { const result = await app.lambdaHandler(event, context) expect(result).to.be.an('object'); expect(result.statusCode).to.equal(200); expect(result.body).to.be.an('string'); let response = JSON.parse(result.body); expect(response).to.be.an('object'); expect(response.message).to.be.equal("hello world"); // expect(response.location).to.be.an("string"); }); });
  4. 选择提交,然后再次选择提交

    现在,您已将名为 test-handler.js 的文件添加到 hello-world/tests/unit 文件夹下。

现在,您已添加所有源文件。

请花点时间仔细检查您的工作,确保已将所有文件置于正确的文件夹中。文件夹结构如下所示:

. |— hello-world | |— tests | |— unit | |— test-handler.js | |— app.js |— .npmignore |— README.md |— package.json |— sam-template.yml |— setup-sam.sh

步骤 6:创建并运行工作流

在此步骤中,您将创建一个工作流来打包 Lambda 源代码并对其进行部署。工作流包含以下按顺序运行的构造块:

  • 触发器 – 当您将更改推送到源存储库时,此触发器会自动启动工作流运行。有关触发器的更多信息,请参阅使用触发器自动启动工作流运行

  • 测试操作(Test)– 触发时,此操作将安装 Node package manager (npm),然后运行 npm run test 命令。此命令告知 npm 运行 package.json 文件中定义的 test 脚本。test 脚本反过来运行单元测试并生成两个报告:测试报告(junit.xml)和代码覆盖率报告(clover.xml)。有关更多信息,请参阅package.json 文件

    接下来,测试操作将 XML 报告转换为 CodeCatalyst 报告,并将其显示在 CodeCatalyst 控制台中测试操作的报告选项卡下。

    有关测试操作的更多信息,请参阅使用工作流进行测试

  • 构建操作(BuildBackend)– 在测试操作完成后,构建操作将下载并安装 AWS SAM CLI,打包 hello-world 源,然后将包复制到 Lambda 服务要求的 Amazon S3 存储桶。该操作还将输出一个名为 sam-template-packaged.yml 的新 AWS SAM 模板文件,并将此文件置于名为 buildArtifact 的输出构件中。

    有关构建操作的更多信息,请参阅使用工作流进行构建

  • 部署操作(DeployCloudFormationStack)– 在构建操作完成后,部署操作将查找构建操作(buildArtifact)所生成的输出构件,查找其中包含的 AWS SAM 模板,然后运行该模板。AWS SAM 模板创建一个用于部署无服务器应用程序的堆栈。

创建工作流
  1. 在导航窗格中,选择 CI/CD,然后选择工作流

  2. 选择创建工作流

  3. 对于源存储库,选择 codecatalyst-cfn-source-repository

  4. 对于分支,选择 main

  5. 选择创建

  6. 删除 YAML 示例代码。

  7. 添加以下 YAML 代码:

    注意

    在接下来的 YAML 代码中,如果需要,可以省略 Connections: 部分。如果您省略这些部分,则必须确保您环境的默认 IAM 角色字段中指定的角色包含步骤 2:创建 AWS 角色中描述的两个角色的权限和信任策略。有关使用默认 IAM 角色设置环境的更多信息,请参阅创建环境

    Name: codecatalyst-cfn-workflow SchemaVersion: 1.0 Triggers: - Type: PUSH Branches: - main Actions: Test: Identifier: aws/managed-test@v1 Inputs: Sources: - WorkflowSource Outputs: Reports: CoverageReport: Format: CLOVERXML IncludePaths: - "coverage/*" TestReport: Format: JUNITXML IncludePaths: - junit.xml Configuration: Steps: - Run: npm install - Run: npm run test BuildBackend: Identifier: aws/build@v1 DependsOn: - Test Environment: Name: codecatalyst-cfn-environment Connections: - Name: codecatalyst-account-connection Role: codecatalyst-build-role Inputs: Sources: - WorkflowSource Configuration: Steps: - Run: . ./setup-sam.sh - Run: sam package --template-file sam-template.yml --s3-bucket codecatalyst-cfn-s3-bucket --output-template-file sam-template-packaged.yml --region us-west-2 Outputs: Artifacts: - Name: buildArtifact Files: - "**/*" DeployCloudFormationStack: Identifier: aws/cfn-deploy@v1 DependsOn: - BuildBackend Environment: Name: codecatalyst-cfn-environment Connections: - Name: codecatalyst-account-connection Role: codecatalyst-deploy-role Inputs: Artifacts: - buildArtifact Sources: [] Configuration: name: codecatalyst-cfn-stack region: us-west-2 role-arn: arn:aws:iam::111122223333:role/StackRole template: ./sam-template-packaged.yml capabilities: CAPABILITY_IAM,CAPABILITY_AUTO_EXPAND

    在上述代码中,进行如下替换:

    • codecatalyst-cfn-environment 的两个实例替换为您的环境的名称。

    • codecatalyst-account-connection 的两个实例替换为账户连接的显示名称。显示名称可能是数字。有关更多信息,请参阅步骤 3:将 AWS 角色添加到 CodeCatalyst

    • codecatalyst-build-role 替换为您在步骤 2:创建 AWS 角色中创建的构建角色的名称。

    • codecatalyst-cfn-s3-bucket 替换为您在步骤 4:创建 Amazon S3 存储桶中创建的 Amazon S3 存储桶的名称。

    • us-west-2 的两个实例替换为您的 Amazon S3 存储桶所在区域(第一个实例)和堆栈将部署到的区域(第二个实例)。这两个区域可能不同。本教程假定两个区域都设置为 us-west-2。有关 Amazon S3 和 AWS CloudFormation 支持的区域的详细信息,请参阅《AWS 一般参考》中的 Service endpoints and quotas

    • codecatalyst-deploy-role 替换为您在步骤 2:创建 AWS 角色中创建的部署角色的名称。

    • codecatalyst-cfn-environment 替换为您在先决条件中创建的环境的名称。

    • arn:aws:iam::111122223333:role/StackRole 替换为您在步骤 2:创建 AWS 角色中创建的堆栈角色的 Amazon 资源名称(ARN)。

      注意

      如果您决定不创建构建、部署和堆栈角色,请将 codecatalyst-build-rolecodecatalyst-deploy-rolearn:aws:iam::111122223333:role/StackRole 替换为 CodeCatalystWorkflowDevelopmentRole-spaceName 角色的名称或 ARN。有关该角色的更多信息,请参阅步骤 2:创建 AWS 角色

    有关前面显示的代码中的属性的信息,请参阅“部署 AWS CloudFormation 堆栈”操作 YAML

  8. (可选)选择验证,确保 YAML 代码在提交之前有效。

  9. 选择提交

  10. 提交工作流对话框中,输入以下内容:

    1. 对于工作流文件名,保留默认值 codecatalyst-cfn-workflow

    2. 对于提交消息,输入:

      add initial workflow file
    3. 对于存储库,选择 codecatalyst-cfn-source-repository

    4. 对于分支名称,选择

    5. 选择提交

    现在,您已创建工作流。由于在工作流顶部定义了触发器,因此工作流运行会自动启动。具体而言,当您将 codecatalyst-cfn-workflow.yaml 文件提交(并推送)到源存储库时,触发器启动了工作流运行。

查看正在运行的工作流
  1. 在导航窗格中,选择 CI/CD,然后选择工作流

  2. 选择您刚刚创建的工作流:codecatalyst-cfn-workflow

  3. 选择运行选项卡。

  4. 运行 ID 列中,选择运行 ID。

  5. 选择测试以查看测试进度。

  6. 选择 BuildBackend 以查看构建进度。

  7. 选择 DeployCloudFormationStack 以查看部署进度。

    有关查看运行详细信息的更多信息,请参阅查看工作流运行状态和详细信息

  8. DeployCloudFormationStack 操作完成后,请执行以下操作:

    • 如果工作流运行成功,请转到下一过程。

    • 如果工作流在测试BuildBackend 操作上运行失败,请选择日志来解决该问题。

    • 如果工作流在 DeployCloudFormationStack 操作上运行失败,请选择部署操作,然后选择摘要选项卡。滚动到 CloudFormation 事件部分以查看详细的错误消息。如果发生了回滚,请在重新运行工作流之前,在 AWS 中通过 AWS CloudFormation 控制台删除 codecatalyst-cfn-stack 堆栈。

验证部署
  1. 在部署成功后,从顶部附近的水平菜单栏中选择变量 (7)。(请勿在右侧窗格中选择变量。)

  2. HelloWorldApi 旁边,将 https:// URL 粘贴到浏览器中。

    这将显示来自 Lambda 函数的 hello world JSON 消息,表示工作流已成功部署和配置 Lambda 函数以及 API Gateway。

    提示

    您可以使用几项配置来让 CodeCatalyst 在工作流图中显示此 URL。有关更多信息,请参阅在工作流图中显示应用程序 URL

验证单元测试结果和代码覆盖率
  1. 在工作流图中,选择测试,然后选择报告

  2. 选择 TestReport 以查看单元测试结果,或选择 CoverageReport 以查看将测试的文件的代码覆盖率详细信息,在此示例中为 app.jstest-handler.js

验证已部署的资源
  1. 登录到AWS Management Console并通过以下网址打开 API Gateway 控制台:https://console.aws.amazon.com/apigateway/

  2. 观察 AWS SAM 模板创建的 codecatalyst-cfn-stack API。API 名称来自工作流定义文件(codecatalyst-cfn-workflow.yaml)中的 Configuration/name 值。

  3. 通过 https://console.aws.amazon.com/lambda/ 打开 AWS Lambda 控制台。

  4. 在导航窗格中,选择函数

  5. 选择您的 Lambda 函数 codecatalyst-cfn-stack-HelloWorldFunction-string

  6. 您可以查看 API Gateway 是如何成为该函数的触发器的。此集成已由 AWS SAM AWS::Serverless::Function 资源类型自动配置。

步骤 7:进行更改

在此步骤中,您对 Lambda 源代码进行更改,然后提交它。此提交将启动新的工作流运行。此运行在蓝绿方案中部署新的 Lambda 函数,该方案使用 Lambda 控制台中指定的默认流量转移配置。

更改您的 Lambda 源
  1. 在 CodeCatalyst 中,导航到您的项目。

  2. 在导航窗格中,选择代码,然后选择源存储库

  3. 选择您的源存储库 codecatalyst-cfn-source-repository

  4. 更改应用程序文件:

    1. 选择 hello-world 文件夹。

    2. 选择 app.js 文件。

    3. 选择编辑

    4. 在第 23 行上,将 hello world 更改为 Tutorial complete!

    5. 选择提交,然后再次选择提交

      提交会促使启动工作流运行。此运行将失败,因为您尚未更新单元测试来反映名称更改。

  5. 更新单元测试:

    1. 选择hello-world\tests\unit\test-handler.js

    2. 选择编辑

    3. 在第 19 行上,将 hello world 更改为 Tutorial complete!

    4. 选择提交,然后再次选择提交

      提交会促使启动另一个工作流运行。此运行将成功。

  6. 在导航窗格中,选择 CI/CD,然后选择工作流

  7. 选择 codecatalyst-cfn-workflow,然后选择运行

  8. 选择最新运行的运行 ID。该运行应仍在进行中。

  9. 选择测试BuildBackendDeployCloudFormationStack 以查看工作流运行进度。

  10. 在工作流完成后,选择顶部附近的变量 (7)

  11. HelloWorldApi 旁边,将 https:// URL 粘贴到浏览器中。

    一条 Tutorial complete! 消息将显示在浏览器中,这表示您已成功部署新应用程序。

清理

清理本教程中使用的文件和服务以免被收取费用。

在 CodeCatalyst 控制台中进行清理
  1. 通过访问 https://codecatalyst.aws/ 打开 CodeCatalyst 控制台。

  2. 删除 codecatalyst-cfn-workflow

  3. 删除 codecatalyst-cfn-environment

  4. 删除 codecatalyst-cfn-source-repository

  5. 删除 codecatalyst-cfn-project

在 AWS Management Console中进行清理
  1. 在 CloudFormation 中进行清理,如下所示:

    1. 打开 AWS CloudFormation 控制台,地址:https://console.aws.amazon.com/cloudformation

    2. 删除codecatalyst-cfn-stack

      删除堆栈将从 API Gateway 和 Lambda 服务中移除所有教程资源。

  2. 在 Amazon S3 中进行清理,如下所示:

    1. 通过以下网址打开 Simple Storage Service(Amazon S3)控制台:https://console.aws.amazon.com/s3/

    2. 选择 codecatalyst-cfn-s3-bucket

    3. 删除存储桶内容。

    4. 删除存储桶。

  3. 在 IAM 中进行清理,如下所示:

    1. 通过 https://console.aws.amazon.com/iam/ 打开 IAM 控制台。

    2. 删除codecatalyst-deploy-policy

    3. 删除codecatalyst-build-policy

    4. 删除codecatalyst-stack-policy

    5. 删除codecatalyst-deploy-role

    6. 删除codecatalyst-build-role

    7. 删除codecatalyst-stack-role

在本教程中,您已了解如何使用 CodeCatalyst 工作流和部署 AWS CloudFormation 堆栈操作来将无服务器应用程序部署为 CloudFormation 堆栈。