Skip to content

ecs_service: add Service Connect support and wait-on-present - #2408

Open
jonpspri wants to merge 10 commits into
ansible-collections:mainfrom
jonpspri:ecs_service
Open

ecs_service: add Service Connect support and wait-on-present#2408
jonpspri wants to merge 10 commits into
ansible-collections:mainfrom
jonpspri:ecs_service

Conversation

@jonpspri

@jonpspri jonpspri commented Feb 7, 2026

Copy link
Copy Markdown
Contributor

Summary

Closes #1755

  • Add service_connect_configuration parameter to ecs_service module for creating and updating ECS services with AWS Service Connect
  • Extend wait parameter to support state=present using the services_stable waiter, blocking until runningCount matches desiredCount
  • Convert positional args to keyword args at create_service and update_service call sites to prevent silent breakage on parameter reordering
  • Extract is_dict_subset() into plugins/module_utils/dict.py as a reusable recursive subset comparison utility with order-insensitive list matching via list_sort_key
  • Idempotency comparison correctly reads serviceConnectConfiguration from the primary deployment (where AWS returns it, not the top-level Service object) and tolerates AWS-populated defaults like discoveryName

Test plan

  • Unit tests for is_dict_subset (36 tests covering basic subset, nested dicts, list comparison, sort key, scalars, and real-world ECS Service Connect scenarios)
  • Integration tests for Service Connect: create, idempotency, update, disable, delete
  • Integration test teardown covers Cloud Map namespace, task definition, and service cleanup

Add service_connect_configuration parameter to ecs_service module for
creating and updating ECS services with Service Connect. The idempotency
comparison reads serviceConnectConfiguration from the primary deployment
(where AWS returns it) and uses a recursive subset check to tolerate
AWS-populated defaults like discoveryName.

Extend wait parameter to support state=present using the services_stable
waiter, blocking until runningCount matches desiredCount.

Additional improvements:
- Convert positional args to keyword args at create_service and
  update_service call sites to prevent silent breakage on reordering
- Extract is_dict_subset into plugins/module_utils/dict.py as a
  reusable utility with order-insensitive list comparison via
  list_sort_key parameter

Includes unit tests for is_dict_subset and integration tests covering
Service Connect create, idempotency, update, disable, and delete.
Copilot AI review requested due to automatic review settings February 7, 2026 09:49
@github-actions

github-actions Bot commented Feb 7, 2026

Copy link
Copy Markdown

Docs Build 📝

Thank you for contribution!✨

The docsite for this PR is available for download as an artifact from this run:
https://github.com/ansible-collections/community.aws/actions/runs/24337988662

You can compare to the docs for the main branch here:
https://ansible-collections.github.io/community.aws/branch/main

File changes:

  • M collections/community/aws/aws_waf_condition_module.html
  • M collections/community/aws/aws_waf_info_module.html
  • M collections/community/aws/aws_waf_rule_module.html
  • M collections/community/aws/aws_waf_web_acl_module.html
  • M collections/community/aws/ecs_service_module.html
  • M collections/community/aws/index.html
  • M collections/community/aws/sts_session_token_module.html
  • M collections/community/aws/waf_condition_module.html
  • M collections/community/aws/waf_info_module.html
  • M collections/community/aws/waf_rule_module.html
  • M collections/community/aws/waf_web_acl_module.html
  • M collections/community/aws/wafv2_ip_set_module.html
  • M collections/deprecations.html
  • M collections/index_module.html
Click to see the diff comparison.

NOTE: only file modifications are shown here. New and deleted files are excluded.
See the file list and check the published docs to see those files.

The diff output was truncated because it exceeded the maximum size.

diff --git a/home/runner/work/community.aws/community.aws/docsbuild/base/collections/community/aws/aws_waf_condition_module.html b/home/runner/work/community.aws/community.aws/docsbuild/head/collections/community/aws/aws_waf_condition_module.html
index fe0377f..b37d3b9 100644
--- a/home/runner/work/community.aws/community.aws/docsbuild/base/collections/community/aws/aws_waf_condition_module.html
+++ b/home/runner/work/community.aws/community.aws/docsbuild/head/collections/community/aws/aws_waf_condition_module.html
@@ -7,7 +7,7 @@
 <meta content="2.24.0" name="antsibull-docs" />
 
   <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-  <title>community.aws.aws_waf_condition module &mdash; Ansible collections  documentation</title>
+  <title>community.aws.aws_waf_condition &mdash; Ansible collections  documentation</title>
       <link rel="stylesheet" type="text/css" href="../../../_static/pygments.css?v=41de9001" />
       <link rel="stylesheet" type="text/css" href="../../../_static/css/ansible.css?v=b54c304f" />
       <link rel="stylesheet" type="text/css" href="../../../_static/antsibull-minimal.css" />
@@ -100,7 +100,7 @@
           <div role="navigation" aria-label="Page navigation">
   <ul class="wy-breadcrumbs">
       <li><a href="../../../index.html" class="icon icon-home" aria-label="Home"></a></li>
-      <li class="breadcrumb-item active">community.aws.aws_waf_condition module</li>
+      <li class="breadcrumb-item active">community.aws.aws_waf_condition</li>
       <li class="wy-breadcrumbs-aside">
       </li>
   </ul>
@@ -111,19 +111,15 @@
   
            <div itemprop="articleBody">
              
-  <span class="target" id="ansible-collections-community-aws-aws-waf-condition-module"></span><section id="community-aws-aws-waf-condition-module">
-<h1>community.aws.aws_waf_condition module<a class="headerlink" href="#community-aws-aws-waf-condition-module" title="Link to this heading"></a></h1>
+  <span class="target" id="ansible-collections-community-aws-aws-waf-condition-module"></span><section id="community-aws-aws-waf-condition">
+<h1>community.aws.aws_waf_condition<a class="headerlink" href="#community-aws-aws-waf-condition" title="Link to this heading"></a></h1>
 <div class="admonition note">
 <p class="admonition-title">Note</p>
-<p>This redirect is part of the <a class="reference external" href="https://galaxy.ansible.com/ui/repo/published/community/aws/">community.aws collection</a> (version 12.0.0-dev0).</p>
+<p>This plugin was part of the <a class="reference external" href="https://galaxy.ansible.com/ui/repo/published/community/aws/">community.aws collection</a> (version 12.0.0-dev0).</p>
 </div>
-<ul class="simple">
-<li><p>This redirect has been <strong>deprecated</strong>. Please update your tasks to use the new name <code class="docutils literal notranslate"><span class="pre">community.aws.waf_condition</span></code> instead.
-It will be removed in a major release after 2027-01-01 of community.aws.</p></li>
-<li><p>This is a redirect to the <a class="reference internal" href="waf_condition_module.html#ansible-collections-community-aws-waf-condition-module"><span class="std std-ref">community.aws.waf_condition module</span></a>.</p></li>
-<li><p>This redirect does <strong>not</strong> work with Ansible 2.9.</p></li>
-<li><p>The collection contains the following information on this deprecation: the community.aws.aws_waf_condition alias has been deprecated. Please update your tasks to use community.aws.waf_condition.</p></li>
-</ul>
+<p>This module has been removed
+in version 12.0.0 of community.aws.
+Amazon has retired the `WAF Classic` service. Please use the `AWS WAF (WAFv2)` service and modules instead.</p>
 </section>
 
 
diff --git a/home/runner/work/community.aws/community.aws/docsbuild/base/collections/community/aws/aws_waf_info_module.html b/home/runner/work/community.aws/community.aws/docsbuild/head/collections/community/aws/aws_waf_info_module.html
index a79d051..de7dbf0 100644
--- a/home/runner/work/community.aws/community.aws/docsbuild/base/collections/community/aws/aws_waf_info_module.html
+++ b/home/runner/work/community.aws/community.aws/docsbuild/head/collections/community/aws/aws_waf_info_module.html
@@ -7,7 +7,7 @@
 <meta content="2.24.0" name="antsibull-docs" />
 
   <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-  <title>community.aws.aws_waf_info module &mdash; Ansible collections  documentation</title>
+  <title>community.aws.aws_waf_info &mdash; Ansible collections  documentation</title>
       <link rel="stylesheet" type="text/css" href="../../../_static/pygments.css?v=41de9001" />
       <link rel="stylesheet" type="text/css" href="../../../_static/css/ansible.css?v=b54c304f" />
       <link rel="stylesheet" type="text/css" href="../../../_static/antsibull-minimal.css" />
@@ -100,7 +100,7 @@
           <div role="navigation" aria-label="Page navigation">
   <ul class="wy-breadcrumbs">
       <li><a href="../../../index.html" class="icon icon-home" aria-label="Home"></a></li>
-      <li class="breadcrumb-item active">community.aws.aws_waf_info module</li>
+      <li class="breadcrumb-item active">community.aws.aws_waf_info</li>
       <li class="wy-breadcrumbs-aside">
       </li>
   </ul>
@@ -111,19 +111,15 @@
   
            <div itemprop="articleBody">
              
-  <span class="target" id="ansible-collections-community-aws-aws-waf-info-module"></span><section id="community-aws-aws-waf-info-module">
-<h1>community.aws.aws_waf_info module<a class="headerlink" href="#community-aws-aws-waf-info-module" title="Link to this heading"></a></h1>
+  <span class="target" id="ansible-collections-community-aws-aws-waf-info-module"></span><section id="community-aws-aws-waf-info">
+<h1>community.aws.aws_waf_info<a class="headerlink" href="#community-aws-aws-waf-info" title="Link to this heading"></a></h1>
 <div class="admonition note">
 <p class="admonition-title">Note</p>
-<p>This redirect is part of the <a class="reference external" href="https://galaxy.ansible.com/ui/repo/published/community/aws/">community.aws collection</a> (version 12.0.0-dev0).</p>
+<p>This plugin was part of the <a class="reference external" href="https://galaxy.ansible.com/ui/repo/published/community/aws/">community.aws collection</a> (version 12.0.0-dev0).</p>
 </div>
-<ul class="simple">
-<li><p>This redirect has been <strong>deprecated</strong>. Please update your tasks to use the new name <code class="docutils literal notranslate"><span class="pre">community.aws.waf_info</span></code> instead.
-It will be removed in a major release after 2027-01-01 of community.aws.</p></li>
-<li><p>This is a redirect to the <a class="reference internal" href="waf_info_module.html#ansible-collections-community-aws-waf-info-module"><span class="std std-ref">community.aws.waf_info module</span></a>.</p></li>
-<li><p>This redirect does <strong>not</strong> work with Ansible 2.9.</p></li>
-<li><p>The collection contains the following information on this deprecation: the community.aws.aws_waf_info alias has been deprecated. Please update your tasks to use community.aws.waf_info.</p></li>
-</ul>
+<p>This module has been removed
+in version 12.0.0 of community.aws.
+Amazon has retired the `WAF Classic` service. Please use the `AWS WAF (WAFv2)` service and modules instead.</p>
 </section>
 
 
diff --git a/home/runner/work/community.aws/community.aws/docsbuild/base/collections/community/aws/aws_waf_rule_module.html b/home/runner/work/community.aws/community.aws/docsbuild/head/collections/community/aws/aws_waf_rule_module.html
index f4a298b..fdfe81c 100644
--- a/home/runner/work/community.aws/community.aws/docsbuild/base/collections/community/aws/aws_waf_rule_module.html
+++ b/home/runner/work/community.aws/community.aws/docsbuild/head/collections/community/aws/aws_waf_rule_module.html
@@ -7,7 +7,7 @@
 <meta content="2.24.0" name="antsibull-docs" />
 
   <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-  <title>community.aws.aws_waf_rule module &mdash; Ansible collections  documentation</title>
+  <title>community.aws.aws_waf_rule &mdash; Ansible collections  documentation</title>
       <link rel="stylesheet" type="text/css" href="../../../_static/pygments.css?v=41de9001" />
       <link rel="stylesheet" type="text/css" href="../../../_static/css/ansible.css?v=b54c304f" />
       <link rel="stylesheet" type="text/css" href="../../../_static/antsibull-minimal.css" />
@@ -100,7 +100,7 @@
           <div role="navigation" aria-label="Page navigation">
   <ul class="wy-breadcrumbs">
       <li><a href="../../../index.html" class="icon icon-home" aria-label="Home"></a></li>
-      <li class="breadcrumb-item active">community.aws.aws_waf_rule module</li>
+      <li class="breadcrumb-item active">community.aws.aws_waf_rule</li>
       <li class="wy-breadcrumbs-aside">
       </li>
   </ul>
@@ -111,19 +111,15 @@
   
            <div itemprop="articleBody">
              
-  <span class="target" id="ansible-collections-community-aws-aws-waf-rule-module"></span><section id="community-aws-aws-waf-rule-module">
-<h1>community.aws.aws_waf_rule module<a class="headerlink" href="#community-aws-aws-waf-rule-module" title="Link to this heading"></a></h1>
+  <span class="target" id="ansible-collections-community-aws-aws-waf-rule-module"></span><section id="community-aws-aws-waf-rule">
+<h1>community.aws.aws_waf_rule<a class="headerlink" href="#community-aws-aws-waf-rule" title="Link to this heading"></a></h1>
 <div class="admonition note">
 <p class="admonition-title">Note</p>
-<p>This redirect is part of the <a class="reference external" href="https://galaxy.ansible.com/ui/repo/published/community/aws/">community.aws collection</a> (version 12.0.0-dev0).</p>
+<p>This plugin was part of the <a class="reference external" href="https://galaxy.ansible.com/ui/repo/published/community/aws/">community.aws collection</a> (version 12.0.0-dev0).</p>
 </div>
-<ul class="simple">
-<li><p>This redirect has been <strong>deprecated</strong>. Please update your tasks to use the new name <code class="docutils literal notranslate"><span class="pre">community.aws.waf_rule</span></code> instead.
-It will be removed in a major release after 2027-01-01 of community.aws.</p></li>
-<li><p>This is a redirect to the <a class="reference internal" href="waf_rule_module.html#ansible-collections-community-aws-waf-rule-module"><span class="std std-ref">community.aws.waf_rule module</span></a>.</p></li>
-<li><p>This redirect does <strong>not</strong> work with Ansible 2.9.</p></li>
-<li><p>The collection contains the following information on this deprecation: the community.aws.aws_waf_rule alias has been deprecated. Please update your tasks to use community.aws.waf_rule.</p></li>
-</ul>
+<p>This module has been removed
+in version 12.0.0 of community.aws.
+Amazon has retired the `WAF Classic` service. Please use the `AWS WAF (WAFv2)` service and modules instead.</p>
 </section>
 
 
diff --git a/home/runner/work/community.aws/community.aws/docsbuild/base/collections/community/aws/aws_waf_web_acl_module.html b/home/runner/work/community.aws/community.aws/docsbuild/head/collections/community/aws/aws_waf_web_acl_module.html
index 2be63e0..41391e7 100644
--- a/home/runner/work/community.aws/community.aws/docsbuild/base/collections/community/aws/aws_waf_web_acl_module.html
+++ b/home/runner/work/community.aws/community.aws/docsbuild/head/collections/community/aws/aws_waf_web_acl_module.html
@@ -7,7 +7,7 @@
 <meta content="2.24.0" name="antsibull-docs" />
 
   <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-  <title>community.aws.aws_waf_web_acl module &mdash; Ansible collections  documentation</title>
+  <title>community.aws.aws_waf_web_acl &mdash; Ansible collections  documentation</title>
       <link rel="stylesheet" type="text/css" href="../../../_static/pygments.css?v=41de9001" />
       <link rel="stylesheet" type="text/css" href="../../../_static/css/ansible.css?v=b54c304f" />
       <link rel="stylesheet" type="text/css" href="../../../_static/antsibull-minimal.css" />
@@ -100,7 +100,7 @@
           <div role="navigation" aria-label="Page navigation">
   <ul class="wy-breadcrumbs">
       <li><a href="../../../index.html" class="icon icon-home" aria-label="Home"></a></li>
-      <li class="breadcrumb-item active">community.aws.aws_waf_web_acl module</li>
+      <li class="breadcrumb-item active">community.aws.aws_waf_web_acl</li>
       <li class="wy-breadcrumbs-aside">
       </li>
   </ul>
@@ -111,19 +111,15 @@
   
            <div itemprop="articleBody">
              
-  <span class="target" id="ansible-collections-community-aws-aws-waf-web-acl-module"></span><section id="community-aws-aws-waf-web-acl-module">
-<h1>community.aws.aws_waf_web_acl module<a class="headerlink" href="#community-aws-aws-waf-web-acl-module" title="Link to this heading"></a></h1>
+  <span class="target" id="ansible-collections-community-aws-aws-waf-web-acl-module"></span><section id="community-aws-aws-waf-web-acl">
+<h1>community.aws.aws_waf_web_acl<a class="headerlink" href="#community-aws-aws-waf-web-acl" title="Link to this heading"></a></h1>
 <div class="admonition note">
 <p class="admonition-title">Note</p>
-<p>This redirect is part of the <a class="reference external" href="https://galaxy.ansible.com/ui/repo/published/community/aws/">community.aws collection</a> (version 12.0.0-dev0).</p>
+<p>This plugin was part of the <a class="reference external" href="https://galaxy.ansible.com/ui/repo/published/community/aws/">community.aws collection</a> (version 12.0.0-dev0).</p>
 </div>
-<ul class="simple">
-<li><p>This redirect has been <strong>deprecated</strong>. Please update your tasks to use the new name <code class="docutils literal notranslate"><span class="pre">community.aws.waf_web_acl</span></code> instead.
-It will be removed in a major release after 2027-01-01 of community.aws.</p></li>
-<li><p>This is a redirect to the <a class="reference internal" href="waf_web_acl_module.html#ansible-collections-community-aws-waf-web-acl-module"><span class="std std-ref">community.aws.waf_web_acl module</span></a>.</p></li>
-<li><p>This redirect does <strong>not</strong> work with Ansible 2.9.</p></li>
-<li><p>The collection contains the following information on this deprecation: the community.aws.aws_waf_web_acl alias has been deprecated. Please update your tasks to use community.aws.waf_web_acl.</p></li>
-</ul>
+<p>This module has been removed
+in version 12.0.0 of community.aws.
+Amazon has retired the `WAF Classic` service. Please use the `AWS WAF (WAFv2)` service and modules instead.</p>
 </section>
 
 
diff --git a/home/runner/work/community.aws/community.aws/docsbuild/base/collections/community/aws/ecs_service_module.html b/home/runner/work/community.aws/community.aws/docsbuild/head/collections/community/aws/ecs_service_module.html
index 6c124a5..03518f5 100644
--- a/home/runner/work/community.aws/community.aws/docsbuild/base/collections/community/aws/ecs_service_module.html
+++ b/home/runner/work/community.aws/community.aws/docsbuild/head/collections/community/aws/ecs_service_module.html
@@ -644,6 +644,56 @@ see <a class="reference internal" href="#ansible-collections-community-aws-ecs-s
 </div></td>
 </tr>
 <tr class="row-even"><td><div class="ansible-option-cell">
+<div class="ansibleOptionAnchor" id="parameter-service_connect_configuration"></div><p class="ansible-option-title" id="ansible-collections-community-aws-ecs-service-module-parameter-service-connect-configuration"><strong>service_connect_configuration</strong></p>
+<a class="ansibleOptionLink" href="#parameter-service_connect_configuration" title="Permalink to this option"></a><p class="ansible-option-type-line"><span class="ansible-option-type">dictionary</span></p>
+<p><em class="ansible-option-versionadded">added in community.aws 11.1.0</em></p>
+</div></td>
+<td><div class="ansible-option-cell"><p>The configuration for this service to discover and connect to services, and be discovered by, and connected from, other services within a namespace.</p>
+<p>See <a class="reference external" href="https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_ServiceConnectConfiguration.html">https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_ServiceConnectConfiguration.html</a> for more details.</p>
+<p>When determining whether the service needs updating, only the fields explicitly provided are compared against the existing configuration. AWS may populate additional default fields (such as <code class="docutils literal notranslate"><span class="pre">discoveryName</span></code>) which are ignored for idempotency purposes. If you need to enforce a specific value for an AWS-defaulted field, include it explicitly in this configuration.</p>
+</div></td>
+</tr>
+<tr class="row-odd"><td><div class="ansible-option-indent"></div><div class="ansible-option-cell">
+<div class="ansibleOptionAnchor" id="parameter-service_connect_configuration/access_log_configuration"></div><p class="ansible-option-title" id="ansible-collections-community-aws-ecs-service-module-parameter-service-connect-configuration-access-log-configuration"><strong>access_log_configuration</strong></p>
+<a class="ansibleOptionLink" href="#parameter-service_connect_configuration/access_log_configuration" title="Permalink to this option"></a><p class="ansible-option-type-line"><span class="ansible-option-type">dictionary</span></p>
+</div></td>
+<td><div class="ansible-option-indent-desc"></div><div class="ansible-option-cell"><p>The access log configuration for Service Connect.</p>
+</div></td>
+</tr>
+<tr class="row-even"><td><div class="ansible-option-indent"></div><div class="ansible-option-cell">
+<div class="ansibleOptionAnchor" id="parameter-service_connect_configuration/enabled"></div><p class="ansible-option-title" id="ansible-collections-community-aws-ecs-service-module-parameter-service-connect-configuration-enabled"><strong>enabled</strong></p>
+<a class="ansibleOptionLink" href="#parameter-service_connect_configuration/enabled" title="Permalink to this option"></a><p class="ansible-option-type-line"><span class="ansible-option-type">boolean</span> / <span class="ansible-option-required">required</span></p>
+</div></td>
+<td><div class="ansible-option-indent-desc"></div><div class="ansible-option-cell"><p>Specifies whether to use Service Connect with this service.</p>
+<p class="ansible-option-line"><strong class="ansible-option-choices">Choices:</strong></p>
+<ul class="simple">
+<li><p><code class="ansible-option-choices-entry docutils literal notranslate"><span class="pre">false</span></code></p></li>
+<li><p><code class="ansible-option-choices-entry docutils literal notranslate"><span class="pre">true</span></code></p></li>
+</ul>
+</div></td>
+</tr>
+<tr class="row-odd"><td><div class="ansible-option-indent"></div><div class="ansible-option-cell">
+<div class="ansibleOptionAnchor" id="parameter-service_connect_configuration/log_configuration"></div><p class="ansible-option-title" id="ansible-collections-community-aws-ecs-service-module-parameter-service-connect-configuration-log-configuration"><strong>log_configuration</strong></p>
+<a class="ansibleOptionLink" href="#parameter-service_connect_configuration/log_configuration" title="Permalink to this option"></a><p class="ansible-option-type-line"><span class="ansible-option-type">dictionary</span></p>
+</div></td>
+<td><div class="ansible-option-indent-desc"></div><div class="ansible-option-cell"><p>The log configuration for the container.</p>
+</div></td>
+</tr>
+<tr class="row-even"><td><div class="ansible-option-indent"></div><div class="ansible-option-cell">
+<div class="ansibleOptionAnchor" id="parameter-service_connect_configuration/namespace"></div><p class="ansible-option-title" id="ansible-collections-community-aws-ecs-service-module-parameter-service-connect-configuration-namespace"><strong>namespace</strong></p>
+<a class="ansibleOptionLink" href="#parameter-service_connect_configuration/namespace" title="Permalink to this option"></a><p class="ansible-option-type-line"><span class="ansible-option-type">string</span></p>
+</div></td>
+<td><div class="ansible-option-indent-desc"></div><div class="ansible-option-cell"><p>The namespace name or full Amazon Resource Name (ARN) of the AWS Cloud Map namespace for use with Service Connect.</p>
+</div></td>
+</tr>
+<tr class="row-odd"><td><div class="ansible-option-indent"></div><div class="ansible-option-cell">
+<div class="ansibleOptionAnchor" id="parameter-service_connect_configuration/services"></div><p class="ansible-option-title" id="ansible-collections-community-aws-ecs-service-module-parameter-service-connect-configuration-services"><strong>services</strong></p>
+<a class="ansibleOptionLink" href="#parameter-service_connect_configuration/services" title="Permalink to this option"></a><p class="ansible-option-type-line"><span class="ansible-option-type">list</span> / <span class="ansible-option-elements">elements=dictionary</span></p>
+</div></td>
+<td><div class="ansible-option-indent-desc"></div><div class="ansible-option-cell"><p>The list of Service Connect service objects.</p>
+</div></td>
+</tr>
+<tr class="row-even"><td><div class="ansible-option-cell">
 <div class="ansibleOptionAnchor" id="parameter-service_registries"></div><p class="ansible-option-title" id="ansible-collections-community-aws-ecs-service-module-parameter-service-registries"><strong>service_registries</strong></p>
 <a class="ansibleOptionLink" href="#parameter-service_registries" title="Permalink to this option"></a><p class="ansible-option-type-line"><span class="ansible-option-type">list</span> / <span class="ansible-option-elements">elements=dictionary</span></p>
 </div></td>
@@ -732,8 +782,9 @@ see <a class="reference internal" href="#ansible-collections-community-aws-ecs-s
 <a class="ansibleOptionLink" href="#parameter-wait" title="Permalink to this option"></a><p class="ansible-option-type-line"><span class="ansible-option-type">boolean</span></p>
 <p><em class="ansible-option-versionadded">added in community.aws 4.1.0</em></p>
 </div></td>
-<td><div class="ansible-option-cell"><p>Whether or not to wait for the service to be inactive.</p>
-<p>Waits only when <em>state</em> is <code class="docutils literal notranslate"><span class="pre">absent</span></code>.</p>
+<td><div class="ansible-option-cell"><p>Whether or not to wait for the service to reach the desired state.</p>
+<p>When <em>state=present</em>, waits for the service to be stable with tasks in the RUNNING state.</p>
+<p>When <em>state=absent</em>, waits for the service to be inactive.</p>
 <p class="ansible-option-line"><strong class="ansible-option-choices">Choices:</strong></p>
 <ul class="simple">
 <li><p><code class="ansible-option-default-bold docutils literal notranslate"><strong><span class="pre">false</span></strong></code> <span class="ansible-option-choices-default-mark">← (default)</span></p></li>
@@ -840,6 +891,32 @@ see <a class="reference internal" href="#ansible-collections-community-aws-ecs-s
 <span class="w">      </span><span class="nt">Firstname</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">jane</span>
 <span class="w">      </span><span class="nt">lastName</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">doe</span>
 <span class="w">    </span><span class="nt">propagate_tags</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">SERVICE</span>
+
+<span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">Create ECS Service with Service Connect configuration</span>
+<span class="w">  </span><span class="nt">community.aws.ecs_service</span><span class="p">:</span>
+<span class="w">    </span><span class="nt">state</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">present</span>
+<span class="w">    </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">service-connect-test</span>
+<span class="w">    </span><span class="nt">cluster</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">my_cluster</span>
+<span class="w">    </span><span class="nt">task_definition</span><span class="p">:</span><span class="w"> </span><span class="s">&#39;my-task:1&#39;</span>
+<span class="w">    </span><span class="nt">desired_count</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">1</span>
+<span class="w">    </span><span class="nt">service_connect_configuration</span><span class="p">:</span>
+<span class="w">      </span><span class="nt">enabled</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">true</span>
+<span class="w">      </span><span class="nt">namespace</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">my-cloudmap-namespace</span>
+<span class="w">      </span><span class="nt">services</span><span class="p">:</span>
+<span class="w">        </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">port_name</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">http</span>
+<span class="w">          </span><span class="nt">client_aliases</span><span class="p">:</span>
+<span class="w">            </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">port</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">80</span>
+
+<span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">Create service and wait for tasks to be running</span>
+<span class="w">  </span><span class="nt">community.aws.ecs_service</span><span class="p">:</span>
+<span class="w">    </span><span class="nt">state</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">present</span>
+<span class="w">    </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">my-service</span>
+<span class="w">    </span><span class="nt">cluster</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">my_cluster</span>
+<span class="w">    </span><span class="nt">task_definition</span><span class="p">:</span><span class="w"> </span><span class="s">&#39;my-task:1&#39;</span>
+<span class="w">    </span><span class="nt">desired_count</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">2</span>
+<span class="w">    </span><span class="nt">wait</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">true</span>
+<span class="w">    </span><span class="nt">delay</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">10</span>
+<span class="w">    </span><span class="nt">repeat</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">30</span>
 </pre></div>
 </div>
 </section>
diff --git a/home/runner/work/community.aws/community.aws/docsbuild/base/collections/community/aws/index.html b/home/runner/work/community.aws/community.aws/docsbuild/head/collections/community/aws/index.html
index 7f63cd4..4ec2fe4 100644
--- a/home/runner/work/community.aws/community.aws/docsbuild/base/collections/community/aws/index.html
+++ b/home/runner/work/community.aws/community.aws/docsbuild/head/collections/community/aws/index.html
@@ -307,10 +307,6 @@
 <li><p><a class="reference internal" href="stepfunctions_state_machine_execution_module.html#ansible-collections-community-aws-stepfunctions-state-machine-execution-module"><span class="std std-ref">stepfunctions_state_machine_execution module</span></a> – Start or stop execution of an AWS Step Functions state machine</p></li>
 <li><p><a class="reference internal" href="storagegateway_info_module.html#ansible-collections-community-aws-storagegateway-info-module"><span class="std std-ref">storagegateway_info module</span></a> – Fetch AWS Storage Gateway information</p></li>
 <li><p><a class="reference internal" href="sts_session_token_module.html#ansible-collections-community-aws-sts-session-token-module"><span class="std std-ref">sts_session_token module</span></a> – obtain a session token from the AWS Security Token Service</p></li>
-<li><p><a class="reference internal" href="waf_condition_module.html#ansible-collections-community-aws-waf-condition-module"><span class="std std-ref">waf_condition module</span></a> – Create and delete WAF Conditions <strong class="ansible-deprecation-marker">DEPRECATED: REMOVED IN 12.0.0</strong></p></li>
-<li><p><a class="reference internal" href="waf_info_module.html#ansible-collections-community-aws-waf-info-module"><span class="std std-ref">waf_info module</span></a> – Retrieve information for WAF ACLs, Rules, Conditions and Filters <strong class="ansible-deprecation-marker">DEPRECATED: REMOVED IN 12.0.0</strong></p></li>
-<li><p><a class="reference internal" href="waf_rule_module.html#ansible-collections-community-aws-waf-rule-module"><span class="std std-ref">waf_rule module</span></a> – Create and delete WAF Rules <strong class="ansible-deprecation-marker">DEPRECATED: REMOVED IN 12.0.0</strong></p></li>
-<li><p><a class="reference internal" href="waf_web_acl_module.html#ansible-collections-community-aws-waf-web-acl-module"><span class="std std-ref">waf_web_acl module</span></a> – Create and delete WAF Web ACLs <strong class="ansible-deprecation-marker">DEPRECATED: REMOVED IN 12.0.0</strong></p></li>
 <li><p><a class="reference internal" href="wafv2_ip_set_module.html#ansible-collections-community-aws-wafv2-ip-set-module"><span class="std std-ref">wafv2_ip_set module</span></a> – wafv2_ip_set</p></li>
 <li><p><a class="reference internal" href="wafv2_ip_set_info_module.html#ansible-collections-community-aws-wafv2-ip-set-info-module"><span class="std std-ref">wafv2_ip_set_info module</span></a> – Get information about wafv2 ip sets</p></li>
 <li><p><a class="reference internal" href="wafv2_resources_module.html#ansible-collections-community-aws-wafv2-resources-module"><span class="std std-ref">wafv2_resources module</span></a> – wafv2_web_acl</p></li>
diff --git a/home/runner/work/community.aws/community.aws/docsbuild/base/collections/community/aws/sts_session_token_module.html b/home/runner/work/community.aws/community.aws/docsbuild/head/collections/community/aws/sts_session_token_module.html
index 16b7826..0395797 100644
--- a/home/runner/work/community.aws/community.aws/docsbuild/base/collections/community/aws/sts_session_token_module.html
+++ b/home/runner/work/community.aws/community.aws/docsbuild/head/collections/community/aws/sts_session_token_module.html
@@ -22,7 +22,7 @@
       <script src="../../../_static/sphinx_highlight.js?v=6ffebe34"></script>
     <script src="../../../_static/js/theme.js"></script>
     <link rel="search" title="Search" href="../../../search.html" />
-    <link rel="next" title="community.aws.waf_condition module – Create and delete WAF Conditions" href="waf_condition_module.html" />
+    <link rel="next" title="community.aws.wafv2_ip_set module – wafv2_ip_set" href="wafv2_ip_set_module.html" />
     <link rel="prev" title="community.aws.storagegateway_info module – Fetch AWS Storage Gateway information" href="storagegateway_info_module.html" /><!-- extra head elements for Ansible beyond RTD Sphinx Theme -->
 
 
@@ -405,7 +405,7 @@ see <a class="reference internal" href="#ansible-collections-community-aws-sts-s
 
 <footer><div class="rst-footer-buttons" role="navigation" aria-label="Footer">
         <a href="storagegateway_info_module.html" class="btn btn-neutral float-left" title="community.aws.storagegateway_info module – Fetch AWS Storage Gateway information" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left" aria-hidden="true"></span> Previous</a>
-        <a href="waf_condition_module.html" class="btn btn-neutral float-right" title="community.aws.waf_condition module – Create and delete WAF Conditions" accesskey="n" rel="next">Next <span class="fa fa-arrow-circle-right" aria-hidden="true"></span></a>
+        <a href="wafv2_ip_set_module.html" class="btn btn-neutral float-right" title="community.aws.wafv2_ip_set module – wafv2_ip_set" accesskey="n" rel="next">Next <span class="fa fa-arrow-circle-right" aria-hidden="true"></span></a>
     </div>
 
   <hr/>
diff --git a/home/runner/work/community.aws/community.aws/docsbuild/base/collections/community/aws/waf_condition_module.html b/home/runner/work/community.aws/community.aws/docsbuild/head/collections/community/aws/waf_condition_module.html
index 9610f90..e855f8a 100644
--- a/home/runner/work/community.aws/community.aws/docsbuild/base/collections/community/aws/waf_condition_module.html
+++ b/home/runner/work/community.aws/community.aws/docsbuild/head/collections/community/aws/waf_condition_module.html
@@ -7,7 +7,7 @@
 <meta content="2.24.0" name="antsibull-docs" />
 
   <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-  <title>community.aws.waf_condition module – Create and delete WAF Conditions &mdash; Ansible collections  documentation</title>
+  <title>community.aws.waf_condition &mdash; Ansible collections  documentation</title>
       <link rel="stylesheet" type="text/css" href="../../../_static/pygments.css?v=41de9001" />
       <link rel="stylesheet" type="text/css" href="../../../_static/css/ansible.css?v=b54c304f" />
       <link rel="stylesheet" type="text/css" href="../../../_static/antsibull-minimal.css" />
@@ -21,9 +21,7 @@
       <script src="../../../_static/doctools.js?v=fd6eb6e6"></script>
       <script src="../../../_static/sphinx_highlight.js?v=6ffebe34"></script>
     <script src="../../../_static/js/theme.js"></script>
-    <link rel="search" title="Search" href="../../../search.html" />
-    <link rel="next" title="community.aws.waf_info module – Retrieve information for WAF ACLs, Rules, Conditions and Filters" href="waf_info_module.html" />
-    <link rel="prev" title="community.aws.sts_session_token module – obtain a session token from the AWS Security Token Service" href="sts_session_token_module.html" /><!-- extra head elements for Ansible beyond RTD Sphinx Theme -->
+    <link rel="search" title="Search" href="../../../search.html" /><!-- extra head elements for Ansible beyond RTD Sphinx Theme -->
 
 
 
@@ -74,20 +72,8 @@
         </div><div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="Navigation menu">
   
               <p class="caption" role="heading"><span class="caption-text">Collections:</span></p>
-<ul class="current">
-<li class="toctree-l1 current"><a class="reference internal" href="../../index.html">Collection Index</a><ul class="current">
-<li class="toctree-l2 current"><a class="reference internal" href="../index.html">Collections in the Community Namespace</a><ul class="current">
-<li class="toctree-l3 current"><a class="reference internal" href="index.html">Community.Aws</a><ul class="current">
-<li class="toctree-l4"><a class="reference internal" href="index.html#description">Description</a></li>
-<li class="toctree-l4"><a class="reference internal" href="index.html#communication">Communication</a></li>
-<li class="toctree-l4"><a class="reference internal" href="index.html#changelog">Changelog</a></li>
-<li class="toctree-l4 current"><a class="reference internal" href="index.html#plugin-index">Plugin Index</a></li>
-</ul>
-</li>
-</ul>
-</li>
-</ul>
-</li>
+<ul>
+<li class="toctree-l1"><a class="reference internal" href="../../index.html">Collection Index</a></li>
 </ul>
 <p class="caption" role="heading"><span class="caption-text">Plugin indexes:</span></p>
 <ul>
@@ -114,13 +100,8 @@
           <div role="navigation" aria-label="Page navigation">
   <ul class="wy-breadcrumbs">
       <li><a href="../../../index.html" class="icon icon-home" aria-label="Home"></a></li>
-          <li class="breadcrumb-item"><a href="../../index.html">Collection Index</a></li>
-          <li class="breadcrumb-item"><a href="../index.html">Collections in the Community Namespace</a></li>
-          <li class="breadcrumb-item"><a href="index.html">Community.Aws</a></li>
-      <li class="breadcrumb-item active">community.aws.waf_condition module – Create and delete WAF Conditions</li>
+      <li class="breadcrumb-item active">community.aws.waf_condition</li>
       <li class="wy-breadcrumbs-aside">
-              <!-- User defined GitHub URL -->
-              <a href="https://github.com/ansible-collections/community.aws/edit/main/plugins/modules/waf_condition.py?description=%23%23%23%23%23%20SUMMARY%0A%3C!—%20Your%20description%20here%20–%3E%0A%0A%0A%23%23%23%23%23%20ISSUE%20TYPE%0A-%20Docs%20Pull%20Request%0A%0A%2Blabel:%20docsite_pr" class="fa fa-github"> Edit on GitHub</a>
       </li>
   </ul>
   <hr/>
@@ -130,875 +111,15 @@
   
            <div itemprop="articleBody">
              
-  <span class="target" id="ansible-collections-community-aws-waf-condition-module"></span><section id="community-aws-waf-condition-module-create-and-delete-waf-conditions">
-<h1>community.aws.waf_condition module – Create and delete WAF Conditions<a class="headerlink" href="#community-aws-waf-condition-module-create-and-delete-waf-conditions" title="Link to this heading"></a></h1>
+  <span class="target" id="ansible-collections-community-aws-waf-condition-module"></span><section id="community-aws-waf-condition">
+<h1>community.aws.waf_condition<a class="headerlink" href="#community-aws-waf-condition" title="Link to this heading"></a></h1>
 <div class="admonition note">
 <p class="admonition-title">Note</p>
-<p>This module is part of the <a class="reference external" href="https://galaxy.ansible.com/ui/repo/published/community/aws/">community.aws collection</a> (version 12.0.0-dev0).</p>
-<p>It is not included in <code class="docutils literal notranslate"><span class="pre">ansible-core</span></code>.
-To check whether it is installed, run <code class="code docutils literal notranslate"><span class="pre">ansible-galaxy</span> <span class="pre">collection</span> <span class="pre">list</span></code>.</p>
-<p>To install it, use: <code class="code docutils literal notranslate"><span class="pre">ansible-galaxy</span> <span class="pre">collection</span> <span class="pre">install</span> <span class="pre">community.aws</span></code>.
-You need further requirements to be able to use this module,
-see <a class="reference internal" href="#ansible-collections-community-aws-waf-condition-module-requirements"><span class="std std-ref">Requirements</span></a> for details.</p>
-<p>To use it in a playbook, specify: <code class="code docutils literal notranslate"><span class="pre">community.aws.waf_condition</span></code>.</p>
+<p>This plugin was part of the <a class="reference external" href="https://galaxy.ansible.com/ui/repo/published/community/aws/">community.aws collection</a> (version 12.0.0-dev0).</p>
 </div>
-<p class="ansible-version-added">New in community.aws 1.0.0</p>
-<nav class="contents local" id="contents">
-<ul class="simple">
-<li><p><a class="reference internal" href="#deprecated" id="id1">DEPRECATED</a></p></li>
-<li><p><a class="reference internal" href="#synopsis" id="id2">Synopsis</a></p></li>
-<li><p><a class="reference internal" href="#requirements" id="id3">Requirements</a></p></li>
-<li><p><a class="reference internal" href="#parameters" id="id4">Parameters</a></p></li>
-<li><p><a class="reference internal" href="#notes" id="id5">Notes</a></p></li>
-<li><p><a class="reference internal" href="#examples" id="id6">Examples</a></p></li>
-<li><p><a class="reference internal" href="#return-values" id="id7">Return Values</a></p></li>
-<li><p><a class="reference internal" href="#status" id="id8">Status</a></p></li>
-</ul>
-</nav>
-<section id="deprecated">
-<h2><a class="toc-backref" href="#id1" role="doc-backlink">DEPRECATED</a><a class="headerlink" href="#deprecated" title="Link to this heading"></a></h2>
-<dl class="field-list simple">
-<dt class="field-odd">Removed in<span class="colon">:</span></dt>
-<dd class="field-odd"><p>version 12.0.0</p>
-</dd>
-<dt class="field-even">Why<span class="colon">:</span></dt>
-<dd class="field-even"><p>Amazon has retired the “WAF Classic” service.</p>
-</dd>
-<dt class="field-odd">Alternative<span class="colon">:</span></dt>
-<dd class="field-odd"><p>Please use the “AWS WAF (WAFv2)” service and modules instead.</p>
-</dd>
-</dl>
-</section>
-<section id="synopsis">
-<h2><a class="toc-backref" href="#id2" role="doc-backlink">Synopsis</a><a class="headerlink" href="#synopsis" title="Link to this heading"></a></h2>
-<ul class="simple">
-<li><p>Read the AWS documentation for WAF <a class="reference external" href="https://aws.amazon.com/documentation/waf/">https://aws.amazon.com/documentation/waf/</a></p></li>
-<li><p>Prior to release 5.0.0 this module was called <code class="docutils literal notranslate"><span class="pre">community.aws.aws_waf_condition</span></code>. The usage did not change.</p></li>
-</ul>
-<p>Aliases: aws_waf_condition</p>
-</section>
-<section id="requirements">
-<span id="ansible-collections-community-aws-waf-condition-module-requirements"></span><h2><a class="toc-backref" href="#id3" role="doc-backlink">Requirements</a><a class="headerlink" href="#requirements" title="Link to this heading"></a></h2>
-<p>The below requirements are needed on the host that executes this module.</p>
-<ul class="simple">
-<li><p>python &gt;= 3.6</p></li>
-<li><p>boto3 &gt;= 1.38.0</p></li>
-<li><p>botocore &gt;= 1.38.0</p></li>
-</ul>
-</section>
-<section id="parameters">
-<h2><a class="toc-backref" href="#id4" role="doc-backlink">Parameters</a><a class="headerlink" href="#parameters" title="Link to this heading"></a></h2>
-<table class="longtable ansible-option-table docutils align-default" style="width: 100%">
-<thead>
-<tr class="row-odd"><th class="head"><p>Parameter</p></th>
-<th class="head"><p>Comments</p></th>
-</tr>
-</thead>
-<tbody>
-<tr class="row-even"><td><div class="ansible-option-cell">
-<div class="ansibleOptionAnchor" id="parameter-access_key"></div>
-<div class="ansibleOptionAnchor" id="parameter-aws_access_key_id"></div>
-<div class="ansibleOptionAnchor" id="parameter-aws_access_key"></div><p class="ansible-option-title" id="ansible-collections-community-aws-waf-condition-module-parameter-aws-access-key-id"><span id="ansible-collections-community-aws-waf-condition-module-parameter-aws-access-key"></span><span id="ansible-collections-community-aws-waf-condition-module-parameter-access-key"></span><strong>access_key</strong></p>
-<a class="ansibleOptionLink" href="#parameter-access_key" title="Permalink to this option"></a><p class="ansible-option-type-line"><span class="ansible-option-aliases">aliases: aws_access_key_id, aws_access_key</span></p>
-<p class="ansible-option-type-line"><span class="ansible-option-type">string</span></p>
-</div></td>
-<td><div class="ansible-option-cell"><p>AWS access key ID.</p>
-<p>See the AWS documentation for more information about access tokens <a class="reference external" href="https://docs.aws.amazon.com/general/latest/gr/aws-sec-cred-types.html#access-keys-and-secret-access-keys">https://docs.aws.amazon.com/general/latest/gr/aws-sec-cred-types.html#access-keys-and-secret-access-keys</a>.</p>
-<p>The <code class="docutils literal notranslate"><span class="pre">AWS_ACCESS_KEY_ID</span></code> or <code class="docutils literal notranslate"><span class="pre">AWS_ACCESS_KEY</span></code> environment variables may also be used in decreasing order of preference.</p>
-<p>The <em>aws_access_key</em> and <em>profile</em> options are mutually exclusive.</p>
-<p>The <em>aws_access_key_id</em> alias was added in release 5.1.0 for consistency with the AWS botocore SDK.</p>
-</div></td>
-</tr>
-<tr class="row-odd"><td><div class="ansible-option-cell">
-<div class="ansibleOptionAnchor" id="parameter-aws_ca_bundle"></div><p class="ansible-option-title" id="ansible-collections-community-aws-waf-condition-module-parameter-aws-ca-bundle"><strong>aws_ca_bundle</strong></p>
-<a class="ansibleOptionLink" href="#parameter-aws_ca_bundle" title="Permalink to this option"></a><p class="ansible-option-type-line"><span class="ansible-option-type">path</span></p>
-</div></td>
-<td><div class="ansible-option-cell"><p>The location of a CA Bundle to use when validating SSL certificates.</p>
-<p>The <code class="docutils literal notranslate"><span class="pre">AWS_CA_BUNDLE</span></code> environment variable may also be used.</p>
-</div></td>
-</tr>
-<tr class="row-even"><td><div class="ansible-option-cell">
-<div class="ansibleOptionAnchor" id="parameter-aws_config"></div><p class="ansible-option-title" id="ansible-collections-community-aws-waf-condition-module-parameter-aws-config"><strong>aws_config</strong></p>
-<a class="ansibleOptionLink" href="#parameter-aws_config" title="Permalink to this option"></a><p class="ansible-option-type-line"><span class="ansible-option-type">dictionary</span></p>
-</div></td>
-<td><div class="ansible-option-cell"><p>A dictionary to modify the botocore configuration.</p>
-<p>Parameters can be found in the AWS documentation <a class="reference external" href="https://botocore.amazonaws.com/v1/documentation/api/latest/reference/config.html#botocore.config.Config">https://botocore.amazonaws.com/v1/documentation/api/latest/reference/config.html#botocore.config.Config</a>.</p>
-</div></td>
-</tr>
-<tr class="row-odd"><td><div class="ansible-option-cell">
-<div class="ansibleOptionAnchor" id="parameter-debug_botocore_endpoint_logs"></div><p class="ansible-option-title" id="ansible-collections-community-aws-waf-condition-module-parameter-debug-botocore-endpoint-logs"><strong>debug_botocore_endpoint_logs</strong></p>
-<a class="ansibleOptionLink" href="#parameter-debug_botocore_endpoint_logs" title="Permalink to this option"></a><p class="ansible-option-type-line"><span class="ansible-option-type">boolean</span></p>
-</div></td>
-<td><div class="ansible-option-cell"><p>Use a <code class="docutils literal notranslate"><span class="pre">botocore.endpoint</span></code> logger to parse the unique (rather than total) <code class="docutils literal notranslate"><span class="pre">&quot;resource:action&quot;</span></code> API calls made during a task, outputing the set to the resource_actions key in the task results. Use the <code class="docutils literal notranslate"><span class="pre">aws_resource_action</span></code> callback to output to total list made during a playbook.</p>
-<p>The <code class="docutils literal notranslate"><span class="pre">ANSIBLE_DEBUG_BOTOCORE_LOGS</span></code> environment variable may also be used.</p>
-<p class="ansible-option-line"><strong class="ansible-option-choices">Choices:</strong></p>
-<ul class="simple">
-<li><p><code class="ansible-option-default-bold docutils literal notranslate"><strong><span class="pre">false</span></strong></code> <span class="ansible-option-choices-default-mark">← (default)</span></p></li>
-<li><p><code class="ansible-option-choices-entry docutils literal notranslate"><span class="pre">true</span></code></p></li>
-</ul>
-</div></td>
-</tr>
-<tr class="row-even"><td><div class="ansible-option-cell">
-<div class="ansibleOptionAnchor" id="parameter-endpoint_url"></div>
-<div class="ansibleOptionAnchor" id="parameter-aws_endpoint_url"></div><p class="ansible-option-title" id="ansible-collections-community-aws-waf-condition-module-parameter-endpoint-url"><span id="ansible-collections-community-aws-waf-condition-module-parameter-aws-endpoint-url"></span><strong>endpoint_url</strong></p>
-<a class="ansibleOptionLink" href="#parameter-endpoint_url" title="Permalink to this option"></a><p class="ansible-option-type-line"><span class="ansible-option-aliases">aliases: aws_endpoint_url</span></p>
-<p class="ansible-option-type-line"><span class="ansible-option-type">string</span></p>
-</div></td>
-<td><div class="ansible-option-cell"><p>URL to connect to instead of the default AWS endpoints. While this can be used to connection to other AWS-compatible services the amazon.aws and community.aws collections are only tested against AWS.</p>
-<p>The <code class="docutils literal notranslate"><span class="pre">AWS_URL</span></code> environment variable may also be used.</p>
-</div></td>
-</tr>
-<tr class="row-odd"><td><div class="ansible-option-cell">
-<div class="ansibleOptionAnchor" id="parameter-filters"></div><p class="ansible-option-title" id="ansible-collections-community-aws-waf-condition-module-parameter-filters"><strong>filters</strong></p>
-<a class="ansibleOptionLink" href="#parameter-filters" title="Permalink to this option"></a><p class="ansible-option-type-line"><span class="ansible-option-type">list</span> / <span class="ansible-option-elements">elements=dictionary</span></p>
-</div></td>
-<td><div class="ansible-option-cell"><p>A list of the filters against which to match.</p>
-<p>For <em>type=byte</em>, valid keys are <em>field_to_match</em>, <em>position</em>, <em>header</em>, <em>transformation</em> and <em>target_string</em>.</p>
-<p>For <em>type=geo</em>, the only valid key is <em>country</em>.</p>
-<p>For <em>type=ip</em>, the only valid key is <em>ip_address</em>.</p>
-<p>For <em>type=regex</em>, valid keys are <em>field_to_match</em>, <em>transformation</em> and <em>regex_pattern</em>.</p>
-<p>For <em>type=size</em>, valid keys are <em>field_to_match</em>, <em>transformation</em>, <em>comparison</em> and <em>size</em>.</p>
-<p>For <em>type=sql</em>, valid keys are <em>field_to_match</em> and <em>transformation</em>.</p>
-<p>For <em>type=xss</em>, valid keys are <em>field_to_match</em> and <em>transformation</em>.</p>
-<p>Required when <em>state=present</em>.</p>
-</div></td>
-</tr>
-<tr class="row-even"><td><div class="ansible-option-indent"></div><div class="ansible-option-cell">
-<div class="ansibleOptionAnchor" id="parameter-filters/comparison"></div><p class="ansible-option-title" id="ansible-collections-community-aws-waf-condition-module-parameter-filters-comparison"><strong>comparison</strong></p>
-<a class="ansibleOptionLink" href="#parameter-filters/comparison" title="Permalink to this option"></a><p class="ansible-option-type-line"><span class="ansible-option-type">string</span></p>
-</div></td>
-<td><div class="ansible-option-indent-desc"></div><div class="ansible-option-cell"><p>What type of comparison to perform.</p>
-<p>Only valid key when <em>type=size</em>.</p>
-<p class="ansible-option-line"><strong class="ansible-option-choices">Choices:</strong></p>
-<ul class="simple">
-<li><p><code class="ansible-option-choices-entry docutils literal notranslate"><span class="pre">&quot;EQ&quot;</span></code></p></li>
-<li><p><code class="ansible-option-choices-entry docutils literal notranslate"><span class="pre">&quot;NE&quot;</span></code></p></li>
-<li><p><code class="ansible-option-choices-entry docutils literal notranslate"><span class="pre">&quot;LE&quot;</span></code></p></li>
-<li><p><code class="ansible-option-choices-entry docutils literal notranslate"><span class="pre">&quot;LT&quot;</span></code></p></li>
-<li><p><code class="ansible-option-choices-entry docutils literal notranslate"><span class="pre">&quot;GE&quot;</span></code></p></li>
-<li><p><code class="ansible-option-choices-entry docutils literal notranslate"><span class="pre">&quot;GT&quot;</span></code></p></li>
-</ul>
-</div></td>
-</tr>
-<tr class="row-odd"><td><div class="ansible-option-indent"></div><div class="ansible-option-cell">
-<div class="ansibleOptionAnchor" id="parameter-filters/country"></div><p class="ansible-option-title" id="ansible-collections-community-aws-waf-condition-module-parameter-filters-country"><strong>country</strong></p>
-<a class="ansibleOptionLink" href="#parameter-filters/country" title="Permalink to this option"></a><p class="ansible-option-type-line"><span class="ansible-option-type">string</span></p>
-</div></td>
-<td><div class="ansible-option-indent-desc"></div><div class="ansible-option-cell"><p>Value of geo constraint (typically a two letter country code).</p>
-<p>The only valid key when <em>type=geo</em>.</p>
-</div></td>
-</tr>
-<tr class="row-even"><td><div class="ansible-option-indent"></div><div class="ansible-option-cell">
-<div class="ansibleOptionAnchor" id="parameter-filters/field_to_match"></div><p class="ansible-option-title" id="ansible-collections-community-aws-waf-condition-module-parameter-filters-field-to-match"><strong>field_to_match</strong></p>
-<a class="ansibleOptionLink" href="#parameter-filters/field_to_match" title="Permalink to this option"></a><p class="ansible-option-type-line"><span class="ansible-option-type">string</span></p>
-</div></td>
-<td><div class="ansible-option-indent-desc"></div><div class="ansible-option-cell"><p>The field upon which to perform the match.</p>
-<p>Valid when <em>type=byte</em>, <em>type=regex</em>, <em>type=sql</em> or <em>type=xss</em>.</p>
-<p class="ansible-option-line"><strong class="ansible-option-choices">Choices:</strong></p>
-<ul class="simple">
-<li><p><code class="ansible-option-choices-entry docutils literal notranslate"><span class="pre">&quot;uri&quot;</span></code></p></li>
-<li><p><code class="ansible-option-choices-entry docutils literal notranslate"><span class="pre">&quot;query_string&quot;</span></code></p></li>
-<li><p><code class="ansible-option-choices-entry docutils literal notranslate"><span class="pre">&quot;header&quot;</span></code></p></li>
-<li><p><code class="ansible-option-choices-entry docutils literal notranslate"><span class="pre">&quot;method&quot;</span></code></p></li>
-<li><p><code class="ansible-option-choices-entry docutils literal notranslate"><span class="pre">&quot;body&quot;</span></code></p></li>
-</ul>
-</div></td>
-</tr>
-<tr class="row-odd"><td><div class="ansible-option-indent"></div><div class="ansible-option-cell">
-<div class="ansibleOptionAnchor" id="parameter-filters/header"></div><p class="ansible-option-title" id="ansible-collections-community-aws-waf-condition-module-parameter-filters-header"><strong>header</strong></p>
-<a class="ansibleOptionLink" href="#parameter-filters/header" title="Permalink to this option"></a><p class="ansible-option-type-line"><span class="ansible-option-type">string</span></p>
-</div></td>
-<td><div class="ansible-option-indent-desc"></div><div class="ansible-option-cell"><p>Which specific header should be matched.</p>
-<p>Required when <em>field_to_match=header</em>.</p>
-<p>Valid when <em>type=byte</em>.</p>
-</div></td>
-</tr>
-<tr class="row-even"><td><div class="ansible-option-indent"></div><div class="ansible-option-cell">
-<div class="ansibleOptionAnchor" id="parameter-filters/ip_address"></div><p class="ansible-option-title" id="ansible-collections-community-aws-waf-condition-module-parameter-filters-ip-address"><strong>ip_address</strong></p>
-<a class="ansibleOptionLink" href="#parameter-filters/ip_address" title="Permalink to this option"></a><p class="ansible-option-type-line"><span class="ansible-option-type">string</span></p>
-</div></td>
-<td><div class="ansible-option-indent-desc"></div><div class="ansible-option-cell"><p>An IP Address or CIDR to match.</p>
-<p>The only valid key when <em>type=ip</em>.</p>
-</div></td>
-</tr>
-<tr class="row-odd"><td><div class="ansible-option-indent"></div><div class="ansible-option-cell">
-<div class="ansibleOptionAnchor" id="parameter-filters/position"></div><p class="ansible-option-title" id="ansible-collections-community-aws-waf-condition-module-parameter-filters-position"><strong>position</strong></p>
-<a class="ansibleOptionLink" href="#parameter-filters/position" title="Permalink to this option"></a><p class="ansible-option-type-line"><span class="ansible-option-type">string</span></p>
-</div></td>
-<td><div class="ansible-option-indent-desc"></div><div class="ansible-option-cell"><p>Where in the field the match needs to occur.</p>
-<p>Only valid when <em>type=byte</em>.</p>
-<p class="ansible-option-line"><strong class="ansible-option-choices">Choices:</strong></p>
-<ul class="simple">
-<li><p><code class="ansible-option-choices-entry docutils literal notranslate"><span class="pre">&quot;exactly&quot;</span></code></p></li>
-<li><p><code class="ansible-option-choices-entry docutils literal notranslate"><span class="pre">&quot;starts_with&quot;</span></code></p></li>
-<li><p><code class="ansible-option-choices-entry docutils literal notranslate"><span class="pre">&quot;ends_with&quot;</span></code></p></li>
-<li><p><code class="ansible-option-choices-entry docutils literal notranslate"><span class="pre">&quot;contains&quot;</span></code></p></li>
-<li><p><code class="ansible-option-choices-entry docutils literal notranslate"><span class="pre">&quot;contains_word&quot;</span></code></p></li>
-</ul>
-</div></td>
-</tr>
-<tr class="row-even"><td><div class="ansible-option-indent"></div><div class="ansible-option-cell">
-<div class="ansibleOptionAnchor" id="parameter-filters/regex_pattern"></div><p class="ansible-option-title" id="ansible-collections-community-aws-waf-condition-module-parameter-filters-regex-pattern"><strong>regex_pattern</strong></p>
-<a class="ansibleOptionLink" href="#parameter-filters/regex_pattern" title="Permalink to this option"></a><p class="ansible-option-type-line"><span class="ansible-option-type">dictionary</span></p>
-</div></td>
-<td><div class="ansible-option-indent-desc"></div><div class="ansible-option-cell"><p>A dict describing the regular expressions used to perform the match.</p>
-<p>Only valid when <em>type=regex</em>.</p>
-</div></td>
-</tr>
-<tr class="row-odd"><td><div class="ansible-option-indent"></div><div class="ansible-option-indent"></div><div class="ansible-option-cell">
-<div class="ansibleOptionAnchor" id="parameter-filters/regex_pattern/name"></div><p class="ansible-option-title" id="ansible-collections-community-aws-waf-condition-module-parameter-filters-regex-pattern-name"><strong>name</strong></p>
-<a class="ansibleOptionLink" href="#parameter-filters/regex_pattern/name" title="Permalink to this option"></a><p class="ansible-option-type-line"><span class="ansible-option-type">string</span></p>
-</div></td>
-<td><div class="ansible-option-indent-desc"></div><div class="ansible-option-indent-desc"></div><div class="ansible-option-cell"><p>A name to describe the set of patterns.</p>
-</div></td>
-</tr>
-<tr class="row-even"><td><div class="ansible-option-indent"></div><div class="ansible-option-indent"></div><div class="ansible-option-cell">
-<div class="ansibleOptionAnchor" id="parameter-filters/regex_pattern/regex_strings"></div><p class="ansible-option-title" id="ansible-collections-community-aws-waf-condition-module-parameter-filters-regex-pattern-regex-strings"><strong>regex_strings</strong></p>
-<a class="ansibleOptionLink" href="#parameter-filters/regex_pattern/regex_strings" title="Permalink to this option"></a><p class="ansible-option-type-line"><span class="ansible-option-type">list</span> / <span class="ansible-option-elements">elements=string</span></p>
-</div></td>
-<td><div class="ansible-option-indent-desc"></div><div class="ansible-option-indent-desc"></div><div class="ansible-option-cell"><p>A list of regular expressions to match.</p>
-</div></td>
-</tr>
-<tr class="row-odd"><td><div class="ansible-option-indent"></div><div c

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR enhances the ecs_service Ansible module to support AWS ECS Service Connect and adds an optional wait behavior for state=present, alongside introducing a reusable recursive “dict subset” comparison helper used to keep Service Connect idempotency tolerant of AWS-populated defaults.

Changes:

  • Added service_connect_configuration support to ecs_service (create/update + idempotency comparison).
  • Extended wait to support state=present via the services_stable waiter.
  • Introduced is_dict_subset() in plugins/module_utils/dict.py with comprehensive unit tests and new Service Connect integration tests/teardown.

Reviewed changes

Copilot reviewed 7 out of 8 changed files in this pull request and generated 2 comments.

Show a summary per file
File Description
plugins/modules/ecs_service.py Adds Service Connect parameter handling, idempotency comparison, keyword-arg calls, and present-state waiter.
plugins/module_utils/dict.py New recursive subset comparator used for Service Connect idempotency tolerance.
tests/unit/plugins/module_utils/test_dict.py Unit tests covering subset behavior, nested structures, lists, and Service Connect-like payloads.
tests/unit/plugins/module_utils/__init__.py Ensures unit test package discovery for module_utils tests.
tests/integration/targets/ecs_cluster/tasks/main.yml Wires in the new Service Connect integration test task file.
tests/integration/targets/ecs_cluster/tasks/25_ecs_service_connect.yml New integration coverage for Service Connect create/idempotency/update/disable/delete.
tests/integration/targets/ecs_cluster/tasks/99_terminate_everything.yml Adds teardown for Service Connect service, task definition, and Cloud Map namespace.
tests/integration/targets/ecs_cluster/defaults/main.yml Adds Service Connect-specific defaults (namespace + task container port mapping).
Comments suppressed due to low confidence (1)

plugins/modules/ecs_service.py:1263

  • The failure message in the update_service exception path says "Couldn't create service" even though this branch is performing an update. Please change the message to indicate update failure to avoid confusing users during troubleshooting.
                    except (botocore.exceptions.BotoCoreError, botocore.exceptions.ClientError) as e:
                        module.fail_json_aws(e, msg="Couldn't create service")


💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread plugins/modules/ecs_service.py
@softwarefactory-project-zuul

Copy link
Copy Markdown
Contributor

Build failed.
https://ansible.softwarefactory-project.io/zuul/buildset/cefc7e2705304a9ab570c7c38f53a7ad

✔️ ansible-galaxy-importer SUCCESS in 3m 24s (non-voting)
✔️ build-ansible-collection SUCCESS in 11m 06s
✔️ ansible-test-splitter SUCCESS in 4m 26s
integration-community.aws-1 FAILURE in 26m 32s
Skipped 21 jobs

Treat missing serviceConnectConfiguration in AWS response as
{enabled: false} so that disabling Service Connect converges
idempotently. Add when guard to teardown task definition cleanup
to prevent template errors if setup failed earlier.
@softwarefactory-project-zuul

Copy link
Copy Markdown
Contributor

Build failed.
https://ansible.softwarefactory-project.io/zuul/buildset/67f989079d2b44028b4b56e05e49fb83

✔️ ansible-galaxy-importer SUCCESS in 5m 17s (non-voting)
✔️ build-ansible-collection SUCCESS in 11m 37s
✔️ ansible-test-splitter SUCCESS in 4m 36s
integration-community.aws-1 FAILURE in 26m 41s
Skipped 21 jobs

@softwarefactory-project-zuul

Copy link
Copy Markdown
Contributor

Build failed.
https://ansible.softwarefactory-project.io/zuul/buildset/52aadb2825d3452d887f9a7d5b5e1523

✔️ ansible-galaxy-importer SUCCESS in 5m 45s (non-voting)
✔️ build-ansible-collection SUCCESS in 11m 57s
✔️ ansible-test-splitter SUCCESS in 4m 41s
integration-community.aws-1 FAILURE in 25m 46s
Skipped 21 jobs

@jonpspri

jonpspri commented Feb 8, 2026

Copy link
Copy Markdown
Contributor Author

Need some maintainer assistance with this error:

"An error occurred (AccessDeniedException) when calling the CreateHttpNamespace operation: User: arn:aws:sts::966509639900:assumed-role/ansible-core-ci-test-prod/prod=remote=svc=zuul is not authorized to perform: servicediscovery:CreateHttpNamespace on resource: arn:aws:servicediscovery:us-east-1:966509639900:*/* because no identity-based policy allows the servicediscovery:CreateHttpNamespace action"

Looks like the IAM ID that ZUUL runs under needs additional permission.

@jonpspri

jonpspri commented Feb 8, 2026

Copy link
Copy Markdown
Contributor Author

Also note -- the change to semantics of wait: true for status: present could be considered a breaking change and need some advance notice. (The behavior is currently undefined.). Please let me know if we need to go through a process or want to take a different approach to this function.

Comment thread plugins/modules/ecs_service.py
Comment thread plugins/modules/ecs_service.py Outdated
Comment thread plugins/modules/ecs_service.py Outdated
Comment thread plugins/modules/ecs_service.py Outdated
jonpspri and others added 3 commits February 12, 2026 13:46
Cleaning up integration tests.

Co-authored-by: Alina Buzachis <abuzachis@redhat.com>
Guard the until expression against empty stdout, which occurs when
the get-operation CLI call fails on a retry attempt.
The ecs_service_info retry loop that polled for
rolloutState == 'COMPLETED' was effectively dead code:

- ecs_service now has a real services_stable waiter (wait: true)
  that covers both create and update paths, addressing concern (a).
- Concern (b) remains: EC2 instances never register with the cluster
  due to missing VPC route table entries, so the deployment never
  completes and the loop always failed under ignore_errors.
- All subsequent constraint/strategy update tasks already use
  force_new_deployment: true to bypass incomplete deployments.

Removing the block saves ~50s of test runtime (10 retries x 5s delay)
with no change in behavior.
@softwarefactory-project-zuul

Copy link
Copy Markdown
Contributor

Build failed.
https://ansible.softwarefactory-project.io/zuul/buildset/0c62cad24ac24b008a147503f6d2b3f5

✔️ ansible-galaxy-importer SUCCESS in 5m 08s (non-voting)
✔️ build-ansible-collection SUCCESS in 11m 07s
✔️ ansible-test-splitter SUCCESS in 4m 19s
integration-community.aws-1 FAILURE in 24m 12s
Skipped 21 jobs

Comment thread plugins/module_utils/dict.py Outdated
Comment thread plugins/module_utils/dict.py
…dict_subset

- Add type hints (Union[dict, list[dict]]) and return type to is_dict_subset
- Raise ValueError when top-level arguments are not dict or list
- Extract recursive logic into private _is_subset helper to preserve
  scalar leaf comparison during recursion
- Update unit tests to expect ValueError for scalar top-level calls
@softwarefactory-project-zuul

Copy link
Copy Markdown
Contributor

Build failed.
https://ansible.softwarefactory-project.io/zuul/buildset/92b7d967da9a4f2181892a0436982594

ansible-galaxy-importer RETRY_LIMIT Host unreachable in 7m 07s (non-voting)
✔️ build-ansible-collection SUCCESS in 10m 57s
✔️ ansible-test-splitter SUCCESS in 4m 41s
integration-community.aws-1 FAILURE in 22m 52s
Skipped 21 jobs

…nt runs

Select the PRIMARY deployment explicitly when comparing Service Connect
configuration, since ECS can return multiple deployments during rollouts
and the first element is not guaranteed to be the primary one.

Move the services_stable waiter outside the change-detection branch so
wait=true is honored even when the service configuration already matches,
allowing callers to block until a prior deployment finishes converging.
@softwarefactory-project-zuul

Copy link
Copy Markdown
Contributor

Build failed.
https://ansible.softwarefactory-project.io/zuul/buildset/154cca16c63f435f93b5f10ea57d1001

✔️ ansible-galaxy-importer SUCCESS in 3m 32s (non-voting)
✔️ build-ansible-collection SUCCESS in 11m 21s
✔️ ansible-test-splitter SUCCESS in 4m 32s
integration-community.aws-1 FAILURE in 22m 44s
Skipped 21 jobs

@jonpspri

Copy link
Copy Markdown
Contributor Author

Now waiting on security updates in mattclay/aws-terminator#330 .

@softwarefactory-project-zuul

Copy link
Copy Markdown
Contributor

Build failed.
https://ansible.softwarefactory-project.io/zuul/buildset/5dd5309d9b5b44b0a9c17516bf3bab1a

✔️ ansible-galaxy-importer SUCCESS in 3m 44s (non-voting)
✔️ build-ansible-collection SUCCESS in 11m 26s
✔️ ansible-test-splitter SUCCESS in 4m 28s
integration-community.aws-1 FAILURE in 22m 52s
Skipped 21 jobs

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Add Service Connect support to ecs_service module

5 participants