27

boto / pythonを使用して、EBSボリュームから起動する新しいEC2インスタンスを起動しています。インスタンスを起動するときに、起動中のEBSボリュームのデフォルトサイズを上書きしたいと思います。

起動コードに適合する可能性のあるbotoメソッドまたはパラメーターが見つかりませんでした。

ec2 = boto.connect_ec2( ACCESS_KEY, SECRET_KEY, region=region )

reservation = ec2.run_instances( image_id=AMI_ID, 
                                 key_name=EC2_KEY_HANDLE, 
                                 instance_type=INSTANCE_TYPE,
                                 security_groups = [ SECGROUP_HANDLE, ] )

このウェブページは、コマンドラインツールを使用して実行中のEC2インスタンスのEBSボリュームのサイズを増やす方法を示していますが、EC2インスタンスが指定されたときにbotoを使用したいと思います。

4

3 に答える 3

43

最初にブロックデバイスマッピングを作成する必要があります。

dev_sda1 = boto.ec2.blockdevicemapping.EBSBlockDeviceType()
dev_sda1.size = 50 # size in Gigabytes
bdm = boto.ec2.blockdevicemapping.BlockDeviceMapping()
bdm['/dev/sda1'] = dev_sda1 

run_instancesこの後、通話でブロックデバイスマップを指定できます。

reservation = ec2.run_instances( image_id=AMI_ID, 
                                 key_name=EC2_KEY_HANDLE, 
                                 instance_type=INSTANCE_TYPE,
                                 security_groups = [ SECGROUP_HANDLE, ],
                                 block_device_mappings = [bdm])

残念ながら、これは実際には十分に文書化されていませんが、例はソースコードにあります

于 2012-11-28T11:43:04.793 に答える
0

CloudFormationを使用することもできます。これは、環境の文書化と自動化に使用されます。ESB定義のテンプレートは、https ://s3.amazonaws.com/cloudformation-templates-us-east-1/EC2WithEBSSample.templateで確認できます。

 "Resources" : {
    "Ec2Instance" : {
      "Type" : "AWS::EC2::Instance",
      "Properties" : {
        "AvailabilityZone" : { "Fn::FindInMap" : [ "RegionMap", { "Ref" : "AWS::Region" }, "TestAz" ]},
        "SecurityGroups" : [ { "Ref" : "InstanceSecurityGroup" } ],
        "KeyName" : { "Ref" : "KeyName" },
        "ImageId" : { "Fn::FindInMap" : [ "RegionMap", { "Ref" : "AWS::Region" }, "AMI" ]},
        "Volumes" : [ 
          { "VolumeId" : { "Ref" : "NewVolume" },
            "Device" : "/dev/sdk"
          }
        ]
      }
    },

    ...

    "NewVolume" : {
      "Type" : "AWS::EC2::Volume",
      "Properties" : {
        "Size" : "100",
        "AvailabilityZone" : { "Fn::FindInMap" : [ "RegionMap", { "Ref" : "AWS::Region" }, "TestAz" ]}
      }
    }

その後、BotoCloudFormationAPIを使用して環境をデプロイできます。

于 2012-11-28T14:15:55.057 に答える
0

これは、boto3の「すべてがリソースである」アプローチを使用したコードのバージョンです。ハードコードされたディスク名を回避する方法にも注意してください。

import boto3

ec2 = boto3.resource('ec2')


def ec2_one_by_key_and_value(collection: str, key: str, value: str):
    handler = getattr(ec2, collection)
    return list(handler.filter(Filters=[{'Name': key, 'Values': [value]}]))[0]


image = ec2_one_by_key_and_value('images', 'name', 'ubuntu/images/hvm-ssd/...')
root_disk = None
for block_device in image.block_device_mappings:
    if block_device['DeviceName'] == image.root_device_name:
        root_disk = block_device
        assert root_disk['Ebs']
        root_disk['Ebs']['VolumeSize'] = 16 # New disk 
        break
assert root_disk
instances = ec2.create_instances(MinCount=1, ..., ImageId=image.id,
                                 BlockDeviceMappings=image.block_device_mappings)

于 2021-11-10T11:19:26.047 に答える