以下是我尝试的两个示例代码
代码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启动。
答案 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无法启动