如何使用[非]加密快照将AMI从一个区域传输到另一个区域。 AMI平台从windows变为其他linux

时间:2014-11-18 21:32:06

标签: copy transfer snapshot encryption boto3

以下是我尝试的两个示例代码

代码1:

import boto3
session = boto3.session.Session()
ec2_us_east = session.resource('ec2')
snap = ec2_us_east.Snapshot('snap-<id>')
snap.copy(DryRun=False,SourceRegion='us-east-1',SourceSnapshotId=snap.id,Description="testB3Copy",DestinationRegion="us-west-1")

代码2:

import boto3
ec2_us_east_client = boto3.client('ec2')
ec2_us_east_client.copy_snapshot(DryRun=False,SourceRegion='us-east-1',SourceSnapshotId=<snap-id>,Description="testB3Copy",DestinationRegion="us-west-1")

两者都会生成相同的错误消息,如下所示:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-65-464cba179f87> in <module>() 
----> 1 ec2_us_east_client.copy_snapshot(DryRun=True,SourceRegion='us-east-1',SourceSnapshotId=snap.id,Description="testB3Copy",DestinationRegion="us-west-1")

/usr/lib/python2.7/site-packages/botocore/client.pyc in _api_call(self, **kwargs)
    239                     endpoint_prefix=service_model.endpoint_prefix,
    240                     operation_name=operation_name),
--> 241                 model=operation_model, params=request_dict
    242             )
    243

/usr/lib/python2.7/site-packages/botocore/hooks.pyc in emit(self, event_name, **kwargs)
    150         for handler in handlers_to_call:
    151             logger.debug('Event %s: calling handler %s', event_name, handler)
--> 152             response = handler(**kwargs)
    153             responses.append((handler, response))
    154         return responses

TypeError: copy_snapshot_encrypted() takes exactly 3 arguments (1 given)

我不确定这里出了什么问题。根据文档,copy_snapshot需要5个参数。

还不确定是否可以使用boto2 +

传输加密快照

当您将Windows AMI从一个区域传输到另一个区域时(通过复制快照并手动或通过脚本注册AMI),最终AMI的平台属性将设置为&#34;其他Linux&#34;而不是&#34; Windows&#34; 注意:可以忽略其他Linux更改的平台窗口,因为当virtualization_type是hvm时,它并不重要。 VM将正常启动,因为完全虚拟化的VM通过执行mbr启动。

2 个答案:

答案 0 :(得分:1)

更新:Boto 3版本0.0.7现在应该包括对在Botocore客户端界面中复制加密快照的支持。


现在有一个自定义可以帮助Botocore中的这个方法,它由AWS CLI使用。它尚未在Boto 3中提供.Botocore提供两个公共接口,较新的是Boto 3中公开的低级客户端。这些接口尚不支持此处设置的自定义:

https://github.com/boto/botocore/blob/develop/botocore/handlers.py#L398

我们正在努力解决这个问题,以便这个和其他一些调用只能在Boto 3中运行,就像今天在AWS CLI中一样。更改将需要Botocore代码更改和发布,然后它应该只适用于Boto 3。

答案 1 :(得分:1)

目前,Boto(v2 +,3 +),AWS CLI或亚马逊控制台不支持在区域之间进行加密卷传输的AMI。

另外Boto(v2 +,3 +)不透明地支持使用加密快照传输AMI

注意:有5个活动快照传输的硬限制,这可能会对AMI传输功能产生挑战(不确定)。但是AWSCLI(截至今天的最新版本)支持加密的块设备传输。

所以这就是我所做的。我使用AWS CLI传输快照和Python-boto来管理传输

1. Shellscript
   INPUT(CommandlineArgs) takes snapshotID, source region and destination region as input
   Output snapshotID or <predeterminedstring, eg: TfrFailed>(incase transfer failed due to 5ActiveSnapshotTransferAcrossRegionLimit) 

2. Python (boto)
   Input(CommandlineArgs) takes AMI_ID(s)
   Logic:
    for each ami 
       collect information about snapshots
     try
       initiates transfer of each snapshot (by calling shell script which uses AWS CLI)
     catch exception (output of shell script == <predeterminedstring>
       retry after sometime (you would be here if you had hit the hard limit of 5 active snapshots
     finally (once all snapshots are transfered)
       register a new ami (optionally transfer all tags from source AMI to target AMI)
       print SRC_AMI_ID "-->" DST_AMI_ID
    done
   Output: <SourceLocation_AMI-ID> --> <TargetLocation_AMI-ID

注意:您可能会看到目标AMI丢失了有关“平台”的信息,因为当我们以这种方式传输AMI时,我们没有引用清单文件,我无法找到强制设置平台的方法 - &gt; “视窗”。但你可以忽略它,如果你将“Virtualization_type”设置为“hvm”,它应该可以正常工作。

注意:如果您这样做并想使用“获取密码功能”,那么您可能运气不好,因为这需要将平台设置为“Windows”

除非您的新ami具有为PVGRUB配置的足够属性,否则很可能您的目标AMI无法启动