在cloudFormation模板中引用Secrets Manager机密

时间:2019-06-28 23:15:14

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

我有一段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事件中,我有像{"val1": "val1", "secretVal": "{{resolve:secretsmanager:{arn of secret}:SecretString}}"}这样的光吞并

例如,当我尝试将Name设置为{{resolve:secretsmanager:{arn of secret}:SecretString}}时,一切都会按其应有的方式工作,但是使用Input时,它却无法工作。我做错什么了吗?或者,也许还有其他方法可以将秘密值传递给cloudWatch事件主体?感谢前进!

2 个答案:

答案 0 :(得分:2)

您可以直接在要尝试调用的lambda函数中调用GetSecretValue,而不是传递秘密作为输入。如果需要根据每个事件规则区分秘密,请将秘密名称传递给目标输入,然后完全跳过解析语法。

将机密传递给CW事件可能不是一个好主意。即使此方法有效(当我尝试时也无效),您仍可以在CW Events控制台中以纯文本形式看到秘密,这可能是您不希望的。

编辑: Secrets Manager提供了有关helpful guide的lambda函数最佳实践的信息。理想情况下,lambda会运行一个缓存客户端,而不是每次都调用GetSecretValue。

答案 1 :(得分:0)

@RobS在我的用例中无论如何都行不通。目标是使用于处理用户请求的普通api lambda也可用于:

-根据固定的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,所以我做了另一个lambda函数,该函数对最终用户不可用。只能从cloudWatch事件中调用它