AWS Lambda
开发人员指南

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

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

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

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

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

    2. 按照 IAM 用户指南 中的创建向 AWS 服务委托权限的角色创建一个 IAM 角色 (执行角色),然后转到为 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 文件。这是在您的应用程序中定义资源的 SAM 模板。此 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.1 phases: install: commands: - npm install time - aws cloudformation package --template-file samTemplate.yaml --s3-bucket bucket-name --output-template-file outputSamTemplate.yaml artifacts: type: zip files: - samTemplate.yaml - outputSamTemplate.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: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 命令将用于部署 SAM 模板。有关更多信息,请参阅 AWS SAM 中的无服务器资源

  14. Action mode: 中,选择 Create or replace a change set

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

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

  17. Template file: 中,输入 NewSamTemplate.yaml

  18. 功能: 中,选择 CAPABILITY_IAM

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

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

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

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

完成以下步骤,以允许 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 将 SAM 模板转换为完整的 AWS CloudFormation 格式,而 deployChangeSet 部署 AWS CloudFormation 模板。

  6. Stack name* 中,输入或选择 MyBetaStack

  7. Change set name* 中,输入 MyChangeSet

  8. 选择 Add Action

  9. 选择保存管道更改

  10. 选择 Save and continue

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

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

  • 转到 AWS CodePipeline 控制台,选择您创建的管道名称,然后选择 Release change

下一步

逐步代码部署