教程:配置调用 Lambda 函数的生命周期挂钩 - Amazon EC2 Auto Scaling
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

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

教程:配置调用 Lambda 函数的生命周期挂钩

在本练习中,您将创建一个 EventBridge 规则,其中包含一个过滤器模式,当匹配时,将调用Amazon Lambda函数作为规则目标。我们提供了要使用的滤波器模式和示例函数代码。

如果一切配置正确,则在本教程结束时,Lambda 函数将在实例启动时执行自定义操作。自定义操作只是在与 Lambda 函数关联的 CloudWatch Logs 流中记录事件。

Lambda 函数还执行回调,以便在此操作成功时继续执行实例的生命周期,但允许实例放弃启动并在操作失败时终止。

Prerequisites

开始本教程前,请创建 Auto Scaling 组(如果您还没有 Auto Scaling 组)。若要创建 Auto Scaling 组,请打开Auto Scaling 组页在 Amazon EC2 控制台中,选择创建 Auto Scaling 组

请注意,以下所有过程都适用于新控制台。

第 1 步:创建有权完成生命周期挂钩的 IAM 角色

在创建 Lambda 函数之前,必须首先创建执行角色和权限策略,以允许 Lambda 完成生命周期钩子。

创建 策略

  1. 打开“策略” 页,然后选择创建策略

  2. 选择 JSON 选项卡。

  3. 策略文档框中,将以下策略文档粘贴到框中,将斜体,并输入您的帐号和 Auto Scaling 组的名称。

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "autoscaling:CompleteLifecycleAction" ], "Resource": "arn:aws:autoscaling:*:123456789012:autoScalingGroup:*:autoScalingGroupName/my-asg" } ] }
  4. 选择Next: Tags,然后Next: Review

  5. 对于 Name (名称),请输入 LogAutoScalingEvent-policy。选择 Create policy

完成创建策略之后,您可以创建一个使用该策略的角色。

创建 角色

  1. 在导航窗格上,选择角色创建角色

  2. UDER选择使用案例中,选择Lambda,然后选择Next: 权限

  3. UDER附加权限策略中,选择Auto Scaling 事件策略AWSLambdaBasicExecutionRole

  4. 选择Next: Tags,然后Next: Review

  5. 在存储库的审核页面, 用于名称中输入LogAutoScalingEvent-role,然后选择创建角色

第 2 步:创建 Lambda 函数

创建 Lambda 函数以作为事件的目标。在 Amazon EC2 Auto Scaling 发送匹配的事件时,EventBridge 会调用 Node.js 中编写的示例 Lambda 函数。

创建 Lambda 函数

  1. 打开“函数” 页面在 Lambda 控制台上。

  2. 选择创建函数从头开始创作

  3. 基本信息 下,对于函数名称,输入 LogAutoScalingEvent

  4. 选择更改默认执行角色,然后用于执行角色中,选择使用现有角色

  5. 适用于现有角色中,选择日志 Auto Scaling 事件角色

  6. 保留其他默认值。

  7. 选择 Create function (创建函数)。您将返回到函数的代码和配置。

  8. 随着您的LogAutoScalingEvent函数在控制台中保持打开状态,函数代码,在编辑器中,将以下示例代码复制到名为 index.js 的文件中。

    var aws = require("aws-sdk"); exports.handler = (event, context, callback) => { console.log('LogAutoScalingEvent'); console.log('Received event:', JSON.stringify(event, null, 2)); var autoscaling = new aws.AutoScaling({region: event.region}); var eventDetail = event.detail; var params = { AutoScalingGroupName: eventDetail['AutoScalingGroupName'], /* required */ LifecycleActionResult: 'CONTINUE', /* required */ LifecycleHookName: eventDetail['LifecycleHookName'], /* required */ InstanceId: eventDetail['InstanceId'], LifecycleActionToken: eventDetail['LifecycleActionToken'] }; var response; autoscaling.completeLifecycleAction(params, function(err, data) { if (err) { console.log(err, err.stack); // an error occurred response = { statusCode: 500, body: JSON.stringify('ERROR'), }; } else { console.log(data); // successful response response = { statusCode: 200, body: JSON.stringify('SUCCESS'), }; } }); return response; };

    此代码只记录事件,以便在本教程结束时,您可以在 CloudWatch Logs 日志流中看到与此 Lambda 函数关联的事件。

  9. 选择 Deploy (部署)

第 3 步:创建 EventBridge 规则

创建一个 EventBridge 规则来运行 Lambda 函数。

使用控制台创建规则

  1. 打开EventBridge 控制台

  2. 在导航窗格上,选择Rule创建规则

  3. 对于 Name (名称),请输入 LogAutoScalingEvent-rule

  4. 适用于定义模式中,选择事件模式

  5. 适用于事件匹配模式中,选择自定义模式

  6. 规则使用事件模式来选择事件并将事件路由到目标。将以下模式复制到事件模式

    { "source": [ "aws.autoscaling" ], "detail-type": [ "EC2 Instance-launch Lifecycle Action" ] }
  7. 若要保存事件模式,请选择Save

  8. 对于 Select event bus (选择事件总线),选择 Amazon default event bus (亚马逊云科技默认事件总线)

  9. 对于 Target (目标),选择 Lambda function (Lambda 函数)

  10. 适用于函数中,选择日志自动缩放事件。选择创建

第 4 步:添加生命周期挂钩

在本节中,您将添加一个生命周期钩子,以便 Lambda 在启动时在实例上运行函数。

添加生命周期挂钩

  1. 打开Auto Scaling 组页在 Amazon EC2 控制台中。

  2. 选中 Auto Scaling 组旁边的复选框。

    将在Auto Scaling 组页.

  3. 在下方窗格中,在实例管理选项卡, 在生命周期挂钩中,选择创建生命周期挂钩

  4. 要定义生命周期挂钩,请执行以下操作:

    1. 适用于生命周期挂钩名称中输入LogAutoScalingEvent-hook

    2. 适用于生命周期转换中,选择实例启动

    3. 适用于检测信号超时中输入300以获取等待 Lambda 函数回调的秒数。

    4. 适用于默认结果中,选择放弃。这意味着,如果挂接超时而未收到 Lambda 函数的回调,Auto Scaling 组将终止一个新实例。

    5. (可选)离开通知元数据空的。我们传递给 EventBridge 的事件数据包含调用 Lambda 函数所需的所有信息。

  5. 选择创建

第 5 步:测试并验证事件

要测试事件,请通过将 Auto Scaling 组的所需容量增加 1 来更新 Auto Scaling 组。您的 Lambda 函数在增加所需容量后几秒钟内被调用。

增大 Auto Scaling 组的大小

  1. 打开Auto Scaling 组页在 Amazon EC2 控制台中。

  2. 选中 Auto Scaling 组旁边的复选框可在下方窗格中查看详细信息,并且仍然可以看到上方窗格的顶行。

  3. 在下方窗格中,在详细信息选项卡上,选择组详细信息编辑

  4. 对于 Desired capacity (所需容量),将当前值增加 1。

  5. 选择 Update。在启动实例时,状态列显示的状态为更新容量

增加所需容量后,可以验证是否已调用 Lambda 函数。

查看 Lambda 函数的输出

  1. 打开“日志组” 页面中的 CloudWatch 控制台。

  2. 选择 Lambda 函数的日志组的名称 (/aws/lambda/LogAutoScalingEvent)。

  3. 选择日志流的名称,以查看函数提供的生命周期操作的数据。

接下来,您可以通过扩展活动的描述验证您的实例是否已成功启动。

查看扩展活动

  1. 返回到Auto Scaling 组页面,然后选择您的组。

  2. 在存储库的活动选项卡,在活动历史记录状态列显示您的 Auto Scaling 组是否已成功启动实例。

    • 如果操作成功,扩展活动的状态将为 “成功”。

    • 如果失败,等待几分钟后,您将看到一个状态为 “已取消” 的扩展活动和状态消息 “实例无法完成用户的生命周期操作:使用令牌 E85EB647-4FE0-4909-B31-A6C42 的生命周期操作已放弃示例:生命周期操作已完成并且放弃结果 "。

减小 Auto Scaling 组的大小

如果您不需要您为此测试启动的其他实例,则可以打开详细信息选项卡并减少所需容量由 1.

第 6 步:后续步骤

现在,您已完成本教程,您可以尝试创建终止生命周期挂钩。如果 Auto Scaling 组中的实例终止,则向 EventBridge 发送事件。有关实例终止时发出的事件的信息,请参阅EC2 实例终止生命周期操作

步骤 7:清除

如果您已完成刚刚为此教程创建的资源,请按以下步骤将其删除。

删除生命周期挂钩

  1. 打开Auto Scaling 组页在 Amazon EC2 控制台中。

  2. 选中 Auto Scaling 组旁边的复选框。

  3. 在存储库的实例管理选项卡, 在生命周期挂钩,选择生命周期挂钩 (LogAutoScalingEvent-hook)。

  4. 依次选择 ActionsDelete

  5. 选择Delete再次确认。

删除 Amazon EventBridge 梁规则

  1. 打开“规则” 页在 Amazon EventBridge 控制台中。

  2. UDER事件总线中,选择与规则关联的事件总线 (Default)。

  3. 选择规则 ()LogAutoScalingEvent-rule)。

  4. 依次选择 ActionsDelete

  5. 选择Delete再次确认。

如果您已完成使用此示例函数,请将其删除。您还可以删除存储函数日志的日志组以及您创建的执行角色和权限策略。

要删除 Lambda 函数

  1. 打开“函数” 页面在 Lambda 控制台上。

  2. 选择函数 ()LogAutoScalingEvent)。

  3. 依次选择 ActionsDelete

  4. Delete function(删除函数)对话框中,选择 Delete(删除)

删除日志组

  1. 打开“日志组” 页面中的 CloudWatch 控制台。

  2. 选择函数的日志组 (/aws/lambda/LogAutoScalingEvent)。

  3. 依次选择 Actions(操作)Delete log group(s)(删除日志组)

  4. Delete log group(s)(删除日志组)对话框中,选择 Delete(删除)

删除执行角色

  1. 打开角色页的 IAM 控制台。

  2. 选择函数的角色 (LogAutoScalingEvent-role)。

  3. 选择删除角色

  4. Delete role(删除角色)对话框中,选择 Yes, delete(是的,删除)

删除 IAM 策略

  1. 打开“策略” 页的 IAM 控制台。

  2. 选择您创建的策略 (LogAutoScalingEvent-policy)。

  3. 选择 Delete policy (删除策略)

  4. 删除策略对话框中,选择是,删除