

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

# 通过实例元数据检索目标生命周期状态
<a name="retrieving-target-lifecycle-state-through-imds"></a>

您启动的每个 Auto Scaling 实例都经历多个生命周期状态。如需从实例内调用作用于特定生命周期状态转换的自定义操作，则您必须通过实例元数据检索目标生命周期状态。

例如，您可能需要一种从实例内部检测实例终止的机制，以便在实例终止之前在实例上运行一些代码。为此，您可以编写代码，直接从实例中轮询实例的生命周期状态。然后，您可以向自动扩缩组添加生命周期挂钩，以保持实例运行，直到您的代码发送 **complete-lifecycle-action** 命令以继续。

Auto Scaling 实例生命周期有两个主要的稳定状态：`InService` 和 `Terminated`，还有两个附加的稳定状态：`Detached` 和 `Standby`。如果使用暖池，生命周期还有四个额外的稳定状态：`Warmed:Hibernated`、`Warmed:Running`、`Warmed:Stopped` 和 `Warmed:Terminated`。

当实例准备转换到之前的稳定状态之一时，Amazon EC2 Auto Scaling 会更新实例元数据项目 `autoscaling/target-lifecycle-state` 的值。要从实例内获取目标生命周期状态，必须使用实例元数据服务从实例元数据中检索它。

**注意**  
*实例元数据*是有关 Amazon EC2 实例的数据，应用程序可以用它来查询实例信息。*实例元数据服务*是实例上的组件，本地代码用它来访问实例元数据。本地代码可以包括实例上运行的用户数据脚本或应用程序。

本地代码可以使用以下两种方法之一从正在运行的实例访问实例元数据：实例元数据服务版本 1 (IMDSv1) 或实例元数据服务版本 2 (IMDSv2)。 IMDSv2使用面向会话的请求并缓解多种类型的漏洞，这些漏洞可用于尝试访问实例元数据。有关这两种方法的详细信息，请参阅 *Amazon EC2 用户指南 IMDSv2*中的[使用](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/configuring-instance-metadata-service.html)。

------
#### [ IMDSv2 ]

```
[ec2-user ~]$ TOKEN=`curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600"` \
&& curl -H "X-aws-ec2-metadata-token: $TOKEN" -v http://169.254.169.254/latest/meta-data/autoscaling/target-lifecycle-state
```

------
#### [ IMDSv1 ]

```
[ec2-user ~]$ curl http://169.254.169.254/latest/meta-data/autoscaling/target-lifecycle-state
```

------

下面是示例输出。

```
InService
```

目标生命周期状态是实例转换到的状态。当前生命周期状态是实例所处的状态。在生命周期操作完成并且实例完成向目标生命周期状态的转换之后，这两个状态可能是相同的。您无法从实例元数据中检索实例的当前生命周期状态。

Amazon EC2 Auto Scaling 于 2022 年 3 月 10 日开始生成目标生命周期状态。如果您的实例在该日期之后转换为其中一个目标生命周期状态，则您的实例元数据中将显示该目标生命周期状态项目。否则，它不存在，并且您会收到 HTTP 404 错误。

有关检索实例元数据的更多信息，请参阅《Amazon EC2 用户指南》**中的[检索实例元数据](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instancedata-data-retrieval.html)。

有关向您展示如何在使用目标生命周期状态的用户数据脚本中使用自定义操作创建生命周期钩子的教程，请参阅 [教程：使用数据脚本和实例元数据检索生命周期状态](tutorial-lifecycle-hook-instance-metadata.md)。

**重要**  
为确保您可以尽快调用自定义操作，您的本地代码应经常轮询 IMDS，并在出现错误时重试。