Форвард на JSON, полученный от SNS в Lambda - GoLang - PullRequest
0 голосов
/ 19 сентября 2018

Я пытаюсь добиться следующего: Детали тревоги Cloudwatch поступают в виде JSON на лямбду. Лямбда смотрит на JSON, чтобы определить, есть ли «NewStateValue» == «ALARM», если это происходит == «ALARM», переслать всюJSON получен от SNS через другой SNS.

Я почти достиг этой цели, и у меня есть следующий код:

package main

import (
    "context"
    "fmt"
    "encoding/json"

    "github.com/aws/aws-lambda-go/events"
    "github.com/aws/aws-lambda-go/lambda"
    "github.com/aws/aws-sdk-go/aws"
    "github.com/aws/aws-sdk-go/aws/session"
    "github.com/aws/aws-sdk-go/service/sns"
)

func handler(ctx context.Context, snsEvent events.SNSEvent) {
    for _, record := range snsEvent.Records {
        snsRecord := record.SNS

//To add in additional fields to publish to the logs add "snsRecord.'fieldname'"
        fmt.Printf("Message = %s \n", snsRecord.Message) 
        var event CloudWatchAlarm
        err := json.Unmarshal([]byte(snsRecord.Message), &event)
        if err != nil {
            fmt.Println("There is an error: " + err.Error())
        }
        fmt.Printf("Test Message = %s \n", event.NewStateValue)
        if ( event.NewStateValue == "ALARM") {
            svc := sns.New(session.New())
  // params will be sent to the publish call included here is the bare minimum params to send a message.
    params := &sns.PublishInput{
        Message: Message: aws.String("message"), // This is the message itself (can be XML / JSON / Text - anything you want)
        TopicArn: aws.String("my arn"),  //Get this from the Topic in the AWS console.
    }

    resp, err := svc.Publish(params)   //Call to puclish the message

    if err != nil {                    //Check for errors
        // Print the error, cast err to awserr.Error to get the Code and
        // Message from an error.
        fmt.Println(err.Error())
        return
    }

    // Pretty-print the response data.
    fmt.Println(resp)
}
        }
    }


func main() {
    lambda.Start(handler)
}

В настоящее время это отправляет электронное письмо на набор адресовв SNS, связанном с ARN выше.Однако я хотел бы, чтобы в электронное письмо входил полный, идеально отформатированный JSON, полученный первым SNS.У меня есть структура JSON Cloudwatch, определенная в другом файле, она вызывается var event CloudWatchAlarm

Любые указатели были бы великолепны!

Спасибо!

1 Ответ

0 голосов
/ 19 сентября 2018

Из AWS SDK для документов Go:

type PublishInput struct {
// The message you want to send.
//
// If you are publishing to a topic and you want to send the same message to
// all transport protocols, include the text of the message as a String value.
// If you want to send different messages for each transport protocol, set the
// value of the MessageStructure parameter to json and use a JSON object for
// the Message parameter.

Итак, params будет:

params := &sns.PublishInput{
        Message: myjson, // json data you want to send
        TopicArn: aws.String("my arn"),
        MessageStructure: aws.String("json")
    }

ПРЕДУПРЕЖДЕНИЕ

Уведомлениев параграфе справки написано «использовать объект JSON для сообщения параметра», такой объект JSON должен иметь ключи, соответствующие поддерживаемому транспортному протоколу. Это означает, что

{
  'default': json_message,
  'email': json_message
}

Он отправит json_message, используя как по умолчанию, так итранспорт электронной почты.

...