教程:部署无服务器应用程序
在本教程中,您将了解如何使用工作流构建、测试无服务器应用程序并将其部署为 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 函数文件。
有关源存储库的更多信息,请参阅创建源存储库。
创建源存储库
-
在 CodeCatalyst 的导航窗格中,选择代码,然后选择源存储库。
-
选择添加存储库,然后选择创建存储库。
-
在存储库名称中,输入:
codecatalyst-cfn-source-repository
-
选择创建。
现在,您已经创建了一个名为 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-
角色的角色,而不是前面列出的三个角色。有关更多信息,请参阅为您的账户和空间创建 CodeCatalystWorkflowDevelopmentRole-spaceName 角色。了解 spaceName
CodeCatalystWorkflowDevelopmentRole-
角色具有非常广泛的权限,这可能会带来安全风险。我们建议您仅在教程和安全要求较低的场景中使用此角色。本教程假定您创建的是前面列出的三个角色。spaceName
注意
还需要一个 Lambda 执行角色,但您无需立即创建此角色,因为当您在步骤 5 中运行工作流时,sam-template.yml
文件会为您创建它。
创建部署角色
-
按如下步骤操作,为角色创建策略:
-
登录到 AWS。
打开 IAM 控制台:https://console.aws.amazon.com/iam/
。 -
在导航窗格中,选择策略。
-
选择创建策略。
-
选择 JSON 选项卡。
-
删除现有代码。
-
粘贴以下代码:
{ "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": "*"
-
选择下一步:标签。
-
选择下一步:审核。
-
在名称中,输入:
codecatalyst-deploy-policy
-
选择创建策略。
现在,您已经创建了权限策略。
-
-
按如下步骤操作,创建部署角色:
-
在导航窗格中,选择角色,然后选择创建角色。
-
选择自定义信任策略。
-
删除现有的自定义信任策略。
-
添加以下自定义信任策略:
{ "Version": "2012-10-17", "Statement": [ { "Sid": "", "Effect": "Allow", "Principal": { "Service": [ "codecatalyst-runner.amazonaws.com", "codecatalyst.amazonaws.com" ] }, "Action": "sts:AssumeRole" } ] }
-
选择下一步。
-
在权限策略中,搜索
codecatalyst-deploy-policy
并选中其复选框。 -
选择下一步。
-
对于角色名称,输入:
codecatalyst-deploy-role
-
对于角色描述,输入:
CodeCatalyst deploy role
-
选择创建角色。
现在,您已创建一个具有信任策略和权限策略的部署角色。
-
-
按如下步骤操作,获取部署角色 ARN:
-
在导航窗格中,选择角色。
-
在搜索框中,输入刚创建的角色的名称(
codecatalyst-deploy-role
)。 -
从列表中选择该角色。
此时将显示该角色的摘要页面。
-
在顶部,复制 ARN 值。
现在,您已创建具有相应权限的部署角色并已获取其 ARN。
-
创建构建角色
-
按如下步骤操作,为角色创建策略:
-
登录到 AWS。
打开 IAM 控制台:https://console.aws.amazon.com/iam/
。 -
在导航窗格中,选择策略。
-
选择创建策略。
-
选择 JSON 选项卡。
-
删除现有代码。
-
粘贴以下代码:
{ "Version": "2012-10-17", "Statement": [{ "Action": [ "s3:PutObject", "iam:PassRole" ], "Resource": "*", "Effect": "Allow" }] }
注意
第一次使用该角色运行工作流操作时,请在资源策略语句中使用以下通配符,然后在策略可用后使用资源名称缩小策略范围。
"Resource": "*"
-
选择下一步:标签。
-
选择下一步:审核。
-
在名称中,输入:
codecatalyst-build-policy
-
选择创建策略。
现在,您已经创建了权限策略。
-
-
按如下步骤操作,创建构建角色:
-
在导航窗格中,选择角色,然后选择创建角色。
-
选择自定义信任策略。
-
删除现有的自定义信任策略。
-
添加以下自定义信任策略:
{ "Version": "2012-10-17", "Statement": [ { "Sid": "", "Effect": "Allow", "Principal": { "Service": [ "codecatalyst-runner.amazonaws.com", "codecatalyst.amazonaws.com" ] }, "Action": "sts:AssumeRole" } ] }
-
选择下一步。
-
在权限策略中,搜索
codecatalyst-build-policy
并选中其复选框。 -
选择下一步。
-
对于角色名称,输入:
codecatalyst-build-role
-
对于角色描述,输入:
CodeCatalyst build role
-
选择创建角色。
现在,您已创建一个具有信任策略和权限策略的构建角色。
-
-
按如下步骤操作,获取构建角色 ARN:
-
在导航窗格中,选择角色。
-
在搜索框中,输入刚创建的角色的名称(
codecatalyst-build-role
)。 -
从列表中选择该角色。
此时将显示该角色的摘要页面。
-
在顶部,复制 ARN 值。
现在,您已创建具有相应权限的构建角色并已获取其 ARN。
-
创建堆栈角色
-
使用要用于部署堆栈的账户登录 AWS。
通过 https://console.aws.amazon.com/iam/
打开 IAM 控制台。 -
按如下步骤操作,创建堆栈角色:
-
在导航窗格中,选择角色。
-
选择创建角色。
-
选择 AWS 服务。
-
在使用案例部分中,从下拉列表中选择 CloudFormation。
-
选择 CloudFormation 单选按钮。
-
选择底部的下一步。
-
使用搜索框找到以下权限策略,然后选中它们对应的复选框。
注意
如果您搜索一个策略,但该策略未显示,请务必选择清除筛选条件,然后重试。
-
CloudWatchFullAccess
-
AWSCloudFormationFullAccess
-
IAMFullAccess
-
AWSLambda_FullAccess
-
AmazonAPIGatewayAdministrator
-
AmazonS3FullAccess
-
AmazonEC2ContainerRegistryFullAccess
第一个策略可用于访问 CloudWatch,以便在警报发生时启用堆栈回滚。
其余策略使 AWS SAM 能够访问本教程中将部署的堆栈中的服务和资源。有关授予权限的更多信息,请参阅 AWS Serverless Application Model 开发人员指南的 权限。
-
-
选择下一步。
-
对于角色名称,输入:
codecatalyst-stack-role
-
选择创建角色。
-
-
按如下步骤操作,获取堆栈角色的 ARN:
-
在导航窗格中,选择角色。
-
在搜索框中,输入刚创建的角色的名称(
codecatalyst-stack-role
)。 -
从列表中选择该角色。
-
在摘要部分中,复制 ARN 值。稍后您将需要用到它。
现在,您已创建具有相应权限的堆栈角色并已获取其 ARN。
-
步骤 3:将 AWS 角色添加到 CodeCatalyst
在此步骤中,您将构建角色(codecatalyst-build-role
)和部署角色(codecatalyst-deploy-role
)添加到空间中的 CodeCatalyst 账户连接。
注意
您无需将堆栈角色(codecatalyst-stack-role
)添加到连接。这是因为在使用部署角色在 CodeCatalyst 和 AWS 之间建立连接后,CloudFormation(不是 CodeCatalyst)将使用堆栈角色。由于 CodeCatalyst 不使用堆栈角色来获取对 AWS 的访问权限,因此无需将其与账户连接关联。
将构建角色和部署角色添加到账户连接
-
在 CodeCatalyst 中,导航到您的空间。
-
选择 AWS accounts (账户)。此时将显示账户连接列表。
-
选择代表您在其中创建构建角色和部署角色的 AWS 账户的账户连接。
-
选择在 AWS 管理控制台中管理角色。
这将显示将 IAM 角色添加到 Amazon CodeCatalyst 空间页面。您可能需要登录才能访问该页面。
-
选择添加您在 IAM 中创建的现有角色。
这将显示一个下拉列表。该列表显示所有具有包含
codecatalyst-runner.amazonaws.com
和codecatalyst.amazonaws.com
服务主体的信任策略的 IAM 角色。 -
在该下拉列表中,选择
codecatalyst-build-role
,然后选择添加角色。 -
选择添加 IAM 角色,再选择添加您在 IAM 中创建的现有角色,然后在下拉列表中选择
codecatalyst-deploy-role
。选择 Add role (添加角色)。现在,您已将构建角色和部署角色添加到您的空间。
-
复制 Amazon CodeCatalyst 显示名称的值。您稍后在创建工作流时将需要此值。
步骤 4:创建 Amazon S3 存储桶
在此步骤中,您将创建可在其中存储无服务器应用程序的部署包 .zip 文件的 Amazon S3 存储桶。
创建 Amazon S3 存储桶
通过以下网址打开 Simple Storage Service(Amazon S3)控制台:https://console.aws.amazon.com/s3/
。 -
在主窗格中,选择创建存储桶。
-
对于存储桶名称,输入:
codecatalyst-cfn-s3-bucket
-
对于 AWS Region(亚马逊云科技区域),选择一个区域。本教程假设您选择了美国西部(俄勒冈州)us-west-2。有关 Amazon S3 支持的区域的信息,请参阅《AWS 一般参考》中的 Amazon Simple Storage Service endpoints and quotas。
-
在页面底部选择创建存储桶。
现在,您已经在美国西部(俄勒冈州)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 文件
通过访问 https://codecatalyst.aws/
打开 CodeCatalyst 控制台。 -
选择您的项目
codecatalyst-cfn-project
。 -
在导航窗格中,选择代码,然后选择源存储库。
-
从源存储库列表中,选择您的存储库
codecatalyst-cfn-source-repository
。 -
在文件中,选择创建文件。
-
对于文件名,输入:
.npmignore
-
在文本框中,输入以下代码:
tests/*
-
选择提交,然后再次选择提交。
现在,您已在存储库的根目录中创建名为
.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 文件
-
在存储库中的文件中,选择创建文件。
-
对于文件名,输入:
package.json
-
在文本框中,输入以下代码:
{ "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" } }
-
选择提交,然后再次选择提交。
现在,您已将名为
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 文件
-
在存储库中的文件中,选择创建文件。
-
对于文件名,输入:
sam-template.yml
-
在文本框中,输入以下代码:
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
-
选择提交,然后再次选择提交。
现在,您已将名为
sam-template.yml
的文件添加到存储库的根文件夹下。
setup-sam.sh 文件
setup-sam.sh
文件包含有关下载和安装 AWS SAM CLI 实用工具的说明。工作流使用此实用工具来打包 hello-world
源。
添加 setup-sam.sh 文件
-
在存储库中的文件中,选择创建文件。
-
对于文件名,输入:
setup-sam.sh
-
在文本框中,输入以下代码:
#!/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 区域。 -
选择提交,然后再次选择提交。
现在,您已将名为
setup-sam.sh
的文件添加到存储库的根目录。
app.js 文件
app.js
包含 Lambda 函数代码。在本教程中,代码返回文本 hello world
。
添加 app.js 文件
-
在存储库中的文件中,选择创建文件。
-
对于文件名,输入:
hello-world/app.js
-
在文本框中,输入以下代码:
// 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 };
-
选择提交,然后再次选择提交。
现在,您已创建名为
hello-world
的文件夹和名为app.js
的文件。
test-handler.js 文件
test-handler.js
文件包含 Lambda 函数的单元测试。
添加 test-handler.js 文件
-
在存储库中的文件中,选择创建文件。
-
对于文件名,输入:
hello-world/tests/unit/test-handler.js
-
在文本框中,输入以下代码:
'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"); }); });
-
选择提交,然后再次选择提交。
现在,您已将名为
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 模板创建一个用于部署无服务器应用程序的堆栈。
创建工作流
-
在导航窗格中,选择 CI/CD,然后选择工作流。
-
选择创建工作流。
-
对于源存储库,选择
codecatalyst-cfn-source-repository
。 -
对于分支,选择
main
。 -
选择创建。
-
删除 YAML 示例代码。
-
添加以下 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-bucketcodecatalyst-cfn-s3-bucket
--output-template-file sam-template-packaged.yml --regionus-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-role
、codecatalyst-deploy-role
和arn:aws:iam::111122223333:role/StackRole
替换为CodeCatalystWorkflowDevelopmentRole-
角色的名称或 ARN。有关该角色的更多信息,请参阅步骤 2:创建 AWS 角色。spaceName
有关前面显示的代码中的属性的信息,请参阅“部署 AWS CloudFormation 堆栈”操作 YAML。
-
-
(可选)选择验证,确保 YAML 代码在提交之前有效。
-
选择提交。
-
在提交工作流对话框中,输入以下内容:
-
对于工作流文件名,保留默认值
codecatalyst-cfn-workflow
。 -
对于提交消息,输入:
add initial workflow file
-
对于存储库,选择 codecatalyst-cfn-source-repository。
-
对于分支名称,选择主。
-
选择提交。
现在,您已创建工作流。由于在工作流顶部定义了触发器,因此工作流运行会自动启动。具体而言,当您将
codecatalyst-cfn-workflow.yaml
文件提交(并推送)到源存储库时,触发器启动了工作流运行。 -
查看正在运行的工作流
-
在导航窗格中,选择 CI/CD,然后选择工作流。
-
选择您刚刚创建的工作流:
codecatalyst-cfn-workflow
。 -
选择运行选项卡。
-
在运行 ID 列中,选择运行 ID。
-
选择测试以查看测试进度。
-
选择 BuildBackend 以查看构建进度。
-
选择 DeployCloudFormationStack 以查看部署进度。
有关查看运行详细信息的更多信息,请参阅查看工作流运行状态和详细信息。
-
在 DeployCloudFormationStack 操作完成后,请执行以下操作:
-
如果工作流运行成功,请转到下一过程。
-
如果工作流在测试或 BuildBackend 操作上运行失败,请选择日志来解决该问题。
-
如果工作流在 DeployCloudFormationStack 操作上运行失败,请选择部署操作,然后选择摘要选项卡。滚动到 CloudFormation 事件部分以查看详细的错误消息。如果发生了回滚,请在重新运行工作流之前,在 AWS 中通过 AWS CloudFormation 控制台删除
codecatalyst-cfn-stack
堆栈。
-
验证部署
-
在部署成功后,从顶部附近的水平菜单栏中选择变量 (7)。(请勿在右侧窗格中选择变量。)
-
在 HelloWorldApi 旁边,将
https://
URL 粘贴到浏览器中。这将显示来自 Lambda 函数的 hello world JSON 消息,表示工作流已成功部署和配置 Lambda 函数以及 API Gateway。
提示
您可以使用几项配置来让 CodeCatalyst 在工作流图中显示此 URL。有关更多信息,请参阅在工作流图中显示应用程序 URL。
验证单元测试结果和代码覆盖率
-
在工作流图中,选择测试,然后选择报告。
-
选择 TestReport 以查看单元测试结果,或选择 CoverageReport 以查看将测试的文件的代码覆盖率详细信息,在此示例中为
app.js
和test-handler.js
。
验证已部署的资源
登录到AWS Management Console并通过以下网址打开 API Gateway 控制台:https://console.aws.amazon.com/apigateway/
。 -
观察 AWS SAM 模板创建的 codecatalyst-cfn-stack API。API 名称来自工作流定义文件(
codecatalyst-cfn-workflow.yaml
)中的Configuration/name
值。 通过 https://console.aws.amazon.com/lambda/
打开 AWS Lambda 控制台。 -
在导航窗格中,选择函数。
-
选择您的 Lambda 函数
codecatalyst-cfn-stack-HelloWorldFunction-
。string
-
您可以查看 API Gateway 是如何成为该函数的触发器的。此集成已由 AWS SAM
AWS::Serverless::Function
资源类型自动配置。
步骤 7:进行更改
在此步骤中,您对 Lambda 源代码进行更改,然后提交它。此提交将启动新的工作流运行。此运行在蓝绿方案中部署新的 Lambda 函数,该方案使用 Lambda 控制台中指定的默认流量转移配置。
更改您的 Lambda 源
-
在 CodeCatalyst 中,导航到您的项目。
-
在导航窗格中,选择代码,然后选择源存储库。
-
选择您的源存储库
codecatalyst-cfn-source-repository
。 -
更改应用程序文件:
-
选择
hello-world
文件夹。 -
选择
app.js
文件。 -
选择编辑。
-
在第 23 行上,将
hello world
更改为Tutorial complete!
。 -
选择提交,然后再次选择提交。
提交会促使启动工作流运行。此运行将失败,因为您尚未更新单元测试来反映名称更改。
-
-
更新单元测试:
-
选择
hello-world\tests\unit\test-handler.js
。 -
选择编辑。
-
在第 19 行上,将
hello world
更改为Tutorial complete!
。 -
选择提交,然后再次选择提交。
提交会促使启动另一个工作流运行。此运行将成功。
-
-
在导航窗格中,选择 CI/CD,然后选择工作流。
-
选择
codecatalyst-cfn-workflow
,然后选择运行。 -
选择最新运行的运行 ID。该运行应仍在进行中。
-
选择测试、BuildBackend 和 DeployCloudFormationStack 以查看工作流运行进度。
-
在工作流完成后,选择顶部附近的变量 (7)。
-
在 HelloWorldApi 旁边,将
https://
URL 粘贴到浏览器中。一条
Tutorial complete!
消息将显示在浏览器中,这表示您已成功部署新应用程序。
清理
清理本教程中使用的文件和服务以免被收取费用。
在 CodeCatalyst 控制台中进行清理
通过访问 https://codecatalyst.aws/
打开 CodeCatalyst 控制台。 -
删除
codecatalyst-cfn-workflow
。 -
删除
codecatalyst-cfn-environment
。 -
删除
codecatalyst-cfn-source-repository
。 -
删除
codecatalyst-cfn-project
。
在 AWS Management Console中进行清理
-
在 CloudFormation 中进行清理,如下所示:
打开 AWS CloudFormation 控制台,地址:https://console.aws.amazon.com/cloudformation
。 -
删除
codecatalyst-cfn-stack
。删除堆栈将从 API Gateway 和 Lambda 服务中移除所有教程资源。
-
在 Amazon S3 中进行清理,如下所示:
通过以下网址打开 Simple Storage Service(Amazon S3)控制台:https://console.aws.amazon.com/s3/
。 -
选择
codecatalyst-cfn-s3-bucket
。 -
删除存储桶内容。
-
删除存储桶。
-
在 IAM 中进行清理,如下所示:
通过 https://console.aws.amazon.com/iam/
打开 IAM 控制台。 -
删除
codecatalyst-deploy-policy
。 -
删除
codecatalyst-build-policy
。 -
删除
codecatalyst-stack-policy
。 -
删除
codecatalyst-deploy-role
。 -
删除
codecatalyst-build-role
。 -
删除
codecatalyst-stack-role
。
在本教程中,您已了解如何使用 CodeCatalyst 工作流和部署 AWS CloudFormation 堆栈操作来将无服务器应用程序部署为 CloudFormation 堆栈。