【问题标题】:Referencing Secrets Manager secret in cloudFormation template在 cloudFormation 模板中引用 Secrets Manager 密钥
【发布时间】:2019-11-10 19:55:16
【问题描述】:

我有一段 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 事件主体?提前致谢!

【问题讨论】:

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


【解决方案1】:

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

将秘密传递给 CW 事件可能不是一个好主意。即使这行得通(当我尝试它时它不起作用),您也可以在 CW Events 控制台中以纯文本形式看到秘密,这可能是您不想要的。

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

【讨论】:

    【解决方案2】:

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

    -根据固定的 cron 表达式定期调用

    -被自己调用,但在未来的某个时间点

    此密钥只是对最终用户的保护。 当我得到 AWS 的响应时,这可以通过制作子 CloudFormation 堆栈来实现

    父栈sn-p

    "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 "
          }
        }
      }
    

    子栈sn-p

      "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 事件中调用它

    【讨论】:

      猜你喜欢
      • 2020-09-29
      • 2019-02-15
      • 2021-11-29
      • 1970-01-01
      • 2019-06-11
      • 2021-10-29
      • 2021-10-29
      • 2020-08-14
      • 2021-06-25
      相关资源
      最近更新 更多