diff --git a/ee/app/workers/ai/sync_service_token_worker.rb b/ee/app/workers/ai/sync_service_token_worker.rb
index 01204d51827bc8d89d23e7814e88af517625557a..bff8e1a941e564127fb1bea9965b95957aa61925 100644
--- a/ee/app/workers/ai/sync_service_token_worker.rb
+++ b/ee/app/workers/ai/sync_service_token_worker.rb
@@ -1,5 +1,9 @@
 # frozen_string_literal: true
 
+# !!! WARNING !!!
+# We keep it for compatibility during 16.9. Planned for removal in future releases.
+# Starting 16.10, apply all changes to Cloud::SyncServiceTokenWorker instead.
+# Refer to https://gitlab.com/groups/gitlab-org/-/epics/12544.
 module Ai
   class SyncServiceTokenWorker
     include ApplicationWorker
diff --git a/ee/app/workers/all_queues.yml b/ee/app/workers/all_queues.yml
index 4dd90f8566fe1b1378ec5376b96a76c44df5fc1f..18f6fff4d67a5db13dc056a130d580f04444e0c6 100644
--- a/ee/app/workers/all_queues.yml
+++ b/ee/app/workers/all_queues.yml
@@ -129,6 +129,15 @@
   :weight: 1
   :idempotent: true
   :tags: []
+- :name: cronjob:cloud_connector_sync_service_token
+  :worker_name: CloudConnector::SyncServiceTokenWorker
+  :feature_category: :cloud_connector
+  :has_external_dependencies: true
+  :urgency: :low
+  :resource_boundary: :unknown
+  :weight: 1
+  :idempotent: true
+  :tags: []
 - :name: cronjob:compliance_management_merge_requests_compliance_violations_consistency
   :worker_name: ComplianceManagement::MergeRequests::ComplianceViolationsConsistencyWorker
   :feature_category: :compliance_management
diff --git a/ee/app/workers/cloud_connector/sync_service_token_worker.rb b/ee/app/workers/cloud_connector/sync_service_token_worker.rb
new file mode 100644
index 0000000000000000000000000000000000000000..806da20d54a517293904031257e7f769fc74bf97
--- /dev/null
+++ b/ee/app/workers/cloud_connector/sync_service_token_worker.rb
@@ -0,0 +1,27 @@
+# frozen_string_literal: true
+
+module CloudConnector
+  class SyncServiceTokenWorker
+    include ApplicationWorker
+
+    data_consistency :sticky
+
+    include CronjobQueue # rubocop:disable Scalability/CronWorkerContext -- Does not perform work scoped to a context
+
+    idempotent!
+
+    sidekiq_options retry: 3
+
+    worker_has_external_dependencies!
+
+    feature_category :cloud_connector
+
+    def perform
+      return unless ::Feature.enabled?(:use_sync_service_token_worker)
+
+      result = ::CloudConnector::SyncCloudConnectorAccessService.new.execute
+
+      log_extra_metadata_on_done(:error_message, result[:message]) unless result.success?
+    end
+  end
+end
diff --git a/ee/spec/workers/cloud_connector/sync_service_token_worker_spec.rb b/ee/spec/workers/cloud_connector/sync_service_token_worker_spec.rb
new file mode 100644
index 0000000000000000000000000000000000000000..a3c932fefc5bf8be9910d691db9814261026cedc
--- /dev/null
+++ b/ee/spec/workers/cloud_connector/sync_service_token_worker_spec.rb
@@ -0,0 +1,53 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe CloudConnector::SyncServiceTokenWorker, type: :worker, feature_category: :cloud_connector do
+  describe '#perform' do
+    let(:service_response) { ServiceResponse.success }
+
+    before do
+      allow(CloudConnector::SyncCloudConnectorAccessService).to receive_message_chain(:new,
+        :execute).and_return(service_response)
+    end
+
+    include_examples 'an idempotent worker' do
+      let(:worker) { described_class.new }
+
+      subject(:sync_service_token) { perform_multiple(worker: worker) }
+
+      it 'executes the SyncCloudConnectorAccessService with expected params' do
+        expect(CloudConnector::SyncCloudConnectorAccessService).to receive_message_chain(:new, :execute)
+        expect(worker).not_to receive(:log_extra_metadata_on_done)
+
+        sync_service_token
+      end
+
+      context 'when :use_sync_service_token_worker feature flag is disabled' do
+        before do
+          stub_feature_flags(use_sync_service_token_worker: false)
+        end
+
+        it 'does not call CloudConnector::SyncCloudConnectorAccessService' do
+          expect(::CloudConnector::SyncCloudConnectorAccessService).not_to receive(:new)
+          expect(worker).not_to receive(:log_extra_metadata_on_done)
+
+          sync_service_token
+        end
+      end
+
+      context 'when SyncCloudConnectorAccessService fails' do
+        let(:service_response) { ServiceResponse.error(message: 'Error') }
+
+        it { expect { sync_service_token }.not_to raise_error }
+
+        it 'logs the error' do
+          expect(worker).to receive(:log_extra_metadata_on_done)
+                              .with(:error_message, service_response[:message]).twice
+
+          sync_service_token
+        end
+      end
+    end
+  end
+end
diff --git a/spec/workers/every_sidekiq_worker_spec.rb b/spec/workers/every_sidekiq_worker_spec.rb
index 4918c4e00824b96b53874a1216bdc83d907182e3..75101c1a24e4862510ce5cafafaf4007405ae731 100644
--- a/spec/workers/every_sidekiq_worker_spec.rb
+++ b/spec/workers/every_sidekiq_worker_spec.rb
@@ -176,6 +176,7 @@
         'Ci::UnlockPipelinesInQueueWorker' => 0,
         'Ci::SyncReportsToReportApprovalRulesWorker' => 3,
         'CleanupContainerRepositoryWorker' => 3,
+        'CloudConnector::SyncServiceTokenWorker' => 3,
         'ClusterConfigureIstioWorker' => 3,
         'ClusterInstallAppWorker' => 3,
         'ClusterPatchAppWorker' => 3,