是否可以在一个CloudFormation SecretsManager秘密中生成两个秘密字符串?

时间:2019-10-17 22:24:39

标签: amazon-web-services amazon-cloudformation aws-secrets-manager

我想创建一个SecretsManager机密,并同时生成两个值。这可能吗,我该怎么办?

例如,如果我希望最终的秘密在JSON中看起来像这样,那么CloudFormation yaml是什么样的?

{
  "password": "<Generated Value>",
  "serviceId": "fd07f2ab-96bd-4c5c-a4a9-9b8c43b666d7",
  "login": "<Different Generated Value>"
}

如果这是CF模板的一部分,该CF模板生成了秘密字符串的密码部分,那么我还将如何生成动态的“登录”字段?

#This is a Secret resource with a randomly generated password in its SecretString JSON.
MySecretA:
  Type: 'AWS::SecretsManager::Secret'
  Properties:
    Name: MySecretForAppA
    Description: "This secret has a dynamically generated secret password and login."
    GenerateSecretString:
      SecretStringTemplate: '{"service-id": "<some guid>"}'
      GenerateStringKey: "password"
      PasswordLength: 30
      ExcludeCharacters: '"@/\'

3 个答案:

答案 0 :(得分:2)

看来AWS::SecretsManager::Secret资源仅生成一个秘密。

我找不到通过!Ref来引用秘密的实际内容的方法,这将允许生成两个秘密,然后将其引用并组合到另一个资源中。唯一可用的!Ref值是机密的ARN。

因此,我看不到在一个资源中创建两个秘密的方法。

答案 1 :(得分:1)

AWS :: SecretsManager :: Secret资源不支持在单个机密中生成多个随机密钥。今天实现此目标的一种方法是利用自定义CloudFormation资源(请参见https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/template-custom-resources.html)。您可以编写一个自定义资源lambda来生成两个随机字符串,并使用新值对机密执行PutSecretValue。

另一个可能的选择是让CloudFormation生成两个秘密(一个用于用户名,一个用于密码)。我不建议您使用这种方法,因为每次需要密钥时,都需要进行两次检索,这会使您的AWS Secrets Manager成本翻倍。

答案 2 :(得分:0)

您可以创建两个秘密,并且只能使用一个。

例如,您可以为密码创建一个:

MySecretPassword:
  Type: 'AWS::SecretsManager::Secret'
  Properties:
    Name: MySecretPasswordForAppA
    Description: "This secret has a dynamically generated secret password."
    GenerateSecretString:
      SecretStringTemplate: '{"serviceId": "<some guid>"}'
      GenerateStringKey: "password"
      PasswordLength: 30
      ExcludeCharacters: '"@/\'

然后另一个创建 login 值,并使用由 MySecretPassword 保护的生成值:

MySecret:
  Type: 'AWS::SecretsManager::Secret'
  Properties:
    Name: MySecretForAppA
    Description: "This secret has a dynamically generated secret password and login."
    GenerateSecretString:
      SecretStringTemplate:
        !Join:
          - ''
          - '{ "password": "'
          - !Join:
            - ':'
            - '{{resolve'
            - 'secretsmanager'
            - !Ref: MySecretPassword
            - 'SecretString'
            - 'password}}'
          - '", "service-id": "'
          - !Join:
            - ':'
            - '{{resolve'
            - 'secretsmanager'
            - !Ref: MySecretPassword
            - 'SecretString'
            - 'serviceId}}'
          - '" }'
      GenerateStringKey: "login"
      PasswordLength: 30
      ExcludeCharacters: '"@/\'