控制 EC2 实例的 moto 状态转换?

control moto's state transitions of EC2 instances?

为了测试我的应用程序是否正确处理状态转换,我想控制 moto 的假 EC2 实例的生命周期:

与其让实例在 running 中立即启动,不如让它们在 pending 中启动会更好,让我确认一些事情,然后明确地将它们转换为 running .

相关地,当实例切换到 running 时,我想在测试中触发一些操作。

这有可能吗?我在 moto 的代码中找到了 InstanceBackend -- 用户是否可以挂钩或覆盖那里的方法?

a few feature requests 可以更好地控制转换周期,但尚未实现。

可以使用内部API直接设置状态,如你所说,使用InstanceBackend

如果你只有一个实例,可以使用下面的代码:

ec2_backend = moto.ec2.models.ec2_backends[my-region]
list(ec2_backend.reservations.values())[0].instances[0].state = "..."

如果您有多个预订,您可以像这样使用预订 ID:

ec2_backend.reservations["r-7df1884b"].instances[0].state = "..."

请注意,AWS 和 Moto 都使用两个属性来跟踪状态,statestate_code。仅更新 state 可能会导致未定义的行为,因此您可能需要更新两者以确保它们同步:

ec2_backend.reservations["r-7df1884b"].instances[0].state_code = ..

请注意,这是内部 API,因此可能会在没有警告的情况下更改此数据结构。