Как импортировать секреты EKS из AWS Secrets Manager, используя aws -cdk? - PullRequest
1 голос
/ 11 апреля 2020

У меня есть:

  • EKS, развернутый с помощью сценария aws -cdk, с включенным kubectl, и приложений, развернутых с помощью eks.Cluster.addResource()
  • AWS Secrets Manager с набором секретов, которые я хочу быть доступными для приложения EKS

Я пытался развернуть Secret следующим образом:

  import * as sm from "@aws-cdk/aws-secretsmanager";

  getSecret(secretKey: string): string {
    let secretTokens = sm.Secret.fromSecretArn(scope, "ImportedSecrets", awsSecretStorageArn);
    return secretTokens.secretValueFromJson(secretKey).toString();
  }

  createKubernetesImagePullSecrets(k8s: eks.Cluster): void {
    let eksSecretStorageName = this.env.awsResourcesConfig.k8sImagePullSecretStorageName;
    k8s.addResource(eksSecretStorageName, {
      apiVersion: "v1",
      kind: "Secret",
      metadata: {
        name: eksSecretStorageName,
      },
      data: {
        ".dockerconfigjson": this.getSecret('hub-secret'),
      },
      type: "kubernetes.io/dockerconfigjson",
    });
  }

Я получаю сообщение об ошибке от CloudFormation:

Секрет в версии "v1" не может быть обработан как Секрет: v1.Secret.ObjectMeta: v1.ObjectMeta.TypeMeta: Kind: Данные: декодировать base64: недопустимые данные base64 на входном байте 0

Это происходит из-за того, что секретный токен не раскрывается, и значение поля ".dockerconfig json" в этом случае выглядит как ${Token[TOKEN.417]}

Есть ли способ развернуть секретный ресурс EKS и развернуть правильные секретные токены при развертывании?

1 Ответ

0 голосов
/ 12 апреля 2020

Я создал временный обходной путь для этого, загрузив текстовую версию секретов с aws-cli. Не безопасный способ, но работает. Не используйте это, если у вас есть более безопасное решение.

import { execSync } from "child_process";

  extractSecretValues(awsSecretStorageArn: string) : Map<string, string> {
    let map = new Map<string, string>();
    let secretsContent = execSync(`aws secretsmanager get-secret-value --secret-id ${awsSecretStorageArn}`).toString();
    let secrets = JSON.parse(secretsContent);
    if (!secrets)
      throw new Error(`Secret values could not be extracted from ${awsSecretStorageArn}`);
    if (secrets.SecretString) {
      let secretValuesObj = JSON.parse(secrets.SecretString);
      for (let [secretKey, secretValue] of Object.entries<string>(secretValuesObj)) {
        map.set(secretKey, secretValue);
      }
    }
    return map;
  }

  let secretValueMap = extractSecretValues();

  createKubernetesImagePullSecrets(k8s: eks.Cluster): void {
    let eksSecretStorageName = this.env.awsResourcesConfig.k8sImagePullSecretStorageName;
    k8s.addResource(eksSecretStorageName, {
      apiVersion: "v1",
      kind: "Secret",
      metadata: {
        name: eksSecretStorageName,
      },
      data: {
        ".dockerconfigjson": secretValueMap.get('hub-secret'),
      },
      type: "kubernetes.io/dockerconfigjson",
    });
  }
...