

# Lambda 托管实例入门
<a name="lambda-managed-instances-getting-started"></a>

## 创建 Lambda 托管实例函数（控制台）
<a name="lambda-managed-instances-getting-started-console"></a>

您可以使用 Lambda 控制台创建一个将在由容量提供程序管理的 Amazon EC2 实例上运行的托管实例函数。

**重要提示：**在创建托管实例函数之前，您必须先创建容量提供程序。这些函数需要容量提供程序来定义运行您的函数的 Amazon EC2 基础设施。

**要创建 Lambda 托管实例函数（控制台）**

1. 打开 Lambda 控制台。

1. 从左侧导航窗格中选择**容量提供程序**。

1. 选择**创建容量提供程序**。

1. 在**容量提供程序设置**部分，为容量提供程序输入一个名称。

1. 为您的容量提供程序选择 VPC 和权限。您可以使用现有角色，也可以创建新的角色。有关创建所需操作员角色的信息，请参阅 [Lambda 托管实例的 Lambda 操作员角色](lambda-managed-instances-operator-role.md)。

1. 展开 **Advanced settings**（高级设置）。

1. 通过选择处理器架构和实例类型来定义您的**实例要求**。

1. 在**自动扩缩**下，为您的容量提供程序指定 EC2 vCPU 的最大数量。您也可以选择**手动实例扩展模式**来设置自己的扩展值以实现精确控制。

1. 选择**创建容量提供程序**以创建新的容量提供程序。

1. 接下来，选择**创建函数**。

1. 选择**从头开始编写**。

1. 在**基本信息**窗格中，提供**函数名称**。

1. 在**运行时**中，选择任何支持的 Lambda 运行时。

1. 为您的函数选择**架构**（与您为容量提供程序选择的架构相同）。默认情况下，为 **x86\_64**。

1. 在**权限**下，确保您拥有所选**执行角色**的权限。否则，您可以创建新角色。

1. 在**其他配置**下，选择**计算类型**作为 **Lambda 托管实例**。

1. 应预先选择您在之前步骤中创建的容量提供程序的容量提供程序 ARN。

1. 选择**内存大小**和**每个 vCPU 的执行环境内存（GiB）比率**。

1. 选择**创建函数**。

您的 Lambda 托管实例函数已创建，并且将为您指定的容量提供程序预置容量。创建函数通常需要几分钟时间。完成后，您可以编辑函数代码并运行第一个测试。

## 创建 Lambda 托管实例函数（Amazon CLI）
<a name="lambda-managed-instances-getting-started-cli"></a>

### 先决条件
<a name="lambda-managed-instances-prerequisites"></a>

在开始之前，请确保您具有以下各项：
+ **Amazon CLI**：安装和配置 Amazon CLI。有关更多信息，请参阅[安装或更新最新版本的 Amazon CLI](https://docs.amazonaws.cn/cli/latest/userguide/getting-started-install.html)。
+ **IAM 权限**：您的 IAM 用户或角色必须具有创建 Lambda 函数、容量提供程序和传递 IAM 角色的权限。请注意，如果这是首次在账户中创建容量提供程序，或者如果服务相关角色（SLR）已删除，您也将需要 `iam:CreateServiceLinkedRole`。

### 步骤 1：创建所需的 IAM 角色
<a name="lambda-managed-instances-step1-iam"></a>

Lambda 托管实例需要两个 IAM 角色：您的函数的执行角色和容量提供程序的操作员角色。操作员角色使 Lambda 能够代表您启动、终止和监控 Amazon EC2 实例。函数的执行角色授予函数访问其他 Amazon 服务和资源的权限。

**创建 Lambda 执行角色**

1. 创建一个信任策略文档，该文档允许 Lambda 代入该角色：

   ```
   cat > lambda-trust-policy.json << 'EOF'
   {
     "Version": "2012-10-17",		 	 	 
     "Statement": [
       {
         "Effect": "Allow",
         "Principal": {
           "Service": "lambda.amazonaws.com"
         },
         "Action": "sts:AssumeRole"
       }
     ]
   }
   EOF
   ```

1. 创建执行角色：

   ```
   aws iam create-role \
     --role-name MyLambdaExecutionRole \
     --assume-role-policy-document file://lambda-trust-policy.json
   ```

1. 附上基本执行策略：

   ```
   aws iam attach-role-policy \
     --role-name MyLambdaExecutionRole \
     --policy-arn arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole
   ```

**要创建容量提供程序操作员角色**

1. 创建一个信任策略文档，该文档允许 Lambda 代入操作员角色：

   ```
   cat > operator-trust-policy.json << 'EOF'
   {
     "Version": "2012-10-17",		 	 	 
     "Statement": [
       {
         "Effect": "Allow",
         "Principal": {
           "Service": "lambda.amazonaws.com"
         },
         "Action": "sts:AssumeRole"
       }
     ]
   }
   EOF
   ```

1. 创建操作员角色：

   ```
   aws iam create-role \
     --role-name MyCapacityProviderOperatorRole \
     --assume-role-policy-document file://operator-trust-policy.json
   ```

1. 附上所需的 EC2 权限策略：

   ```
   aws iam attach-role-policy \
     --role-name MyCapacityProviderOperatorRole \
     --policy-arn arn:aws:iam::aws:policy/AWSLambdaManagedEC2ResourceOperator
   ```

### 步骤 2：设置 VPC 资源
<a name="lambda-managed-instances-step2-vpc"></a>

Lambda 托管实例在您的 VPC 中运行，并且需要子网和安全组。

**要创建 VPC 资源**

1. 创建 VPC：

   ```
   VPC_ID=$(aws ec2 create-vpc \
     --cidr-block 10.0.0.0/16 \
     --query 'Vpc.VpcId' \
     --output text)
   ```

1. 创建子网：

   ```
   SUBNET_ID=$(aws ec2 create-subnet \
     --vpc-id $VPC_ID \
     --cidr-block 10.0.1.0/24 \
     --query 'Subnet.SubnetId' \
     --output text)
   ```

1. 创建安全组：

   ```
   SECURITY_GROUP_ID=$(aws ec2 create-security-group \
     --group-name my-capacity-provider-sg \
     --description "Security group for Lambda Managed Instances" \
     --vpc-id $VPC_ID \
     --query 'GroupId' \
     --output text)
   ```

**注意：**您的 Lambda 托管实例函数需要进行 VPC 配置，以便能够访问 VPC 之外的资源，并将遥测数据传输至 CloudWatch Logs 和 X-Ray。有关配置的详细信息，请参阅 [Lambda 托管实例的联网](lambda-managed-instances-networking.md)。

### 步骤 3：创建容量提供程序
<a name="lambda-managed-instances-step3-capacity-provider"></a>

容量提供程序管理运行您的 Lambda 函数的 EC2 实例。

**创建容量提供程序**

```
ACCOUNT_ID=$(aws sts get-caller-identity --query Account --output text)

aws lambda create-capacity-provider \
  --capacity-provider-name my-capacity-provider \
  --vpc-config SubnetIds=[$SUBNET_ID],SecurityGroupIds=[$SECURITY_GROUP_ID] \
  --permissions-config CapacityProviderOperatorRoleArn=arn:aws:iam::${ACCOUNT_ID}:role/MyCapacityProviderOperatorRole \
  --instance-requirements Architectures=[x86_64] \
  --capacity-provider-scaling-config MaxVCpuCount=30
```

此命令采用以下配置创建容量提供程序：
+ **VPC 配置**：指定 EC2 实例的子网和安全组
+ **权限**：定义 Lambda 用于管理 EC2 实例的 IAM 角色
+ **实例要求**：指定 x86\_64 架构
+ **扩展配置**：为容量提供程序设置最多 30 个 vCPU

### 步骤 4：创建包含内联代码的 Lambda 函数
<a name="lambda-managed-instances-step4-function"></a>

**要创建包含内联代码的函数**

1. 首先，创建一个简单的 Python 函数并将其内联打包：

   ```
   # Create a temporary directory for the function code
   mkdir -p /tmp/my-lambda-function
   cd /tmp/my-lambda-function
   
   # Create a simple Python handler
   cat > lambda_function.py << 'EOF'
   import json
   
   def lambda_handler(event, context):
       return {
           'statusCode': 200,
           'body': json.dumps({
               'message': 'Hello from Lambda Managed Instances!',
               'event': event
           })
       }
   EOF
   
   # Create a ZIP file
   zip function.zip lambda_function.py
   ```

1. 使用内联 ZIP 文件创建 Lambda 函数：

   ```
   ACCOUNT_ID=$(aws sts get-caller-identity --query Account --output text)
   REGION=$(aws configure get region)
   
   aws lambda create-function \
     --function-name my-managed-instance-function \
     --package-type Zip \
     --runtime python3.13 \
     --handler lambda_function.lambda_handler \
     --zip-file fileb:///tmp/my-lambda-function/function.zip \
     --role arn:aws:iam::${ACCOUNT_ID}:role/MyLambdaExecutionRole \
     --architectures x86_64 \
     --memory-size 2048 \
     --ephemeral-storage Size=512 \
     --capacity-provider-config LambdaManagedInstancesCapacityProviderConfig={CapacityProviderArn=arn:aws:lambda:${REGION}:${ACCOUNT_ID}:capacity-provider:my-capacity-provider}
   ```

   该函数通过以下方法创建：
   + **运行时**：Python 3.13
   + **处理程序**：`lambda_function.py` 中的 `lambda_handler` 函数
   + **内存**：2048MB
   + **临时存储**：512MB
   + **容量提供程序**：指向您创建的容量提供程序的链接

### 步骤 5：发布函数版本
<a name="lambda-managed-instances-step5-publish"></a>

要在 Lambda 托管实例上运行您的函数，您必须发布一个版本。

**要发布函数版本**

```
aws lambda publish-version \
  --function-name my-managed-instance-function
```

此命令会发布您的函数的第 1 版，并将其部署到容量提供程序。

### 第 6 步：调用函数
<a name="lambda-managed-instances-step6-invoke"></a>

发布之后，您可以调用函数。

**要调用函数**

```
aws lambda invoke \
  --function-name my-managed-instance-function:1 \
  --payload '{"name": "World"}' \
  response.json

# View the response
cat response.json
```

该函数在您的容量提供程序管理的 EC2 实例上运行并返回响应。

### 清理
<a name="lambda-managed-instances-cleanup"></a>

为避免产生费用，请删除您创建的资源：

1. 删除函数：

   ```
   aws lambda delete-function --function-name my-managed-instance-function
   ```

1. 删除容量提供程序：

   ```
   aws lambda delete-capacity-provider --capacity-provider-name my-capacity-provider
   ```

1. 删除 VPC 资源：

   ```
   aws ec2 delete-security-group --group-id $SECURITY_GROUP_ID
   aws ec2 delete-subnet --subnet-id $SUBNET_ID
   aws ec2 delete-vpc --vpc-id $VPC_ID
   ```

1. 删除 IAM 角色：

   ```
   aws iam detach-role-policy \
     --role-name MyLambdaExecutionRole \
     --policy-arn arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole
   aws iam detach-role-policy \
     --role-name MyCapacityProviderOperatorRole \
     --policy-arn arn:aws:iam::aws:policy/AWSLambdaManagedEC2ResourceOperator
   
   aws iam delete-role --role-name MyLambdaExecutionRole
   aws iam delete-role --role-name MyCapacityProviderOperatorRole
   ```