TypeError: 'ec2.instancesCollectionManager' object is not iterable when mocking with Moto?

TypeError: 'ec2.instancesCollectionManager' object is not iterable when mocking with Moto?

以下代码在使用 Moto 转换为 list(instances) 时出现错误“TypeError:'ec2.instancesCollectionManager' 对象不可迭代”。

@pytest.fixture(scope='function')
def aws_credentials():
    os.environ['AWS_ACCESS_KEY_ID'] = 'testing'
    os.environ['AWS_SECRET_ACCESS_KEY'] = 'testing'
    os.environ['AWS_SECURITY_TOKEN'] = 'testing'
    os.environ['AWS_SESSION_TOKEN'] = 'testing'
    os.environ["MOTO_ALLOW_NONEXISTENT_REGION"] = 'True'
    os.environ['AWS_DEFAULT_REGION'] = 'us-east-1'

@pytest.fixture
def session(aws_credentials):
    return boto3.session.Session()

@mock_ec2
def test_get_nodes(session):
    #session = boto3.session.Session(region_name='us-east-1')
    filters = None
    Node.get_nodes(session, filters)
    instances = session.resource('ec2').instances
    print(list(instances))  # ERR
    assert any(instances)  # ERR

如果不使用 Moto,Node class 中的实例可以转换为 list()

class Node(NodeBase):
    @classmethod
    def get_nodes(cls, session, filters):
        instances = session.resource('ec2').instances.filter(Filters=filters)
        return instances

print(type(instances)) 无论是否使用 Moto 都获得 <class 'boto3.resources.collection.ec2.instancesCollection'>

在节点中,您正在调用 instances.filter(),其中 returns 是 <class 'boto3.resources.collection.ec2.instancesCollection'>。这个集合是可迭代的,因此可以解压到。一个列表。

但是,在您的测试中,您没有在 .instance 上调用 filter。这里,instances 的类型是 <class 'boto3.resources.collection.ec2.instancesCollectionManager'> 不可迭代。如果你在上面调用 .all() 或 .filer(),你会再次得到一个可迭代的集合。