AWS Lambda
开发人员指南
AWS 服务或AWS文档中描述的功能,可能因地区/位置而异。点 击 Getting Started with Amazon AWS to see specific differences applicable to the China (Beijing) Region.

基于 Lambda 应用程序的自动化部署

在上一部分中,您了解到如何创建 SAM 模板、生成部署程序包并使用 AWS CLI 手动部署无服务器应用程序。在本部分,您将利用以下 AWS 服务完全自动化部署过程。

  • CodePipeline:您使用 CodePipeline 建模、可视化和自动化释放无服务器应用程序必需的步骤。有关更多信息,请参阅什么是 AWS CodePipeline?

  • CodeBuild:您使用 CodeBuild 构建、本地测试和打包无服务器应用程序。有关更多信息,请参阅什么是 AWS CodeBuild?

  • AWS CloudFormation:您使用 AWS CloudFormation 部署应用程序。有关更多信息,请参阅什么是 AWS CloudFormation?

为您的无服务器应用程序构建管道

在下面的教程中,您将创建自动化部署无服务器应用程序的 AWS CodePipeline。首先,您将要设置源阶段以触发您的管道。在本教程中:

  • 我们将使用 GitHub。有关如何创建 GitHub 存储库的说明,请参阅在 GitHub 中创建存储库

  • 您需要创建一个 AWS CloudFormation 角色并向该角色添加 AWSLambdaExecute 策略,如下所述:

    1. 登录 AWS 管理控制台 并通过以下网址打开 IAM 控制台 https://console.amazonaws.cn/iam/

    2. 按照 IAM 用户指南 中的创建向 AWS 服务委托权限的角色创建一个 IAM 角色 (执行角色),然后转到为 AWS 服务创建角色部分。遵循步骤创建角色时,请注意以下事项:

      • Select Role Type 中,选择 AWS Service Roles,然后选择 AWS CloudFormation。这将为 AWS CloudFormation 服务授予担任该角色的权限。

      • Attach Policy 中,选择 AWSLambdaExecute

      • Role Name 中,使用在 AWS 账户内唯一的名称 (例如 cloudformation-lambda-execution-role),然后选择 Create role

      • 打开刚才创建的角色,在 Permissions 选项卡下,展开 Inline Policies,然后选择 click here 链接。

      • 选择 Custom Policy,然后选择 Select

      • Policy Name 中,为您的自定义策略输入一个名称,然后将以下内容粘贴到 Policy Document 字段中:

        Copy
        { "Statement": [ { "Action": [ "s3:GetObject", "s3:GetObjectVersion", "s3:GetBucketVersioning" ], "Resource": "*", "Effect": "Allow" }, { "Action": [ "s3:PutObject" ], "Resource": [ "arn:aws:s3:::codepipeline*" ], "Effect": "Allow" }, { "Action": [ "lambda:*" ], "Resource": [ "arn:aws:lambda:region:account-id:function:*" ], "Effect": "Allow" }, { "Action": [ "apigateway:*" ], "Resource": [ "arn:aws:apigateway:region::*" ], "Effect": "Allow" }, { "Action": [ "iam:GetRole", "iam:CreateRole", "iam:DeleteRole" ], "Resource": [ "arn:aws:iam::account-id:role/*" ], "Effect": "Allow" }, { "Action": [ "iam:AttachRolePolicy", "iam:DetachRolePolicy" ], "Resource": [ "arn:aws:iam::account-id:role/*" ], "Effect": "Allow" }, { "Action": [ "iam:PassRole" ], "Resource": [ "*" ], "Effect": "Allow" }, { "Action": [ "cloudformation:CreateChangeSet" ], "Resource": [ "arn:aws:cloudformation:region:aws:transform/Serverless-2016-10-31" ], "Effect": "Allow" } ], "Version": "2012-10-17" }
      • 选择 Validate Policy,然后选择 Apply Policy

步骤 1:设置 存储库

要设置您的存储库,请执行以下操作:

  • 添加包含以下代码的 index.js 文件

    Copy
    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(), }); };
  • 添加包含以下内容的 samTemplate.yaml 文件。这是在您的应用程序中定义资源的 SAM 模板。此 SAM 模板定义 API 网关 触发的 Lambda 函数。请注意,runtime 参数使用 nodejs6.10,但您还可以指定 nodejs4.3。有关 AWS SAM 的更多信息,请参阅 AWS 无服务器应用程序模型

    Copy
    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: nodejs6.10 CodeUri: ./ Events: MyTimeApi: Type: Api Properties: Path: /TimeResource Method: GET
  • 添加 buildspec.yml 文件。构建规范是构建命令和相关设置的集合,以 YAML 格式并且 AWS CodeBuild 可用其运行某一版本。有关更多信息,请参阅为 AWS CodeBuild 构建规范参考。在本例中,以下是构建操作过程:

    • 使用 npm 来安装时间程序包。

    • 运行 Package 命令,以在管道中为后续部署步骤准备部署程序包。有关程序包命令的更多信息,请参阅将本地项目上传至 S3 存储桶

      Copy
      version: 0.1 phases: install: commands: - npm install time - aws cloudformation package --template-file samTemplate.yaml --s3-bucket bucket-name --output-template-file NewSamTemplate.yaml artifacts: type: zip files: - NewSamTemplate.yaml

      请注意,您需要为您的 Amazon S3 存储桶提供 --s3-bucket 参数值,这类似于您将要采取的步骤 (如果您打算使用 SAM 手动打包部署程序包),正如之前教程中包装步骤所述。

步骤 2:创建您的管道

按照以下步骤创建您的 AWS CodePipeline。

  1. 登录 AWS 管理控制台并打开 AWS CodePipeline 控制台。

  2. 选择 Get Started Now

  3. 管道名称:中,输入您的管道名称,然后选择下一步

  4. 源提供商:中,选择 GitHub

  5. 选择连接到 GitHub:,然后选择您想要连接的存储库分支。每个推送到您选择的分支的 Git 都将触发管道。选择下一步

  6. 选择 AWS CodeBuild 作为您的构建提供商

  7. 选择 Create a new build project,然后输入项目名称。

  8. 选择 Ubuntu 作为操作系统。

  9. 选择 Node.js 作为运行时。

  10. 版本中,选择 aws/codebuild/nodejs:4.3.2

  11. 选择 Save build project

    注意

    系统将代表您自动创建 AWS CodeBuild 服务角色。

    选择下一步

  12. 部署提供商:中,选择 AWS CloudFormation

    通过选择此选项,AWS CloudFormation 命令将用于部署 SAM 模板。有关更多信息,请参阅 AWS CloudFormation 内的无服务器资源

  13. Action mode: 中,选择 create or replace a change set

  14. 堆栈名称:中,输入 MyBetaStack

  15. 更改集名称:中,输入 MyChangeSet

  16. 模板文件:中,输入 NewSamTemplate.yaml

  17. 功能: 中,选择 CAPABILITY_IAM

  18. Role 中,选择您在本教程开始时创建的 AWS CloudFormation 角色,然后选择 Next step

  19. 选择创建角色。选择下一步,然后选择允许。选择下一步

  20. 检查您的管道,然后选择创建管道

步骤 3:更新生成的服务策略

按照下述步骤操作,允许 CodeBuild 将构建项目上传到 Amazon S3 存储桶。

  1. 转至 IAM 管理控制台。

  2. 选择 Roles

  3. 打开为您的项目生成的服务角色,通常为 code-build-project-name-service-role

  4. Permissions 选项卡下,选择 Attach Policy

  5. Permissions 选项卡下,选择 Create Role Policy

  6. 选择 Policy Generator,然后选择 Select

  7. AWS Service 列表中,选择 Amazon S3

  8. Actions 中,选择 PutObject

  9. Amazon Resource Name (ARN) 中,输入 arn:aws:s3:::bucket-name*

  10. 选择 Add Statement,然后选择 Next Step

  11. Review Policy 中,选择 Validate Policy,然后选择 Apply Policy

步骤 4:完成您的测试部署阶段

请按照以下步骤完成您的测试阶段。

  1. 选择 Edit

  2. 选择

    作为您测试阶段的图标。

  3. 在测试阶段,选择现有操作之后的 + Action 图标。

  4. 类别:中,选择部署

  5. 操作:中,输入 execute_cs

  6. 部署提供商:中,选择 AWS CloudFormation

  7. Action mode: 中,选择 execute a changeset。这类似于您将要手动部署程序包时要采取的步骤,如之前教程的部署步骤所述。CreateChangeSet 将 SAM 模板转换为完整的 AWS CloudFormation 格式,而 deployChangeSet 部署 AWS CloudFormation 模板。

  8. 堆栈名称:中,输入 MyBetaStack

  9. 更改集名称:中,输入 MyChangeSet

  10. 选择 Add Action

  11. 选择保存管道更改

  12. 选择 Save and continue

您的管道已就绪。任何推送到您连接到此管道的分支的 Git 都将触发部署。要测试您的管道并首次部署应用程序,请执行以下操作之一:

  • 将 Git 推送到连接到您的管道的分支。

  • 转到 AWS CodePipeline 控制台,选择您创建的管道名称,然后选择发布更改