如何从另一个密文构建 CloudFormation 密文?

0

【以下的问题经过翻译处理】 我用自己的一个镜像部署到 ECS,它需要一个名为 DATABASE_URL 的环境变量,其中包含用户名和密码作为 url 的用户信息部分(例如 postgres://myusername:mypassword@mydb.foo.us-east-1 .rds.amazonaws.com:5432/mydbname)。我无法更改镜像。

用法DatabaseInstance.Builder.credentials(fromGeneratedSecret("myusername")),我通过 CDK 在 Secrets Manager 创建了一个 secret,其中包含所有这些信息,但不是单个值:

{
  "username":"myusername",
  "password":"mypassword",
  "engine":"postgres",
  "host":"mydb.foo.us-east-1.rds.amazonaws.com",
  "port":5432,
  "dbInstanceIdentifier":"live-myproduct-db"
}

我需要以某种方式合成那个 “DATABASE_URL” 环境变量。

我不认为我可以在 ECS 任务定义中做到这一点 - 据我所知,secret 只能引用 secret 中的单个密钥。

我想我可以使用 cloud formation 中的引用向现有 secret 添加一个额外的 url 密钥 - 但我不知道怎么做。比如:

secret.newBuilder()
  .addTemplatedKey(
    "url",
    "postgres://#{username}:#{password}@#{host}:#{port}/#{db}"
  )
  .build()

除了我刚刚编造的...

或者,我可以使用 CDK 在 Secrets Manager 或 Systems Manager 中生成新的 secret ——但我还是想将其指定为模板,这样真正的 secret 值就不会在 CloudFormation 模板中被指定。

有什么想法吗?我希望我只是错过了一些使用 API 来构建复合 secrets 的方法......

1 Antwort
0

【以下的回答经过翻译处理】 随着 主要 附带条件,正如@JohnPreston 指出的那样,它不会获取对原始 secret 值的更改,因此可以从现有 secret 生成新的 secret,如下所示:

DatabaseInstance dbInstance = makeDbInstance();
ISecret dbCredentials = dbInstance.getSecret();
Secret.Builder.create(stack, "name")
  .secretName("db-url")
  .secretStringValue(
    SecretValue.unsafePlainText(
      "{\"url\": \"postgres://" + dbCredentials.secretValueFromJson("username") + ":" + dbCredentials.secretValueFromJson("password") + "@" + dbCredentials.secretValueFromJson("host") + ":" + dbCredentials.secretValueFromJson("port") + "/mydbname\"}"
    )
  )
  .build();

这似乎是安全的 - 生成的 CloudFormation yaml 是这样的:

  dburl5B3B78EC:
    Type: AWS::SecretsManager::Secret
    Properties:
      Name: db-url
      SecretString:
        Fn::Join:
          - ""
          - - |-
              {
                "url": "postgres://{{resolve:secretsmanager:
            - Ref: dbSecretAttachmentCCB3B2FC
            - ":SecretString:username::}}:{{resolve:secretsmanager:"
            - Ref: dbSecretAttachmentCCB3B2FC
            - ":SecretString:password::}}@{{resolve:secretsmanager:"
            - Ref: dbSecretAttachmentCCB3B2FC
            - ":SecretString:host::}}:{{resolve:secretsmanager:"
            - Ref: dbSecretAttachmentCCB3B2FC
            - |-
              :SecretString:port::}}/mydbname"
              }

所以那里没有暴露的 secret,他们似乎在新的 secret 中正确地解决了。

profile picture
EXPERTE
beantwortet vor 5 Monaten

Du bist nicht angemeldet. Anmelden um eine Antwort zu veröffentlichen.

Eine gute Antwort beantwortet die Frage klar, gibt konstruktives Feedback und fördert die berufliche Weiterentwicklung des Fragenstellers.

Richtlinien für die Beantwortung von Fragen