Deploying AWS Lambda function using GitLab CI/CD

Deploying AWS Lambda function using GitLab CI/CD

GitLab 允许用户轻松部署 AWS Lambda 函数并创建丰富的无服务器应用程序.

GitLab 支持使用以下无服务器框架通过 GitLab CI / CD 部署 AWS Lambda 功能:

The .

我们准备了一个包含分步指南的示例,以创建一个简单功能并将其部署在 AWS 上.

此外,在”操作方法“部分中 ,您可以了解不同的用例,例如:

  • 在本地运行功能.
  • 处理秘密.
  • 设置 CORS.

或者,您可以快速创建一个新项目 . 已经包括下面描述的所有部分.

在以下示例中,您将:

  1. 创建一个基本的 AWS Lambda Node.js 函数.
  2. 将该函数链接到 API Gateway GET端点.

Steps

该示例包括以下步骤:

  1. 创建 Lambda 处理函数.
  2. 创建一个serverless.yml文件.
  3. 制作.gitlab-ci.yml文件.
  4. 使用 GitLab 账户设置 AWS 凭证.
  5. 测试已部署的功能.

让我们一步一步来.

Creating a Lambda handler function

您的 Lambda 函数将是请求的主要处理程序. 在这种情况下,我们将创建一个非常简单的 Node.js hello函数:

将此代码放在文件src/handler.js .

src是无服务器功能的标准位置,但是您可以根据需要进行自定义.

在我们的例子中, module.exports.hello定义了hello ,这将在以后的引用处理器serverless.yml

您可以在此处了解有关 AWS Lambda Node.js 函数处理程序及其所有各种选项的更多信息: https :

Creating a serverless.yml file

在项目的根目录中,创建一个serverless.yml文件,其中将包含 Serverless Framework 的配置详细信息.

将以下代码放入文件中:

  1. service: gitlab-example
  2. provider:
  3. name: aws
  4. runtime: nodejs10.x
  5. functions:
  6. hello:
  7. handler: src/handler.hello
  8. events:
  9. - http: GET hello

我们的函数包含一个处理程序和一个事件.

处理程序定义将使用位于src/handler.hello的源代码提供 Lambda 函数.

events声明将创建一个 AWS API Gateway GET终端节点,以接收外部请求并将其通过服务集成传递给 Lambda 函数.

您可以阅读有关无服务器框架的的更多信息.

Crafting the .gitlab-ci.yml file

在项目根目录下的.gitlab-ci.yml文件中,放置以下代码:

  1. image: node:latest
  2. stages:
  3. - deploy
  4. production:
  5. stage: deploy
  6. before_script:
  7. - npm config set prefix /usr/local
  8. - npm install -g serverless
  9. script:
  10. - serverless deploy --stage production --verbose
  11. environment: production

此示例代码执行以下操作:

  1. 对所有 GitLab CI / CD 版本使用node:latest映像
  2. The deploy stage:
    • 安装无服务器框架.
    • 使用上面定义的 AWS 凭证将无服务器功能部署到您的 AWS 账户.

Setting up your AWS credentials with your GitLab account

为了与您的 AWS 账户进行交互,GitLab CI / CD 管道要求在您的 GitLab 设置中的设置> CI / CD>变量下定义和AWS_SECRET_ACCESS_KEY . 有关更多信息,请参见在 UI 中创建自定义变量 .

注意:您提供的 AWS 凭证必须包括 IAM 策略,以提供对 AWS Lambda,API 网关,CloudFormation 和 IAM 资源的正确访问控制.

Deploying your function

git push the changes to your GitLab repository and the GitLab build pipeline will automatically deploy your function.

在您的 GitLab 部署阶段日志中,将包含您的 AWS Lambda 端点 URL 的输出. 日志行将类似于以下内容:

  1. endpoints:
  2. GET - https://u768nzby1j.execute-api.us-east-1.amazonaws.com/production/hello

Manually testing your function

运行以下curl命令将触发您的功能.

  1. curl https://u768nzby1j.execute-api.us-east-1.amazonaws.com/production/hello

那应该输出:

  1. { "message": "Your function executed successfully!" }

万岁! 现在,您已经通过 GitLab CI / CD 部署了 AWS Lambda 函数.

干得好!

How To

在本节中,我们向您展示如何在基本示例上构建以下内容:

  • 在本地运行该功能.
  • 设置秘密变量.
  • 设置 CORS.

Running function locally

serverless-offline插件允许在本地运行代码. 要在本地运行代码:

  1. 将以下内容添加到您的serverless.yml

    1. plugins:
    2. - serverless-offline
  2. 通过运行以下命令来启动服务:

    1. serverless offline

运行以下curl命令将触发您的功能.

它应该输出:

  1. { "message": "Your function executed successfully!" }

Secret variables

Secrets are injected into your functions using environment variables.

通过在serverless.yml的 provider 部分中定义变量,可以将它们添加到已部署函数的环境中:

  1. provider:
  2. ...
  3. environment:
  4. A_VARIABLE: ${env:A_VARIABLE}

从那里,您也可以在函数中引用它们. 请记住,在设置> CI / CD>变量下,将A_VARIABLE添加到您的 GitLab CI / CD 变量中,它将随您的函数一起被拾取和部署.

注意:有权访问 AWS 环境的任何人都可以查看 lambda 定义中保留的那些变量的值.

Setting up CORS

如果您想要建立一个调用函数的网页,就像我们在所做的那样,则需要处理跨域资源共享(CORS).

快速的方法来做到这一点是添加cors: true标志的 HTTP 端点在你serverless.yml

  1. functions:
  2. hello:
  3. handler: src/handler.hello
  4. events:
  5. - http: # Rewrite this part to enable CORS
  6. path: hello
  7. method: get
  8. cors: true # <-- CORS here

您还需要在函数响应中返回 CORS 特定的标头:

  1. 'use strict';
  2. module.exports.hello = async event => {
  3. return {
  4. statusCode: 200,
  5. headers: {
  6. // Uncomment the line below if you need access to cookies or authentication
  7. // 'Access-Control-Allow-Credentials': true,
  8. 'Access-Control-Allow-Origin': '*'
  9. },
  10. body: JSON.stringify(
  11. message: 'Your function executed successfully!'
  12. },
  13. null,
  14. 2
  15. ),
  16. };

有关更多信息,请参阅由无服务器框架团队撰写的《 您的 CORS 和 API 网关生存指南》博客文章.

Writing automated tests

无服务器框架示例项目展示了如何使用 Jest,Axios 和serverless-offline插件对本地和已部署的无服务器功能进行自动化测试.

Examples and template

示例代码可用:

您还可以在 GitLab UI 中使用模板 (基于带有测试和秘密变量的版本)(请参阅Serverless Framework/JS模板).

AWS Serverless Application Model

AWS 无服务器应用程序模型是用于构建无服务器应用程序的开源框架. 它使构建和部署无服务器应用程序变得更加容易. 有关更多详细信息,请参阅有关AWS 无服务器应用程序模型的 AWS 文档.

Deploying AWS Lambda function using AWS SAM and GitLab CI/CD

GitLab 允许开发人员使用以下组合来构建和部署无服务器应用程序:

在以下示例中,您将:

  • 安装 SAM CLI.
  • 创建一个示例 SAM 应用程序,其中包括 Lambda 函数和 API 网关.
  • 使用 GitLab CI / CD 将应用程序构建并部署到您的 AWS 账户.

Steps

该示例包括以下步骤:

  1. 安装 SAM CLI.
  2. 使用 SAM CLI 创建 AWS SAM 应用程序.
  3. 制作.gitlab-ci.yml文件.
  4. 使用 GitLab 账户设置 AWS 凭证.
  5. 部署您的应用程序.
  6. 测试已部署的功能.

Installing SAM CLI

AWS SAM 提供了一个称为 AWS SAM CLI 的 CLI,可简化创建和管理应用程序的过程.

本文档中的某些步骤使用 SAM CLI. 请按照说明来安装和配置 SAM CLI.

如果您将AWS Cloud9用作集成开发环境(IDE),则会为您安装以下软件:

Creating an AWS SAM application using SAM CLI

  1. 创建一个新的 GitLab 项目.
  2. git clone将项目git clone到您的本地环境中.
  3. 更改为新克隆的项目,并使用以下命令创建新的 SAM 应用程序:

    1. sam init -r python3.8 -n gitlabpoc --app-template "hello-world"
  4. git push应用程序git push回到 GitLab 项目.

这将使用默认配置创建一个名为gitlabpoc的 SAM 应用程序,该配置是端点调用的单个 Python 3.8 函数. 要查看 SAM 支持的其他运行时以及sam init选项,请运行:

  1. sam init -h

为了与您的 AWS 账户进行交互,GitLab CI / CD 管道要求在项目的 CI / CD 变量中同时设置AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEY .

设置这些:

  1. 导航到项目的 设置> CI / CD .
  2. 展开变量部分,并为AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEY创建条目.
  3. 屏蔽凭据,以免使用”已屏蔽”切换将其显示在日志中.

注意:您提供的 AWS 凭证必须包括 IAM 策略,以提供对 AWS Lambda,API 网关,CloudFormation 和 IAM 资源的正确访问控制.

Crafting the .gitlab-ci.yml file

在项目根目录中的文件中,添加以下内容,并将<S3_bucket_name>替换为要在其中存储软件包的 S3 存储桶的名称:

  1. image: python:latest
  2. stages:
  3. - deploy
  4. production:
  5. stage: deploy
  6. before_script:
  7. - pip3 install awscli --upgrade
  8. - pip3 install aws-sam-cli --upgrade
  9. script:
  10. - sam build
  11. - sam package --output-template-file packaged.yaml --s3-bucket <S3_bucket_name>
  12. - sam deploy --template-file packaged.yaml --stack-name gitlabpoc --s3-bucket <S3_bucket_name> --capabilities CAPABILITY_IAM --region us-east-1
  13. environment: production

让我们更仔细地检查配置文件:

  • image指定用于此构建的 Docker 映像. 由于示例应用程序是用 Python 编写的,因此这是最新的 Python 图像.
  • AWS CLI 和 AWS SAM CLI 安装在before_script部分中.
  • SAM 构建,打包和部署命令用于构建,打包和部署应用程序.

Deploying your application

Push changes to your GitLab repository and the GitLab build pipeline will automatically deploy your application. If your:

  • 构建和部署成功, .
  • 生成失败,请查看生成日志以查看生成失败的原因. 构建可能会失败的一些常见原因是:

    • 不兼容的软件版本. 例如,Python 运行时版本可能与构建计算机上的 Python 不同. 通过安装所需的软件版本来解决此问题.
    • 您可能无法从 GitLab 访问您的 AWS 账户. 检查您使用 AWS 凭证设置的环境变量.
    • 您可能没有权限部署无服务器应用程序. 确保提供了部署无服务器应用程序所需的所有权限.

Testing the deployed application

要测试您部署的应用程序,请转到构建日志,然后执行以下步骤:

  1. 点击右上角的”显示完整的原始数据”:

  2. 查找 HelloWorldApi –与以下所示类似的 API 网关端点:

    sam-api-endpoint

  3. 使用 curl 测试 API. 例如:

输出应为:

  1. {"message": "hello world"}

AWS SAM 提供了在本地测试应用程序的功能. 您必须在本地安装 AWS SAM CLI,才能在本地进行测试.

首先,测试功能.

SAM 在events/event.json中提供一个默认事件,其中包括以下消息主体:

  1. {\"message\": \"hello world\"}

如果您将该事件传递给HelloWorldFunction ,则它应该以相同的主体响应.

通过运行以下命令来调用该函数:

  1. sam local invoke HelloWorldFunction -e events/event.json

输出应为:

  1. {"message": "hello world"}

确认 Lambda 函数按预期工作后,请按照以下步骤测试 API 网关.

通过运行以下命令在本地启动 API:

  1. sam local start-api

SAM 再次启动 Docker 容器,这一次是在localhost:3000上侦听的模拟 Amazon API Gateway.

通过运行以下命令来调用hello API:

  1. curl http://127.0.0.1:3000/hello