diff --git a/awscmd/secrets.go b/awscmd/secrets.go index d28f086..6e9463f 100644 --- a/awscmd/secrets.go +++ b/awscmd/secrets.go @@ -30,7 +30,7 @@ func SecretsAll(ctx context.Context, input *InputSecretsAll) (*OutputSecretsAll, SecretId: aws.String(input.ID), VersionStage: aws.String("AWSCURRENT"), } - result, err := svc.GetSecretValue(secretsInput) + result, err := svc.GetSecretValueWithContext(ctx, secretsInput) if err != nil { return nil, fmt.Errorf("Failed to get secret value: %w", err) } @@ -47,3 +47,48 @@ func SecretsAll(ctx context.Context, input *InputSecretsAll) (*OutputSecretsAll, return &out, nil } + +type InputSecretsPut struct { + Region string + ID string + NewSecrets map[string]string +} + +type OutputSecretsPut struct{} + +func SecretsPut(ctx context.Context, input *InputSecretsPut) (*OutputSecretsPut, error) { + all, err := SecretsAll(ctx, &InputSecretsAll{ + Region: input.Region, + ID: input.ID, + }) + if err != nil { + return nil, err + } + + for k, v := range input.NewSecrets { + all.Secrets[k] = v + } + + secretBytes, err := json.Marshal(all.Secrets) + if err != nil { + return nil, fmt.Errorf("Failed to marshall secrets to json: %w", err) + } + + sess, err := NewSession(input.Region) + if err != nil { + return nil, err + } + + secretsString := string(secretBytes) + svc := secretsmanager.New(sess, aws.NewConfig().WithRegion(input.Region)) + secretsInput := &secretsmanager.PutSecretValueInput{ + SecretId: aws.String(input.ID), + SecretString: &secretsString, + } + _, err = svc.PutSecretValueWithContext(ctx, secretsInput) + if err != nil { + return nil, fmt.Errorf("Failed to set secrets: %w", err) + } + + return &OutputSecretsPut{}, nil +} diff --git a/main.go b/main.go index 61af0c5..8b87f6d 100644 --- a/main.go +++ b/main.go @@ -50,6 +50,33 @@ func main() { shellcmd.KeyValueToExports(c.App.Writer, out.Secrets) + return nil + }, + }, + { + Name: "set", + Usage: "Sets key value secret", + Flags: []cli.Flag{ + &cli.StringFlag{Name: "region", Usage: "AWS region", Required: true}, + &cli.StringFlag{Name: "id", Usage: "Secrets ID", Required: true}, + }, + ArgsUsage: "KEY VALUE", + Action: func(c *cli.Context) error { + if c.NArg() != 2 { + return fmt.Errorf("Invalid number of arguments. Missing KEY and VALUE.") + } + k, v := c.Args().Get(0), c.Args().Get(1) + + input := &awscmd.InputSecretsPut{ + Region: c.String("region"), + ID: c.String("id"), + NewSecrets: map[string]string{k: v}, + } + _, err := awscmd.SecretsPut(context.TODO(), input) + if err != nil { + return err + } + return nil }, },