1

以下は、私が試した2つのサンプルコードです

コード 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 のプラットフォーム プロパティは「Windows」ではなく「Other Linux」として設定されます。 注: プラットフォーム ウィンドウを他の Linux に変更することができます。 virtualization_type が hvm の場合は問題にならないため、無視してください。完全仮想化された VM は mbr を実行して起動するため、VM は正常に起動します。

4

2 に答える 2

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 に PVGRUB 用に十分なプロパティが設定されていない限り、ほとんどの場合、ターゲット AMI は起動しません。

于 2014-11-24T23:37:12.140 に答える