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

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

在此练习中,您将创建一个包含筛选条件模式的 Amazon EventBridge 规则,该规则将在匹配时调用一个作为规则目标的 Amazon Lambda 函数。我们提供了要使用的筛选条件模式和示例函数代码。

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

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

有关使用 EventBridge 的更多信息,请参阅使用 EventBridge 处理 Auto Scaling 事件

先决条件

在开始本教程前,请创建 Auto Scaling 组(如果您还没有 Auto Scaling 组)。要创建自动扩缩组,请打开 Amazon EC2 控制台中的自动扩缩组页面,然后选择 Create Auto Scaling group(创建自动扩缩组)。

步骤 1:创建具有完成生命周期操作权限的 IAM 角色

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

创建 策略

  1. 打开 IAM 控制台的策略页面,然后选择创建策略

  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. 选择 Create role(创建角色)。

  3. 对于 Select trusted entity(选择可信实体),选择 Amazon service(Amazon 服务)。

  4. 对于您的使用案例,选择 Lambda,然后选择 Next(下一步)。

  5. Add permissions(添加权限)下,选择您创建的策略(LogAutoScalingEvent-policy)和名为 AWSLambdaBasicExecutionRole 的策略。然后选择下一步

    注意

    AWSLambdaBasicExecutionRole 策略具有函数将日志写入 CloudWatch Logs 所需的权限。

  6. Name, review, and create(命名、检查并创建)页面上,对于 Role name(角色名称),输入 LogAutoScalingEvent-role,然后选择 Create role(创建角色)。

步骤 2:创建 Lambda 函数

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

创建 Lambda 函数

  1. 打开 Lambda 控制台的 Functions(函数)页面

  2. 选择 Create function(创建函数),然后选择 Author from scratch(从头开始创作)。

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

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

  5. 对于现有角色,选择 LogAutoScalingEvent-role

  6. 保留其他默认值。

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

  8. LogAutoScalingEvent 函数在控制台中保持打开状态时,在编辑器中的 Function code(函数代码)下,将以下示例代码复制到名为 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['EC2InstanceId'], 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; };

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

  9. 选择 Deploy(部署)。

步骤 3:创建 EventBridge 规则

创建 EventBridge 规则以运行您的 Lambda 函数。

使用控制台创建规则

  1. 打开 EventBridge 控制台

  2. 在导航窗格中,选择 Rules (规则)

  3. 选择 Create rule (创建规则)

  4. 对于定义规则详细信息,请执行以下操作:

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

    2. 对于 Event bus(事件总线),选择 default(默认)。当您账户中的某个 Amazon Web Service生成一个事件时,它始终会发送到您账户的默认事件总线。

    3. 对于 Rule type(规则类型),选择 Rule with an event pattern(具有事件模式的规则)。

    4. 选择 Next (下一步)

  5. 对于 Build event pattern(构建事件模式),执行以下操作:

    1. 对于 Event source(事件源),选择 Amazon 事件或 EventBridge 合作伙伴事件

    2. 对于 Event pattern(事件模式),执行以下操作:

      1. 对于事件源,选择 Amazon Web Services

      2. 对于 Amazon Web Service,选择 Auto Scaling

      3. 对于 Event Type (事件类型),选择 Instance Launch and Terminate (实例启动和终止)

      4. 默认情况下,该规则会与任何横向缩减或横向扩展事件匹配。要创建在发生横向扩展事件并且因生命周期挂钩而使实例被置于等待状态时通知您的规则,请选择 Specific instance event(s)(特定实例事件),然后选择 EC2 Instance-launch Lifecycle Action(EC2 实例启动生命周期操作)。

      5. 默认情况下,该规则与区域中任何 Auto Scaling 组匹配。若要使该规则与特定 Auto Scaling 组匹配,请选择 特定组名称并选择一个或多个 Auto Scaling 组。

      6. 选择 Next (下一步)

  6. 对于 Select target(s)(选择目标),请执行以下操作:

    1. 对于 Target types(目标类型),选择 Amazon Web Service

    2. 对于 Select a target(选择目标),选择 Lambda function(Lambda 函数)。

    3. 对于 Function(函数),选择 LogAutoScalingEvent

    4. 选择 Next(下一步)两次。

  7. 请在 Review and create(审核和创建)页面上,选择 Create(创建)。

步骤 4:添加生命周期钩子

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

添加生命周期挂钩

  1. 打开 Amazon EC2 控制台的自动扩缩组页面

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

    将在 Auto Scaling 组页面底部打开一个拆分窗格。

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

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

    1. 对于生命周期钩子名称,请输入 LogAutoScalingEvent-hook

    2. 对于生命周期转换,请选择实例启动

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

    4. 对于默认结果,请选择放弃。这意味着,如果钩子超时而未收到 Lambda 函数的回调,Auto Scaling 组将终止新实例。

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

  5. 选择 Create (创建)

步骤 5:测试和验证事件

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

增加您的 Auto Scaling 组的大小

  1. 打开 Amazon EC2 控制台的自动扩缩组页面

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

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

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

  5. 选择 Update(更新)。启动实例时,上方窗格中的状态列会显示正在更新容量状态。

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

查看 Lambda 函数的输出

  1. 打开 CloudWatch 控制台的 Log groups page(日志组页面)。

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

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

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

查看扩展活动

  1. 返回到 Auto Scaling 组页面并选择您的组。

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

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

    • 如果失败,在等待几分钟后,您将看到状态为“已取消”的扩展活动,并显示状态消息“实例无法完成用户的生命周期操作:使用令牌 e85eb647-4fe0-4909-b341-a6c42EXAMPLE 的生命周期操作已放弃:使用“放弃”结果完成的生命周期操作”。

减少您的 Auto Scaling 组的大小

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

步骤 6:后续步骤

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

步骤 7:清除

如果您已完成仅为本教程创建的资源,请使用以下步骤将其删除。

删除生命周期钩子

  1. 打开 Amazon EC2 控制台的自动扩缩组页面

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

  3. 实例管理选项卡的生命周期钩子中,选择生命周期钩子 (LogAutoScalingEvent-hook)。

  4. 依次选择 Actions(操作)Delete(删除)

  5. 再次选择删除以确认。

删除 Amazon EventBridge 规则

  1. 打开 Amazon EventBridge 控制台中的规则页面

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

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

  4. 依次选择 Actions(操作)Delete(删除)

  5. 再次选择删除以确认。

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

要删除 Lambda 函数

  1. 打开 Lambda 控制台的 Functions(函数)页面

  2. 选择函数 (LogAutoScalingEvent)。

  3. 依次选择 Actions(操作)和 Delete(删除)。

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

删除日志组

  1. 打开 CloudWatch 控制台的 Log groups page(日志组页面)。

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

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

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

删除执行角色

  1. 打开 IAM 控制台的 Roles page(角色页面)。

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

  3. 选择 Delete role(删除角色)。

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

删除 IAM policy

  1. 打开 IAM 控制台的 Policies(策略)页面

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

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

  4. Delete policy(删除策略)对话框中,选择 Yes, delete(是的,删除)。