当前位置:网站首页 > 更多 > 玩电脑 > 正文

[玩转系统] 如何使用 PowerShell 管理和自动化 AWS EC2 快照

作者:精品下载站 日期:2024-12-14 20:49:51 浏览:14 分类:玩电脑

如何使用 PowerShell 管理和自动化 AWS EC2 快照


Amazon Elastic Block Store (EBS) 是一项为 Amazon EC2 实例提供存储的服务。 EC2 实例上的每个卷都在 EBS 上运行。当您依赖服务来运行重要的基础设施时,明智的做法是确保数据得到备份。在这篇博文中,了解如何使用 PowerShell 脚本语言管理和自动化 EC2 快照。

附加到 EC2 实例的每个 EBS 卷都可以通过 EBS 快照进行备份。每个快照可以通过以下两种方式之一创建:完整或增量快照。嗯,从技术上讲,两者都是,但是……跟我一起讨论这个吧。

当为 EC2 实例创建第一个快照备份时,它会创建整个卷的备份。后续创建快照时,仅保存自上次快照以来发生变化的块级存储级别的数据。然而,与典型的增量时间点备份不同,由于快照可以链接,因此当恢复快照时,该卷的所有数据都会恢复,使其类似于完整备份。

快照可以异步发生,这意味着快照可以并行创建过程。启动后,快照进入待处理阶段,直到所有必要的块都复制到存储所有 EBS 快照的 Amazon S3。

使用 PowerShell 创建 AWS EC2 快照

AWS 允许您通过几种不同的方式来管理 EBS 快照。如果您愿意,您可以直接使用 AWS 管理控制台、AWS CLI、PowerShell 或 API。在本文中,我们将使用 PowerShell,因为 AWSPowerShell 模块非常支持使用 PowerShell 命令管理 EBS 快照。

先决条件

在我们深入讨论之前,我假设您必须从本教程中获得最大收益,因此有一些先决条件。你会需要:

  • AWS 账户
  • 具有附加卷的 EC2 实例
  • 使用 root 用户或具有 CreateSnapshot 权限的 IAM 用户进行身份验证 (arn:aws:ec2:region::snapshot/*)

一旦您满足了所有这些先决条件,我们就可以开始了!

查找现有 EC2 快照

我们要做的首要任务之一是发现是否已经有任何现有的快照。为了弄清楚这一点,我们使用 Get-EC2Snapshot 命令。该命令将搜索已创建的任何快照并将其输出到 PowerShell 控制台。

PS C:\> Get-EC2Snapshot


DataEncryptionKeyId :
Description         : Business/Industry Summary (Windows)
Encrypted           : False
KmsKeyId            :
OwnerAlias          : amazon
OwnerId             : 947081328633
Progress            : 100%
SnapshotId          : snap-8af818e3
StartTime           : 11/19/2008 6:15:17 AM
State               : completed
StateMessage        :
Tags                : {}
VolumeId            : vol-e1ac4888
VolumeSize          : 15
<SNIP>

您会注意到,出现的 AWS EC2 快照并不是您的 EC2 实例的快照。这些都是已与您共享的快照,可供您恢复到 EC2 实例。要发现来自 EC2 实例的所有快照,请将 OwnerId 参数与 self 值结合使用。

PS> Get-EC2Snapshot -OwnerId self

创建新的 EBS 快照

假设您已经创建了 EC2 实例,现在可以创建快照。您可以使用 New-EC2Snapshot 命令创建新快照,但首先,您需要收集要创建快照的每个卷的卷 ID。为此,我们首先需要找到该卷附加到的 EC2 实例 ID。

PS> (Get-EC2Instance).instances
PS> $instanceId = (Get-EC2Instance).instances.InstanceId

一旦您知道了 EC2 实例 ID,您就需要使用它来查找卷。要查找附加到 EC2 实例的所有卷,您将使用 Get-EC2Volume 命令并将输出过滤为仅包含具有我们要查找的附加实例 ID 的卷。

PS> $volumes = Get-EC2Volume | Where-Object { $_.attachments.InstanceId -eq $instanceId }

Attachments      : {i-083007f62ff750d7a}
AvailabilityZone : us-east-1b
CreateTime       : 3/1/2019 7:06:57 AM
Encrypted        : False
Iops             : 100
KmsKeyId         :
Size             : 8
SnapshotId       : snap-0ff5b79fdf9b021e8
State            : in-use
Tags             : {}
VolumeId         : vol-0bf53c62534f99eee
VolumeType       : gp2

现在我们已经有了卷,AWS 建议关闭实例或至少卸载卷。我们将继续关闭该实例。

PS> Stop-EC2Instance -InstanceId $instanceId

现在,我们可以循环遍历每个卷,并将该卷的 ID 传递给 New-EC2Snapshot 命令上的 VolumeId 参数。一旦发生这种情况,您会注意到快照将进入待处理状态。

foreach ($volume in $volumes) {
    New-EC2Snapshot -VolumeId $volume.VolumeId
}

DataEncryptionKeyId :
Description         :
Encrypted           : False
KmsKeyId            :
OwnerAlias          :
OwnerId             : 013223035658
Progress            :
SnapshotId          : snap-027a3550dde80eb3b
StartTime           : 3/1/2019 7:19:13 AM
State               : pending
StateMessage        :
Tags                : {}
VolumeId            : vol-0bf53c62534f99eee
VolumeSize          : 8

您可以通过再次运行 Get-EC2Snapshot 并确认状态现在已完成来确认快照已完成。

分配标签

如果您有大量快照需要管理,则很难将它们全部整理好。要对快照进行排序并对每个发现进行分类,您还可以为其分配标签。标签是 EC2 中无处不在的一部分,可用于您的 EBS 快照。

您可以在创建快照时或之后分配标签。要在创建快照时分配标签,请使用 New-EC2Snapshot 上的 TagSpecification 参数。

例如,也许我想标记我在进行生产更改之前刚刚拍摄的 AWS EC2 快照。我想创建一个名为 Stage 的标签,并将其指定为 Dev。为此,我可以创建一个 TagSpecification 对象,将一个或多个 Tag 对象分配给 Tags 属性,然后定义此标签将附加到的资源类型。

$tag = New-Object Amazon.EC2.Model.Tag
$tag.Key = 'Stage'
$tag.Value = 'Dev'
$tagSpec = New-Object Amazon.EC2.Model.TagSpecification
$tagSpec.Tags = $tag
$tagSpec.ResourceType = 'snapshot'

创建 TagSpecification 对象后,我可以将其传递给 New-EC2Snapshot

PS> New-EC2Snapshot -VolumeId <VolumeId> -TagSpecification $tagSpec

从快照创建新的 AMI

快照的另一个很酷的功能是您可以从快照创建全新的映像 (AMI)。如果您拥有仅限 Linux EC2 实例的根卷快照,您可以轻松地从该卷快照创建全新的 AMI。假设我想从刚刚创建的快照创建一个新图像。我可以使用 New-EC2Image 命令来做到这一点。

我首先需要捕获快照 ID。

PS> $snapshotId = Get-EC2Snapshot -OwnerId self | where {$_.Tags.where({$_.Key -eq 'Stage' -and $_.Value -eq 'Dev'})} | Select-Object -ExpandProperty SnapshotId

接下来,我可以将该 ID 作为哈希表传递给 New-EC2Image 上的 BlockDeviceMapping 参数。

PS> $block = @{SnapshotId=$snapshotId}
PS> Register-EC2Image -Name 'my_image' -BlockDeviceMapping @{DeviceName="/dev/sda1";Ebs=$block;VirtualName='ephemeral0'} -RootDeviceName '/dev/sda1'

删除 AWS EC2 快照

如果我们完成了快照,我们现在可以删除它们。这样做很容易。只需将 Get-EC2Snapshot 返回的实例通过管道传输到 Remove-EC2Snapshot。但是,如果正在使用 AMI,您可能会遇到此错误。

PS> Get-EC2Snapshot -OwnerId self | Remove-EC2Snapshot

Confirm
Are you sure you want to perform this action?
Performing the operation "Remove-EC2Snapshot (DeleteSnapshot)" on target "snap-066ccd492f85192be".
[Y] Yes  [A] Yes to All  [N] No  [L] No to All  [S] Suspend  [?] Help (default is "Y"): a
Remove-EC2Snapshot : The snapshot snap-066ccd492f85192be is currently in use by ami-0b353cbd967f6658f
At line:1 char:33
+ Get-EC2Snapshot -OwnerId self | Remove-EC2Snapshot
+                                 ~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (Amazon.PowerShe...2SnapshotCmdlet:RemoveEC2SnapshotCmdlet) [Remove-EC2Snapshot], InvalidOperationExce
   ption
    + FullyQualifiedErrorId : Amazon.EC2.AmazonEC2Exception,Amazon.PowerShell.Cmdlets.EC2.RemoveEC2SnapshotCmdlet

在这种情况下,AMI 已注册,您必须首先使用 Unregister-EC2Image 命令取消注册。

PS> $myImage = Get-EC2Image -Owner self
PS> Unregister-EC2Image -ImageId $myImage.ImageId
PS> Get-EC2Snapshot -OwnerId self | Remove-EC2Snapshot

概括

PowerShell 允许您管理 EBS 快照的各个方面。如果我们此处介绍的场景不适合您需要执行的操作,我建议通过运行 Get-Command -Noun *ec2snapshot* -Module AWSPowerShell 来查看所有可用的 EC2 快照命令。这将使您更好地了解 PowerShell 和 EC2 (EBS) 快照的可能性。

您需要 登录账户 后才能发表评论

取消回复欢迎 发表评论:

关灯