Skip to content

Commit d1d01a6

Browse files
committed
feat: add support for backup-plan changes
1 parent 2b62288 commit d1d01a6

File tree

4 files changed

+107
-1
lines changed

4 files changed

+107
-1
lines changed

fixtures/samples.json

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -386,5 +386,59 @@
386386
"creationDate": "2020-06-22T18:50:46.407Z",
387387
"state": "CREATED"
388388
}
389+
},
390+
{
391+
"version": "0",
392+
"id": "2895aefb-dd4a-0a23-6071-2652abd92c3f",
393+
"detail-type": "Backup Plan State Change",
394+
"source": "aws.backup",
395+
"account": "1112233445566",
396+
"time": "2020-06-24T23:18:25Z",
397+
"region": "us-west-2",
398+
"resources": [
399+
"arn:aws:backup:us-west-2:1112233445566:backup-plan:83fcb8ee-2d93-42ac-b06f-591563f3f8de"
400+
],
401+
"detail": {
402+
"backupPlanId": "83fcb8ee-2d93-42ac-b06f-591563f3f8de",
403+
"versionId": "NjIwNDFjMDEtNmZlNC00M2JmLTkzZDgtNzNkZjQyNzkxNDk0",
404+
"modifiedAt": "2020-06-24T23:18:19.168Z",
405+
"state": "MODIFIED"
406+
}
407+
},
408+
{
409+
"version": "0",
410+
"id": "33fc5c1d-6db2-b3d9-1e70-1c9a2c23645c",
411+
"detail-type": "Backup Plan State Change",
412+
"source": "aws.backup",
413+
"account": "1112233445566",
414+
"time": "2020-06-24T23:18:25Z",
415+
"region": "us-west-2",
416+
"resources": [
417+
"arn:aws:backup:us-west-2:1112233445566:backup-plan:83fcb8ee-2d93-42ac-b06f-591563f3f8de"
418+
],
419+
"detail": {
420+
"backupPlanId": "83fcb8ee-2d93-42ac-b06f-591563f3f8de",
421+
"versionId": "NjIwNDFjMDEtNmZlNC00M2JmLTkzZDgtNzNkZjQyNzkxNDk0",
422+
"deletionDate": "2020-06-24T23:18:19.411Z",
423+
"state": "DELETED"
424+
}
425+
},
426+
{
427+
"version": "0",
428+
"id": "b64fb2d0-ae16-ff9a-faf6-0bdd0d4bfdef",
429+
"detail-type": "Backup Plan State Change",
430+
"source": "aws.backup",
431+
"account": "1112233445566",
432+
"time": "2020-06-24T23:18:19Z",
433+
"region": "us-west-2",
434+
"resources": [
435+
"arn:aws:backup:us-west-2:1112233445566:backup-plan:2c103c5f-6d6e-4cac-9147-d3afa4c84f59"
436+
],
437+
"detail": {
438+
"backupPlanId": "2c103c5f-6d6e-4cac-9147-d3afa4c84f59",
439+
"versionId": "N2Q4OTczMzEtZmY1My00N2UwLWE3ODUtMjViYWYyOTUzZWY4",
440+
"creationDate": "2020-06-24T23:18:15.318Z",
441+
"state": "CREATED"
442+
}
389443
}
390444
]

internal/app/app.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@ func (a *App) ParseEvent(e awsEvent.CloudWatchEvent) (events.StateChangeEvent, e
2727
switch e.DetailType {
2828
case "Backup Job State Change":
2929
return events.NewBackupJobStateChange(e.Detail)
30+
case "Backup Plan State Change":
31+
return events.NewBackupPlanStateChange(e.Detail)
3032
case "Copy Job State Change":
3133
return events.NewCopyJobStateChange(e.Detail)
3234
case "Restore Job State Change":

internal/events/backup-plan.go

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
package events
2+
3+
import (
4+
"encoding/json"
5+
"fmt"
6+
7+
"github.com/slack-go/slack"
8+
)
9+
10+
type BackupPlanStateChange struct {
11+
StateChangeEvent
12+
BackupPlanId string `json:"backupPlanId"`
13+
VersionId string `json:"versionId"`
14+
State string `json:"state"`
15+
StatusMessage string `json:"statusMessage"`
16+
Raw string `json:"-"`
17+
}
18+
19+
func (sce *BackupPlanStateChange) SlackMessage() (slack.MsgOption, slack.MsgOption) {
20+
var blocks []slack.Block
21+
22+
header := slack.NewHeaderBlock(slack.NewTextBlockObject("plain_text", "Backup Plan Change", false, false))
23+
blocks = append(blocks, header)
24+
25+
var details []*slack.TextBlockObject
26+
details = append(details, slack.NewTextBlockObject("mrkdwn", fmt.Sprintf("*State*\n%s", sce.State), false, false))
27+
blocks = append(blocks, slack.NewSectionBlock(nil, details, nil))
28+
29+
if sce.StatusMessage != "" {
30+
desc := slack.NewSectionBlock(
31+
slack.NewTextBlockObject("mrkdwn", fmt.Sprintf("```\n%s\n```", sce.StatusMessage), false, false),
32+
nil, nil,
33+
)
34+
blocks = append(blocks, desc)
35+
}
36+
return slack.MsgOptionText(sce.StatusMessage, false), slack.MsgOptionBlocks(blocks...)
37+
}
38+
39+
func (sce *BackupPlanStateChange) IsAlertable() bool {
40+
return true
41+
}
42+
43+
func NewBackupPlanStateChange(raw json.RawMessage) (*BackupPlanStateChange, error) {
44+
var sce BackupPlanStateChange
45+
if err := json.Unmarshal(raw, &sce); err != nil {
46+
return &BackupPlanStateChange{}, err
47+
}
48+
sce.StatusMessage = "Backup plan for AWS Backup service was changed. Please confirm it was intended."
49+
return &sce, nil
50+
}

internal/events/copy-job.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import (
1212

1313
type CopyJobStateChange struct {
1414
StateChangeEvent
15-
CopyJobId string `json:"backupJobId"`
15+
CopyJobId string `json:"copyJobId"`
1616
ResourceArn string `json:"resourceArn"`
1717
ResourceType string `json:"resourceType"`
1818
State string `json:"state"`

0 commit comments

Comments
 (0)