如何从 SecretStringTemplate 中的文件递归传递用户名作为参数(旋转秘密 cloudformation 模板代码)?

How to pass username as parameter recursively from a file in SecretStringTemplate (rotation secret cloudformation template code)?

我正在编写一个 cloudformation 模板,以使用 AWS 部署的 lambda 函数在设定的时间段后轮换 Aurora RDS 的秘密凭证。

但我需要通过下面的模板递归传递 3 次以创建 3 个不同的用户机密。为此,我使用了计数和 Pylate 宏。

代码如下:-

AWSTemplateFormatVersion: '2010-09-09'
Description: |
  Aurora DB users rotation mecahnism via autocreated rotation lambda.

Transform: 
  - AWS::SecretsManager-2020-07-23
  - Count
  - PyPlate

Parameters:
  pEnv:
    Type: String
  pResAurSg:
    Type: String
  pDbUserNameCount:
    Type: Number
  pDbUserName:
    Type: String


Conditions:
  cDbUserNameCheck:
    Count: !Ref pDbUserNameCount
    Fn::Not:
      - Fn::Equals:
          - |
            #!PyPlate
            import ast
            output = ast.literal_eval(params['pDbUserName'])[%d-1]['pName']
          - ignore

Resources:

  rRDSInstanceRotationSecret:
    Count: !Ref pDbUserNameCount
    Condition: cDbUserNameCheck%d
    Type: AWS::SecretsManager::Secret
    Properties:
      Name: |
          #!PyPlate
          import ast
          output = {}
          output['Fn::Sub'] = f"{ast.literal_eval(params['pDbUserName'])[%d-1]['pName']}"
      KmsKeyId: "alias/SecretsManager_KMSKey"
      GenerateSecretString:
        SecretStringTemplate: '{"username": "rs_ro1", "masterarn": "<arn"}'
        GenerateStringKey: "password"
        PasswordLength: 16
        ExcludeCharacters: "\"@/\"
      Tags: <tags>
...

下面是参数文件:-

  "aur_dbuser_params": {
    "Dbusername": [
      {
        "pName": "user1",
        "pusername": "rs_su"
      },
      {
        "pName": "user2",
        "pusername": "rs_ro1"
      },
      {
        "pName": "user3",
        "pusername": "rs_ro2"
      }
    ]
  }
}

无法使用计数宏将参数文件中的这些用户名递归传递给模板中的“SecretStringTemplate”,因为它不接受 JSON。所以也尝试了 JSON.stringify,但没有用。

我如何将用户名传递给“SecretStringTemplate”,就像我在属性中使用 Pylate 传递“Name”参数以进行递归调用一样?

所以我找到了解决方法,特别是使用 python 字典:-

      GenerateSecretString:
        SecretStringTemplate: |
          #!PyPlate
          import ast,json
          creds_dict = {}
          creds_dict["username"] = ast.literal_eval(params['pDbUserName'])[%d-1]['pUsername']
          creds_dict["masterarn"] = '<arn>'
          output = json.dumps(creds_dict)
        GenerateStringKey: "password"