使用 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