使用amazon.aws.ec2_instance终止EC2实例时报TypeError错误
我编写了用于终止EC2实例的Ansible任务:
- name: ec2_instance module - Terminate EC2 Instance amazon.aws.ec2_instance: region: "{{ ec2_region }}" name: "{{ ec2_name }}" state: terminated register: ec2
执行后抛出以下错误:
An exception occurred during task execution. To see the full traceback, use -vvv. The error was: TypeError: 'NoneType' object is not subscriptable
fatal: [localhost]: FAILED! => {"changed": false, "module_stderr": "Traceback (most recent call last):\n File "/root/.ansible/tmp/ansible-tmp-1689314444.0447388-8-263549951178931/AnsiballZ_ec2_instance.py", line 107, in \n _ansiballz_main()\n File "/root/.ansible/tmp/ansible-tmp-1689314444.0447388-8-263549951178931/AnsiballZ_ec2_instance.py", line 99, in _ansiballz_main\n invoke_module(zipped_mod, temp_path, ANSIBALLZ_PARAMS)\n File "/root/.ansible/tmp/ansible-tmp-1689314444.0447388-8-263549951178931/AnsiballZ_ec2_instance.py", line 47, in invoke_module\n runpy.run_module(mod_name='ansible_collections.amazon.aws.plugins.modules.ec2_instance', init_globals=dict(_module_fqn='ansible_collections.amazon.aws.plugins.modules.ec2_instance', _modlib_path=modlib_path),\n File "", line 226, in run_module\n File "", line 98, in _run_module_code\n File "", line 88, in _run_code\n File "/tmp/ansible_amazon.aws.ec2_instance_payload_mp9fer50/ansible_amazon.aws.ec2_instance_payload.zip/ansible_collections/amazon/aws/plugins/modules/ec2_instance.py", line 2203, in \n File "/tmp/ansible_amazon.aws.ec2_instance_payload_mp9fer50/ansible_amazon.aws.ec2_instance_payload.zip/ansible_collections/amazon/aws/plugins/modules/ec2_instance.py", line 2172, in main\n File "/tmp/ansible_amazon.aws.ec2_instance_payload_mp9fer50/ansible_amazon.aws.ec2_instance_payload.zip/ansible_collections/amazon/aws/plugins/modules/ec2_instance.py", line 2037, in build_filters\n File "/tmp/ansible_amazon.aws.ec2_instance_payload_mp9fer50/ansible_amazon.aws.ec2_instance_payload.zip/ansible_collections/amazon/aws/plugins/modules/ec2_instance.py", line 1573, in get_default_subnet\nTypeError: 'NoneType' object is not subscriptable\n", "module_stdout": "", "msg": "MODULE FAILURE\nSee stdout/stderr for the exact error", "rc": 1}
错误原因
这个错误的核心是:amazon.aws.ec2_instance模块通过实例名称筛选实例时,会尝试自动获取目标区域的默认子网,但当前AWS账号在{{ ec2_region }}指定的区域内没有默认VPC,或者模块无法获取到有效的子网数据,返回了None值,后续代码尝试对None进行下标操作(如None['key']),从而触发TypeError。
另外也可能存在辅助因素:{{ ec2_name }}变量未正确赋值,或不存在匹配该名称的EC2实例,但根源仍指向子网/默认VPC的获取失败。
解决方法
方法1:直接指定实例ID终止(推荐)
跳过名称匹配和子网查找逻辑,直接用实例ID定位目标,修改任务如下:
- name: ec2_instance module - Terminate EC2 Instance amazon.aws.ec2_instance: region: "{{ ec2_region }}" instance_ids: "{{ ec2_instance_id }}" # 替换为目标实例的ID变量 state: terminated register: ec2
方法2:确保目标区域存在默认VPC
登录AWS控制台,检查{{ ec2_region }}区域是否有默认VPC。如果没有,可通过AWS控制台或CLI恢复/创建默认VPC,之后再执行任务。
方法3:显式指定实例所在VPC
在任务中添加vpc_id参数,明确指定目标实例所属的VPC,避免模块自动查找默认子网:
- name: ec2_instance module - Terminate EC2 Instance amazon.aws.ec2_instance: region: "{{ ec2_region }}" name: "{{ ec2_name }}" vpc_id: "{{ ec2_vpc_id }}" # 替换为实例所在的VPC ID state: terminated register: ec2
内容的提问来源于stack exchange,提问作者jeremywat

