Skip to content

Commit 625eb1c

Browse files
authored
add: create kms-key (#204)
1 parent b01e5d1 commit 625eb1c

File tree

10 files changed

+160
-28
lines changed

10 files changed

+160
-28
lines changed

cmd/create/create.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import (
1010
"github.com/awslabs/eksdemo/pkg/resource/dns_record"
1111
"github.com/awslabs/eksdemo/pkg/resource/ec2/instance"
1212
"github.com/awslabs/eksdemo/pkg/resource/fargate_profile"
13+
kmskey "github.com/awslabs/eksdemo/pkg/resource/kms/key"
1314
"github.com/awslabs/eksdemo/pkg/resource/log_group"
1415
"github.com/awslabs/eksdemo/pkg/resource/nodegroup"
1516
"github.com/awslabs/eksdemo/pkg/resource/organization"
@@ -44,6 +45,7 @@ func NewCreateCmd() *cobra.Command {
4445
cmd.AddCommand(dns_record.NewResource().NewCreateCmd())
4546
cmd.AddCommand(fargate_profile.NewResource().NewCreateCmd())
4647
cmd.AddCommand(instance.NewResource().NewCreateCmd())
48+
cmd.AddCommand(kmskey.NewResource().NewCreateCmd())
4749
cmd.AddCommand(NewKyvernoCmd())
4850
cmd.AddCommand(NewCreateAliasCmds(kyvernoPolicies, "kyverno-")...)
4951
cmd.AddCommand(log_group.NewResource().NewCreateCmd())

cmd/get/get.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ import (
2828
"github.com/awslabs/eksdemo/pkg/resource/iam_policy"
2929
"github.com/awslabs/eksdemo/pkg/resource/iam_role"
3030
"github.com/awslabs/eksdemo/pkg/resource/internet_gateway"
31-
"github.com/awslabs/eksdemo/pkg/resource/kms_key"
31+
kmskey "github.com/awslabs/eksdemo/pkg/resource/kms/key"
3232
"github.com/awslabs/eksdemo/pkg/resource/listener"
3333
"github.com/awslabs/eksdemo/pkg/resource/listener_rule"
3434
"github.com/awslabs/eksdemo/pkg/resource/load_balancer"
@@ -100,7 +100,7 @@ func NewGetCmd() *cobra.Command {
100100
cmd.AddCommand(iam_policy.NewResource().NewGetCmd())
101101
cmd.AddCommand(iam_role.NewResource().NewGetCmd())
102102
cmd.AddCommand(internet_gateway.NewResource().NewGetCmd())
103-
cmd.AddCommand(kms_key.NewResource().NewGetCmd())
103+
cmd.AddCommand(kmskey.NewResource().NewGetCmd())
104104
cmd.AddCommand(listener.NewResource().NewGetCmd())
105105
cmd.AddCommand(listener_rule.NewResource().NewGetCmd())
106106
cmd.AddCommand(load_balancer.NewResource().NewGetCmd())

pkg/aws/kms.go

Lines changed: 33 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,39 @@ func NewKMSClient() *KMSClient {
1616
return &KMSClient{kms.NewFromConfig(GetConfig())}
1717
}
1818

19+
func (c *KMSClient) CreateAlias(aliasName, keyID string) error {
20+
_, err := c.Client.CreateAlias(context.Background(), &kms.CreateAliasInput{
21+
AliasName: aws.String(aliasName),
22+
TargetKeyId: aws.String(keyID),
23+
})
24+
25+
return err
26+
}
27+
28+
func (c *KMSClient) CreateKey() (*types.KeyMetadata, error) {
29+
result, err := c.Client.CreateKey(context.Background(), &kms.CreateKeyInput{
30+
KeySpec: types.KeySpecSymmetricDefault,
31+
})
32+
33+
if err != nil {
34+
return nil, err
35+
}
36+
37+
return result.KeyMetadata, nil
38+
}
39+
40+
func (c *KMSClient) DescribeKey(keyID string) (*types.KeyMetadata, error) {
41+
result, err := c.Client.DescribeKey(context.Background(), &kms.DescribeKeyInput{
42+
KeyId: aws.String(keyID),
43+
})
44+
45+
if err != nil {
46+
return nil, err
47+
}
48+
49+
return result.KeyMetadata, nil
50+
}
51+
1952
func (c *KMSClient) ListAliases() ([]types.AliasListEntry, error) {
2053
keys := []types.AliasListEntry{}
2154
pageNum := 0
@@ -51,15 +84,3 @@ func (c *KMSClient) ListKeys() ([]types.KeyListEntry, error) {
5184

5285
return keys, nil
5386
}
54-
55-
func (c *KMSClient) DescribeKey(keyId string) (*types.KeyMetadata, error) {
56-
result, err := c.Client.DescribeKey(context.Background(), &kms.DescribeKeyInput{
57-
KeyId: aws.String(keyId),
58-
})
59-
60-
if err != nil {
61-
return nil, err
62-
}
63-
64-
return result.KeyMetadata, nil
65-
}

pkg/resource/amp_workspace/manager.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ func (m *Manager) Create(options resource.Options) error {
4949
if err != nil {
5050
return err
5151
}
52-
fmt.Printf("done\nCreated AMP Workspace Id: %s\n", *result.WorkspaceId)
52+
fmt.Printf("done\nCreated AMP Workspace Id: %s\n", awssdk.ToString(result.WorkspaceId))
5353

5454
return nil
5555
}

pkg/resource/error.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package resource
22

33
import "fmt"
44

5+
// TODO: phase this out. Doesn't work with errors.As
56
type NotFoundError string
67

78
func (e NotFoundError) Error() string {
@@ -25,3 +26,14 @@ type NotFoundByNameError struct {
2526
func (e *NotFoundByNameError) Error() string {
2627
return fmt.Sprintf("%s with name %q not found", e.Type, e.Name)
2728
}
29+
30+
// TODO: This error could potentially replace NotFoundByIDError and NotFoundByNameError
31+
type NotFoundByError struct {
32+
Type string
33+
Name string
34+
Value string
35+
}
36+
37+
func (e *NotFoundByError) Error() string {
38+
return fmt.Sprintf("%s with %s %q not found", e.Type, e.Name, e.Value)
39+
}
Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
1-
package kms_key
1+
package key
22

33
import (
44
"fmt"
55
"os"
6+
"sort"
67

78
awssdk "github.com/aws/aws-sdk-go-v2/aws"
89
"github.com/aws/aws-sdk-go-v2/service/kms/types"
@@ -31,7 +32,7 @@ func (g *Getter) Init() {
3132
}
3233

3334
func (g *Getter) Get(alias string, output printer.Output, options resource.Options) error {
34-
kmsOptions, ok := options.(*KmsKeyOptions)
35+
kmsOptions, ok := options.(*Options)
3536
if !ok {
3637
return fmt.Errorf("internal error, unable to cast options to KmsKeyOptions")
3738
}
@@ -85,6 +86,11 @@ func (g *Getter) GetAllKeys() ([]*KMSKey, error) {
8586
keys = append(keys, key)
8687
}
8788

89+
// Show recently created Keys at the end of the list
90+
sort.Slice(keys, func(i, j int) bool {
91+
return keys[i].Key.CreationDate.Before(awssdk.ToTime(keys[j].Key.CreationDate))
92+
})
93+
8894
return keys, nil
8995
}
9096

@@ -109,7 +115,7 @@ func (g *Getter) GetByAlias(aliasName string) (*KMSKey, error) {
109115
return &KMSKey{filterAliasesByKeyId(aliases, keyId), key}, nil
110116
}
111117

112-
return nil, resource.NotFoundError(fmt.Sprintf("kms-key alias %q not found", aliasName))
118+
return nil, &resource.NotFoundByError{Type: "kms-key", Name: "alias", Value: aliasName}
113119
}
114120

115121
func filterAliasesByKeyId(aliases []types.AliasListEntry, id string) []types.AliasListEntry {
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,28 @@
1-
package kms_key
1+
package key
22

33
import (
44
"github.com/awslabs/eksdemo/pkg/cmd"
55
"github.com/awslabs/eksdemo/pkg/resource"
66
)
77

88
func NewResource() *resource.Resource {
9-
res := &resource.Resource{
9+
options, getFlags := newOptions()
10+
11+
return &resource.Resource{
1012
Command: cmd.Command{
1113
Name: "kms-key",
1214
Description: "KMS Key",
1315
Aliases: []string{"kms-keys", "kmskeys", "kmskey", "kms"},
1416
Args: []string{"ALIAS"},
17+
CreateArgs: []string{"ALIAS"},
1518
},
1619

20+
GetFlags: getFlags,
21+
1722
Getter: &Getter{},
18-
}
1923

20-
res.Options, res.GetFlags = newOptions()
24+
Manager: &Manager{},
2125

22-
return res
26+
Options: options,
27+
}
2328
}

pkg/resource/kms/key/manager.go

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
package key
2+
3+
import (
4+
"errors"
5+
"fmt"
6+
7+
awssdk "github.com/aws/aws-sdk-go-v2/aws"
8+
"github.com/awslabs/eksdemo/pkg/aws"
9+
"github.com/awslabs/eksdemo/pkg/resource"
10+
"github.com/spf13/cobra"
11+
)
12+
13+
type Manager struct {
14+
DryRun bool
15+
kmsClient *aws.KMSClient
16+
kmsGetter *Getter
17+
}
18+
19+
func (m *Manager) Init() {
20+
if m.kmsClient == nil {
21+
m.kmsClient = aws.NewKMSClient()
22+
}
23+
m.kmsGetter = NewGetter(m.kmsClient)
24+
}
25+
26+
func (m *Manager) Create(options resource.Options) error {
27+
alias := options.Common().Name
28+
29+
_, err := m.kmsGetter.GetByAlias(alias)
30+
31+
// Return if the KMS alias already exists
32+
if err == nil {
33+
fmt.Printf("KMS Key with alias %q already exists\n", alias)
34+
return nil
35+
}
36+
37+
// Return the error if it's anything other than resource not found
38+
var notFoundErr *resource.NotFoundByError
39+
if !errors.As(err, &notFoundErr) {
40+
return err
41+
}
42+
43+
fullAliasName := fmt.Sprintf("alias/%s", alias)
44+
45+
if m.DryRun {
46+
return m.dryRun(fullAliasName)
47+
}
48+
49+
fmt.Printf("Creating KMS Key with Alias %q...", alias)
50+
51+
keyMeta, err := m.kmsClient.CreateKey()
52+
if err != nil {
53+
return err
54+
}
55+
56+
keyID := awssdk.ToString(keyMeta.KeyId)
57+
58+
err = m.kmsClient.CreateAlias(fullAliasName, keyID)
59+
if err != nil {
60+
return fmt.Errorf("failed to create alias for key %q: %w", keyID, err)
61+
}
62+
fmt.Printf("done\nCreated KMS Key Id: %s\n", keyID)
63+
64+
return nil
65+
}
66+
67+
func (m *Manager) Delete(_ resource.Options) error {
68+
return fmt.Errorf("feature not supported")
69+
}
70+
71+
func (m *Manager) SetDryRun() {
72+
m.DryRun = true
73+
}
74+
75+
func (m *Manager) Update(_ resource.Options, _ *cobra.Command) error {
76+
return fmt.Errorf("feature not supported")
77+
}
78+
79+
func (m *Manager) dryRun(aliasName string) error {
80+
fmt.Printf("\nKMS Key Manager Dry Run:\n")
81+
fmt.Printf("KMS API Call %q with no request parameters\n", "CreateKey")
82+
fmt.Printf("KMS API Call %q with parameters:\n", "CreateAlias")
83+
fmt.Printf("\tAliasName: %q\n", aliasName)
84+
fmt.Printf("\tTargetKeyId: <Key Id returned from CreateKey call>\n")
85+
return nil
86+
}
Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,16 @@
1-
package kms_key
1+
package key
22

33
import (
44
"github.com/awslabs/eksdemo/pkg/cmd"
55
"github.com/awslabs/eksdemo/pkg/resource"
66
)
77

8-
type KmsKeyOptions struct {
8+
type Options struct {
99
resource.CommonOptions
1010
}
1111

12-
func newOptions() (options *KmsKeyOptions, getFlags cmd.Flags) {
13-
options = &KmsKeyOptions{
12+
func newOptions() (options *Options, getFlags cmd.Flags) {
13+
options = &Options{
1414
CommonOptions: resource.CommonOptions{
1515
ClusterFlagDisabled: true,
1616
},
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package kms_key
1+
package key
22

33
import (
44
"fmt"

0 commit comments

Comments
 (0)