diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..b2cd9d5
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,2 @@
+/aws-cli-2.11.16.tar.gz
+/aws-cli-2.11.17.tar.gz
diff --git a/awscli2.spec b/awscli2.spec
new file mode 100644
index 0000000..e53281a
--- /dev/null
+++ b/awscli2.spec
@@ -0,0 +1,107 @@
+%global pkgname aws-cli
+
+Name:               awscli2
+Version:            2.11.17
+Release:            %autorelease
+
+Summary:            Universal Command Line Environment for AWS, version 2
+# all files are licensed under Apache-2.0, except:
+# - awscli/topictags.py is MIT
+# - awscli/botocore/vendored/six.py is MIT
+License:            Apache-2.0 AND MIT
+URL:                https://github.com/aws/aws-cli/tree/v2
+
+Source0:            https://github.com/aws/aws-cli/archive/%{version}/%{pkgname}-%{version}.tar.gz
+
+# ruamel-yaml 0.17.22 changed whitespace formatting, breaking some TestUpdateKubeconfig tests
+# add a workaround for that until upstream comes with a proper fix
+Patch0:             ruamel-yaml-0.17.22.patch
+
+BuildArch:          noarch
+
+BuildRequires:      python%{python3_pkgversion}-devel
+BuildRequires:      python%{python3_pkgversion}-pytest
+BuildRequires:      python%{python3_pkgversion}-pytest-xdist
+BuildRequires:      python%{python3_pkgversion}-jsonschema
+BuildRequires:      python-unversioned-command
+BuildRequires:      procps-ng
+
+Recommends:         groff
+
+Provides:           awscli = %{version}-%{release}
+Obsoletes:          awscli < 2
+
+# provide an upgrade path from awscli-2 (Amazon Linux)
+Provides:           awscli-2 = %{version}-%{release}
+Obsoletes:          awscli-2 < %{version}-%{release}
+
+# python-awscrt does not build on s390x
+ExcludeArch:        s390x
+
+
+%description
+This package provides version 2 of the unified command line
+interface to Amazon Web Services.
+
+
+%prep
+%autosetup -p1 -n %{pkgname}-%{version}
+
+# fix permissions
+find awscli/examples/ -type f -name '*.rst' -executable -exec chmod -x '{}' +
+
+# use unittest.mock
+find -type f -name '*.py' -exec sed \
+    -e 's/^\( *\)import mock$/\1from unittest import mock/' \
+    -e 's/^\( *\)from mock import mock/\1from unittest import mock/' \
+    -e 's/^\( *\)from mock import/\1from unittest.mock import/' \
+    -i '{}' +
+
+
+%generate_buildrequires
+%pyproject_buildrequires
+
+
+%build
+%pyproject_wheel
+
+
+%install
+%pyproject_install
+%pyproject_save_files awscli
+
+# remove unnecessary scripts
+rm -vf %{buildroot}%{_bindir}/{aws_bash_completer,aws_zsh_completer.sh,aws.cmd}
+
+# install shell completion
+install -Dpm0644 bin/aws_bash_completer \
+  %{buildroot}%{_datadir}/bash-completion/completions/aws
+install -Dpm0644 bin/aws_zsh_completer.sh \
+  %{buildroot}%{_datadir}/zsh/site-functions/_awscli
+
+
+%check
+# it appears that some tests modify the environment and remove PYTHONPATH
+# so it's not passed to botocore cmd-runner, inject it here
+sed -i '/self.driver.start(env=env)/i \ \ \ \ \ \ \ \ env["PYTHONPATH"] = "%{buildroot}%{python3_sitelib}"' \
+    tests/utils/botocore/__init__.py
+
+export TESTS_REMOVE_REPO_ROOT_FROM_PATH=1 TZ=UTC
+%pytest --verbose --numprocesses=auto --dist=loadfile tests/unit tests/functional
+
+
+%files -f %{pyproject_files}
+%license LICENSE.txt
+%doc README.rst
+%{_bindir}/aws
+%{_bindir}/aws_completer
+%dir %{_datadir}/bash-completion
+%dir %{_datadir}/bash-completion/completions
+%{_datadir}/bash-completion/completions/aws
+%dir %{_datadir}/zsh
+%dir %{_datadir}/zsh/site-functions
+%{_datadir}/zsh/site-functions/_awscli
+
+
+%changelog
+%autochangelog
diff --git a/ruamel-yaml-0.17.22.patch b/ruamel-yaml-0.17.22.patch
new file mode 100644
index 0000000..e874606
--- /dev/null
+++ b/ruamel-yaml-0.17.22.patch
@@ -0,0 +1,25 @@
+diff --git a/awscli/customizations/eks/ordered_yaml.py b/awscli/customizations/eks/ordered_yaml.py
+index 23834e0..828280a 100644
+--- a/awscli/customizations/eks/ordered_yaml.py
++++ b/awscli/customizations/eks/ordered_yaml.py
+@@ -46,6 +46,7 @@ def ordered_yaml_dump(to_dump, stream=None):
+     :type stream: file
+     """
+     yaml = ruamel.yaml.YAML(typ="safe", pure=True)
++    yaml.width = 99999
+     yaml.default_flow_style = False
+     yaml.Representer.add_representer(OrderedDict, _ordered_representer)
+ 
+diff --git a/pyproject.toml b/pyproject.toml
+index db82f2a..991ddfa 100644
+--- a/pyproject.toml
++++ b/pyproject.toml
+@@ -31,7 +31,7 @@ dependencies = [
+     "colorama>=0.2.5,<0.4.7",
+     "docutils>=0.10,<0.20",
+     "cryptography>=3.3.2,<40.0.2",
+-    "ruamel.yaml>=0.15.0,<=0.17.21",
++    "ruamel.yaml>=0.15.0,<=0.17.22",
+     # ruamel.yaml only requires ruamel.yaml.clib for Python versions
+     # less than or equal to Python 3.10. In order to ensure we have
+     # a consistent dependency closure across all Python versions,
diff --git a/sources b/sources
new file mode 100644
index 0000000..9e1c298
--- /dev/null
+++ b/sources
@@ -0,0 +1 @@
+SHA512 (aws-cli-2.11.17.tar.gz) = e9cccd2d4e33cd926f8699112e9dd77e46f228bd8f037d5ff981d41cc71cc4324dea059e4431c50b87ce1cbc5109b48ae6de2372b47c6a6ae32f88bf8c670891