在 cloudFormation 模板中引用 Secrets Manager 机密
Referencing Secrets Manager secret in cloudFormation template
我有一段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}}"}
这样的 optput
当我尝试将例如 Name 设置为 {{resolve:secretsmanager:{arn of secret}:SecretString}}
时,一切正常,但使用 Input 时它不起作用。我做错了什么吗?或者也许还有其他方法可以将秘密值传递给 cloudWatch 事件主体?提前致谢!
您可以直接在您尝试调用的 lambda 函数中直接调用 GetSecretValue,而不是将密码作为输入传递。如果您需要根据每个事件规则区分秘密,请将秘密名称传递给目标输入并完全跳过解析语法。
将秘密传递到 CW 事件中可能不是一个好主意。即使此方法有效(我尝试时它无效),您也可以在 CW Events 控制台中以纯文本形式看到秘密,这可能是您不希望看到的。
编辑:
Secrets Manager 提供了关于 lambda 函数最佳实践的 helpful guide。理想情况下,lambda 将 运行 缓存客户端,而不是每次调用时都调用 GetSecretValue。
@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 事件中调用它
我有一段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 事件主体?提前致谢!
您可以直接在您尝试调用的 lambda 函数中直接调用 GetSecretValue,而不是将密码作为输入传递。如果您需要根据每个事件规则区分秘密,请将秘密名称传递给目标输入并完全跳过解析语法。
将秘密传递到 CW 事件中可能不是一个好主意。即使此方法有效(我尝试时它无效),您也可以在 CW Events 控制台中以纯文本形式看到秘密,这可能是您不希望看到的。
编辑: Secrets Manager 提供了关于 lambda 函数最佳实践的 helpful guide。理想情况下,lambda 将 运行 缓存客户端,而不是每次调用时都调用 GetSecretValue。
@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 事件中调用它