:py:mod:`airflow.providers.amazon.aws.secrets.systems_manager`
==============================================================

.. py:module:: airflow.providers.amazon.aws.secrets.systems_manager

.. autoapi-nested-parse::

   Objects relating to sourcing connections from AWS SSM Parameter Store



Module Contents
---------------

Classes
~~~~~~~

.. autoapisummary::

   airflow.providers.amazon.aws.secrets.systems_manager.SystemsManagerParameterStoreBackend




.. py:class:: SystemsManagerParameterStoreBackend(connections_prefix = '/airflow/connections', variables_prefix = '/airflow/variables', config_prefix = '/airflow/config', profile_name = None, **kwargs)

   Bases: :py:obj:`airflow.secrets.BaseSecretsBackend`, :py:obj:`airflow.utils.log.logging_mixin.LoggingMixin`

   Retrieves Connection or Variables from AWS SSM Parameter Store

   Configurable via ``airflow.cfg`` like so:

   .. code-block:: ini

       [secrets]
       backend = airflow.providers.amazon.aws.secrets.systems_manager.SystemsManagerParameterStoreBackend
       backend_kwargs = {"connections_prefix": "/airflow/connections", "profile_name": null}

   For example, if ssm path is ``/airflow/connections/smtp_default``, this would be accessible
   if you provide ``{"connections_prefix": "/airflow/connections"}`` and request conn_id ``smtp_default``.
   And if ssm path is ``/airflow/variables/hello``, this would be accessible
   if you provide ``{"variables_prefix": "/airflow/variables"}`` and request conn_id ``hello``.

   :param connections_prefix: Specifies the prefix of the secret to read to get Connections.
       If set to None (null), requests for connections will not be sent to AWS SSM Parameter Store.
   :param variables_prefix: Specifies the prefix of the secret to read to get Variables.
       If set to None (null), requests for variables will not be sent to AWS SSM Parameter Store.
   :param config_prefix: Specifies the prefix of the secret to read to get Variables.
       If set to None (null), requests for configurations will not be sent to AWS SSM Parameter Store.
   :param profile_name: The name of a profile to use. If not given, then the default profile is used.

   .. py:method:: client(self)

      Create a SSM client


   .. py:method:: get_conn_value(self, conn_id)

      Get param value

      :param conn_id: connection id


   .. py:method:: get_conn_uri(self, conn_id)

      Return URI representation of Connection conn_id.

      As of Airflow version 2.3.0 this method is deprecated.

      :param conn_id: the connection id
      :return: deserialized Connection


   .. py:method:: get_variable(self, key)

      Get Airflow Variable from Environment Variable

      :param key: Variable Key
      :return: Variable Value


   .. py:method:: get_config(self, key)

      Get Airflow Configuration

      :param key: Configuration Option Key
      :return: Configuration Option Value



