AWS Lambda
开发人员指南

使用 AWS CodePipeline 为 Lambda 应用程序构建持续交付管道

您可以使用 AWS CodePipeline 为 Lambda 应用程序创建持续交付管道。CodePipeline 结合了源代码控制、构建和部署资源,以创建一个在您更改应用程序源代码时运行的管道。

在本教程中,您将创建以下资源。

  • 存储库 – AWS CodeCommit 中的 Git 存储库。当您推送更改时,管道将源代码复制到 Amazon S3 存储桶并将其传递给构建项目。

  • 构建项目 – 从管道获取源代码并打包应用程序的 AWS CodeBuild 构建。源包括构建规范,其中包含用于安装依赖项和为部署准备 AWS 无服务器应用程序模型 (AWS SAM) 模板的命令。

  • 部署配置 – 管道的部署阶段定义一组操作,这些操作从构建输出获取 AWS SAM 模板,在 AWS CloudFormation 中创建更改集,并执行更改集以更新应用程序的 AWS CloudFormation 堆栈。

  • 角色 – 管道、构建和部署各有一个允许其管理 AWS 资源的服务角色。在创建这些资源时,控制台会创建管道和构建角色。您负责创建允许 AWS CloudFormation 管理应用程序堆栈的角色。

管道将存储库中的单个分支映射到单个 AWS CloudFormation 堆栈。您可以创建其他管道来为同一存储库中的其他分支添加环境。此外,您还可以向管道添加阶段,以进行测试、暂存和手动审批。有关 AWS CodePipeline 的更多信息,请参阅什么是 AWS CodePipeline

先决条件

本教程假设您对基本 Lambda 操作和 Lambda 控制台有一定了解。如果尚不了解,请按照开始使用 AWS Lambda中的说明创建您的第一个 Lambda 函数。

为了遵循本指南中的步骤,您需要命令行终端或外壳,以便运行命令。命令显示在列表中,以提示符 ($) 和当前目录名称(如果有)开头:

~/lambda-project$ this is a command this is output

对于长命令,使用转义字符 (\) 将命令拆分到多行中。

在 Linux 和 macOS 中,可使用您首选的外壳程序和程序包管理器。在 Windows 10 中,您可以 安装 Windows Subsystem for Linux,获取 Ubuntu 和 Bash 与 Windows 集成的版本。

在构建阶段,构建脚本将构件上传到 Amazon Simple Storage Service (Amazon S3)。您可以使用现有存储桶,也可以为管道创建新的存储桶。使用 AWS CLI 创建存储桶。

$ aws s3 mb s3://lambda-deployment-artifacts-123456789012

创建 AWS CloudFormation 角色

创建一个角色,以授予 AWS CloudFormation 访问 AWS 资源的权限。

创建 AWS CloudFormation 角色

  1. 打开 IAM 控制台中的“角色”页面

  2. 选择 Create role (创建角色)

  3. 创建具有以下属性的角色。

    • Trusted entity (可信任的实体)AWS CloudFormation

    • Permissions (权限)AWSLambdaExecute

    • Role name (角色名称)cfn-lambda-pipeline

  4. 打开角色。在 Permissions 选项卡下,选择 Add inline policy

  5. 创建策略中,选择 JSON 选项卡,然后添加以下策略。

    { "Statement": [ { "Action": [ "apigateway:*", "codedeploy:*", "lambda:*", "cloudformation:CreateChangeSet", "iam:GetRole", "iam:CreateRole", "iam:DeleteRole", "iam:PutRolePolicy", "iam:AttachRolePolicy", "iam:DeleteRolePolicy", "iam:DetachRolePolicy", "iam:PassRole", "s3:GetObjectVersion", "s3:GetBucketVersioning" ], "Resource": "*", "Effect": "Allow" } ], "Version": "2012-10-17" }

设置存储库

创建 AWS CodeCommit 存储库来存储项目文件。有关更多信息,请参阅 CodeCommit 用户指南中的设置

创建存储库

  1. 打开开发人员工具控制台

  2. Source (源) 下,选择 Repositories (存储库)

  3. 选择 Create repository

  4. 按照说明创建和克隆名为 lambda-pipeline-repo 的存储库。

在存储库文件夹中创建以下文件。

例 index.js

一个返回当前时间的 Lambda 函数。

var time = require('time'); exports.handler = (event, context, callback) => { var currentTime = new time.Date(); currentTime.setTimezone("America/Los_Angeles"); callback(null, { statusCode: '200', body: 'The time in Los Angeles is: ' + currentTime.toString(), }); };

例 template.yaml

定义应用程序的 SAM 模板

AWSTemplateFormatVersion: '2010-09-09' Transform: AWS::Serverless-2016-10-31 Description: Outputs the time Resources: TimeFunction: Type: AWS::Serverless::Function Properties: Handler: index.handler Runtime: nodejs8.10 CodeUri: ./ Events: MyTimeApi: Type: Api Properties: Path: /TimeResource Method: GET

例 buildspec.yml

安装所需的包并将部署包上传到 Amazon S3 的 AWS CodeBuild 构建规范。请将突出显示的文本替换为您的存储桶的名称。

version: 0.2 phases: install: commands: - npm install time - export BUCKET=lambda-deployment-artifacts-123456789012 - aws cloudformation package --template-file template.yaml --s3-bucket $BUCKET --output-template-file outputtemplate.yaml artifacts: type: zip files: - template.yaml - outputtemplate.yaml

提交并将文件推送到 CodeCommit。

~/lambda-pipeline-repo$ git add . ~/lambda-pipeline-repo$ git commit -m "project files" ~/lambda-pipeline-repo$ git push

创建管道

创建一个部署应用程序的管道。管道监视存储库更改,运行 AWS CodeBuild 构建来创建部署包,并使用 AWS CloudFormation 部署应用程序。在创建管道的过程中,您还可以创建 AWS CodeBuild 构建项目。

创建管道

  1. 打开开发人员工具控制台

  2. Pipeline (管道) 下,选择 Pipelines (管道)

  3. 选择 Create pipeline (创建管道)

  4. 配置管道设置,然后选择 Next (下一步)

    • Pipeline name (管道名称)lambda-pipeline

    • Service role (服务角色)New service role

    • Artifact store (构件存储)默认位置

  5. 配置源阶段设置,然后选择 Next (下一步)

    • Source provider (源提供商)AWS CodeCommit

    • Repository name (存储库名称)lambda-pipeline-repo

    • Branch name (分支名称)master

    • Change detection options (更改检测选项)Amazon CloudWatch Events

  6. 对于 Build provider (构建提供商),选择 AWS CodeBuild,然后选择 Create project (创建项目)

  7. 配置构建项目设置,然后选择 Continue to CodePipeline (前往 CodePipeline)

    • Project name (项目名称)lambda-pipeline-build

    • Operating system (操作系统)Ubuntu

    • Runtime (运行时)Node.js

    • Runtime version (运行时版本)aws/codebuild/nodejs:8.11.0

    • Image version (映像版本)Latest (最新)

    • Buildspec name (构建规范名称)buildspec.yml

  8. 选择 Next (下一步)

  9. 配置部署阶段设置,然后选择 Next (下一步)

    • Deploy provider (部署提供商)AWS CloudFormation

    • Action mode (操作模式)Create or replace a change set (创建或替换更改集)

    • Stack name (堆栈名称)lambda-pipeline-stack

    • Change set name (更改集名称)lambda-pipeline-changeset

    • Template (模板)BuildArtifact::outputtemplate.yaml

    • Capabilities (功能)CAPABILITY_IAM

    • Role name (角色名称)cfn-lambda-pipeline

  10. 选择 Create pipeline (创建管道)

管道首次运行将失败,因为它需要其他权限。在下一部分中,您将向为构建阶段生成的角色添加权限。

更新构建阶段角色

在构建阶段,AWS CodeBuild 需要将构建输出上传到 Amazon S3 存储桶的权限。

更新角色

  1. 打开 IAM 控制台中的“角色”页面

  2. 选择 code-build-lamba-pipeline-service-role

  3. 选择 Attach policies (附加策略)。​

  4. 附加 AmazonS3FullAccess

完成部署阶段

部署阶段有一个操作 - 为管理 Lambda 应用程序的 AWS CloudFormation 堆栈创建更改集。添加第二个操作 - 执行更改集以完成部署。

更新部署阶段

  1. 开发人员工具控制台中打开您的管道。

  2. 选择 Edit (编辑)

  3. 然后转到 Deploy (部署),选择 Edit stage (编辑阶段)

  4. 选择 Add action group (添加操作组)

  5. 配置部署阶段设置,然后选择 Next (下一步)

    • Action name (操作名称)execute-changeset

    • Deploy provider (部署提供商)AWS CloudFormation

    • Input artifacts (输入构件)BuildArtifact

    • Action mode (操作模式)Execute a change set (执行更改集)

    • Stack name (堆栈名称)lambda-pipeline-stack

    • Change set name (更改集名称)lambda-pipeline-changeset

  6. 选择 Save

  7. 选择完成

  8. 选择 Save

  9. 选择 Release change (发布更改) 以运行管道。

您的管道已就绪。将更改推送到主分支即可触发部署。