Skip to main content

External Secrets From Aws Parameter Store

·311 words·2 mins
O11y | Cloud
Author
O11y | Cloud
Site Reliability Engineer
Table of Contents

AWS Parameter Store to Kubernetes Secrets
#

You can use AWS Parameters Store to keep your secrets in the safe Cloud storage. Using ESO - External Secrets Operator, you can pull them from AWS and create local Kubernetes Secrets in your namespace.

Install ESO - External Secrets Operator
#

External Secrets Operator

helm repo add external-secrets https://charts.external-secrets.io

helm install external-secrets \
   external-secrets/external-secrets \
    -n external-secrets \
    --create-namespace \
  # --set installCRDs=false

Create IAM Policy with RO access to the store
#

# Create IAM Policy to enable RO access to Parameter Store
data "aws_iam_policy_document" "ssm_read" {
	statement {
		effect = "Allow"

		actions = [
			"ssm:GetParameter",
			"ssm:GetParameters",
			"ssm:GetParametersByPath"
		]

		resources = ["*"]
	}
}

Create IAM User and attach the policy
#

# Create IAM user 
resource "aws_iam_user" "eso" {
        name = "tf-parameter-store-ro"
}

resource "aws_iam_user_policy" "ssm_read" {
        name = "ssm-read"
        user = aws_iam_user.eso.name
        policy = data.aws_iam_policy_document.ssm_read.json
}

Create AWS Credentials
#

# Create Access Key for the RO user used in external K8s ESO
resource "aws_iam_access_key" "eso" {
        user = aws_iam_user.eso.name
}

# Output AWS Credentials
output "access_key_id" {
        value = aws_iam_access_key.eso.id
}

output "secret_access_key" {
        value = aws_iam_access_key.eso.secret
        sensitive = true
}

Configure ESO
#

Create K8s Secret with AWS credentials
#

kubectl create secret generic aws-eso-ro \
        --from-literal=access-key-id=YOUR_KEY_ID \
        --from-literal=secret-access-key=YOUR_SECRET_KEY

Create Secret Store
#

Connect microk8s to AWS Parameter Store using IAM user with RO only access. Use the CRD defined by ESO:

apiVersion: external-secrets.io/v1
kind: SecretStore
metadata:
  name: aws-ssm
spec:
  provider:
    aws:
      service: ParameterStore
      region: us-east-1
      auth:
        secretRef:
          accessKeyIDSecretRef:
            name: aws-eso-ro
            key: access-key-id
          secretAccessKeySecretRef:
            name: aws-eso-ro
            key: secret-access-key

Create K8s Secret from AWS key/pair
#

Use ESO defined CRD to pull the secret from AWS and create namespace scoped K8s secret:

apiVersion: external-secrets.io/v1
kind: ExternalSecret
metadata:
  name: dev-mongo-pass
spec:
  refreshInterval: 1h0m0s
  secretStoreRef:
    name: aws-ssm
    kind: SecretStore
  target:
    name: dev-mongo-password
    creationPolicy: Owner
  data:
    - secretKey: mongo-password
      remoteRef:
        key: dev-mongo-password