AWS EventBridge PutEvent 详细信息格式错误

AWS EventBridge PutEvent Detail Malformed

我已经尝试了两个 AWS Go SDK 的两个版本,每次我都收到一条错误消息,指出 Details 字段格式错误。详细信息字段接受 JSON 字符串。

在 SDK V2 中,您基本上有一个事件结构

type Event struct {
Details []struct {
    Key   string `json:"Key"`
    Value string `json:"Value"`
} `json:"Details"`
DetailType string `json:"DetailType"`
Source     string `json:"Source"`

}

示例然后使用此代码构建 JSON 字符串

myDetails := "{ "
for _, d := range event.Details {
    myDetails = myDetails + "\"" + d.Key + "\": \"" + d.Value + "\","
}

myDetails = myDetails + " }"

然后进行 api 调用

input := &cloudwatchevents.PutEventsInput{
    Entries: []types.PutEventsRequestEntry{
        {
            Detail:     &myDetails,
            DetailType: &event.DetailType,
            Resources: []string{
                *lambdaARN,
            },
            Source: &event.Source,
        },
    },
}

基本上我收到一条错误消息,指出分配给“详细信息”字段的字符串格式不正确。我相信这是因为示例代码生成了一个尾随无效的字符串。但是,当您省略 时,您会得到一个 nil 内存引用。

AWS SDK Example

SDK 版本 1 的示例也会生成错误。
任何帮助都会很棒

您 link 编辑的页面上的代码并非 100% 正确。他们实际上 link 页面底部的“完整示例”,代码略有不同:

https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/gov2/cloudwatch/PutEvent/PutEventv2.go#L108-L117

myDetails := "{ "
for i, d := range event.Details {
    if i == (len(event.Details) - 1) {
        myDetails = myDetails + "\"" + d.Key + "\": \"" + d.Value + "\""    
    } else {
        myDetails = myDetails + "\"" + d.Key + "\": \"" + d.Value + "\","
    }
}

myDetails = myDetails + " }"

但是像这样构建 JSON 并不理想 error-prone,正如您已经发现的那样。

我建议如下:

details := make(map[string]string, len(event.Details))
for _, d := range event.Details {
    details[d.Key] = d.Value
}

b, err := json.Marshal(details)
if err != nil {
    return
}

fmt.Println(string(b))

查看 playground 以查看它的运行情况:

https://play.golang.com/p/E4ueZLGIKp4