使用 dotnet core 从 lambda 访问来自 AWS Secrets 的 Db 连接参数
Access Db connection parameter from AWS Secrets from lambda using dotnet core
我正在尝试使用 API 网关和 lambda 函数开发 AWS 无服务器 API 项目。
我正在使用 AWS 提供的 SAM 模型和 Visual studio 的 AWS 无服务器项目模板,其中也包含 cloudformation 模板。
出于安全原因,我不想在配置文件中存储数据库信息,
我想知道如何在 运行 时间使用 AWS Secrets Manager 在 lambda 函数中获取数据库连接信息。
代码示例会很有帮助,因为我只能找到 python 使用 Boto3 的示例、.net 核心示例或无服务器的解释 API 并且 lmbda 在互联网上可用的不多我猜测。
任何帮助或线索将不胜感激。
谢谢。
[方法一]
您可以在 Cloudformation 中使用 dynamic referencing,如下所示:
- 在 Secret Manager 中创建数据库凭据。
- (可选)在从 Cloudformation 创建数据库时将这些凭据传递给数据库。
- 将这些凭据传递给 Cloudformation 中的 Lambda 函数的 environment variables。
- 在 Lambda 代码中简单读取引用的环境变量:
Console.WriteLine(Environment.GetEnvironmentVariable("DB_USERNAME"));
DB 动态引用示例:
{
"MyRDSInstance": {
"Type": "AWS::RDS::DBInstance",
"Properties": {
"DBName": "MyRDSInstance",
"AllocatedStorage": "20",
"DBInstanceClass": "db.t2.micro",
"Engine": "mysql",
"MasterUsername": "{{resolve:secretsmanager:MyRDSSecret:SecretString:username}}",
"MasterUserPassword": "{{resolve:secretsmanager:MyRDSSecret:SecretString:password}}"
}
}
}
这种方法很简单,但需要在凭据更新时重新部署。
[方法二]
或者,您可以在环境变量中传递 Secret Manager 变量名称,然后使用这些名称检索值。
为 SecretsManager 添加 nuget 包。写入class查询:
public class SecretManager : ISecretManager
{
public string Get(string secretName)
{
var config = new AmazonSecretsManagerConfig {RegionEndpoint = RegionEndpoint.EUWest1};
var client = new AmazonSecretsManagerClient(config);
var request = new GetSecretValueRequest
{
SecretId = secretName
};
GetSecretValueResponse response = null;
try
{
response = Task.Run(async () => await client.GetSecretValueAsync(request)).Result;
}
catch (ResourceNotFoundException)
{
Console.WriteLine("The requested secret " + secretName + " was not found");
}
catch (InvalidRequestException e)
{
Console.WriteLine("The request was invalid due to: " + e.Message);
}
catch (InvalidParameterException e)
{
Console.WriteLine("The request had invalid params: " + e.Message);
}
return response?.SecretString;
}
}
使用class如下:
var secretManager = new SecretManager();
var mongoDb = JsonConvert.DeserializeObject<MongoConnectionString>(secretManager.Get(Environment.GetEnvironmentVariable("SECRET_NAME")));
var database = new MongoClient(mongoDb.ConnectionString);
详情请参考this article
我正在尝试使用 API 网关和 lambda 函数开发 AWS 无服务器 API 项目。 我正在使用 AWS 提供的 SAM 模型和 Visual studio 的 AWS 无服务器项目模板,其中也包含 cloudformation 模板。
出于安全原因,我不想在配置文件中存储数据库信息, 我想知道如何在 运行 时间使用 AWS Secrets Manager 在 lambda 函数中获取数据库连接信息。
代码示例会很有帮助,因为我只能找到 python 使用 Boto3 的示例、.net 核心示例或无服务器的解释 API 并且 lmbda 在互联网上可用的不多我猜测。 任何帮助或线索将不胜感激。
谢谢。
[方法一]
您可以在 Cloudformation 中使用 dynamic referencing,如下所示:
- 在 Secret Manager 中创建数据库凭据。
- (可选)在从 Cloudformation 创建数据库时将这些凭据传递给数据库。
- 将这些凭据传递给 Cloudformation 中的 Lambda 函数的 environment variables。
- 在 Lambda 代码中简单读取引用的环境变量:
Console.WriteLine(Environment.GetEnvironmentVariable("DB_USERNAME"));
DB 动态引用示例:
{
"MyRDSInstance": {
"Type": "AWS::RDS::DBInstance",
"Properties": {
"DBName": "MyRDSInstance",
"AllocatedStorage": "20",
"DBInstanceClass": "db.t2.micro",
"Engine": "mysql",
"MasterUsername": "{{resolve:secretsmanager:MyRDSSecret:SecretString:username}}",
"MasterUserPassword": "{{resolve:secretsmanager:MyRDSSecret:SecretString:password}}"
}
}
}
这种方法很简单,但需要在凭据更新时重新部署。
[方法二]
或者,您可以在环境变量中传递 Secret Manager 变量名称,然后使用这些名称检索值。
为 SecretsManager 添加 nuget 包。写入class查询:
public class SecretManager : ISecretManager
{
public string Get(string secretName)
{
var config = new AmazonSecretsManagerConfig {RegionEndpoint = RegionEndpoint.EUWest1};
var client = new AmazonSecretsManagerClient(config);
var request = new GetSecretValueRequest
{
SecretId = secretName
};
GetSecretValueResponse response = null;
try
{
response = Task.Run(async () => await client.GetSecretValueAsync(request)).Result;
}
catch (ResourceNotFoundException)
{
Console.WriteLine("The requested secret " + secretName + " was not found");
}
catch (InvalidRequestException e)
{
Console.WriteLine("The request was invalid due to: " + e.Message);
}
catch (InvalidParameterException e)
{
Console.WriteLine("The request had invalid params: " + e.Message);
}
return response?.SecretString;
}
}
使用class如下:
var secretManager = new SecretManager();
var mongoDb = JsonConvert.DeserializeObject<MongoConnectionString>(secretManager.Get(Environment.GetEnvironmentVariable("SECRET_NAME")));
var database = new MongoClient(mongoDb.ConnectionString);
详情请参考this article