diff --git a/moto/ec2/utils.py b/moto/ec2/utils.py
--- a/moto/ec2/utils.py
+++ b/moto/ec2/utils.py
@@ -413,6 +413,7 @@ def tag_filter_matches(obj, filter_name, filter_values):
     "owner-id": "owner_id",
     "subnet-id": "subnet_id",
     "dns-name": "public_dns",
+    "key-name": "key_name",
 }
 
 

Thanks for raising this @BlakeSearlSonocent. A PR would be very welcome, let us know if you need some pointers!
diff --git a/tests/test_ec2/test_instances.py b/tests/test_ec2/test_instances.py
--- a/tests/test_ec2/test_instances.py
+++ b/tests/test_ec2/test_instances.py
@@ -1565,6 +1565,25 @@ def test_run_instance_with_keypair():
     instance.key_name.should.equal("keypair_name")
 
 
+@mock_ec2
+def test_describe_instances_with_keypair_filter():
+    ec2 = boto3.resource("ec2", region_name="us-east-1")
+    for i in range(3):
+        key_name = "kp-single" if i % 2 else "kp-multiple"
+        ec2.create_instances(
+            ImageId=EXAMPLE_AMI_ID, MinCount=1, MaxCount=1, KeyName=key_name
+        )
+    test_data = [
+        (["kp-single"], 1),
+        (["kp-multiple"], 2),
+        (["kp-single", "kp-multiple"], 3),
+    ]
+    for filter_values, expected_instance_count in test_data:
+        _filter = [{"Name": "key-name", "Values": filter_values}]
+        instances_found = list(ec2.instances.filter(Filters=_filter))
+        instances_found.should.have.length_of(expected_instance_count)
+
+
 @mock_ec2
 @mock.patch(
     "moto.ec2.models.instances.settings.ENABLE_KEYPAIR_VALIDATION",

NotImplementedError: Filter dicts have not been implemented in Moto for 'key-name'
I am seeing this when I try to use the `describe_instances` ec2 function and filter on `key-name`.

Quick snippet of code that produces the error:

```
import boto3
import moto

mock_aws_account = moto.mock_ec2()
mock_aws_account.start()

client = boto3.client("ec2", region_name="eu-west-1")
client.run_instances(ImageId="ami-test-1234", MinCount=1, MaxCount=1, KeyName="test_key")

client.describe_instances(
        Filters=[
            {
                "Name": "key-name",
                "Values": [
                    "a_key",
                ],
            },
        ],
    )
```

Relevant error comes from the `passes_filter_dict` function in `/site-packages/moto/ec2/utils.py`:

```
NotImplementedError: Filter dicts have not been implemented in Moto for 'key-name' yet. Feel free to open an issue at https://github.com/spulec/moto/issues

```

Hopefully will get some time to raise a PR 🤞 

tests/test_ec2/test_instances.py::test_describe_instances_with_keypair_filter
tests/test_ec2/test_instances.py::test_run_instance_with_block_device_mappings_missing_ebs tests/test_ec2/test_instances.py::test_get_instances_filtering_by_tag tests/test_ec2/test_instances.py::test_run_instance_and_associate_public_ip tests/test_ec2/test_instances.py::test_modify_instance_attribute_security_groups tests/test_ec2/test_instances.py::test_run_instance_cannot_have_subnet_and_networkinterface_parameter tests/test_ec2/test_instances.py::test_create_with_volume_tags tests/test_ec2/test_instances.py::test_get_instances_filtering_by_subnet_id tests/test_ec2/test_instances.py::test_run_instance_with_placement tests/test_ec2/test_instances.py::test_describe_instance_status_with_instances tests/test_ec2/test_instances.py::test_get_instances_filtering_by_dns_name tests/test_ec2/test_instances.py::test_filter_wildcard_in_specified_tag_only tests/test_ec2/test_instances.py::test_get_instances_filtering_by_reason_code tests/test_ec2/test_instances.py::test_get_instances_filtering_by_account_id tests/test_ec2/test_instances.py::test_describe_instance_status_no_instances tests/test_ec2/test_instances.py::test_run_instance_with_block_device_mappings_using_no_device tests/test_ec2/test_instances.py::test_get_instance_by_security_group tests/test_ec2/test_instances.py::test_create_with_tags tests/test_ec2/test_instances.py::test_instance_terminate_discard_volumes tests/test_ec2/test_instances.py::test_instance_terminate_detach_volumes tests/test_ec2/test_instances.py::test_run_instance_with_nic_preexisting tests/test_ec2/test_instances.py::test_instance_detach_volume_wrong_path tests/test_ec2/test_instances.py::test_instance_attribute_source_dest_check tests/test_ec2/test_instances.py::test_run_instance_with_nic_autocreated tests/test_ec2/test_instances.py::test_run_instance_with_block_device_mappings_from_snapshot tests/test_ec2/test_instances.py::test_get_instances_filtering_by_instance_id tests/test_ec2/test_instances.py::test_get_instances_filtering_by_tag_name tests/test_ec2/test_instances.py::test_instance_attach_volume tests/test_ec2/test_instances.py::test_get_instances_filtering_by_ni_private_dns tests/test_ec2/test_instances.py::test_describe_instance_status_with_non_running_instances tests/test_ec2/test_instances.py::test_warn_on_invalid_ami tests/test_ec2/test_instances.py::test_run_instance_with_security_group_name tests/test_ec2/test_instances.py::test_describe_instances_filter_vpcid_via_networkinterface tests/test_ec2/test_instances.py::test_get_paginated_instances tests/test_ec2/test_instances.py::test_run_instance_with_invalid_keypair tests/test_ec2/test_instances.py::test_get_instances_filtering_by_image_id tests/test_ec2/test_instances.py::test_describe_instances_dryrun tests/test_ec2/test_instances.py::test_instance_reboot tests/test_ec2/test_instances.py::test_run_instance_with_invalid_instance_type tests/test_ec2/test_instances.py::test_run_instance_with_new_nic_and_security_groups tests/test_ec2/test_instances.py::test_run_instance_with_keypair tests/test_ec2/test_instances.py::test_instance_start_and_stop tests/test_ec2/test_instances.py::test_ec2_classic_has_public_ip_address tests/test_ec2/test_instances.py::test_describe_instance_status_with_instance_filter_deprecated tests/test_ec2/test_instances.py::test_describe_instance_attribute tests/test_ec2/test_instances.py::test_terminate_empty_instances tests/test_ec2/test_instances.py::test_instance_terminate_keep_volumes_implicit tests/test_ec2/test_instances.py::test_run_instance_with_block_device_mappings tests/test_ec2/test_instances.py::test_instance_termination_protection tests/test_ec2/test_instances.py::test_create_instance_from_launch_template__process_tags tests/test_ec2/test_instances.py::test_get_instances_filtering_by_source_dest_check tests/test_ec2/test_instances.py::test_get_instances_filtering_by_architecture tests/test_ec2/test_instances.py::test_run_instance_mapped_public_ipv4 tests/test_ec2/test_instances.py::test_instance_terminate_keep_volumes_explicit tests/test_ec2/test_instances.py::test_get_instances_filtering_by_instance_type tests/test_ec2/test_instances.py::test_create_instance_ebs_optimized tests/test_ec2/test_instances.py::test_instance_launch_and_terminate tests/test_ec2/test_instances.py::test_instance_attribute_instance_type tests/test_ec2/test_instances.py::test_user_data_with_run_instance tests/test_ec2/test_instances.py::test_get_instances_filtering_by_private_dns tests/test_ec2/test_instances.py::test_get_instances_filtering_by_instance_group_id tests/test_ec2/test_instances.py::test_instance_with_nic_attach_detach tests/test_ec2/test_instances.py::test_get_instances_filtering_by_instance_group_name tests/test_ec2/test_instances.py::test_terminate_unknown_instances tests/test_ec2/test_instances.py::test_run_instance_with_availability_zone_not_from_region tests/test_ec2/test_instances.py::test_modify_delete_on_termination tests/test_ec2/test_instances.py::test_add_servers tests/test_ec2/test_instances.py::test_get_instances_filtering_by_vpc_id tests/test_ec2/test_instances.py::test_run_instance_with_instance_type tests/test_ec2/test_instances.py::test_run_multiple_instances_in_same_command tests/test_ec2/test_instances.py::test_get_instances_filtering_by_state tests/test_ec2/test_instances.py::test_error_on_invalid_ami_format tests/test_ec2/test_instances.py::test_run_instance_with_default_placement tests/test_ec2/test_instances.py::test_run_instance_with_subnet tests/test_ec2/test_instances.py::test_instance_lifecycle tests/test_ec2/test_instances.py::test_run_instance_with_block_device_mappings_missing_size tests/test_ec2/test_instances.py::test_get_instances_by_id tests/test_ec2/test_instances.py::test_run_instance_with_security_group_id tests/test_ec2/test_instances.py::test_describe_instance_credit_specifications tests/test_ec2/test_instances.py::test_get_instances_filtering_by_tag_value tests/test_ec2/test_instances.py::test_error_on_invalid_ami tests/test_ec2/test_instances.py::test_describe_instance_status_with_instance_filter tests/test_ec2/test_instances.py::test_run_instance_with_specified_private_ipv4 tests/test_ec2/test_instances.py::test_instance_attribute_user_data