1

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

代码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 的平台属性将设置为“其他 Linux”而不是“Windows”注意:平台窗口到其他 Linux 的更改可以被忽略,因为当 virtualization_type 是 hvm 时,这并不重要。虚拟机将正常启动,因为完全虚拟化的虚拟机通过执行 mbr 启动。

4

2 回答 2

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 中工作。

于 2014-11-24T18:26:08.757 回答
1

目前,Boto (v2+,3+)、AWS CLI 或 Amazon 控制台不支持具有区域间加密卷传输的 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 时,我们并没有引用清单文件,而且我无法找到强制设置平台 ->“Windows”的方法。但是您可以忽略它,如果您将“Virtualization_type”设置为“hvm”,它应该可以正常工作。

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

如果是半虚拟化,您的目标 AMI 很可能不会启动,除非您的新 ami 为 PVGRUB 配置了足够的属性

于 2014-11-24T23:37:12.140 回答