Amazon Elastic Compute Cloud
Windows 实例用户指南
AWS 服务或AWS文档中描述的功能,可能因地区/位置而异。点 击 Getting Started with Amazon AWS to see specific differences applicable to the China (Beijing) Region.

Amazon EBS 的 Amazon CloudWatch Events

Amazon EBS 根据 Amazon CloudWatch Events 发送通知,以告知一系列快照和加密状态的更改。借助 CloudWatch Events,您可以创建规则,以触发编程操作,从而响应快照或加密密钥状态的更改。例如,创建快照后,您可以触发 AWS Lambda 函数,以与其他账户共享已完成的快照,或将其复制到其他区域以便用于灾难恢复用途。

有关更多信息,请参阅 Amazon CloudWatch 用户指南 中的使用事件

事件定义和示例

此部分定义了受支持的 Amazon EBS 事件,并提供了特定情景的事件输出示例。CloudWatch 中的事件表示为 JSON 对象。有关事件对象的格式和内容的更多信息,请参阅 Amazon CloudWatch Events 用户指南中的 事件和事件模式

注意

有关 Cloudwatch 未捕获的 EBS 卷的其他信息可通过

DescribeVolumes API 和 describe-volumes CLI 命令获取。

EBS 事件的独有字段包含在以下所示的 JSON 对象“详细信息”部分。“事件”字段包含事件名称。“结果”字段包含触发事件的操作的已完成状态。

创建快照 (createSnapshot)

当创建快照的操作完成后,系统会将 createSnapshot 事件发送至您的 AWS 账户。此事件的结果可能是 succeededfailed

事件数据

下面的列表是 EBS 为成功的 createSnapshot事件发送的 JSON 对象示例。source 字段包含源卷的 ARN。StartTimeEndTime 字段表示快照的创建何时开始以及何时完成。

Copy
{ "version": "0", "id": "01234567-0123-0123-0123-012345678901", "detail-type": "EBS Snapshot Notification", "source": "aws.ec2", "account": "012345678901", "time": "yyyy-mm-ddThh:mm:ssZ", "region": "us-east-1", "resources": [ "arn:aws:ec2::us-west-2:snapshot/snap-01234567" ], "detail": { "event": "createSnapshot", "result": "succeeded", "cause": "", "request-id": "", "snapshot_id": "arn:aws:ec2::us-west-2:snapshot/snap-01234567", "source": "arn:aws:ec2::us-west-2:volume/vol-01234567", "StartTime": "yyyy-mm-ddThh:mm:ssZ", "EndTime": "yyyy-mm-ddThh:mm:ssZ" } }

复制快照 (copySnapshot)

当复制快照的操作完成时,系统会将 copySnapshot 事件发送至您的 AWS 账户。此事件的结果可能是 succeededfailed

事件数据

下面的列表是 EBS 在 copySnapshot 事件失败后发送的 JSON 对象的示例。失败原因是源快照 ID 无效。snapshot_id 的值为失败快照的 ARN。source 的值为源快照的 ARN。StartTimeEndTime 表示 copy-snapshot 操作何时开始以及何时结束。

Copy
{ "version": "0", "id": "01234567-0123-0123-0123-012345678901", "detail-type": "EBS Snapshot Notification", "source": "aws.ec2", "account": "123456789012", "time": "yyyy-mm-ddThh:mm:ssZ", "region": "us-east-1", "resources": [ "arn:aws:ec2::us-west-2:snapshot/snap-01234567" ], "detail": { "event": "copySnapshot", "result": "failed", "cause": "Source snapshot ID is not valid", "request-id": "", "snapshot_id": "arn:aws:ec2::us-west-2:snapshot/snap-01234567", "source": "arn:aws:ec2::eu-west-1:snapshot/snap-76543210", "StartTime": "yyyy-mm-ddThh:mm:ssZ", "EndTime": "yyyy-mm-ddThh:mm:ssZ" } }

共享快照 (shareSnapshot)

在其他与您的 AWS 账户共享快照时,系统会将 shareSnapshot 事件发送至您的 AWS 账户。结果始终是 succeeded

事件数据

下面的列表是 EBS 在 shareSnapshot 事件完成后发送的 JSON 对象的示例。source 值是与您共享快照的用户的 AWS 账号。StartTimeEndTime 表示 share-snapshot 操作何时开始以及何时结束。仅在与其他用户共享私有快照时,系统才会发送 shareSnapshot 事件。共享公有快照不会触发该事件。

Copy
{ "version": "0", "id": "01234567-01234-0123-0123-012345678901", "detail-type": "EBS Snapshot Notification", "source": "aws.ec2", "account": "012345678901", "time": "yyyy-mm-ddThh:mm:ssZ", "region": "us-east-1", "resources": [ "arn:aws:ec2::us-west-2:snapshot/snap-01234567" ], "detail": { "event": "shareSnapshot", "result": "succeeded", "cause": "", "request-id": "", "snapshot_id": "arn:aws:ec2::us-west-2:snapshot/snap-01234567", "source": 012345678901, "StartTime": "yyyy-mm-ddThh:mm:ssZ", "EndTime": ""yyyy-mm-ddThh:mm:ssZ"" } }

挂载或重新挂载卷时加密密钥无效 (attachVolumereattachVolume)

因 KMS 密钥无效而导致 attachVolume 事件无法将卷挂载或重新挂载到实例时,系统就会将该事件发送到您的 AWS 账户。

注意

您可以使用 KMS 密钥加密 EBS 卷。如果用于加密卷的密钥无效,则日后将该密钥用于创建、挂载或重新挂载卷时,EBS 将会发送该事件。

事件数据

下面的列表是 EBS 在 attachVolume 事件失败后发送的 JSON 对象的示例。失败原因是 KMS 密钥处于待删除状态。

注意

在对服务器进行日常维护后,AWS 可能会尝试重新挂载卷。

Copy
{ "version": "0", "id": "01234567-0123-0123-0123-0123456789ab", "detail-type": "EBS Volume Notification", "source": "aws.ec2", "account": "012345678901", "time": "yyyy-mm-ddThh:mm:ssZ", "region": "us-east-1", "resources": [ "arn:aws:ec2:us-east-1:0123456789ab:volume/vol-01234567", "arn:aws:kms:us-east-1:0123456789ab:key/01234567-0123-0123-0123-0123456789ab" ], "detail": { "event": "attachVolume", "result": "failed", "cause": "arn:aws:kms:us-east-1:0123456789ab:key/01234567-0123-0123-0123-0123456789ab is pending deletion.", "request-id": "" } }

下面的列表是 EBS 在 reattachVolume 事件失败后发送的 JSON 对象的示例。失败原因是 KMS 密钥处于待删除状态。

Copy
{ "version": "0", "id": "01234567-0123-0123-0123-0123456789ab", "detail-type": "EBS Volume Notification", "source": "aws.ec2", "account": "012345678901", "time": "yyyy-mm-ddThh:mm:ssZ", "region": "us-east-1", "resources": [ "arn:aws:ec2:us-east-1:0123456789ab:volume/vol-01234567", "arn:aws:kms:us-east-1:0123456789ab:key/01234567-0123-0123-0123-0123456789ab" ], "detail": { "event": "reattachVolume", "result": "failed", "cause": "arn:aws:kms:us-east-1:0123456789ab:key/01234567-0123-0123-0123-0123456789ab is pending deletion.", "request-id": "" } }

创建卷时加密密钥无效 (createVolume)

因 KMS 密钥无效而导致 createVolume 事件无法创建卷时,系统就会将该事件发送到您的 AWS 账户。

您可以使用 KMS 密钥加密 EBS 卷。如果用于加密卷的密钥无效,则日后将该密钥用于创建、挂载或重新挂载卷时,EBS 将会发送该事件。

事件数据

下面的列表是 EBS 在 createVolume 事件失败后发送的 JSON 对象的示例。失败原因是 KMS 密钥被禁用。

Copy
{ "version": "0", "id": "01234567-0123-0123-0123-0123456789ab", "detail-type": "EBS Volume Notification", "source": "aws.ec2", "account": "012345678901", "time": "yyyy-mm-ddThh:mm:ssZ", "region": "sa-east-1", "resources": [ "arn:aws:ec2:sa-east-1:0123456789ab:volume/vol-01234567", ], "detail": { "event": "createVolume", "result": "failed", "cause": "arn:aws:kms:sa-east-1:0123456789ab:key/01234567-0123-0123-0123-0123456789ab is disabled.", "request-id": "01234567-0123-0123-0123-0123456789ab", } }

以下是 EBS 在 createVolume 事件失败后发送的 JSON 对象的示例。失败原因是 KMS 密钥正等待导入。

Copy
{ "version": "0", "id": "01234567-0123-0123-0123-0123456789ab", "detail-type": "EBS Volume Notification", "source": "aws.ec2", "account": "012345678901", "time": "yyyy-mm-ddThh:mm:ssZ", "region": "sa-east-1", "resources": [ "arn:aws:ec2:sa-east-1:0123456789ab:volume/vol-01234567", ], "detail": { "event": "createVolume", "result": "failed", "cause": "arn:aws:kms:sa-east-1:0123456789ab:key/01234567-0123-0123-0123-0123456789ab is pending import.", "request-id": "01234567-0123-0123-0123-0123456789ab", } }

使用 AWS Lambda 处理 CloudWatch Events

您可以使用 Amazon EBS 和 CloudWatch Events 自动执行数据备份工作流。这需要您创建 IAM 策略、用于处理事件的 AWS Lambda 函数,以及与传入事件匹配并能将传入事件路由到 Lambda 函数的 Amazon CloudWatch Events 规则。

以下步骤使用 createSnapshot 事件自动将已完成的快照复制到其他区域,以用于灾难恢复。

将已完成的快照复制到其他区域

  1. 创建 IAM 策略 (例如以下示例中显示的策略),以便提供执行 CopySnapshot 操作和对 CloudWatch Events 日志执行写入操作的权限。将策略分配给要处理 CloudWatch 事件的 IAM 用户。

    Copy
    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "logs:CreateLogGroup", "logs:CreateLogStream", "logs:PutLogEvents" ], "Resource": "arn:aws:logs:*:*:*" }, { "Effect": "Allow", "Action": [ "ec2:CopySnapshot" ], "Resource": "*" } ] }
  2. 在 Lambda 中定义一个可在 CloudWatch 控制台中使用的函数。在 Amazon EBS 发送匹配的 createSnapshot 事件时 (表示快照已完成),CloudWatch 会调用下例中的在 Node.js 中编写的 Lambda 函数。该函数被调用后,它会将快照从 us-east-2 复制到 us-east-1

    Copy
    // Sample Lambda function to copy an EBS snapshot to a different region var AWS = require('aws-sdk'); var ec2 = new AWS.EC2(); // define variables var destinationRegion = 'us-east-1'; var sourceRegion = 'us-east-2'; console.log ('Loading function'); //main function exports.handler = (event, context, callback) => { // Get the EBS snapshot ID from the CloudWatch event details var snapshotArn = event.detail.snapshot_id.split('/'); const snapshotId = snapshotArn[1]; const description = `Snapshot copy from ${snapshotId} in ${sourceRegion}.`; console.log ("snapshotId:", snapshotId); // Load EC2 class and update the configuration to use destination region to initiate the snapshot. AWS.config.update({region: destinationRegion}); var ec2 = new AWS.EC2(); // Prepare variables for ec2.modifySnapshotAttribute call const copySnapshotParams = { Description: description, DestinationRegion: destinationRegion, SourceRegion: sourceRegion, SourceSnapshotId: snapshotId }; // Execute the copy snapshot and log any errors ec2.copySnapshot(copySnapshotParams, (err, data) => { if (err) { const errorMessage = `Error copying snapshot ${snapshotId} to region ${destinationRegion}.`; console.log(errorMessage); console.log(err); callback(errorMessage); } else { const successMessage = `Successfully started copy of snapshot ${snapshotId} to region ${destinationRegion}.`; console.log(successMessage); console.log(data); callback(null, successMessage); } }); };

    为确保您的 Lambda 函数在 CloudWatch 控制台中可用,请在将发生 CloudWatch 事件的区域创建该函数。有关更多信息,请参阅 AWS Lambda 开发人员指南

  3. 通过以下网址打开 CloudWatch 控制台:https://console.amazonaws.cn/cloudwatch/

  4. 依次选择事件创建规则选择事件源以及 Amazon EBS 快照

  5. 对于特定事件,请选择 createSnapshot,对于特定结果,请选择 succeeded

  6. 有关规则目标,请查找并选择您之前创建的示例函数。

  7. 选择目标添加目标

  8. 有关 Lambda 功能,请选择您之前创建的 Lambda 功能并选择配置详细信息

  9. 配置规则详细信息页面,请键入名称描述的值。选择状态复选框激活功能 (将其设置为已启用)。

  10. 选择 Create rule

现在,您的规则应该会显示在规则选项卡中。在所示的示例中,当您下次复制快照时,EBS 应该会发送您所配置的事件。