在Elixir中调用AWS EventBridge PutEvents接口报错求助
问题原因
你遇到的错误有两个核心问题:
Poison.encode/1返回值处理错误:Poison.encode(event)返回的是{:ok, json_string}元组,而ExAws.EventBridge.put_events/1不接受这种元组类型,它尝试将元组当作可枚举对象处理,导致抛出Enumerable协议未实现的错误。put_events参数格式不符合要求:ExAws的EventBridgeput_events接口要求传入包含Entries键的结构,每个事件需要放在Entries数组中,而非直接传单个事件对象。此外,你不需要手动序列化JSON,ExAws会自动处理数据的序列化工作。
修复后的代码
defmodule MyApp.Eventbridge do @moduledoc false require Logger def send_event_to_eventbridge() do event = %{ Source: "car-event", DetailType: "car-created", Detail: %{ brand: "Renault", name: "A4", country: "US" }, EventBusName: "my-event-bus" } # 按照ExAws要求构造参数:事件放入Entries数组 put_events_params = %{Entries: [event]} Logger.info("Send event: #{inspect(put_events_params)}") case ExAws.EventBridge.put_events(put_events_params) |> ExAws.request() do {:ok, response} -> Logger.info("Event sent successfully: #{inspect(response)}") {:error, error} -> Logger.error("Failed to send event: #{inspect(error)}") end end end
关键改动说明
- 移除手动JSON编码:删除
Poison.encode(event)的调用,直接使用Elixir映射结构,ExAws会自动将Detail字段序列化为JSON字符串,符合EventBridge的API要求。 - 调整参数结构:将单个事件包装到
Entries数组中,这是put_events接口的必填格式,因为该接口支持批量发送多个事件。 - 简化日志输出:直接打印原始Elixir数据结构,便于调试查看事件内容。
额外注意事项
如果你的项目中使用的是Jason而非Poison作为JSON编码器,确保ExAws的配置中指定了正确的编码器(通常ExAws会自动适配项目中的JSON库)。
内容的提问来源于stack exchange,提问作者backin
相关产品推荐
相关产品推荐

