workflow.yaml 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. apiVersion: v1
  2. kind: ServiceAccount
  3. metadata:
  4. name: my-store
  5. ---
  6. apiVersion: rbac.authorization.k8s.io/v1
  7. kind: Role
  8. metadata:
  9. namespace: default
  10. name: eso-store-role
  11. rules:
  12. - apiGroups: [""]
  13. resources:
  14. - secrets
  15. verbs:
  16. - get
  17. - list
  18. - watch
  19. - create
  20. - update
  21. - delete
  22. - apiGroups:
  23. - authorization.k8s.io
  24. resources:
  25. - selfsubjectrulesreviews
  26. verbs:
  27. - create
  28. ---
  29. apiVersion: rbac.authorization.k8s.io/v1
  30. kind: RoleBinding
  31. metadata:
  32. name: my-store
  33. roleRef:
  34. apiGroup: rbac.authorization.k8s.io
  35. kind: Role
  36. name: eso-store-role
  37. subjects:
  38. - kind: ServiceAccount
  39. name: my-store
  40. namespace: default
  41. ---
  42. apiVersion: external-secrets.io/v1beta1
  43. kind: SecretStore
  44. metadata:
  45. name: kubernetes
  46. spec:
  47. provider:
  48. kubernetes:
  49. remoteNamespace: default
  50. server:
  51. url: https://localhost:44245
  52. caProvider:
  53. type: ConfigMap
  54. name: kube-root-ca.crt
  55. key: ca.crt
  56. auth:
  57. serviceAccount:
  58. name: "my-store"
  59. ---
  60. apiVersion: external-secrets.io/v1beta1
  61. kind: SecretStore
  62. metadata:
  63. name: aws-parameterstore
  64. spec:
  65. provider:
  66. aws:
  67. service: ParameterStore
  68. region: eu-central-1
  69. ---
  70. apiVersion: external-secrets.io/v1beta1
  71. kind: SecretStore
  72. metadata:
  73. name: aws-secrets-manager
  74. spec:
  75. provider:
  76. aws:
  77. region: eu-central-1
  78. service: SecretsManager
  79. ---
  80. apiVersion: external-secrets.io/v1alpha1
  81. kind: Workflow
  82. metadata:
  83. name: "backend-secrets-with-config"
  84. spec:
  85. workflows:
  86. # 1: fetch the database credentials from AWS Secrets Manager
  87. - name: "db_credentials"
  88. # steps are executed in order
  89. steps:
  90. - name: "fetch-mysql-credentials"
  91. pull:
  92. source:
  93. storeRef:
  94. name: "aws-secrets-manager"
  95. dataFrom:
  96. - extract:
  97. key: "app-creds"
  98. data:
  99. - secretKey: "color"
  100. remoteRef:
  101. metadataPolicy: Fetch
  102. key: "app-creds"
  103. property: "color"
  104. - name: "encode_db_credentials"
  105. template:
  106. data:
  107. color: "{{ .workflow.data.color }}"
  108. encodedAppCreds: mysql://{{ .workflow.data.foo }}:{{ .workflow.data.baz }}@db.mycorp:3306/{{ .workflow.data.color }}
  109. # 2. fetch the configuration from SSM
  110. - name: "ami_config"
  111. steps:
  112. - name: "fetch-config"
  113. pull:
  114. source:
  115. storeRef:
  116. name: "aws-parameterstore"
  117. data:
  118. - secretKey: "ami"
  119. remoteRef:
  120. key: "/aws/service/eks/optimized-ami/1.29/amazon-linux-2/recommended/image_id"
  121. # 3. aggregate the secrets
  122. - name: "aggregate"
  123. steps:
  124. - name: "aggregate-secrets"
  125. # takes inputs from previous workflows
  126. # inputs
  127. template:
  128. metadata:
  129. labels:
  130. color: "{{ .workflows.db_credentials.data.color }}"
  131. data:
  132. credentials: "{{ .workflows.db_credentials.data.encodedAppCreds }}"
  133. ami: "{{ .workflows.ami_config.data.ami }}"
  134. # Note: A workflow always starts a new output map which aggregates values over the steps in a workflow.
  135. #
  136. # For that reason, the "push" step needs a preceding step to have a value for the secret
  137. # which is about to be pushed.
  138. - name: "push-secrets"
  139. push:
  140. destination:
  141. storeRef:
  142. name: "kubernetes"
  143. # TODO: support pushing to multiple stores with matchLabels
  144. # TODO: allow Kubernetes provider (CSS) to push to multiple namespaces
  145. data:
  146. - match:
  147. # TODO: support accessing previous workflow outputs
  148. secretKey: "credentials"
  149. remoteRef:
  150. remoteKey: "app-credentials"
  151. property: "credentials"
  152. - match:
  153. secretKey: "ami"
  154. remoteRef:
  155. remoteKey: "app-credentials"
  156. property: "ami"