I need help sending a put event on AWS Eventbridge

I’m fighting with this code

  @moduledoc false
  require Logger

  def send_event_to_eventbridge() do
    event = %{
      entries: [
        %{
          source: "car-event",
          detailType: "car-created",
          detail: (%{
            brand: "Renault",
            name: "A4",
            country: "US"
          }),
          eventBusName: "my-event-bus"
        }
      ]
    }

    event_json = Poison.encode(event)

    Logger.info("Sending: #{inspect(event_json)}")
    
    case ExAws.EventBridge.put_events(event_json) |> ExAws.request() do
      {:ok, response} ->
        Logger.info("Successfully: #{inspect(response)}")
      {:error, error} ->
        Logger.error("Error: #{inspect(error)}")
    end
  end
end

and I don’t know how to fix this error

(Protocol.UndefinedError) protocol Enumerable not implemented for {:ok, “{"entries":[{"eventBusName":"my-event-bus","detail":{"country":"US","brand":"Renault","name":"A4"},"detailType":"car-created","source":"car-event"}]}”} of type Tuple. This protocol is implemented for the following type(s): DBConnection.PrepareStream, DBConnection.Stream, Date.Range, Ecto.Adapters.SQL.Stream, File.Stream, Function, GenEvent.Stream, HashDict, HashSet, IO.Stream, Jason.OrderedObject, List, Map, MapSet, Phoenix.LiveView.LiveStream, Postgrex.Stream, Range, Stream
(elixir 1.14.0) lib/enum.ex:1: Enumerable.impl_for!/1
(elixir 1.14.0) lib/enum.ex:166: Enumerable.reduce/3
(elixir 1.14.0) lib/enum.ex:4307: Enum.map/2
(ex_aws_eventbridge 0.1.1) lib/ex_aws/event_bridge.ex:88: ExAws.EventBridge.put_events/2
(my_app 0.1.0) lib/my_app/eventbridge.ex:27: MyApp.Eventbridge.send_event_to_eventbridge/0

This error message:

(Protocol.UndefinedError) protocol Enumerable not implemented for {:ok, “{"entries":[{"eventBusName":"my-event-bus","detail":{"country":"US","brand":"Renault","name":"A4"},"detailType":"car-created","source":"car-event"}]}”} of type Tuple. 

is telling you “I’m calling an Enumerable function on something, but it doesn’t support it because it is a tuple”

Where is the tuple coming from? Here:

  event_json = Poison.encode(event)`

Poison.encode returns a tuple. If you just want the encoded JSON, you can call Poison.encode!

iex> Poison.encode([1, 2, 3])
{:ok, "[1,2,3]"}

iex> Poison.encode!([1, 2, 3])
"[1,2,3]"
2 Likes

I was able to get it now, I’ll leave it here for other users.

defmodule MyApp.EventBridge do
  @moduledoc false
  require Logger
  alias ExAws.EventBridge

  def send_event_to_eventbridge(source, detail_type, detail, event_bus_name) do
    event = %{
      "Source": source,
      "DetailType": detail_type,
      "Detail":  Poison.encode!(detail),
      "EventBusName": event_bus_name
    }

    Logger.info("Sending: #{inspect(event)}" )

    case EventBridge.put_events([event]) |> ExAws.request() do
      {:ok, response} ->
        Logger.info("Event ID: #{inspect(response)}")

      {:error, error} ->
        Logger.error("Error #{inspect(error)}")
    end
  end
end

I insert the data through the console

MyApp.EventBridge.send_event_to_eventbridge(
   "car-event",
   "car-created",
   %{brand: "Renault", name: "A4", country: "US"},
   "my-event-bus"
  )

[info] Sending: %{Source: "car-event", DetailType: "car-created", Detail: "{\"country\":\"US\",\"brand\":\"Renault\",\"name\":\"A4\"}", EventBusName: "my-event-bus"}

[info] Event ID: %{"Entries" => [%{"EventId" => "e4accabf-b89d-0dd2-0fff-92e6de215a95"}], "FailedEntryCount" => 0}

1 Like