我正在为boto3函数编写一些测试,并使用moto库模拟boto3

他们提供的示例如下:

import boto3
from moto import mock_ec2

def add_servers(ami_id, count):
    client = boto3.client('ec2', region_name='us-west-1')
    client.run_instances(ImageId=ami_id, MinCount=count, MaxCount=count)

@mock_ec2
def test_add_servers():
    add_servers('ami-1234abcd', 2)

    client = boto3.client('ec2', region_name='us-west-1')
    instances = client.describe_instances()['Reservations'][0]['Instances']
    assert len(instances) == 2
    instance1 = instances[0]
    assert instance1['ImageId'] == 'ami-1234abcd'


但是,当我尝试类似的操作时,通过执行以下操作,在此处使用一个简单的示例:

def start_instance(instance_id):
    client = boto3.client('ec2')
    client.start_instances(InstanceIds=[instance_id])

@mock_ec2
def test_start_instance():
    start_instance('abc123')
    client = boto3.client('ec2')
    instances = client.describe_instances()
    print instances

test_start_instance()

ClientError: An error occurred (InvalidInstanceID.NotFound) when calling the StartInstances operation: The instance ID '[u'abc123']' does not exist


当我将功能明显包装在模拟程序中时,为什么实际上要向AWS发出请求?

最佳答案

查看moto for boto/boto3的README.md,我注意到
在S3连接代码上,有一个注释


  #我们需要创建存储桶,因为这都是Moto的“虚拟”
  AWS账户


如果我是正确的,则显示的错误不是AWS错误,而是Moto错误。您需要初始化要模拟到Moto虚拟空间的所有模拟资源。这意味着,在启动实例之前,您需要使用另一个脚本来使用moto来模拟“ create_instance”。

关于python - 模拟boto3调用实际的boto3,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46835804/

10-13 00:47