如何从另一个密文构建 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 回答
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
专家
已回答 3 个月前

您未登录。 登录 发布回答。

一个好的回答可以清楚地解答问题和提供建设性反馈,并能促进提问者的职业发展。

回答问题的准则