AWS Lambda
开发人员指南

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

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

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

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

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

    2. 按照 IAM 用户指南创建角色以向 AWS 服务委派权限的步骤创建 IAM 角色(执行角色)。然后,转至 To create a role for an AWS service (为 AWS 服务创建角色) 部分。遵循步骤创建角色时,请注意以下事项:

      • Select Role Type 中,选择 AWS Service Roles,然后选择 CloudFormation。选择 Next: Permissions (下一步: 权限)

      • Attach permissions policies 中,使用搜索栏查找然后选择 AWSLambdaExecute。选择 Next: Review

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

      • 打开您刚刚创建的角色。在 Permissions 选项卡下,选择 Add inline policy

      • Create Policy (创建策略) 中,选择 JSON 选项卡,然后输入以下内容:

        注意

        确保将 regionid 占位符替换为您的区域和账户 ID。

        { "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:id:function:*" ], "Effect": "Allow" }, { "Action": [ "apigateway:*" ], "Resource": [ "arn:aws:apigateway:region::*" ], "Effect": "Allow" }, { "Action": [ "iam:GetRole", "iam:CreateRole", "iam:DeleteRole", "iam:PutRolePolicy" ], "Resource": [ "arn:aws:iam::id:role/*" ], "Effect": "Allow" }, { "Action": [ "iam:AttachRolePolicy", "iam:DeleteRolePolicy", "iam:DetachRolePolicy" ], "Resource": [ "arn:aws:iam::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" }, { "Action": [ "codedeploy:CreateApplication", "codedeploy:DeleteApplication", "codedeploy:RegisterApplicationRevision" ], "Resource": [ "arn:aws:codedeploy:region:id:application:*" ], "Effect": "Allow" }, { "Action": [ "codedeploy:CreateDeploymentGroup", "codedeploy:CreateDeployment", "codedeploy:GetDeployment" ], "Resource": [ "arn:aws:codedeploy:region:id:deploymentgroup:*" ], "Effect": "Allow" }, { "Action": [ "codedeploy:GetDeploymentConfig" ], "Resource": [ "arn:aws:codedeploy:region:id:deploymentconfig:*" ], "Effect": "Allow" } ], "Version": "2012-10-17" }
      • 选择 Validate Policy,然后选择 Apply Policy

步骤 1:设置 存储库

在设置存储库时,您可以使用任意 Lambda 支持的运行时。以下示例将使用 Node.js。

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

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

    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 文件。这用于在您的应用程序中定义资源的 AWS SAM 模板。此 AWS SAM 模板定义由 API 网关 触发的 Lambda 函数。请注意,runtime 参数使用 nodejs6.10,但您还可以指定 nodejs8.10。有关 AWS SAM 的更多信息,请参阅 AWS 无服务器应用程序模型

    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 存储桶

      version: 0.2 phases: install: commands: - npm install time - aws cloudformation package --template-file samTemplate.yaml --kms-key-id kms-key-id --s3-bucket bucket-name --output-template-file outputSamTemplate.yaml artifacts: type: zip files: - samTemplate.yaml - outputSamTemplate.yaml

步骤 2:创建您的管道

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

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

  2. 选择 Get Started Now

  3. Pipeline name (管道名称) 中,输入您的管道名称,然后选择 Next step (下一步)

  4. Source provider (源提供商) 中,选择 GitHub

  5. 选择 Connect to GitHub (连接到 GitHub),然后选择要连接到的 Repository (存储库)Branch (分支)。每个推送到您选择的分支的 git push 都将触发管道。选择下一步

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

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

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

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

  10. Version (版本) 中,选择 aws/codebuild/nodejs:version

  11. Build specification (构建规范) 中,选择 Use the buildspec.yml in the source code root directory

  12. 选择 Save build project

    注意

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

    选择下一步

  13. Deployment provider (部署提供商) 中,选择 AWS CloudFormation

    选择此选项后,AWS CloudFormation 命令将用于部署 AWS SAM 模板。有关更多信息,请参阅 AWS 无服务器应用程序模型 开发人员指南 中的 AWS SAM 模板基础知识

  14. Action mode (操作模式) 中,选择 Create or replace a change set (创建或替换更改集)

  15. Stack name (堆栈名称) 中,输入 MyBetaStack

  16. Change set name (更改集名称) 中,输入 MyChangeSet

  17. Template file (模板文件) 中,输入 outputSamTemplate.yaml

  18. Capabilities (功能) 中,选择 CAPABILITY_IAM

  19. Role (角色) 中,选择您在本教程开始时创建的 AWS CloudFormation 角色,然后选择 Next step (下一步)

  20. 依次选择 Create role (创建角色)Next (下一步)Allow (允许)Next step (下一步)

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

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

完成下述步骤,允许 AWS CodeBuild 将构建项目上传到 Amazon S3 存储桶。

  1. 转到 IAM 控制台。

  2. 选择 Roles

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

  4. Permissions 选项卡下,选择 Add inline policy

  5. service 中,选择 Choose a service

  6. Select a service below 中,选择 S3

  7. Actions 中,选择 Select actions

  8. Access level groups (访问级别组) 下展开 Write (写入),然后选择 PutObject

  9. 选择 Resources (资源),然后选中 Any (任意) 复选框。

  10. 选择查看策略

  11. 输入 Name (名称),然后选择 Create policy (创建策略)。然后返回到您在上一部分中创建的管道。

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

使用以下步骤完成您的测试阶段。

  1. 选择 Edit

  2. 选择 MyBetaStack 旁边的 + 图标。

  3. Action category (操作类别) 中,如果尚未选择,请选择 Deploy (部署)

  4. Deployment provider (部署提供商) 中,如果尚未选择,请选择 AWS CloudFormation

  5. Action mode (操作模式) 中,选择 Execute a change set (执行更改集)CreateChangeSet 将 AWS SAM 模板转换为完整的 AWS CloudFormation 格式,deployChangeSet 将部署 AWS CloudFormation 模板。

  6. Stack name (堆栈名称) 中,输入或选择 MyBetaStack

  7. Change set name (更改集名称) 中,输入 MyChangeSet

  8. 选择 Add Action

  9. 选择保存管道更改

  10. 选择 Save and continue

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

  • 对连接到您的管道的分支执行 git push

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