

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# Spot 執行個體中斷通知
<a name="spot-instance-termination-notices"></a>

*Spot 執行個體中斷通知*是在 Amazon EC2 停止或終止 Spot 執行個體的兩分鐘之前發出的警告。如果將休眠指定為中斷時的行為，您會收到中斷通知，但不會提前兩分鐘收到警告，因為休眠程序會立刻開始執行。

從容處理 Spot 執行個體中斷的最佳方法，就是建立容錯的應用程式架構。若要達成此目的，您可以利用 Spot 執行個體中斷通知。建議您每隔 5 秒檢查這些中斷通知。

中斷通知可做為 EventBridge 事件和 Spot 執行個體上[執行個體中繼資料](ec2-instance-metadata.md)中的項目。中斷通知的原則是盡可能發出。

## EC2 Spot Instance Interruption Warning 事件
<a name="ec2-spot-instance-interruption-warning-event"></a>

當 Amazon EC2 要中斷您的 Spot 執行個體時，它會在實際中斷前兩分鐘發出一個事件 (休眠除外，它會收到中斷通知，但不會提前兩分鐘，因為休眠會立即開始)。Amazon EventBridge 可以偵測到此事件。如需 EventBridge 事件的詳細資訊，請參閱[「Amazon EventBridge 使用者指南」](https://docs.aws.amazon.com/eventbridge/latest/userguide/)。如需如何建立和使用事件規則的詳細範例，請參閱[利用 Amazon EC2 Spot 執行個體中斷通知](https://aws.amazon.com/blogs/compute/taking-advantage-of-amazon-ec2-spot-instance-interruption-notices/)。

下列是 Spot 執行個體中斷事件的範例。`instance-action` 可能的值為 `hibernate`、`stop` 或 `terminate`。

```
{
    "version": "0",
    "id": "12345678-1234-1234-1234-123456789012",
    "detail-type": "EC2 Spot Instance Interruption Warning",
    "source": "aws.ec2",
    "account": "123456789012",
    "time": "yyyy-mm-ddThh:mm:ssZ",
    "region": "us-east-2",
    "resources": ["arn:aws:ec2:us-east-2a:instance/i-1234567890abcdef0"],
    "detail": {
        "instance-id": "i-1234567890abcdef0",
        "instance-action": "action"
    }
}
```

**注意**  
Spot 執行個體中斷事件的 ARN 格式是 `arn:aws:ec2:availability-zone:instance/instance-id`。此格式與 [EC2 資源 ARN 格式](https://docs.aws.amazon.com/service-authorization/latest/reference/list_amazonec2.html#amazonec2-resources-for-iam-policies)不同。

## instance-action
<a name="instance-action-metadata"></a>

`instance-action` 項目會指定動作和動作發生的約略時間 (UTC)。

如果 Spot 執行個體已標記為由 Amazon EC2 停止或終止，則[執行個體中繼資料](ec2-instance-metadata.md)中會出現 `instance-action` 項目。否則不會存在。您可以使用執行個體中繼資料服務第 2 版 (IMDSv2) 擷取 `instance-action`，如下所示。

------
#### [ Linux ]

```
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" http://169.254.169.254/latest/meta-data/spot/instance-action
```

------
#### [ Windows ]

```
[string]$token = Invoke-RestMethod `
    -Headers @{"X-aws-ec2-metadata-token-ttl-seconds" = "21600"} `
    -Method PUT -Uri http://169.254.169.254/latest/meta-data/spot/instance-action
```

------

 下列範例輸出指出此執行個體將會停止的時間點。

```
{"action": "stop", "time": "2017-09-18T08:22:00Z"}
```

下列範例輸出指出此執行個體將會終止的時間點。

```
{"action": "terminate", "time": "2017-09-18T08:22:00Z"}
```

如果 Amazon EC2 未準備停止或終止執行個體，或是您自行終止了執行個體，則執行個體中繼資料中不會出現 `instance-action`，而且您會在嘗試擷取它時收到 HTTP 404 錯誤。

## termination-time
<a name="termination-time-metadata"></a>

`termination-time` 項目會指定執行個體將接收結束訊號的約略時間 (UTC)。

**注意**  
保留此項目是為了回溯相容性；您應改用 `instance-action`。

如果您的 Spot 執行個體被 Amazon EC2 標記為終止 (由於 Spot 執行個體中斷，中斷行為設定為 `terminate`，或者由於取消持續性 Spot 執行個體請求)，則 `termination-time` 項目會出現在[執行個體中繼資料](ec2-instance-metadata.md)中。否則不會存在。您可以使用 `termination-time` IMDSv2 擷取，如下所示。

------
#### [ Linux ]

```
TOKEN=`curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600"`
if curl -H "X-aws-ec2-metadata-token: $TOKEN" -s http://169.254.169.254/latest/meta-data/spot/termination-time | grep -q .*T.*Z; then echo termination_scheduled; fi
```

------
#### [ Windows ]

```
[string]$token = Invoke-RestMethod -Headers @{"X-aws-ec2-metadata-token-ttl-seconds" = "21600"} -Method PUT -Uri http://169.254.169.254/latest/meta-data/spot/termination-time
```

------

以下為範例輸出。

```
2015-01-05T18:02:00Z
```

如果 Amazon EC2 沒有準備終止執行個體 (無論是因為沒有 Spot 執行個體中斷，或是因為中斷行為設定為 `stop` 或 `hibernate`) 或是您自行終止 Spot 執行個體，則 `termination-time` 項目可能不存在於執行個體中繼資料中 (因此您會收到 HTTP 404 錯誤)，或是包含的值並非時間值。

如果 Amazon EC2 終止執行個體的動作失敗，則請求狀態會設定為 `fulfilled`。`termination-time` 值仍會存在於執行個體中繼資料中，包含原來的約略時間 (現在這個時間已經成為過去)。