You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Elixir中调用AWS EventBridge PutEvents接口报错求助

问题原因

你遇到的错误有两个核心问题:

  1. Poison.encode/1返回值处理错误:Poison.encode(event)返回的是{:ok, json_string}元组,而ExAws.EventBridge.put_events/1不接受这种元组类型,它尝试将元组当作可枚举对象处理,导致抛出Enumerable协议未实现的错误。
  2. put_events参数格式不符合要求:ExAws的EventBridge put_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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 10:37:14