DEV Community

Naveen Karasu
Naveen Karasu

Posted on

AWS Secrets Manager: Rotation, IAM Scoping, and Production Gotchas

Day 17: AWS Secrets Manager

Secrets Manager charges $0.40/secret/month but gives you something Parameter Store does not: automatic credential rotation with pre-built Lambda functions for RDS, Redshift, and DocumentDB.

Retrieving Secrets in Go

package main

import (
    "context"
    "encoding/json"
    "fmt"
    "github.com/aws/aws-sdk-go-v2/config"
    "github.com/aws/aws-sdk-go-v2/service/secretsmanager"
)

type DBCreds struct {
    Username string `json:"username"`
    Password string `json:"password"`
    Host     string `json:"host"`
}

func getSecret(ctx context.Context, name string) (*DBCreds, error) {
    cfg, _ := config.LoadDefaultConfig(ctx, config.WithRegion("us-east-1"))
    client := secretsmanager.NewFromConfig(cfg)
    result, err := client.GetSecretValue(ctx, &secretsmanager.GetSecretValueInput{
        SecretId: &name,
    })
    if err != nil {
        return nil, fmt.Errorf("failed to retrieve secret: %w", err)
    }
    var creds DBCreds
    json.Unmarshal([]byte(*result.SecretString), &creds)
    return &creds, nil
}
Enter fullscreen mode Exit fullscreen mode

Key Tips

  • Name secrets as env/app/purpose for clean IAM wildcard scoping
  • Always pin the AWS region -- cross-region secret injection is a real attack
  • Rotation Lambda needs VPC + NAT gateway access to reach RDS
  • Cache secrets in-app (1hr TTL default) to reduce costs
  • Cross-account access needs BOTH a resource policy AND a KMS key grant

Tomorrow: AWS Systems Manager and Parameter Store.

Top comments (0)