Я пытаюсь добиться следующего:
- Лямбда запускается тревогой Cloudwatch
- Лямбда просматривает данные, полученные Cloudwatch, и принимает решение о том, что делать на основена
NewStateValue
- При необходимости, лямбда запустит другой SNS, который отправит все данные Cloudwatch в OpsGenie
Я застреваю на третьем шаге.Я могу передать некоторые данные, указав их вручную, однако есть ли функция, которая будет просто передавать весь JSON, полученный Lambda, на следующий SNS?
Я получил JSON для SNS, CloudWatch Alarms и раздел Message of CloudWatch Alarm.
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.Subject)
var event CloudWatchAlarmMessage
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.Sns.Message.NewStateValue == "ALARM") {
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: aws.String(event.OldStateValue),
Subject: aws.String(event.NewStateValue),
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)
}
Я попытался использовать MessageStructure: aws.String("json"),
, но, похоже, это просто cannot use snsRecord (type events.SNSEntity) as type *string in field value
.
с моим текущим наборомДо этого он успешно отправляет NewStateValue
и OldStateValue
.
Структуры JSON, к которым у меня есть доступ:
package main
type SNS struct {
Type string `json:"Type"`
MessageID string `json:"MessageId"`
TopicArn string `json:"TopicArn"`
Subject string `json:"Subject"`
Message string `json:"Message"`
Timestamp string `json:"Timestamp"`
SignatureVersion string `json:"SignatureVersion"`
Signature string `json:"Signature"`
SigningCertURL string `json:"SigningCertURL"`
UnsubscribeURL string `json:"UnsubscribeURL"`
MessageAttributes struct {
Alias struct {
Type string `json:"Type"`
Value string `json:"Value"`
} `json:"alias"`
Entity struct {
Type string `json:"Type"`
Value string `json:"Value"`
} `json:"entity"`
Tags struct {
Type string `json:"Type"`
Value string `json:"Value"`
} `json:"tags"`
EventType struct {
Type string `json:"Type"`
Value string `json:"Value"`
} `json:"eventType"`
Recipients struct {
Type string `json:"Type"`
Value string `json:"Value"`
} `json:"recipients"`
Teams struct {
Type string `json:"Type"`
Value string `json:"Value"`
} `json:"teams"`
Actions struct {
Type string `json:"Type"`
Value string `json:"Value"`
} `json:"actions"`
} `json:"MessageAttributes"`
}
package main
type CloudWatchAlarms struct {
Records []struct {
EventVersion string `json:"EventVersion"`
EventSubscriptionArn string `json:"EventSubscriptionArn"`
EventSource string `json:"EventSource"`
Sns struct {
Signature string `json:"Signature"`
MessageID string `json:"MessageId"`
Type string `json:"Type"`
TopicArn string `json:"TopicArn"`
MessageAttributes struct {
} `json:"MessageAttributes"`
SignatureVersion string `json:"SignatureVersion"`
Timestamp string `json:"Timestamp"`
SigningCertURL string `json:"SigningCertUrl"`
Message string `json:"Message"`
UnsubscribeURL string `json:"UnsubscribeUrl"`
Subject string `json:"Subject"`
} `json:"Sns"`
} `json:"Records"`
}
package main
type CloudWatchAlarmMessage struct {
AlarmName string `json:"AlarmName"`
AlarmDescription string `json:"AlarmDescription"`
AWSAccountID string `json:"AWSAccountId"`
NewStateValue string `json:"NewStateValue"`
NewStateReason string `json:"NewStateReason"`
StateChangeTime string `json:"StateChangeTime"`
Region string `json:"Region"`
OldStateValue string `json:"OldStateValue"`
Trigger struct {
MetricName string `json:"MetricName"`
Namespace string `json:"Namespace"`
StatisticType string `json:"StatisticType"`
Statistic string `json:"Statistic"`
Unit interface{} `json:"Unit"`
Dimensions []struct {
Name string `json:"name"`
Value string `json:"value"`
} `json:"Dimensions"`
Period int `json:"Period"`
EvaluationPeriods int `json:"EvaluationPeriods"`
ComparisonOperator string `json:"ComparisonOperator"`
Threshold float64 `json:"Threshold"`
TreatMissingData string `json:"TreatMissingData"`
EvaluateLowSampleCountPercentile string `json:"EvaluateLowSampleCountPercentile"`
} `json:"Trigger"`
}
Если у кого-либо есть понимание, это будет очень признательно.
Спасибо.