moto mock_ec2调用describe_network_interface_attribute未实现如何修复?
报错原因
你遇到的NotImplementedError: ElasticNetworkInterfaces(AmazonVPC).describe_network_interface_attribute is not yet implemented报错,本质是你当前使用的moto 2.1.0版本尚未实现EC2网络接口的describe_network_interface_attribute相关接口,所以调用eni1.describe_attribute()方法时会触发未实现错误。
可行解决方案
提供两种可落地的解决思路,你可以根据自己的项目限制选择:
方案1:升级moto版本
moto在后续的3.x及以上版本已经补全了该接口的实现,你可以直接升级moto依赖到兼容版本即可,升级命令参考:
pip install moto>=3.0.0
注意升级前需要确认新版本和你项目中其他依赖(如boto3、botocore)的兼容性,避免出现版本冲突
方案2:替换查询逻辑(无需修改依赖版本)
如果你暂时不能升级moto版本,可以直接替换describe_attribute的调用,改用moto 2.1.0已经实现的describe_network_interfaces接口来获取网络接口的所有属性,从中提取你需要的字段即可,修改后的测试代码参考:
@mock_ec2 def test_elastic_network_interfaces_get_by_description(): ec2 = boto3.resource("ec2", region_name="us-east-1") ec2_client= ec2.meta.client vpc = ec2.create_vpc(CidrBlock="10.0.0.0/16") vpc.reload() subnet = ec2.create_subnet( VpcId=vpc.id, CidrBlock="10.0.0.0/24", AvailabilityZone="us-east-1a") desc = str(uuid4()) eni1 = ec2.create_network_interface( SubnetId=subnet.id, PrivateIpAddress="10.0.10.5", Description=desc ) # The status of the new interface should be 'available' waiter = ec2_client.get_waiter("network_interface_available") waiter.wait(NetworkInterfaceIds=[eni1.id]) eni1.modify_attribute(SourceDestCheck={'Value': False}) eni1.reload() # 替换describe_attribute调用,用describe_network_interfaces查询属性 eni_info = ec2_client.describe_network_interfaces(NetworkInterfaceIds=[eni1.id])['NetworkInterfaces'][0] # 直接从查询结果中取对应属性即可,比如取description description = eni_info['Description'] # 如果需要和原describe_attribute返回结构一致,可以自行构造response response = { 'NetworkInterfaceId': eni1.id, 'Description': { 'Value': description } }
这种方式不需要修改任何依赖版本,兼容你当前的测试环境,即可正常完成属性查询逻辑。
内容的提问来源于stack exchange,提问作者Guillermo
相关产品推荐
相关产品推荐

