Usa i segreti di Secrets Manager nelle funzioni Lambda - AWS Lambda

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

Usa i segreti di Secrets Manager nelle funzioni Lambda

AWS Secrets Manager ti aiuta a gestire credenziali, chiavi API e altri segreti necessari alle tue funzioni Lambda. Ti consigliamo di utilizzare l'estensione Lambda AWS Parameters and Secrets per recuperare i segreti nelle tue funzioni Lambda. L'estensione offre prestazioni migliori e costi inferiori rispetto al recupero diretto dei segreti tramite l'SDK. AWS

L'estensione AWS Parameters and Secrets Lambda mantiene una cache locale di segreti, eliminando la necessità per la funzione di chiamare Secrets Manager per ogni chiamata. Quando la funzione richiede un segreto, l'estensione controlla innanzitutto la sua cache. Se il segreto è disponibile e non è scaduto, viene restituito immediatamente. Altrimenti, l'estensione lo recupera da Secrets Manager, lo memorizza nella cache e quindi lo restituisce alla tua funzione. Questo meccanismo di memorizzazione nella cache consente tempi di risposta più rapidi e costi ridotti riducendo al minimo le chiamate API a Secrets Manager.

L'estensione utilizza una semplice interfaccia HTTP compatibile con qualsiasi runtime Lambda. Per impostazione predefinita, memorizza nella cache i segreti per 300 secondi (5 minuti) e può contenere fino a 1.000 segreti. È possibile personalizzare queste impostazioni con variabili di ambiente.

Quando usare Secrets Manager con Lambda

Gli scenari più comuni per l'utilizzo di Secrets Manager con Lambda includono:

  • Memorizzazione delle credenziali del database utilizzate dalla funzione per connettersi ad Amazon RDS o ad altri database

  • Gestione delle chiavi API per i servizi esterni chiamati dalle tue funzioni

  • Archiviazione delle chiavi di crittografia o di altri dati di configurazione sensibili

  • Rotazione automatica delle credenziali senza dover aggiornare il codice della funzione

Usa Secrets Manager in una funzione Lambda

Questa sezione presuppone che tu abbia già un segreto di Secrets Manager. Per creare un segreto, vedi Creare un AWS Secrets Manager segreto.

Scegli il tuo runtime preferito e segui i passaggi per creare una funzione che recuperi segreti da Secrets Manager. La funzione di esempio recupera un segreto da Secrets Manager e può essere utilizzata per accedere alle credenziali del database, alle chiavi API o ad altri dati di configurazione sensibili nelle applicazioni.

Python
Per creare una funzione Python
  1. Crea e accedi a una nuova directory di progetto. Esempio:

    mkdir my_function cd my_function
  2. Crea un file denominato lambda_function.py con il seguente codice. Ad secret_name esempio, usa il nome o Amazon Resource Name (ARN) del tuo segreto.

    import json import os import requests def lambda_handler(event, context): try: # Replace with the name or ARN of your secret secret_name = "arn:aws:secretsmanager:us-east-1:111122223333:secret:SECRET_NAME" secrets_extension_endpoint = f"http://localhost:2773/secretsmanager/get?secretId={secret_name}" headers = {"X-Aws-Parameters-Secrets-Token": os.environ.get('AWS_SESSION_TOKEN')} response = requests.get(secrets_extension_endpoint, headers=headers) print(f"Response status code: {response.status_code}") secret = json.loads(response.text)["SecretString"] print(f"Retrieved secret: {secret}") return { 'statusCode': response.status_code, 'body': json.dumps({ 'message': 'Successfully retrieved secret', 'secretRetrieved': True }) } except Exception as e: print(f"Error: {str(e)}") return { 'statusCode': 500, 'body': json.dumps({ 'message': 'Error retrieving secret', 'error': str(e) }) }
  3. Crea un file denominato requirements.txt con questo contenuto:

    requests
  4. Installa le dipendenze:

    pip install -r requirements.txt -t .
  5. Crea un file.zip contenente tutti i file:

    zip -r function.zip .
Node.js
Per creare una funzione Node.js.
  1. Crea e accedi a una nuova directory di progetto. Esempio:

    mkdir my_function cd my_function
  2. Crea un file denominato index.mjs con il seguente codice. Ad secret_name esempio, usa il nome o Amazon Resource Name (ARN) del tuo segreto.

    import http from 'http'; export const handler = async (event) => { try { // Replace with the name or ARN of your secret const secretName = "arn:aws:secretsmanager:us-east-1:111122223333:secret:SECRET_NAME"; const options = { hostname: 'localhost', port: 2773, path: `/secretsmanager/get?secretId=${secretName}`, headers: { 'X-Aws-Parameters-Secrets-Token': process.env.AWS_SESSION_TOKEN } }; const response = await new Promise((resolve, reject) => { http.get(options, (res) => { let data = ''; res.on('data', (chunk) => { data += chunk; }); res.on('end', () => { resolve({ statusCode: res.statusCode, body: data }); }); }).on('error', reject); }); const secret = JSON.parse(response.body).SecretString; console.log('Retrieved secret:', secret); return { statusCode: response.statusCode, body: JSON.stringify({ message: 'Successfully retrieved secret', secretRetrieved: true }) }; } catch (error) { console.error('Error:', error); return { statusCode: 500, body: JSON.stringify({ message: 'Error retrieving secret', error: error.message }) }; } };
  3. Crea un file.zip contenente il index.mjs file:

    zip -r function.zip index.mjs
Java
Per creare una funzione Java
  1. Crea un progetto Maven:

    mvn archetype:generate \ -DgroupId=example \ -DartifactId=lambda-secrets-demo \ -DarchetypeArtifactId=maven-archetype-quickstart \ -DarchetypeVersion=1.4 \ -DinteractiveMode=false
  2. Vai alla directory del progetto:

    cd lambda-secrets-demo
  3. Apri pom.xml e sostituisci il contenuto con quanto segue:

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>example</groupId> <artifactId>lambda-secrets-demo</artifactId> <version>1.0-SNAPSHOT</version> <properties> <maven.compiler.source>11</maven.compiler.source> <maven.compiler.target>11</maven.compiler.target> </properties> <dependencies> <dependency> <groupId>com.amazonaws</groupId> <artifactId>aws-lambda-java-core</artifactId> <version>1.2.1</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>3.2.4</version> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> <configuration> <createDependencyReducedPom>false</createDependencyReducedPom> <finalName>function</finalName> </configuration> </execution> </executions> </plugin> </plugins> </build> </project>
  4. Rinomina il file /lambda-secrets-demo/src/main/java/example/App.java in modo Hello.java che corrisponda al nome del gestore Java predefinito di Lambda (): example.Hello::handleRequest

    mv src/main/java/example/App.java src/main/java/example/Hello.java
  5. Apri il Hello.java file e sostituisci il suo contenuto con quanto segue. Ad secretName esempio, usa il nome o Amazon Resource Name (ARN) del tuo segreto.

    package example; import com.amazonaws.services.lambda.runtime.Context; import com.amazonaws.services.lambda.runtime.RequestHandler; import java.net.URI; import java.net.http.HttpClient; import java.net.http.HttpRequest; import java.net.http.HttpResponse; public class Hello implements RequestHandler<Object, String> { private final HttpClient client = HttpClient.newHttpClient(); @Override public String handleRequest(Object input, Context context) { try { // Replace with the name or ARN of your secret String secretName = "arn:aws:secretsmanager:us-east-1:111122223333:secret:SECRET_NAME"; String endpoint = "http://localhost:2773/secretsmanager/get?secretId=" + secretName; HttpRequest request = HttpRequest.newBuilder() .uri(URI.create(endpoint)) .header("X-Aws-Parameters-Secrets-Token", System.getenv("AWS_SESSION_TOKEN")) .GET() .build(); HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString()); String secret = response.body(); secret = secret.substring(secret.indexOf("SecretString") + 15); secret = secret.substring(0, secret.indexOf("\"")); System.out.println("Retrieved secret: " + secret); return String.format( "{\"statusCode\": %d, \"body\": \"%s\"}", response.statusCode(), "Successfully retrieved secret" ); } catch (Exception e) { e.printStackTrace(); return String.format( "{\"body\": \"Error retrieving secret: %s\"}", e.getMessage() ); } } }
  6. Rimuovi la directory di test. Maven la crea per impostazione predefinita, ma non ne abbiamo bisogno per questo esempio.

    rm -rf src/test
  7. Costruisci il progetto:

    mvn package
  8. Scarica il file JAR (target/function.jar) per un uso successivo.

  1. Aprire la pagina Funzioni della console Lambda.

  2. Scegli Crea funzione.

  3. Scegli Crea da zero.

  4. Nel campo Function name (Nome funzione), immettere secret-retrieval-demo.

  5. Scegliete il vostro runtime preferito.

  6. Scegli Crea funzione.

Per caricare il pacchetto di distribuzione
  1. Nella scheda Codice della funzione, scegli Carica da e seleziona il file.zip (per Python e Node.js) o.jar (per Java).

  2. Carica il pacchetto di distribuzione creato in precedenza.

  3. Scegli Save (Salva).

Per aggiungere l'estensione Lambda AWS Parameters and Secrets come livello
  1. Nella scheda Codice della funzione, scorri verso il basso fino a Livelli.

  2. Scegliere Add a layer (Aggiungi un livello).

  3. Seleziona AWS i livelli.

  4. Scegliete AWS-parameters-and-Secrets-Lambda-Extension.

  5. Seleziona la versione più recente.

  6. Scegli Aggiungi.

Per aggiungere le autorizzazioni di Secrets Manager al tuo ruolo di esecuzione
  1. Quindi, seleziona la scheda Configuration (Configurazione) e poi Permissions (Autorizzazioni).

  2. In Nome del ruolo, scegli il link al tuo ruolo di esecuzione. Questo ruolo si apre nella console IAM.

    Link al ruolo di esecuzione
  3. Scegli Aggiungi autorizzazioni, quindi seleziona Crea policy in linea.

    Collegare le policy nella console IAM
  4. Scegli la scheda JSON e aggiungi la seguente politica. PerResource, inserisci l'ARN del tuo segreto.

    JSON
    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "secretsmanager:GetSecretValue", "Resource": "arn:aws:secretsmanager:us-east-1:111122223333:secret:SECRET_NAME" } ] }
  5. Scegli Next (Successivo).

  6. Inserisci un nome per la policy.

  7. Scegliere Create Policy (Crea policy).

Per testare la funzione
  1. Torna alla console Lambda.

  2. Seleziona la scheda Test.

  3. Scegli Test (Esegui test). Dovrebbe essere visualizzata la seguente risposta:

    Risultato positivo del test

Variabili di ambiente

L'estensione Lambda AWS Parameters and Secrets utilizza le seguenti impostazioni predefinite. È possibile sovrascrivere queste impostazioni creando le variabili di ambiente corrispondenti. Per visualizzare le impostazioni correnti di una funzione, impostate suPARAMETERS_SECRETS_EXTENSION_LOG_LEVEL. DEBUG L'estensione registrerà le informazioni di configurazione in CloudWatch Logs all'inizio di ogni chiamata di funzione.

Impostazione Valore predefinito Valori validi Variabile di ambiente Informazioni
Porta HTTP 2773 1 - 65535 PARAMETERS_SECRETS_EXTENSION_HTTP_PORT Porta per il server HTTP locale
Cache abilitata TRUE TRUE | FALSE PARAMETERS_SECRETS_EXTENSION_CACHE_ENABLED Abilita o disabilita la cache
Dimensioni della cache 1000 0 - 1000 PARAMETRI_SECRETS_EXTENSION_CACHE_SIZE Imposta su 0 per disabilitare la memorizzazione nella cache
Secrets Manager TTL 300 secondi 0-300 secondi SECRETS_MANAGER_TTL Time-to-live per i segreti memorizzati nella cache. Impostare su 0 per disabilitare la memorizzazione nella cache. Questa variabile viene ignorata se il valore di PARAMETERS_SECRETS_EXTENSION_CACHE_SIZE è 0.
Parameter Store TTL 300 secondi 0-300 secondi SSM_PARAMETER_STORE_TTL Time-to-live per i parametri memorizzati nella cache. Impostare su 0 per disabilitare la memorizzazione nella cache. Questa variabile viene ignorata se il valore di PARAMETERS_SECRETS_EXTENSION_CACHE_SIZE è 0.
Livello di log INFO DEBUG | INFO | WARN | ERRORE | NESSUNO PARAMETERS_SECRETS_EXTENSION_LOG_LEVEL Il livello di dettaglio riportato nei log dell'estensione
Numero massimo di connessioni 3 Uguale o maggiore di 1 PARAMETERS_SECRETS_EXTENSION_MAX_CONNECTIONS Numero massimo di connessioni HTTP per le richieste a Parameter Store o Secrets Manager
Timeout di Secrets Manager 0 (nessun timeout) Tutti i numeri interi SECRETS_MANAGER_TIMEOUT_MILLIS Timeout per le richieste a Secrets Manager (in millisecondi)
Timeout dell'archivio dei parametri 0 (nessun timeout) Tutti i numeri interi SSM_PARAMETER_STORE_TIMEOUT_MILLIS Timeout per le richieste a Parameter Store (in millisecondi)

Lavorare con rotazione segreta

Se ruotate spesso i segreti, la durata predefinita di 300 secondi della cache potrebbe far sì che la funzione utilizzi segreti obsoleti. Sono disponibili due opzioni per garantire che la funzione utilizzi il valore segreto più recente:

  • Riduci il TTL della cache impostando la variabile di SECRETS_MANAGER_TTL ambiente su un valore inferiore (in secondi). Ad esempio, impostandolo per 60 garantire che la funzione non utilizzi mai un segreto vecchio di più di un minuto.

  • Usa le etichette AWSCURRENT o AWSPREVIOUS staging nella tua richiesta segreta per assicurarti di ottenere la versione specifica che desideri:

    secretsmanager/get?secretId=YOUR_SECRET_NAME&versionStage=AWSCURRENT

Scegliete l'approccio che meglio bilancia le vostre esigenze di prestazioni e freschezza. Un TTL inferiore significa chiamate più frequenti a Secrets Manager, ma garantisce l'utilizzo dei valori segreti più recenti.