Skip to content

Commit 4f81c4e

Browse files
committed
Add tags to images and snapshots so we can find them later
1 parent a50e15a commit 4f81c4e

File tree

4 files changed

+110
-4
lines changed

4 files changed

+110
-4
lines changed

Diff for: cloudformation/iam.yaml

+2
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,8 @@ Resources:
3535
- "ec2:DescribeVolumes"
3636
- "ec2:CreateImage"
3737
- "ec2:CreateSnapshot"
38+
- "ec2:DescribeTags"
39+
- "ec2:CreateTags"
3840
Resource: "*"
3941
- PolicyName: lambda-delete-ebs-backup-policy
4042
PolicyDocument:

Diff for: cmd/lambda-ebs-backup/main.go

+5-2
Original file line numberDiff line numberDiff line change
@@ -30,15 +30,18 @@ func HandleRequest(ctx context.Context) error {
3030
return err
3131
}
3232

33-
err = backupManager.Search()
34-
if err != nil {
33+
if err = backupManager.Search(); err != nil {
3534
return err
3635
}
3736

3837
if err = backupManager.Backup(); err != nil {
3938
return err
4039
}
4140

41+
if err = backupManager.Cleanup(); err != nil {
42+
return err
43+
}
44+
4245
return nil
4346
}
4447

Diff for: pkg/backup/manager.go

+91-2
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ type ManagerOpts struct {
2121
ImageTagKey string
2222
ImageTagValue string
2323
ImageNameTag string
24+
ManagedTagKey string
25+
ManagedTagValue string
2426
RebootOnImageTag string
2527

2628
DefaultImageNameTemplate *template.Template
@@ -41,6 +43,8 @@ func NewManagerOptsFromConfig(client *ec2.EC2) (*ManagerOpts, error) {
4143
ImageTagKey: config.ImageTagKey(),
4244
ImageTagValue: config.ImageTagValue(),
4345
ImageNameTag: config.ImageNameTag(),
46+
ManagedTagKey: config.ManagedTagKey(),
47+
ManagedTagValue: config.ManagedTagValue(),
4448
RebootOnImageTag: config.RebootOnImageTag(),
4549
Verbose: true,
4650

@@ -165,12 +169,32 @@ func (m *Manager) backupVolumes() error {
165169
if err != nil {
166170
m.logf("Error creating snapshot for volume '%s'\n", aws.StringValue(v.VolumeId))
167171
errorChan <- err
168-
} else {
169-
m.logf("Created snapshot '%s' for volume '%s'\n",
172+
return
173+
}
174+
175+
m.logf("Created snapshot '%s' for volume '%s'\n",
176+
aws.StringValue(snap.SnapshotId),
177+
aws.StringValue(v.VolumeId),
178+
)
179+
180+
err = m.addManagmentTags(
181+
[]*string{snap.SnapshotId},
182+
map[string]string{
183+
"lambda-ebs-backup/volume-id": aws.StringValue(v.VolumeId),
184+
},
185+
)
186+
187+
if err != nil {
188+
m.logf("Error adding management tag to snapshot '%s'(%s)\n",
170189
aws.StringValue(snap.SnapshotId),
171190
aws.StringValue(v.VolumeId),
172191
)
192+
errorChan <- err
193+
return
173194
}
195+
196+
m.logf("Added management tag for snapshot '%s'\n", aws.StringValue(snap.SnapshotId))
197+
174198
}(volume)
175199
}
176200

@@ -222,6 +246,27 @@ func (m *Manager) backupInstances() error {
222246
aws.StringValue(i.InstanceId),
223247
tags.GetDefault("Name", ""),
224248
)
249+
250+
err = m.addManagmentTags(
251+
[]*string{image.ImageId},
252+
map[string]string{
253+
"lambda-ebs-backup/instance-id": aws.StringValue(i.InstanceId),
254+
},
255+
)
256+
257+
if err != nil {
258+
m.logf("Error adding management tag for image '%s'(%s)\n",
259+
aws.StringValue(image.ImageId),
260+
imageName,
261+
)
262+
errorChan <- err
263+
return
264+
}
265+
266+
m.logf("Added management tag for image '%s'(%s)\n",
267+
aws.StringValue(image.ImageId),
268+
imageName,
269+
)
225270
}(instance)
226271
}
227272

@@ -236,6 +281,50 @@ func (m *Manager) backupInstances() error {
236281
return nil
237282
}
238283

284+
// Cleanup cleans up old volume snapshots and images
285+
func (m *Manager) Cleanup() error {
286+
return m.all(
287+
[]func() error{
288+
m.cleanupSnapshots,
289+
m.cleanupImages,
290+
},
291+
)
292+
}
293+
294+
func (m *Manager) cleanupSnapshots() error {
295+
m.logf("Starting cleanup of old ebs snapshots")
296+
return nil
297+
}
298+
299+
func (m *Manager) cleanupImages() error {
300+
m.logf("Starting cleanup of old AMIs")
301+
return nil
302+
}
303+
304+
func (m *Manager) addManagmentTags(resources []*string, extraTags map[string]string) error {
305+
306+
tags := []*ec2.Tag{
307+
&ec2.Tag{
308+
Key: aws.String(m.ManagerOpts.ManagedTagKey),
309+
Value: aws.String(m.ManagerOpts.ManagedTagValue),
310+
},
311+
}
312+
if extraTags != nil {
313+
for k, v := range extraTags {
314+
tags = append(tags, &ec2.Tag{
315+
Key: aws.String(k),
316+
Value: aws.String(v),
317+
})
318+
}
319+
}
320+
321+
_, err := m.client.CreateTags(&ec2.CreateTagsInput{
322+
Resources: resources,
323+
Tags: tags,
324+
})
325+
return err
326+
}
327+
239328
func (m *Manager) all(funcs []func() error) error {
240329
var wg sync.WaitGroup
241330
errorChan := make(chan error, 1)

Diff for: pkg/config/config.go

+12
Original file line numberDiff line numberDiff line change
@@ -93,3 +93,15 @@ func RebootOnImageTag() string {
9393
func DefaultRebootOnImage() bool {
9494
return envDefaultBool("DEFAULT_REBOOT_ON_IMAGE", true)
9595
}
96+
97+
// ManagedTagKey will get added to all resources created by the backup so we
98+
// can search for them later for things like auditing and cleaning up backups
99+
func ManagedTagKey() string {
100+
return envDefault("MANAGED_TAG_KEY", "lambda-ebs-backup/managed")
101+
}
102+
103+
// ManagedTagValue is the value that corresponds to the ManagedTagKey that gets
104+
// added to all resources created by backup.
105+
func ManagedTagValue() string {
106+
return envDefault("MANAGED_TAG_VALUE", "true")
107+
}

0 commit comments

Comments
 (0)