lib/secrets_manager_provider.ex

defmodule SecretsManagerProvider do
  @moduledoc """
  AWS Secrets Manager ConfigProvider for Elixir Releases.
  """

  @behaviour Config.Provider

  import SecretsManagerProvider.Utils, only: [to_keyword: 1]
  alias SecretsManagerProvider.Configuration

  @impl true
  def init(args), do: args

  @impl true
  def load(config, args) do
    {:ok, _deps} = Application.ensure_all_started(:hackney)
    {:ok, _deps} = Application.ensure_all_started(:ex_aws)
    configuration = Configuration.new(args)

    configuration
    |> Map.get(:name)
    |> configuration.client.get_secrets()
    |> configuration.parser.decode!()
    |> to_keyword()
    |> merge_configs(config)
  end

  defp merge_configs(secrets, config) do
    Config.Reader.merge(config, secrets)
  end
end