diff --git a/SOURCES/ci-Fix-requiring-device-number-on-EC2-derivatives-836.patch b/SOURCES/ci-Fix-requiring-device-number-on-EC2-derivatives-836.patch
new file mode 100644
index 0000000..120a4f1
--- /dev/null
+++ b/SOURCES/ci-Fix-requiring-device-number-on-EC2-derivatives-836.patch
@@ -0,0 +1,103 @@
+From 93b48730e201bf374f75a3f71d8d6b28211016ba Mon Sep 17 00:00:00 2001
+From: Eduardo Otubo <otubo@redhat.com>
+Date: Tue, 23 Mar 2021 16:14:16 +0100
+Subject: [PATCH] Fix requiring device-number on EC2 derivatives (#836)
+
+RH-Author: Eduardo Otubo <otubo@redhat.com>
+RH-MergeRequest: 3: Fix requiring device-number on EC2 derivatives (#836)
+RH-Commit: [1/1] f372b10d179a969fcf824db8a39bdea3befc4ef4 (eterell/cloud-init)
+RH-Bugzilla: 1942699
+RH-Acked-by: Acked-by: Mohammed Gamal <mgamal@redhat.com>
+RH-Acked-by: Acked-by: Vitaly Kuznetsov vkuznets@redhat.com
+RH-Acked-by: Acked-by: Cathy Avery cavery@redhat.com
+
+commit 9bd19645a61586b82e86db6f518dd05c3363b17f
+Author: James Falcon <TheRealFalcon@users.noreply.github.com>
+Date:   Mon Mar 8 14:09:47 2021 -0600
+
+    Fix requiring device-number on EC2 derivatives (#836)
+
+    #342 (70dbccbb) introduced the ability to determine route-metrics based on
+    the `device-number` provided by the EC2 IMDS. Not all datasources that
+    subclass EC2 will have this attribute, so allow the old behavior if
+    `device-number` is not present.
+
+    LP: #1917875
+
+Signed-off-by: Eduardo Otubo <otubo@redhat.com>
+---
+ cloudinit/sources/DataSourceEc2.py            |  3 +-
+ .../unittests/test_datasource/test_aliyun.py  | 30 +++++++++++++++++++
+ 2 files changed, 32 insertions(+), 1 deletion(-)
+
+diff --git a/cloudinit/sources/DataSourceEc2.py b/cloudinit/sources/DataSourceEc2.py
+index 1d09c12a..ce69d1b3 100644
+--- a/cloudinit/sources/DataSourceEc2.py
++++ b/cloudinit/sources/DataSourceEc2.py
+@@ -764,13 +764,14 @@ def convert_ec2_metadata_network_config(
+         netcfg['ethernets'][nic_name] = dev_config
+         return netcfg
+     # Apply network config for all nics and any secondary IPv4/v6 addresses
++    nic_idx = 0
+     for mac, nic_name in sorted(macs_to_nics.items()):
+         nic_metadata = macs_metadata.get(mac)
+         if not nic_metadata:
+             continue  # Not a physical nic represented in metadata
+         # device-number is zero-indexed, we want it 1-indexed for the
+         # multiplication on the following line
+-        nic_idx = int(nic_metadata['device-number']) + 1
++        nic_idx = int(nic_metadata.get('device-number', nic_idx)) + 1
+         dhcp_override = {'route-metric': nic_idx * 100}
+         dev_config = {'dhcp4': True, 'dhcp4-overrides': dhcp_override,
+                       'dhcp6': False,
+diff --git a/tests/unittests/test_datasource/test_aliyun.py b/tests/unittests/test_datasource/test_aliyun.py
+index b626229e..a57f86a1 100644
+--- a/tests/unittests/test_datasource/test_aliyun.py
++++ b/tests/unittests/test_datasource/test_aliyun.py
+@@ -7,6 +7,7 @@ from unittest import mock
+ 
+ from cloudinit import helpers
+ from cloudinit.sources import DataSourceAliYun as ay
++from cloudinit.sources.DataSourceEc2 import convert_ec2_metadata_network_config
+ from cloudinit.tests import helpers as test_helpers
+ 
+ DEFAULT_METADATA = {
+@@ -183,6 +184,35 @@ class TestAliYunDatasource(test_helpers.HttprettyTestCase):
+         self.assertEqual(ay.parse_public_keys(public_keys),
+                          public_keys['key-pair-0']['openssh-key'])
+ 
++    def test_route_metric_calculated_without_device_number(self):
++        """Test that route-metric code works without `device-number`
++
++        `device-number` is part of EC2 metadata, but not supported on aliyun.
++        Attempting to access it will raise a KeyError.
++
++        LP: #1917875
++        """
++        netcfg = convert_ec2_metadata_network_config(
++            {"interfaces": {"macs": {
++                "06:17:04:d7:26:09": {
++                    "interface-id": "eni-e44ef49e",
++                },
++                "06:17:04:d7:26:08": {
++                    "interface-id": "eni-e44ef49f",
++                }
++            }}},
++            macs_to_nics={
++                '06:17:04:d7:26:09': 'eth0',
++                '06:17:04:d7:26:08': 'eth1',
++            }
++        )
++
++        met0 = netcfg['ethernets']['eth0']['dhcp4-overrides']['route-metric']
++        met1 = netcfg['ethernets']['eth1']['dhcp4-overrides']['route-metric']
++
++        # route-metric numbers should be 100 apart
++        assert 100 == abs(met0 - met1)
++
+ 
+ class TestIsAliYun(test_helpers.CiTestCase):
+     ALIYUN_PRODUCT = 'Alibaba Cloud ECS'
+-- 
+2.27.0
+
diff --git a/SPECS/cloud-init.spec b/SPECS/cloud-init.spec
index cedad04..1322fbf 100644
--- a/SPECS/cloud-init.spec
+++ b/SPECS/cloud-init.spec
@@ -6,7 +6,7 @@
 
 Name:           cloud-init
 Version:        20.3
-Release:        10%{?dist}
+Release:        10%{?dist}.2
 Summary:        Cloud instance init scripts
 
 Group:          System Environment/Base
@@ -40,6 +40,8 @@ Patch15: ci-DataSourceAzure-update-password-for-defuser-if-exist.patch
 Patch16: ci-Revert-ssh_util-handle-non-default-AuthorizedKeysFil.patch
 # For bz#1913127 - A typo in cloud-init man page
 Patch17: ci-fix-a-typo-in-man-page-cloud-init.1-752.patch
+# For bz#1942699 - [Aliyun][RHEL8.4][cloud-init] cloud-init service failed to start with Alibaba instance [rhel-8.4.0.z]
+Patch18: ci-Fix-requiring-device-number-on-EC2-derivatives-836.patch
 
 BuildArch:      noarch
 
@@ -231,6 +233,11 @@ fi
 %config(noreplace) %{_sysconfdir}/rsyslog.d/21-cloudinit.conf
 
 %changelog
+* Tue Apr 06 2021 Miroslav Rezanina <mrezanin@redhat.com> - 20.3-10.el8_4.2
+- ci-Fix-requiring-device-number-on-EC2-derivatives-836.patch [bz#1942699]
+- Resolves: bz#1942699
+  ([Aliyun][RHEL8.4][cloud-init] cloud-init service failed to start with Alibaba instance [rhel-8.4.0.z])
+
 * Tue Feb 02 2021 Miroslav Rezanina <mrezanin@redhat.com> - 20.3-10.el8
 - ci-fix-a-typo-in-man-page-cloud-init.1-752.patch [bz#1913127]
 - Resolves: bz#1913127