Ссылка на секрет менеджера секретов в шаблоне cloudFormation - PullRequest
0 голосов
/ 29 июня 2019

У меня есть фрагмент кода CloudFormation

"dareMeXDevCloudwatchMissingPayoutsJob": {
      "Type": "AWS::Events::Rule",
      "DependsOn": [
        "xxx"
      ],
      "Properties": {
        "Description": "xxxxx)",
        "RoleArn": {
          "Fn::GetAtt": [
            "xxxxx",
            "Arn"
          ]
        },
        "Name": "xxxxx",
        "ScheduleExpression": "cron(0 8 ? * 6 *)",
        "State": "ENABLED",
        "Targets": [
          {
            "Arn": {
              "Fn::GetAtt": [
                "xxxxxxx",
                "Arn"
              ]
            },
            "Id": "xxxx",
            "Input": "{\"val1\":\"val1\",\"secretVal\":\"??????????????????\"}"
          }
        ]
      }
    }

, который я хочу сделать, это передать значение Secrets Manager в переменную secretVal Я попытался сделать это, установив значение secretVal в {{resolve:secretsmanager:{arn of secret}:SecretString}}, нозатем в событии cloudWatch у меня появляется optput вроде {"val1": "val1", "secretVal": "{{resolve:secretsmanager:{arn of secret}:SecretString}}"}

Когда я пытался установить, например, Имя на {{resolve:secretsmanager:{arn of secret}:SecretString}}, тогда все работало как надо, но с вводом это просто не работает.Я делаю что-то не так?Или, может быть, есть какой-то другой способ передачи секретных значений в тело события cloudWatch?Спасибо заранее!

Ответы [ 2 ]

2 голосов
/ 03 июля 2019

Вместо того, чтобы передавать секрет в качестве ввода, вы можете просто вызвать GetSecretValue непосредственно в лямбда-функции, которую вы пытаетесь вызвать. Если вам необходимо дифференцировать секрет для каждого правила события, передайте секретное имя целевому входу и пропустите синтаксис разрешения.

Передача секрета в CW событие, вероятно, не очень хорошая идея. Даже если это сработало (это не сработало, когда я попробовал), вы сможете увидеть секрет в текстовом виде в консоли CW Events, что вам, вероятно, не нужно.

Edit: Secrets Manager предоставил полезное руководство о передовых практиках с лямбда-функциями. В идеале лямбда будет запускать клиент кэширования вместо вызова GetSecretValue каждый раз, когда он вызывается.

0 голосов
/ 04 июля 2019

@ RobS это не сработает в любом случае. цель состояла в том, чтобы сделать нормальный API лямбда для обработки запросов пользователей также доступным для:

- периодически вызываться на основе фиксированного выражения cron

- вызывается сам по себе, но в какой-то момент в будущем

этот ключ был просто защитой от конечных пользователей. когда я получаю ответ от AWS, это возможно, если сделать дочерний стек CloudFormation

Фрагмент родительского стека

"Resources": {

    "MySecretB": {
      "Type": "AWS::SecretsManager::Secret",
      "Properties": {
        "Name": "MySecretForAppA",
        "Description": "This secret has a hardcoded password in SecretString (use GenerateSecretString instead)",
        "SecretString": "{\"username\":\"MasterUsername\",\"password\":\"secret-password\"}"
      }
    },
    "Test": {
      "DependsOn" : "MySecretB",
      "Type": "AWS::CloudFormation::Stack",
      "Properties": {
        "Parameters": {
          "Key": {
            "Fn::Sub": ["${value1}", {
              "value1": "{{resolve:secretsmanager:MySecretForAppA:SecretString:username}}"
            }]
          }

        },
        "TemplateURL" : "https://s3.amazonaws.com/mybucketname/childstack.json "
      }
    }
  }

Фрагмент дочернего стека

  "Parameters": {
        "Key":{
          "Type":"String"
        }
      },
      "Resources": {
        "ScheduledRule": {
            "Type": "AWS::Events::Rule",
            "Properties": {
                "ScheduleExpression": "rate(1 minute)",
                "Description": "ScheduledRule",
                "Targets": [
                    {
                        "Arn": "arn:aws:lambda:us-east-1:380574440275:function:LambdaFunction",
                        "Id": "TargetFunctionV1",
                        "Input": {"Fn::Sub": "{\"Input\": \"${Key}\"}"}
                    }
                ]
            }
        }
    }

Как вы сказали, passing a secret into a CW event is probably not a good idea, поэтому я только что сделал еще одну лямбда-функцию, которая недоступна для конечных пользователей. его можно вызвать только из событий cloudWatch

...