

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 在 AWS Lambda 计算基础上运行构建
<a name="lambda"></a>

AWS Lambda compute 为您的构建提供优化的启动速度。 AWS Lambda 由于启动延迟较低，因此支持更快的构建。 AWS Lambda 还会自动缩放，因此构建无需在队列中等待运行。但是，有些用例 AWS Lambda 不支持，如果它们对您造成影响，请使用 EC2 计算。有关更多信息，请参阅 [AWS Lambda 计算的局限性](#lambda.limitations)。

**Topics**
+ [AWS Lambda上运行的精心策划的运行时环境 Docker 映像中将包含哪些工具和运行时？](#lambda.tools)
+ [如果精选映像未包括我需要的工具，该怎么办？](#lambda.custom)
+ [哪些区域支持 AWS Lambda 计算 CodeBuild？](#lambda.regions)
+ [AWS Lambda 计算的局限性](#lambda.limitations)
+ [使用 Lambda Java 部署 Lam AWS SAM b CodeBuild da 函数](sample-lambda-sam-gradle.md)
+ [使用 CodeBuild Lambda Node.js 创建单页 React 应用程序](sample-lambda-react-nodejs.md)
+ [使用 Lambda Python 更新 Lamb CodeBuild da 函数配置](sample-lambda-boto3-python.md)

## AWS Lambda上运行的精心策划的运行时环境 Docker 映像中将包含哪些工具和运行时？
<a name="lambda.tools"></a>

AWS Lambda 支持以下工具： AWS CLI v2、 AWS SAM CLI、git、go、Java、Node.js、Python、pip、Ruby 和.NET。

## 如果精选映像未包括我需要的工具，该怎么办？
<a name="lambda.custom"></a>

如果精选映像不包括您需要的工具，则可以提供包括所需工具的自定义环境 Docker 映像。

**注意**  
Lambda 不支持使用多架构容器映像的函数。有关更多信息，请参阅《AWS Lambda 开发人员指南》**中的[使用容器映像创建 Lambda 函数](https://docs.aws.amazon.com/lambda/latest/dg/images-create.html#images-reqs)。

请注意，您需要以下 Amazon ECR 权限才能使用 Lambda 计算的自定义映像：

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ecr:GetAuthorizationToken"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "ecr:BatchCheckLayerAvailability",
                "ecr:GetDownloadUrlForLayer",
                "ecr:BatchGetImage"
            ],
            "Resource": "arn:aws:ecr:us-east-1:111122223333:repository/image-repo"
        }
    ]
}
```

------

另请注意，要使用自定义映像，必须安装 `curl` 或 `wget`。

## 哪些区域支持 AWS Lambda 计算 CodeBuild？
<a name="lambda.regions"></a>

在中 CodeBuild，以下地区支持 AWS Lambda 计算 AWS 区域：美国东部（弗吉尼亚北部）、美国东部（俄亥俄州）、美国西部（俄勒冈）、亚太地区（孟买）、亚太地区（新加坡）、亚太地区（悉尼）、亚太地区（东京）、欧洲（法兰克福）、欧洲（爱尔兰）和南美洲（圣保罗）。有关 AWS 区域 何处 CodeBuild 可用的更多信息，请参阅[按地区划分的AWS 服务](https://aws.amazon.com/about-aws/global-infrastructure/regional-product-services/)。

## AWS Lambda 计算的局限性
<a name="lambda.limitations"></a>

有些用例 AWS Lambda 不支持，如果它们对您造成影响，请使用 EC2 计算：
+ AWS Lambda 不支持需要 root 权限的工具。对于 `yum` 或 `rpm` 之类的工具，请使用 EC2 计算类型或其他不需要 root 权限的工具。
+ AWS Lambda 不支持 Docker 的构建或运行。
+ AWS Lambda 不支持写入外部文件`/tmp`。包含的包管理器被配置为默认使用 `/tmp` 目录来下载和引用包。
+ AWS Lambda 不支持该环境类型`LINUX_GPU_CONTAINER`，Windows Server Core 2019 也不支持。
+ AWS Lambda 不支持缓存、自定义编译超时、队列超时、构建徽章、特权模式、自定义运行时环境或长度超过 15 分钟的运行时间。
+ AWS Lambda 不支持 VPC 连接、固定范围的 CodeBuild 源 IP 地址、EFS、安装证书或使用会话管理器进行 SSH 访问。

# 使用 Lambda Java 部署 Lam AWS SAM b CodeBuild da 函数
<a name="sample-lambda-sam-gradle"></a>

 AWS Serverless Application Model (AWS SAM) 是一个用于构建无服务器应用程序的开源框架。有关更多信息，请参阅上的[AWS Serverless Application Model 存储库](https://github.com/aws/serverless-application-model) GitHub。以下 Java 示例使用 Gradle 来构建和测试 AWS Lambda 函数。之后，使用 AWS SAM CLI 来部署 CloudFormation 模板和部署包。通过使用 CodeBuild Lambda，构建、测试和部署步骤均可自动处理，从而无需手动干预单个构建即可快速更新基础架构。

## 设置您的 AWS SAM 存储库
<a name="sample-lambda-sam-gradle.set-up-repo"></a>

使用 AWS SAM CLI 创建 AWS SAM `Hello World`项目。

**创建您的 AWS SAM 项目**

1. 按照《*AWS Serverless Application Model 开发者指南*》中的说明在本地计算机上[安装 AWS SAM CLI](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/install-sam-cli.html)。

1. 运行 `sam init` 并选择以下项目配置。

   ```
   Which template source would you like to use?: 1 - AWS Quick Start Templates
   Choose an AWS Quick Start application template: 1 - Hello World Example
   Use the most popular runtime and package type? (Python and zip) [y/N]: N
   Which runtime would you like to use?: 8 - java21
   What package type would you like to use?: 1 - Zip
   Which dependency manager would you like to use?: 1 - gradle
   Would you like to enable X-Ray tracing on the function(s) in your application? [y/N]: N
   Would you like to enable monitoring using CloudWatch Application Insights? [y/N]: N
   Would you like to set Structured Logging in JSON format on your Lambda functions? [y/N]:  N
   Project name [sam-app]: <insert project name>
   ```

1. 将 AWS SAM 项目文件夹上传到支持的源存储库。有关支持的源类型的列表，请参阅[ProjectSource](https://docs.aws.amazon.com/codebuild/latest/APIReference/API_ProjectSource.html)。

## 创建一个 CodeBuild Lambda Java 项目
<a name="sample-lambda-sam-gradle.create-project"></a>

创建 AWS CodeBuild Lambda Java 项目并设置构建所需的 IAM 权限。

**创建你的 CodeBuild Lambda Java 项目**

1. 在 [https://console.aws.amazon.com/codesuite/codebuild](https://console.aws.amazon.com/codesuite/codebuild/home) /home 中打开 AWS CodeBuild 控制台。

1.  如果显示 CodeBuild 信息页面，请选择 “**创建构建项目**”。否则，请在导航窗格中，展开**构建**，选择**构建项目**，然后选择**创建构建项目**。

1. 在**项目名称**中，输入此构建项目的名称。每个 AWS 账户中的构建项目名称必须是唯一的。您还可以包含构建项目的可选描述，以帮助其他用户了解此项目的用途。

1. 在**源代码**中，选择 AWS SAM 项目所在的源存储库。

1. 在**环境**中：
   + 在**计算**中，选择 **Lambda**。
   + 在**运行时**中，选择 **Java**。
   + 对于**图片**，选择 **aws/codebuild/amazonlinux-x86\$164-lambda-** standard: corretto21。
   + 在**服务角色**中，选中**新服务角色**。记下**角色名称**。在本示例稍后更新项目的 IAM 权限时，会需要角色名称。

1. 选择 **Create build project（创建构建项目）**。

1. 使用 [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) 打开 IAM 控制台。

1. 在导航窗格中，选择**角色**，然后选择与项目关联的服务角色。您可以 CodeBuild 通过选择构建项目、选择 “**编辑**”、“**环境**” 和 “**服务角色” 来找到自己的项目角色**。

1. 选择 **Trust relationships**（信任关系）选项卡，然后选择 **Edit trust policy**（编辑信任策略）。

1. 将以下内联策略附加到您的 IAM 角色。这将在以后用于部署您的 AWS SAM 基础架构。有关更多信息，请参阅《 IAM 用户指南》**中的[添加和移除 IAM 身份权限](https://docs.aws.amazon.com//IAM/latest/UserGuide/access_policies_manage-attach-detach.html)。

------
#### [ JSON ]

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Sid": "",
               "Effect": "Allow",
               "Action": [
                   "cloudformation:*",
                   "lambda:*",
                   "iam:*",
                   "apigateway:*",
                   "s3:*"
               ],
               "Resource": "arn:aws:iam::*:role/Service*"
           }
       ]
   }
   ```

------

## 设置项目 buildspec
<a name="sample-lambda-sam-gradle.set-up-buildspec"></a>

为了构建、测试和部署您的 Lambda 函数，请从构建规范中 CodeBuild 读取和执行构建命令。

**设置项目 buildspec**

1. 在 CodeBuild 控制台中，选择您的构建项目，然后选择 “**编辑**” 和 “**Buildspec**”。

1. 在 **Buildspec** 中，选择**插入构建命令**，然后选择**切换到编辑器**。

1. 删除预先填入的构建命令并粘贴以下 buildspec。

   ```
   version: 0.2
   env:
     variables:
       GRADLE_DIR: "HelloWorldFunction"
   phases:
     build:
       commands:
         - echo "Running unit tests..."
         - cd $GRADLE_DIR; gradle test; cd ..
         - echo "Running build..."
         - sam build --template-file template.yaml
         - echo "Running deploy..."
         - sam package --output-template-file packaged.yaml --resolve-s3 --template-file template.yaml
         - yes | sam deploy
   ```

1. 选择 **Update buildspec (更新构建规范)**。

## 部署您的 AWS SAM Lambda 基础架构
<a name="sample-lambda-sam-gradle.deploy"></a>

使用 CodeBuild Lambda 自动部署您的 Lambda 基础架构

**部署 Lambda 基础设施**

1. 选择**启动构建**。这将自动构建、测试您的 AWS SAM 应用程序并将其部署到 AWS Lambda 使用 CloudFormation。

1. 构建完成后，导航到 AWS Lambda 控制台并在 AWS SAM 项目名称下搜索您的新 Lambda 函数。

1. 在**函数**概览下面选择 **API Gateway**，然后单击 **API 端点** URL，测试您的 Lambda 函数。您应该会看到一个页面打开，其中包含以下消息：`"message": "hello world"`。

## 清除基础设施
<a name="sample-lambda-sam-gradle.clean-up"></a>

为避免对您在本教程中使用的资源收取额外费用，请删除由您的 AWS SAM 模板创建的资源，然后 CodeBuild。

**清除基础设施**

1. 导航到 CloudFormation 控制台并选择`aws-sam-cli-managed-default`。

1. 在**资源**中，清空部署存储桶 `SamCliSourceBucket`。

1. 删除 `aws-sam-cli-managed-default` 堆栈。

1. 删除与您的 AWS SAM 项目关联的 CloudFormation 堆栈。此堆栈的名称应与您的 AWS SAM 项目相同。

1. 导航到 CloudWatch 控制台并删除与您的 CodeBuild 项目关联的 CloudWatch 日志组。

1. 导航到 CodeBuild 控制台并通过选择删除**构建 CodeBuild 项目来删除您的项目**。

# 使用 CodeBuild Lambda Node.js 创建单页 React 应用程序
<a name="sample-lambda-react-nodejs"></a>

[创建 React 应用程序](https://create-react-app.dev/)是一种创建单页 React 应用程序的方法。以下 Node.js 示例使用 Node.js 通过“创建 React 应用程序”构建源构件并返回构建构件。

## 设置源存储库和构件存储桶
<a name="sample-lambda-react-nodejs.set-up-repo"></a>

使用 yarn 和“创建 React 应用程序”为项目创建源存储库。

**设置源存储库和构件存储桶**

1. 在本地计算机上运行 `yarn create react-app <app-name>` 来创建简单的 React 应用程序。

1. 将 React 应用程序项目文件夹上传到支持的源存储库。有关支持的源类型的列表，请参阅[ProjectSource](https://docs.aws.amazon.com/codebuild/latest/APIReference/API_ProjectSource.html)。

## 创建一个 CodeBuild Lambda Node.js 项目
<a name="sample-lambda-react-nodejs.create-project"></a>

创建一个 AWS CodeBuild Lambda Node.js 项目。

**创建你的 CodeBuild Lambda Node.js 项目**

1. 在 [https://console.aws.amazon.com/codesuite/codebuild](https://console.aws.amazon.com/codesuite/codebuild/home) /home 中打开 AWS CodeBuild 控制台。

1.  如果显示 CodeBuild 信息页面，请选择 “**创建构建项目**”。否则，请在导航窗格中，展开**构建**，选择**构建项目**，然后选择**创建构建项目**。

1. 在**项目名称**中，输入此构建项目的名称。每个 AWS 账户中的构建项目名称必须是唯一的。您还可以包含构建项目的可选描述，以帮助其他用户了解此项目的用途。

1. 在**源代码**中，选择 AWS SAM 项目所在的源存储库。

1. 在**环境**中：
   + 在**计算**中，选择 **Lambda**。
   + 在**运行时**中，选择 **Node.js**。
   + 对于**图片**，选择 **aws/codebuild/amazonlinux-x86\$164-lambda-** standard: nodejs20。

1. 在**构件**中：
   + 在**类型**中，选择 **Amazon S3**。
   + 在**存储桶名称**中，选择您之前创建的项目构件存储桶。
   + 在**构件打包**中，选择 **Zip**。

1. 选择 **Create build project（创建构建项目）**。

## 设置项目 buildspec
<a name="sample-lambda-react-nodejs.set-up-buildspec"></a>

为了构建 React 应用程序，需要从 buildspec 文件中 CodeBuild 读取和执行构建命令。

**设置项目 buildspec**

1. 在 CodeBuild 控制台中，选择您的构建项目，然后选择 “**编辑**” 和 “**Buildspec**”。

1. 在 **Buildspec** 中，选择**插入构建命令**，然后选择**切换到编辑器**。

1. 删除预先填入的构建命令并粘贴以下 buildspec。

   ```
   version: 0.2
   phases:
     build:
       commands:
         - yarn
         - yarn add --dev jest-junit @babel/plugin-proposal-private-property-in-object
         - yarn run build
         - yarn run test -- --coverage --watchAll=false --testResultsProcessor="jest-junit" --detectOpenHandles
   artifacts:
     name: "build-output"
     files:
       - "**/*"
   reports:
     test-report:
       files:
         - 'junit.xml'
       file-format: 'JUNITXML'
     coverage-report:
       files:
         - 'coverage/clover.xml'
       file-format: 'CLOVERXML'
   ```

1. 选择 **Update buildspec (更新构建规范)**。

## 构建和运行 React 应用程序
<a name="sample-lambda-react-nodejs.build"></a>

在 CodeBuild Lambda 上构建 React 应用程序，下载构建工件，然后在本地运行 React 应用程序。

**构建和运行 React 应用程序**

1. 选择**启动构建**。

1. 构建完成后，导航到您的 Amazon S3 项目构件存储桶并下载 React 应用程序构件。

1. 解压缩 React 构建构件并在项目文件夹中执行 `run npm install -g serve && serve -s build`。

1. `serve` 命令将在本地端口为静态站点提供服务，并输出到您的终端。您可以访问终端输出中 `Local:` 下面的 localhost URL，查看您的 React 应用程序。

要详细了解如何处理基于 React 的服务器的部署，请参阅[创建 React 应用程序部署](https://create-react-app.dev/docs/deployment/)。

## 清除基础设施
<a name="sample-lambda-react-nodejs.clean-up"></a>

为避免对您在本教程中使用的资源收取更多费用，请删除为您的 CodeBuild 项目创建的资源。

**清除基础设施**

1. 删除项目构件 Amazon S3 存储桶

1. 导航到 CloudWatch 控制台并删除与您的 CodeBuild 项目关联的 CloudWatch 日志组。

1. 导航到 CodeBuild 控制台并通过选择删除**构建 CodeBuild 项目来删除您的项目**。

# 使用 Lambda Python 更新 Lamb CodeBuild da 函数配置
<a name="sample-lambda-boto3-python"></a>

以下 Python 示例使用 [Boto3 和](https://aws.amazon.com/sdk-for-python/) Lambda CodeBuild Python 更新 Lambda 函数的配置。此示例可以扩展为以编程方式管理其他 AWS 资源。有关更多信息，请参阅 [Boto3 文档](https://aws.amazon.com/sdk-for-python/)。

## 先决条件
<a name="sample-lambda-boto3-python.prerequisites"></a>

在账户中创建或查找 Lambda 函数。

此示例假设您已经在账户中创建了一个 Lambda 函数，并将用于 CodeBuild 更新 Lambda 函数的环境变量。有关通过设置 Lambda 函数的更多信息 CodeBuild，请参阅[使用 Lambda Java 部署 Lam AWS SAM b CodeBuild da 函数](sample-lambda-sam-gradle.md)示例或访问。[AWS Lambda](https://aws.amazon.com/lambda/)

## 设置源存储库
<a name="sample-lambda-boto3-python.set-up-repo"></a>

创建源存储库来存储 Boto3 python 脚本。

**设置源存储库。**

1. 将以下 python 脚本复制到名为 `update_lambda_environment_variables.py` 的新文件中。

   ```
   import boto3
   from os import environ
   
   
   def update_lambda_env_variable(lambda_client):
       lambda_function_name = environ['LAMBDA_FUNC_NAME']
       lambda_env_variable = environ['LAMBDA_ENV_VARIABLE']
       lambda_env_variable_value = environ['LAMBDA_ENV_VARIABLE_VALUE']
       print("Updating lambda function " + lambda_function_name + " environment variable "
             + lambda_env_variable + " to " + lambda_env_variable_value)
       lambda_client.update_function_configuration(
           FunctionName=lambda_function_name,
           Environment={
               'Variables': {
                   lambda_env_variable: lambda_env_variable_value
               }
           },
       )
   
   
   if __name__ == "__main__":
       region = environ['AWS_REGION']
       client = boto3.client('lambda', region)
       update_lambda_env_variable(client)
   ```

1. 将 python 文件上传到支持的源存储库。有关支持的源类型的列表，请参阅[ProjectSource](https://docs.aws.amazon.com/codebuild/latest/APIReference/API_ProjectSource.html)。

## 创建 CodeBuild Lambda Python 项目
<a name="sample-lambda-boto3-python.create-project"></a>

创建一个 CodeBuild Lambda Python 项目。

**创建你的 CodeBuild Lambda Java 项目**

1. 在 [https://console.aws.amazon.com/codesuite/codebuild](https://console.aws.amazon.com/codesuite/codebuild/home) /home 中打开 AWS CodeBuild 控制台。

1.  如果显示 CodeBuild 信息页面，请选择 “**创建构建项目**”。否则，请在导航窗格中，展开**构建**，选择**构建项目**，然后选择**创建构建项目**。

1. 在**项目名称**中，输入此构建项目的名称。每个 AWS 账户中的构建项目名称必须是唯一的。您还可以包含构建项目的可选描述，以帮助其他用户了解此项目的用途。

1. 在**源代码**中，选择 AWS SAM 项目所在的源存储库。

1. 在**环境**中：
   + 在**计算**中，选择 **Lambda**。
   + 在**运行时**中，选择 **Python**。
   + 对于 **Image**，选择 **aws/codebuild/amazonlinux-x86\$164-lambda-** standard: python3.12。
   + 在**服务角色**中，选中**新服务角色**。记下**角色名称**。在本示例稍后更新项目的 IAM 权限时，会需要角色名称。

1. 选择 **Create build project（创建构建项目）**。

1. 使用 [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) 打开 IAM 控制台。

1. 在导航窗格中，选择**角色**，然后选择与项目关联的服务角色。您可以 CodeBuild 通过选择构建项目、选择 “**编辑**”、“**环境**” 和 “**服务角色” 来找到自己的项目角色**。

1. 选择 **Trust relationships**（信任关系）选项卡，然后选择 **Edit trust policy**（编辑信任策略）。

1. 将以下内联策略附加到您的 IAM 角色。这将在以后用于部署您的 AWS SAM 基础架构。有关更多信息，请参阅《 IAM 用户指南》**中的[添加和移除 IAM 身份权限](https://docs.aws.amazon.com//IAM/latest/UserGuide/access_policies_manage-attach-detach.html)。

------
#### [ JSON ]

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Sid": "UpdateLambdaPermissions",
               "Effect": "Allow",
               "Action": [
                   "lambda:UpdateFunctionConfiguration"
               ],
               "Resource": [
                   "*"
               ]
           }
       ]
   }
   ```

------

## 设置项目 buildspec
<a name="sample-lambda-boto3-python.set-up-buildspec"></a>

为了更新 Lambda 函数，脚本会从 buildspec 中读取环境变量，以便找到 Lambda 函数的名称、环境变量名称和环境变量值。

**设置项目 buildspec**

1. 在 CodeBuild 控制台中，选择您的构建项目，然后选择 “**编辑**” 和 “**Buildspec**”。

1. 在 **Buildspec** 中，选择**插入构建命令**，然后选择**切换到编辑器**。

1. 删除预先填入的构建命令并粘贴以下 buildspec。

   ```
   version: 0.2
   env:
     variables:
       LAMBDA_FUNC_NAME: "<lambda-function-name>"
       LAMBDA_ENV_VARIABLE: "FEATURE_ENABLED"
       LAMBDA_ENV_VARIABLE_VALUE: "true"
   phases:
     install:
       commands:
          - pip3 install boto3
     build:
       commands:
          - python3 update_lambda_environment_variables.py
   ```

1. 选择 **Update buildspec (更新构建规范)**。

## 更新 Lambda 配置
<a name="sample-lambda-boto3-python.update"></a>

使用 CodeBuild Lambda Python 自动更新您的 Lambda 函数的配置。

**更新 Lambda 函数的配置**

1. 选择**启动构建**。

1. 构建完成后，导航到您的 Lambda 函数。

1. 选择**配置**，然后选择**环境变量**。您应该会看到一个具有键 `FEATURE_ENABLED` 和值 `true` 的新环境变量。

## 清除基础设施
<a name="sample-lambda-boto3-python.clean-up"></a>

为避免对您在本教程中使用的资源收取更多费用，请删除为您的 CodeBuild 项目创建的资源。

**清除基础设施**

1. 导航到 CloudWatch 控制台并删除与您的 CodeBuild 项目关联的 CloudWatch 日志组。

1. 导航到 CodeBuild 控制台并通过选择删除**构建 CodeBuild 项目来删除您的项目**。

1. 如果您为此示例创建了 Lambda 函数，请选择**操作**和**删除函数**来清理您的 Lambda 函数。

## 扩展程序
<a name="sample-lambda-boto3-python.extensions"></a>

如果您想扩展此示例以使用 AWS CodeBuild Lambda Python 管理其他 AWS 资源，请执行以下操作：
+ 使用 Boto3 更新 Python 脚本来修改新资源。
+ 更新与您的 CodeBuild 项目关联的 IAM 角色以拥有新资源的权限。
+ 将与新资源关联的所有新环境变量添加到 buildspec 中。