diff --git a/moto/ec2/models/instances.py b/moto/ec2/models/instances.py
--- a/moto/ec2/models/instances.py
+++ b/moto/ec2/models/instances.py
@@ -111,6 +111,7 @@ def __init__(
         self.instance_type: str = kwargs.get("instance_type", "m1.small")
         self.region_name = kwargs.get("region_name", "us-east-1")
         placement = kwargs.get("placement", None)
+        self.placement_hostid = kwargs.get("placement_hostid")
         self.subnet_id = kwargs.get("subnet_id")
         if not self.subnet_id:
             self.subnet_id = next(
diff --git a/moto/ec2/responses/instances.py b/moto/ec2/responses/instances.py
--- a/moto/ec2/responses/instances.py
+++ b/moto/ec2/responses/instances.py
@@ -61,6 +61,7 @@ def run_instances(self) -> str:
             "instance_type": self._get_param("InstanceType", if_none="m1.small"),
             "is_instance_type_default": not self._get_param("InstanceType"),
             "placement": self._get_param("Placement.AvailabilityZone"),
+            "placement_hostid": self._get_param("Placement.HostId"),
             "region_name": self.region,
             "subnet_id": self._get_param("SubnetId"),
             "owner_id": owner_id,
@@ -470,6 +471,7 @@ def _convert_to_bool(bool_str: Any) -> bool:  # type: ignore[misc]
           <instanceLifecycle>{{ instance.lifecycle }}</instanceLifecycle>
           {% endif %}
           <placement>
+            {% if instance.placement_hostid %}<hostId>{{ instance.placement_hostid }}</hostId>{% endif %}
             <availabilityZone>{{ instance.placement}}</availabilityZone>
             <groupName/>
             <tenancy>default</tenancy>
@@ -627,6 +629,7 @@ def _convert_to_bool(bool_str: Any) -> bool:  # type: ignore[misc]
                     <instanceLifecycle>{{ instance.lifecycle }}</instanceLifecycle>
                     {% endif %}
                     <placement>
+                      {% if instance.placement_hostid %}<hostId>{{ instance.placement_hostid }}</hostId>{% endif %}
                       <availabilityZone>{{ instance.placement }}</availabilityZone>
                       <groupName/>
                       <tenancy>default</tenancy>

Hi @romanilchyshynb, that attribute is indeed not supported at the moment.

> Also, Is it hard to add it?

That depends - what is your usecase? If you just want the attribute to show up in the `run_instances`/`describe_instances`-response, that should be easy.
Thanks for quick response!
I'll try to persist placement host id and make it work. But not sure will be able to provide suitable PR as I am too far from Python.
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
@@ -1326,6 +1326,23 @@ def test_run_instance_with_specified_private_ipv4():
     assert instance["PrivateIpAddress"] == "192.168.42.5"
 
 
+@mock_ec2
+def test_run_instance_with_placement():
+    client = boto3.client("ec2", region_name="eu-central-1")
+    host_id = "h-asdfasdfasdf"
+
+    instance = client.run_instances(
+        ImageId=EXAMPLE_AMI_ID, MaxCount=1, MinCount=1, Placement={"HostId": host_id}
+    )["Instances"][0]
+    instance_id = instance["InstanceId"]
+    assert instance["Placement"]["HostId"] == host_id
+
+    resp = client.describe_instances(InstanceIds=[instance_id])["Reservations"][0][
+        "Instances"
+    ][0]
+    assert resp["Placement"]["HostId"] == host_id
+
+
 @mock_ec2
 def test_run_instance_mapped_public_ipv4():
     client = boto3.client("ec2", region_name="eu-central-1")

EC2 run instances placement host id is not supported?
I'm checking to make sure that the system is suitable for my use case (version `4.2.5`).

My case is to run aws equivalent:
```
aws ec2 run-instances --image-id ami-0e373a2446example --instance-type m5.large --placement HostId=h-0b1b80b286example --subnet-id subnet-3862e0ex
```
The crucial here is `--placement HostId=h-0b1b80b286example` - I need created instance to have placement with specified host id.

Am I right that `add_instances` doesn't implement such placement functionality? Or maybe I miss something? 
https://github.com/getmoto/moto/blob/60fd1a5cf2eb1c1c7f8c7bbd0a81c13c5797f3ac/moto/ec2/models/instances.py#L624
Also, Is it hard to add it?


tests/test_ec2/test_instances.py::test_run_instance_with_placement
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_additional_args[True] 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_run_multiple_instances_with_single_nic_template 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_in_subnet_with_nic_private_ip 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_instances_with_unknown_security_group 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_instance_iam_instance_profile 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_describe_instance_with_enhanced_monitoring tests/test_ec2/test_instances.py::test_create_instance_with_default_options 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_with_keypair_filter tests/test_ec2/test_instances.py::test_describe_instances_pagination_error 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_describe_instance_without_enhanced_monitoring 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_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_additional_args[False] 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_in_subnet_with_nic_private_ip_and_public_association tests/test_ec2/test_instances.py::test_run_instance_with_specified_private_ipv4 tests/test_ec2/test_instances.py::test_instance_attribute_user_data