Você pode conectar uma função do Lambda a um banco de dados do Amazon Relational Database Service (Amazon RDS) diretamente e por meio de um Amazon RDS Proxy. As conexões diretas são úteis em cenários simples e os proxies são recomendados para produção. Um proxy de banco de dados gerencia um pool de conexões de banco de dados compartilhadas, o que permite que sua função atinja altos níveis de simultaneidade sem esgotar as conexões de banco de dados.
Recomendamos o uso do Amazon RDS Proxy para funções do Lambda que fazem conexões curtas e frequentes com o banco de dados ou que abrem e fecham um grande número de conexões de banco de dados. Para obter mais informações, consulte Conectar automaticamente uma função do Lambda e uma instância de banco de dados no Guia do desenvolvedor do Amazon Relational Database Service.
dica
Para conectar uma função do Lambda rapidamente a um banco de dados do Amazon RDS, é possível usar o assistente guiado no console. Para abrir o assistente, faça o seguinte:
Abra a página Funções
do console do Lambda. -
Selecione a função à qual você deseja conectar um banco de dados.
-
Na guia Configuração, selecione bancos de dados do RDS.
-
Escolha Conectar ao banco de dados do RDS.
Depois de conectar a função a um banco de dados, você pode criar um proxy escolhendo Adicionar proxy.
Configurar a função para funcionar com recursos do RDS
No console do Lambda, você pode provisionar e configurar instâncias de banco de dados e recursos de proxy do Amazon RDS. Você pode fazer isso navegando até Bancos de dados do RDS na guia Configuração. Como alternativa, você também pode criar e configurar conexões com funções do Lambda no console do Amazon RDS. Ao configurar uma instância de banco de dados do RDS para usar com o Lambda, observe os seguintes critérios:
-
Para se conectar a um banco de dados, a função deve estar na mesma Amazon VPC em que o banco de dados é executado.
-
Você pode usar bancos de dados do Amazon RDS com mecanismos MySQL, MariaDB, PostgreSQL ou Microsoft SQL Server.
-
Você também pode usar clusters de banco de dados do Aurora com mecanismos MySQL ou PostgreSQL.
-
Você precisa fornecer um segredo do Secrets Manager para a autenticação do banco de dados.
-
Um perfil do IAM deve fornecer permissão para usar o segredo e uma política de confiança deve permitir que o Amazon RDS assuma o perfil.
-
A entidade principal do IAM que usa o console para configurar o recurso do Amazon RDS e conectá-lo à função deve ter as seguintes permissões:
nota
Você só precisa das permissões do Amazon RDS Proxy se configurar um Amazon RDS Proxy para gerenciar um pool de conexões de banco de dados.
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"ec2:CreateSecurityGroup",
"ec2:DescribeSecurityGroups",
"ec2:DescribeSubnets",
"ec2:DescribeVpcs",
"ec2:AuthorizeSecurityGroupIngress",
"ec2:AuthorizeSecurityGroupEgress",
"ec2:RevokeSecurityGroupEgress",
"ec2:CreateNetworkInterface",
"ec2:DeleteNetworkInterface",
"ec2:DescribeNetworkInterfaces"
],
"Resource": "*"
},
{
"Effect": "Allow",
"Action": [
"rds-db:connect",
"rds:CreateDBProxy",
"rds:CreateDBInstance",
"rds:CreateDBSubnetGroup",
"rds:DescribeDBClusters",
"rds:DescribeDBInstances",
"rds:DescribeDBSubnetGroups",
"rds:DescribeDBProxies",
"rds:DescribeDBProxyTargets",
"rds:DescribeDBProxyTargetGroups",
"rds:RegisterDBProxyTargets",
"rds:ModifyDBInstance",
"rds:ModifyDBProxy"
],
"Resource": "*"
},
{
"Effect": "Allow",
"Action": [
"lambda:CreateFunction",
"lambda:ListFunctions",
"lambda:UpdateFunctionConfiguration"
],
"Resource": "*"
},
{
"Effect": "Allow",
"Action": [
"iam:AttachRolePolicy",
"iam:AttachPolicy",
"iam:CreateRole",
"iam:CreatePolicy"
],
"Resource": "*"
},
{
"Effect": "Allow",
"Action": [
"secretsmanager:GetResourcePolicy",
"secretsmanager:GetSecretValue",
"secretsmanager:DescribeSecret",
"secretsmanager:ListSecretVersionIds",
"secretsmanager:CreateSecret"
],
"Resource": "*"
}
]
}
O Amazon RDS cobra uma taxa horária por proxies com base no tamanho da instância do banco de dados. Consulte Preço do RDS Proxy
Requisitos de SSL/TLS para conexões do Amazon RDS
Para fazer conexões SSL/TLS seguras com uma instância de banco de dados do Amazon RDS, a função do Lambda deverá verificar a identidade do servidor de banco de dados usando um certificado confiável. O Lambda lida com esses certificados de forma diferente dependendo do tipo de pacote de implantação:
-
Arquivos .zip: os runtimes gerenciados do Lambda incluem tanto os certificados de autoridade de certificação (CA) quanto os certificados necessários para conexões com instâncias de banco de dados do Amazon RDS. Até 4 semanas podem ser necessárias para que os certificados do Amazon RDS para novos Regiões da AWS sejam adicionados aos runtimes gerenciados do Lambda.
-
Imagens de contêiner: as imagens base da AWS incluem apenas certificados de CA. Se sua função se conectar a uma instância de banco de dados do Amazon RDS, será necessário incluir os certificados apropriados na imagem do seu contêiner. Em seu Dockerfile, baixe o pacote de certificados que corresponde à Região da AWS em que você hospeda seu banco de dados. Exemplo:
RUN curl
https://truststore.pki.rds.amazonaws.com/us-east-1/us-east-1-bundle.pem
-o/us-east-1-bundle.pem
Esse comando baixa o pacote de certificados do Amazon RDS e o salva no caminho absoluto /us-east-1-bundle.pem
no diretório raiz do seu contêiner. Ao configurar a conexão do banco de dados no código da função, você deve referenciar esse caminho exato. Exemplo:
A função readFileSync
é necessária porque os clientes de banco de dados Node.js precisam do conteúdo real do certificado na memória, e não apenas do caminho para o arquivo do certificado. Sem readFileSync
, o cliente interpreta a string do caminho como conteúdo do certificado, o que resulta em um erro de "certificado autoassinado na cadeia de certificados".
exemplo Configuração de conexão Node.js para função OCI
import { readFileSync } from 'fs';
// ...
let connectionConfig = {
host: process.env.ProxyHostName,
user: process.env.DBUserName,
password: token,
database: process.env.DBName,
ssl: {
ca: readFileSync('/us-east-1-bundle.pem')
// Load RDS certificate content from file into memory
}
};
Como se conectar a um banco de dados do Amazon RDS em uma função do Lambda
Os exemplos de código a seguir mostram como implementar uma função do Lambda que se conecta a um banco de dados do Amazon RDS. A função faz uma solicitação simples ao banco de dados e exibe o resultado.
nota
Esses exemplos de código são válidos somente para pacotes de implantação .zip. Se você estiver implantando sua função usando uma imagem de contêiner, será necessário especificar o arquivo de certificado do Amazon RDS no código da sua função, conforme explicado na seção anterior.
- SDK para .NET
-
nota
Há mais no GitHub. Encontre o exemplo completo e saiba como configurar e executar no repositório dos Exemplos sem servidor
. Conectar-se a um banco de dados do Amazon RDS em uma função do Lambda usando .NET.
using System.Data; using System.Text.Json; using Amazon.Lambda.APIGatewayEvents; using Amazon.Lambda.Core; using MySql.Data.MySqlClient; // Assembly attribute to enable the Lambda function's JSON input to be converted into a .NET class. [assembly: LambdaSerializer(typeof(Amazon.Lambda.Serialization.SystemTextJson.DefaultLambdaJsonSerializer))] namespace aws_rds; public class InputModel { public string key1 { get; set; } public string key2 { get; set; } } public class Function { /// <summary> // Handles the Lambda function execution for connecting to RDS using IAM authentication. /// </summary> /// <param name="input">The input event data passed to the Lambda function</param> /// <param name="context">The Lambda execution context that provides runtime information</param> /// <returns>A response object containing the execution result</returns> public async Task<APIGatewayProxyResponse> FunctionHandler(APIGatewayProxyRequest request, ILambdaContext context) { // Sample Input: {"body": "{\"key1\":\"20\", \"key2\":\"25\"}"} var input = JsonSerializer.Deserialize<InputModel>(request.Body); /// Obtain authentication token var authToken = RDSAuthTokenGenerator.GenerateAuthToken( Environment.GetEnvironmentVariable("RDS_ENDPOINT"), Convert.ToInt32(Environment.GetEnvironmentVariable("RDS_PORT")), Environment.GetEnvironmentVariable("RDS_USERNAME") ); /// Build the Connection String with the Token string connectionString = $"Server={Environment.GetEnvironmentVariable("RDS_ENDPOINT")};" + $"Port={Environment.GetEnvironmentVariable("RDS_PORT")};" + $"Uid={Environment.GetEnvironmentVariable("RDS_USERNAME")};" + $"Pwd={authToken};"; try { await using var connection = new MySqlConnection(connectionString); await connection.OpenAsync(); const string sql = "SELECT @param1 + @param2 AS Sum"; await using var command = new MySqlCommand(sql, connection); command.Parameters.AddWithValue("@param1", int.Parse(input.key1 ?? "0")); command.Parameters.AddWithValue("@param2", int.Parse(input.key2 ?? "0")); await using var reader = await command.ExecuteReaderAsync(); if (await reader.ReadAsync()) { int result = reader.GetInt32("Sum"); //Sample Response: {"statusCode":200,"body":"{\"message\":\"The sum is: 45\"}","isBase64Encoded":false} return new APIGatewayProxyResponse { StatusCode = 200, Body = JsonSerializer.Serialize(new { message = $"The sum is: {result}" }) }; } } catch (Exception ex) { Console.WriteLine($"Error: {ex.Message}"); } return new APIGatewayProxyResponse { StatusCode = 500, Body = JsonSerializer.Serialize(new { error = "Internal server error" }) }; } }
Processar notificações de eventos vindas do Amazon RDS
Você pode usar o Lambda para processar notificações de eventos em um banco de dados do Amazon RDS. O Amazon RDS envia notificações para um tópico do Amazon Simple Notification Service (Amazon SNS), que você pode configurar para invocar uma função do Lambda. O Amazon SNS envolve a mensagem do Amazon RDS em seu próprio documento de evento e a envia para sua função.
Para obter mais informações sobre como configurar um banco de dados do Amazon RDS para enviar notificações, consulte Trabalhar com a notificação de eventos do Amazon RDS.
exemplo Mensagem do Amazon RDS em um evento do Amazon SNS
{ "Records": [ { "EventVersion": "1.0", "EventSubscriptionArn": "arn:aws:sns:us-east-2:123456789012:rds-lambda:21be56ed-a058-49f5-8c98-aedd2564c486", "EventSource": "aws:sns", "Sns": { "SignatureVersion": "1", "Timestamp": "2023-01-02T12:45:07.000Z", "Signature": "tcc6faL2yUC6dgZdmrwh1Y4cGa/ebXEkAi6RibDsvpi+tE/1+82j...65r==", "SigningCertUrl": "https://sns.us-east-2.amazonaws.com/SimpleNotificationService-ac565b8b1a6c5d002d285f9598aa1d9b.pem", "MessageId": "95df01b4-ee98-5cb9-9903-4c221d41eb5e", "Message":
"{\"Event Source\":\"db-instance\",\"Event Time\":\"2023-01-02 12:45:06.000\",\"Identifier Link\":\"https://console.aws.amazon.com/rds/home?region=eu-west-1#dbinstance:id=dbinstanceid\",\"Source ID\":\"dbinstanceid\",\"Event ID\":\"http://docs.amazonwebservices.com/AmazonRDS/latest/UserGuide/USER_Events.html#RDS-EVENT-0002\",\"Event Message\":\"Finished DB Instance backup\"}",
"MessageAttributes": {}, "Type": "Notification", "UnsubscribeUrl": "https://sns.us-east-2.amazonaws.com/?Action=Unsubscribe&SubscriptionArn=arn:aws:sns:us-east-2:123456789012:test-lambda:21be56ed-a058-49f5-8c98-aedd2564c486", "TopicArn":"arn:aws:sns:us-east-2:123456789012:sns-lambda", "Subject": "RDS Notification Message" } } ] }
Tutorial do Lambda e do Amazon RDS
-
Usar uma função do Lambda para acessar um banco de dados do Amazon RDS: no Guia do usuário do Amazon RDS, aprenda a usar uma função do Lambda para gravar dados em um banco de dados do Amazon RDS usando um Amazon RDS Proxy. A função do Lambda lerá registros de uma fila do Amazon SQS e gravará novos itens em uma tabela no banco de dados sempre que uma mensagem for adicionada.