Skip to content

refactor: use serverless provider#1

Merged
ArielSantos01 merged 6 commits intomainfrom
refactor/use-serverless-provider
Mar 20, 2025
Merged

refactor: use serverless provider#1
ArielSantos01 merged 6 commits intomainfrom
refactor/use-serverless-provider

Conversation

@ArielSantos01
Copy link
Copy Markdown
Collaborator

Description

  • Se hace refactor para utilizar el provider de serverless en lugar del sdk de aws.
  • Se cambia la forma de guardar los secrets desencriptados, en lugar de guardarlo en forma local se guarda en memoria.
  • Se cambia la forma de utilizar la private key de ejson, en lugar de pasarla por el stdin y exponerla en el comando, se almacena dentro de un archivo temporal y se indica en el comando el path de la private key.

@coderabbitai
Copy link
Copy Markdown

coderabbitai bot commented Mar 20, 2025

📝 Walkthrough

Summary by CodeRabbit

  • Nuevas Funcionalidades

    • Se introduce un plugin para la sincronización de secretos cifrados con AWS Secrets Manager, soportando múltiples entornos y un modo de simulación.
  • Refactorización

    • Se optimizó la gestión interna de secretos eliminando el manejo directo de credenciales AWS y archivos temporales, mejorando la robustez y el manejo de errores.
  • Documentación

    • Se actualizó la guía de configuración con ejemplos claros para integrar y utilizar el plugin en proyectos Serverless.

Walkthrough

Se han realizado modificaciones en varios módulos para actualizar el manejo de secretos. Se elimina la gestión de credenciales de AWS y la manipulación de archivos temporales, adaptando las clases para utilizar un objeto serverless y gestionar los secretos de forma directa en memoria. Asimismo, se simplifican y actualizan las firmas de métodos en los módulos relacionados, y se eliminan dependencias específicas de AWS en el fichero de configuración de dependencias.

Changes

Archivo(s) Resumen de cambios
index.js, src/SecretsManager.js, src/SyncSecrets.js - Se elimina el manejo de credenciales AWS y la gestión de archivos temporales.
- Se actualizan firmas de métodos y propiedades para utilizar el objeto serverless.
- Se refactoriza la interacción con el servicio de secretos, pasando a un manejo directo y simplificado.
package.json - Se eliminan las dependencias "aws-sdk" y "@aws-sdk/client-secrets-manager".
- Se reordena la dependencia "fs" sin agregar nuevas dependencias.
src/Decrypt.js - Se modifica el constructor para recibir serverless, filePath, privateKey y ssm_prefix.
- Se reemplaza el método #init por #setEjsonPrivateKey con mayor control de errores.
- La lógica de desencriptación se actualiza para gestionar clave privada vía SSM y un directorio temporal.
.github/workflows/pull_request.yml - Se actualiza el entorno de ejecución de ubuntu-latest a ubuntu-22.04 en los trabajos lint y commit_lint.
- Se elimina el trabajo test, lo que elimina la fase de pruebas del flujo de trabajo.
README.md - Se añade nueva documentación para el plugin serverless-plugin-sync-secrets, incluyendo características, requisitos, instrucciones de instalación y ejemplos de configuración.

Sequence Diagram(s)

sequenceDiagram
  participant SL as Serverless
  participant SSP as SyncSecretPlugin
  participant D as Decrypt
  participant SM as SecretsManager

  SL->>SSP: Inicializa plugin con configuración y etapa
  SSP->>D: Llama a decryptSecrets() pasando contexto serverless
  D-->>SSP: Retorna secretos desencriptados
  SSP->>SM: Invoca syncSecretToSecretManager() con los secretos
  SM-->>SSP: Confirma actualización del secreto
Loading
sequenceDiagram
  participant D as Decrypt
  participant SSM as AWS SSM
  participant FS as Sistema de Archivos

  D->>SSM: Solicita la clave privada
  SSM-->>D: Retorna la clave privada
  D->>FS: Crea directorio temporal y escribe la clave con permisos restringidos
  D->>FS: Lee el archivo JSON para extraer la clave pública
  D->>D: Ejecuta el proceso de desencriptación
  D-->>D: Retorna el objeto JSON desencriptado
Loading

🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>, please review it.
    • Generate unit testing code for this file.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query. Examples:
    • @coderabbitai generate unit testing code for this file.
    • @coderabbitai modularize this function.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    • @coderabbitai read src/utils.ts and generate unit testing code.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.
    • @coderabbitai help me debug CodeRabbit configuration file.

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

CodeRabbit Commands (Invoked using PR comments)

  • @coderabbitai pause to pause the reviews on a PR.
  • @coderabbitai resume to resume the paused reviews.
  • @coderabbitai review to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
  • @coderabbitai full review to do a full review from scratch and review all the files again.
  • @coderabbitai summary to regenerate the summary of the PR.
  • @coderabbitai generate docstrings to generate docstrings for this PR.
  • @coderabbitai resolve resolve all the CodeRabbit review comments.
  • @coderabbitai configuration to show the current CodeRabbit configuration for the repository.
  • @coderabbitai help to get help.

Other keywords and placeholders

  • Add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbitai summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai anywhere in the PR title to generate the title automatically.

CodeRabbit Configuration File (.coderabbit.yaml)

  • You can programmatically configure CodeRabbit by adding a .coderabbit.yaml file to the root of your repository.
  • Please see the configuration documentation for more information.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json

Documentation and Community

  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

Copy link
Copy Markdown

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🧹 Nitpick comments (4)
src/SyncSecrets.js (1)

69-71: Falta validación del objeto “secrets”.
En #validateData sólo se comprueba la existencia de secretName, pero no se verifica si secrets está presente o es válido. Esto podría derivar en errores si secrets es null o se maneja de forma incorrecta en el futuro.

Propuesta de validación adicional en #validateData:

 #validateData(secretName, secrets) {
   if (!secretName) {
     throw new Error("Missing secret_name");
   }
+  if (!secrets || typeof secrets !== 'object') {
+    throw new Error("Missing or invalid secrets object");
+  }
 }
src/Decrypt.js (2)

6-6: Sugerencia: eliminar la importación inservible privateDecrypt.
No se detecta uso de privateDecrypt en el archivo, lo que podría generar confusión y agregar dependencias innecesarias.

-import crypto, { privateDecrypt } from "crypto";
+import crypto from "crypto";

135-139: Sugerencia: comprobar la existencia del archivo antes de eliminarlo.
Si por alguna razón privateKeyPath no se crea, podríamos evitar un error al intentar eliminar un archivo inexistente. Se recomienda un chequeo adicional para mayor robustez.

index.js (1)

11-12: Consideración sobre el ciclo de vida de los datos sensibles.
Almacenar secretos en una propiedad de la instancia (this.secrets) podría exponerlos si la instancia vive mucho tiempo o se generan logs involuntarios. Como buena práctica, podrías limpiar esta propiedad una vez que se complete la sincronización.

📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 749c89e and 068d543.

⛔ Files ignored due to path filters (1)
  • package-lock.json is excluded by !**/package-lock.json
📒 Files selected for processing (5)
  • index.js (4 hunks)
  • package.json (1 hunks)
  • src/Decrypt.js (6 hunks)
  • src/SecretsManager.js (5 hunks)
  • src/SyncSecrets.js (5 hunks)
🧰 Additional context used
🧬 Code Definitions (2)
src/SyncSecrets.js (1)
src/SecretsManager.js (1) (1)
  • SecretsManager (5-92)
index.js (1)
src/SyncSecrets.js (1) (1)
  • SyncSecret (9-131)
🔇 Additional comments (4)
package.json (1)

38-38: Considerar la necesidad real del paquete “fs”.
Este paquete suele ser parte nativa de Node.js y, en la mayoría de casos, no requiere ser instalado como dependencia adicional. Verifica que realmente lo necesitas para un entorno no estándar.

¿Deseas ejecutar un script para buscar usos de este paquete y corroborar si es indispensable?

src/Decrypt.js (1)

41-46: Buena validación condicional al obtener la clave privada.
Verifica correctamente si existe la clave privada o si se estableció un prefijo de SSM, reduciendo la posibilidad de errores en tiempo de ejecución.

index.js (2)

50-50: Buena integración con el proceso de desencriptación.
Asignar el resultado de decrypt.run() directamente a this.secrets es claro y conciso.


65-67: Acierto al verificar la presencia de los secretos antes de sincronizarlos.
Esta comprobación temprana facilita la detección de problemas de desencriptación y evita operaciones innecesarias o fallidas.

Comment thread src/SecretsManager.js Outdated
Comment thread src/SecretsManager.js
Copy link
Copy Markdown

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

♻️ Duplicate comments (1)
src/SecretsManager.js (1)

87-90: ⚠️ Potential issue

Error tipográfico en el servicio 'SecretsManger'.

Se ha escrito incorrectamente el nombre del servicio, lo que causará un error en la solicitud.

- await this.provider.request('SecretsManger', 'deleteSecret', {
+ await this.provider.request('SecretsManager', 'deleteSecret', {
  SecretId: this.secretName,
  RecoverWindowInDays: 7,
-})
+});
🧰 Tools
🪛 ESLint

[error] 90-90: Insert ;

(prettier/prettier)

🧹 Nitpick comments (3)
src/SyncSecrets.js (1)

47-47: Eliminar espacio en blanco extra en documentación JSDoc.

Hay un espacio en blanco adicional que debería ser eliminado.

-   * 
+   *
🧰 Tools
🪛 ESLint

[error] 47-47: Delete ·

(prettier/prettier)

src/SecretsManager.js (1)

37-40: Se corrigió el método update para usar la API de proveedor correctamente.

La actualización ahora utiliza el proveedor para realizar la solicitud a AWS Secrets Manager. Sin embargo, hay algunos problemas de formato que deberían corregirse según las sugerencias de ESLint.

- await this.provider.request('SecretsManager', 'updateSecret', {
-   SecretId: this.secretName, 
-   SecretString: JSON.stringify(newValues)
- });
+ await this.provider.request('SecretsManager', 'updateSecret', {
+   SecretId: this.secretName,
+   SecretString: JSON.stringify(newValues),
+ });
🧰 Tools
🪛 ESLint

[error] 38-38: Delete ·

(prettier/prettier)


[error] 39-39: Insert ,

(prettier/prettier)

index.js (1)

17-27: Configuración por defecto actualizada adecuadamente.

La configuración por defecto ahora incluye las propiedades necesarias para el nuevo enfoque basado en ejson y elimina las relacionadas con AWS. Hay algunos problemas de formato que deberían corregirse según las sugerencias de ESLint.

  ejson_file_path: path.join(this.servicePath, 'secrets', `${this.stage}.ejson`),
  secret_name: this.serverless.service.service,
  ejson_key: null,
  ssm_prefix: null,
- exclude: "^_",
+ exclude: '^_',
  create_secret: false,
  show_values: false,
  delete_secret: false,
- dry: false
+ dry: false,
🧰 Tools
🪛 ESLint

[error] 22-22: Replace "^_" with '^_'

(prettier/prettier)


[error] 26-26: Insert ,

(prettier/prettier)

📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 068d543 and 1a911ab.

⛔ Files ignored due to path filters (1)
  • package-lock.json is excluded by !**/package-lock.json
📒 Files selected for processing (5)
  • .github/workflows/pull_request.yml (3 hunks)
  • index.js (4 hunks)
  • package.json (2 hunks)
  • src/SecretsManager.js (5 hunks)
  • src/SyncSecrets.js (5 hunks)
🚧 Files skipped from review as they are similar to previous changes (1)
  • package.json
🧰 Additional context used
🧬 Code Definitions (2)
index.js (1)
src/SyncSecrets.js (1) (1)
  • SyncSecret (9-131)
src/SyncSecrets.js (1)
src/SecretsManager.js (1) (1)
  • SecretsManager (5-92)
🪛 ESLint
index.js

[error] 13-13: Delete ·

(prettier/prettier)


[error] 22-22: Replace "^_" with '^_'

(prettier/prettier)


[error] 26-26: Insert ,

(prettier/prettier)


[error] 34-34: Insert ,

(prettier/prettier)


[error] 51-51: Delete ·

(prettier/prettier)

src/SecretsManager.js

[error] 9-9: Delete ·

(prettier/prettier)


[error] 12-12: Delete ·

(prettier/prettier)


[error] 16-16: Replace "aws" with 'aws'

(prettier/prettier)


[error] 24-24: Insert ·

(prettier/prettier)


[error] 38-38: Delete ·

(prettier/prettier)


[error] 39-39: Insert ,

(prettier/prettier)


[error] 90-90: Insert ;

(prettier/prettier)

src/SyncSecrets.js

[error] 47-47: Delete ·

(prettier/prettier)

🔇 Additional comments (9)
src/SyncSecrets.js (3)

60-77: El constructor ha sido correctamente refactorizado.

La modificación del constructor para utilizar el objeto serverless y almacenar los secretos en memoria está bien implementada y alineada con el objetivo de la refactorización.

🧰 Tools
🪛 ESLint

[error] 60-68: Replace ⏎····serverless,⏎····secretName,⏎····secrets,⏎····skipPattern,⏎····showValues,⏎····createSecret,⏎····deleteSecret,⏎·· with serverless,·secretName,·secrets,·skipPattern,·showValues,·createSecret,·deleteSecret

(prettier/prettier)


91-91: Cambio correcto en el manejo de datos de secretos.

El código ahora utiliza los secretos almacenados en memoria en lugar de leerlos desde un archivo JSON, lo que mejora la seguridad al evitar escribir información sensible en disco.


126-130: Validación simplificada correctamente.

La función de validación ha sido simplificada adecuadamente para solo verificar el nombre del secreto, ya que los demás parámetros ya no son necesarios en el nuevo enfoque.

🧰 Tools
🪛 ESLint

[error] 128-128: Replace "Missing·secret_name" with 'Missing·secret_name'

(prettier/prettier)

src/SecretsManager.js (2)

7-17: Constructor refactorizado correctamente para utilizar el proveedor serverless.

La implementación del constructor ahora utiliza correctamente el objeto serverless para obtener el proveedor AWS, lo que simplifica la gestión de credenciales.

🧰 Tools
🪛 ESLint

[error] 9-9: Delete ·

(prettier/prettier)


[error] 12-12: Delete ·

(prettier/prettier)


[error] 16-16: Replace "aws" with 'aws'

(prettier/prettier)


24-29: Implementación correcta del método getValues.

El método ahora utiliza correctamente el proveedor para realizar la solicitud a AWS Secrets Manager.

🧰 Tools
🪛 ESLint

[error] 24-24: Insert ·

(prettier/prettier)

index.js (4)

11-13: Inicialización correcta del estado del plugin.

Las propiedades para manejar los secretos, el proveedor y la etapa están correctamente inicializadas.

🧰 Tools
🪛 ESLint

[error] 13-13: Delete ·

(prettier/prettier)


43-56: Método decryptSecrets refactorizado correctamente.

El método ahora utiliza correctamente la clase Decrypt con los parámetros adecuados y almacena los secretos en memoria.

🧰 Tools
🪛 ESLint

[error] 51-51: Delete ·

(prettier/prettier)


66-68: Validación de secretos mejorada.

Se ha añadido una validación adecuada para asegurar que los secretos están disponibles antes de sincronizarlos, lo que mejora la robustez del código.


70-78: Constructor de SyncSecret actualizado correctamente.

La llamada al constructor de SyncSecret ahora pasa los parámetros correctos según la nueva firma del método.

Comment thread .github/workflows/pull_request.yml Outdated
Comment on lines +27 to +28
if: false
runs-on: ubuntu-22.04
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

Se desactivó el trabajo de pruebas sin explicación.

Se ha añadido la condición if: false que desactiva el trabajo de pruebas, lo que podría permitir que se introduzcan errores o regresiones sin ser detectados en el código. Es recomendable mantener las pruebas activas o documentar por qué se han desactivado temporalmente.

Si las pruebas no son compatibles con la refactorización actual, sería mejor actualizarlas en lugar de desactivarlas completamente.

Copy link
Copy Markdown

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

🧹 Nitpick comments (4)
index.js (4)

11-13: Revisa el manejo de secretos y el espacio en blanco adicional en la línea 13
Al asignar this.secrets = null facilitas el control del estado interno de los secretos. No obstante, almacenar los secretos en memoria puede exponerlos si se registran inadvertidamente en logs. Asegúrate de no imprimir this.secrets en ningún momento.
Además, según las herramientas de análisis, existe un espacio en blanco extra en la línea 13. Se sugiere eliminarlo como se indica a continuación:

-    this.stage = this.provider.getStage(); 
+    this.stage = this.provider.getStage();
🧰 Tools
🪛 ESLint

[error] 13-13: Delete ·

(prettier/prettier)


51-51: Elimina el espacio en blanco adicional
Hay un espacio en blanco sobrante en esta línea según el análisis estático. Se sugiere eliminarlo para cumplir con la convención de estilo:

-      this.secrets = await decrypt.run(); 
+      this.secrets = await decrypt.run();
🧰 Tools
🪛 ESLint

[error] 51-51: Delete ·

(prettier/prettier)


66-68: Mejora la claridad del mensaje de error
La verificación de this.secrets antes de proceder facilita la detección de errores de flujo. Considera incluir instrucciones adicionales en el mensaje para guiar al usuario, por ejemplo: “Asegúrate de haber llamado decryptSecrets() antes de sincronizar.”


96-96: Proporciona mayor contexto al relanzar la excepción
Al relanzar la excepción throw e;, estás manteniendo la pila original, pero podrías agregar contexto personalizado o un mensaje más explicativo. Por ejemplo, “Error al sincronizar con Secret Manager” para así facilitar el rastreo de errores.

📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 1a911ab and e1ecbd2.

📒 Files selected for processing (4)
  • index.js (4 hunks)
  • src/Decrypt.js (6 hunks)
  • src/SecretsManager.js (5 hunks)
  • src/SyncSecrets.js (5 hunks)
🧰 Additional context used
🧬 Code Definitions (2)
src/SyncSecrets.js (1)
src/SecretsManager.js (1) (1)
  • SecretsManager (5-92)
index.js (1)
src/SyncSecrets.js (1) (1)
  • SyncSecret (9-129)
🪛 ESLint
src/Decrypt.js

[error] 4-4: Replace "os" with 'os'

(prettier/prettier)


[error] 5-5: Replace "path" with 'path'

(prettier/prettier)


[error] 6-6: Replace "crypto" with 'crypto'

(prettier/prettier)


[error] 7-7: Replace "lodash" with 'lodash'

(prettier/prettier)


[error] 8-8: Replace "./Logger.js" with './Logger.js'

(prettier/prettier)


[error] 21-21: Insert ·

(prettier/prettier)


[error] 22-27: Replace ⏎····serverless,⏎····filePath,·⏎····privateKey,⏎····ssm_prefix⏎·· with serverless,·filePath,·privateKey,·ssm_prefix

(prettier/prettier)


[error] 44-44: Replace "No·provided·private·key·for·decryption·and·no·SSM·prefix·provided" with 'No·provided·private·key·for·decryption·and·no·SSM·prefix·provided'

(prettier/prettier)


[error] 50-50: Delete ··

(prettier/prettier)


[error] 68-68: Delete ··

(prettier/prettier)


[error] 69-69: Delete ··

(prettier/prettier)


[error] 70-70: Delete ··

(prettier/prettier)


[error] 81-81: Delete ····

(prettier/prettier)


[error] 102-102: Insert ·

(prettier/prettier)


[error] 112-112: Delete ·

(prettier/prettier)


[error] 113-113: Delete ······

(prettier/prettier)


[error] 133-133: Delete ··

(prettier/prettier)


[error] 151-151: Delete ··

(prettier/prettier)


[error] 152-152: Replace ··········WithDecryption:·true with ········WithDecryption:·true,

(prettier/prettier)


[error] 153-153: Delete ··

(prettier/prettier)


[error] 158-158: Replace "No·provided·private·key·for·decryption" with 'No·provided·private·key·for·decryption'

(prettier/prettier)


[error] 161-161: Delete ········

(prettier/prettier)


[error] 163-163: Delete ··

(prettier/prettier)

src/SecretsManager.js

[error] 9-9: Delete ·

(prettier/prettier)


[error] 12-12: Delete ·

(prettier/prettier)


[error] 24-24: Insert ·

(prettier/prettier)


[error] 38-38: Delete ·

(prettier/prettier)

src/SyncSecrets.js

[error] 47-47: Delete ·

(prettier/prettier)

index.js

[error] 13-13: Delete ·

(prettier/prettier)


[error] 51-51: Delete ·

(prettier/prettier)

🔇 Additional comments (29)
src/SyncSecrets.js (5)

11-14: Comentario en la documentación de la propiedad #secrets
La anotación de tipo y la explicación de la propiedad ayudan a la claridad del propósito de #secrets.


47-50: Documentación actualizada del constructor
Se refleja adecuadamente el cambio de credenciales de AWS a la instancia de Serverless y la gestión de secretos en memoria.

🧰 Tools
🪛 ESLint

[error] 47-47: Delete ·

(prettier/prettier)


61-71: Transición a un constructor basado en Serverless y uso de secretos en memoria
El constructor se simplifica al depender del objeto serverless y asignar #secrets. Verifica que todos los consumidores del constructor se actualicen con la nueva firma.


90-90: Posible efecto secundario al compartir la misma referencia de objeto
Al asignar newSecretData = this.#secrets, ambos apuntan al mismo objeto en memoria. Si se modifica newSecretData, podría impactar el objeto original. Confirma que esta conducta sea intencional.


124-124: Validación simplificada de parámetro
Se validan únicamente el nombre del secreto. Comprueba si se requieren validaciones adicionales o parámetros obligatorios en casos de uso futuros.

src/Decrypt.js (16)

4-6: Nuevas importaciones para gestión de directorios, rutas y criptografía
os, path y crypto brindan las herramientas necesarias para crear y manejar archivos temporales y claves de manera segura.

🧰 Tools
🪛 ESLint

[error] 4-4: Replace "os" with 'os'

(prettier/prettier)


[error] 5-5: Replace "path" with 'path'

(prettier/prettier)


[error] 6-6: Replace "crypto" with 'crypto'

(prettier/prettier)


13-13: Declaración de #ssm_prefix
Definir este campo privado facilita la obtención de la clave privada desde SSM al mantener encapsulada la lógica del prefijo.


17-21: Actualización de la documentación del constructor
Se incluyen correctamente las descripciones para serverless y ssm_prefix, indicando la nueva vía de obtención de la clave privada.

🧰 Tools
🪛 ESLint

[error] 21-21: Insert ·

(prettier/prettier)


23-26: Constructor adaptado para utilizar el provider de Serverless
La eliminación de credenciales explícitas de AWS a favor del provider añade coherencia y reduce riesgos de exposición de credenciales.


41-46: Método privado #setEjsonPrivateKey para obtener la clave desde SSM
Permite manejar escenarios donde la clave no está disponible localmente, delegando la lógica de recuperación a SSM. Verifica la existencia del parámetro en SSM para evitar fallas en tiempo de ejecución.

🧰 Tools
🪛 ESLint

[error] 44-44: Replace "No·provided·private·key·for·decryption·and·no·SSM·prefix·provided" with 'No·provided·private·key·for·decryption·and·no·SSM·prefix·provided'

(prettier/prettier)


70-70: Invocación del nuevo método #setEjsonPrivateKey
Al llamar #setEjsonPrivateKey() dentro de run(), la obtención de la clave queda garantizada antes de iniciar el proceso de desencripción.

🧰 Tools
🪛 ESLint

[error] 70-70: Delete ··

(prettier/prettier)


81-81: Log de verificación de ejson
Registrar este paso orienta al usuario a instalar ejson si no está presente y facilita la identificación de errores.

🧰 Tools
🪛 ESLint

[error] 81-81: Delete ····

(prettier/prettier)


95-95: Firma de método #decrypt con retorno de objeto
El comentario aclara que el método regresa un objeto JSON con los secretos desencriptados, lo cual mejora la documentación.


99-100: Inicialización de variables para directorio y archivo temporal
Establecer null previene comportamientos indefinidos y facilita la limpieza en el bloque finally.


102-116: Creación y uso de un directorio temporal para la clave privada
Se genera un directorio con permisos restringidos y se almacena la clave privados de forma efímera. Verifica que el proceso de limpieza posterior sea infalible ante errores.

🧰 Tools
🪛 ESLint

[error] 102-102: Insert ·

(prettier/prettier)


[error] 112-112: Delete ·

(prettier/prettier)


[error] 113-113: Delete ······

(prettier/prettier)


118-122: Ejecución segura de desencripción con variable de entorno EJSON_KEYDIR
El comando ejson decrypt usa la carpeta temporal para la clave, reduciendo la exposición en la línea de comandos.


124-126: Control de errores en la salida de stderr
Se detectan errores específicos arrojados por ejson y se lanzan como excepciones, evitando el silenciamiento de problemas.


128-131: Retorno de los secretos desencriptados
Después de convertir la salida a JSON, se registra y retorna el objeto con los resultados desencriptados, cumpliendo con la expectativa del método.


133-134: Manejo de errores en el bloque catch
La excepción proporciona contexto adicional para mejorar la trazabilidad en fallas de desencripción.

🧰 Tools
🪛 ESLint

[error] 133-133: Delete ··

(prettier/prettier)


135-139: Eliminación de la clave privada y directorio temporal en finally
Este paso es fundamental para evitar persistir datos sensibles y dejar archivos residuales.


148-165: Implementación de #getEjsonPrivateKey con SSM
Se simplifica la obtención de la clave privada usando this.provider.request, logrando una integración más limpia con AWS Parameter Store.

🧰 Tools
🪛 ESLint

[error] 151-151: Delete ··

(prettier/prettier)


[error] 152-152: Replace ··········WithDecryption:·true with ········WithDecryption:·true,

(prettier/prettier)


[error] 153-153: Delete ··

(prettier/prettier)


[error] 158-158: Replace "No·provided·private·key·for·decryption" with 'No·provided·private·key·for·decryption'

(prettier/prettier)


[error] 161-161: Delete ········

(prettier/prettier)


[error] 163-163: Delete ··

(prettier/prettier)

src/SecretsManager.js (6)

7-16: Constructor simplificado con provider de Serverless
Al eliminar la configuración manual de credenciales y usar serverless.getProvider('aws'), se reduce el riesgo de exponer secretos y se mejora la uniformidad con el resto del proyecto.

🧰 Tools
🪛 ESLint

[error] 9-9: Delete ·

(prettier/prettier)


[error] 12-12: Delete ·

(prettier/prettier)


24-28: getValues con provider.request
Se obtiene el valor del secreto llamando a getSecretValue. La conversión a JSON es correcta para deserializar el contenido guardado en Secrets Manager.

🧰 Tools
🪛 ESLint

[error] 24-24: Insert ·

(prettier/prettier)


37-40: Actualización de secretos mediante updateSecret
Utilizar JSON.stringify(newValues) garantiza la estructura correcta de los datos al enviarlos a Secrets Manager.

🧰 Tools
🪛 ESLint

[error] 38-38: Delete ·

(prettier/prettier)


49-64: Comprobación de existencia del secreto con listSecrets
La validación recorre la lista filtrada y confirma su coincidencia con secret.Name. Se trata de una verificación clara y robusta.

🧰 Tools
🪛 ESLint

[error] 52-52: Replace "name" with 'name'

(prettier/prettier)


77-77: Creación de secreto con createSecret
Iniciar el secreto con un objeto por defecto, { generated: true }, simplifica su posterior gestión o actualización.


87-89: Eliminación con deleteSecret y periodo de recuperación
Implementar RecoverWindowInDays permite restaurar el secreto en caso de eliminación accidental dentro de ese lapso.

index.js (2)

18-18: Verifica la coherencia de la configuración y el patrón de exclusión
Los nuevos campos ejson_file_path, ejson_key, ssm_prefix y la opción dry en la configuración proporcionan flexibilidad para manejar secretos. Asegúrate de que la propiedad exclude sea coherente con el skipPattern de la clase SyncSecret (línea 71 en el snippet relevante) si deseas mantener un comportamiento homogéneo al filtrar claves.

Also applies to: 20-22, 26-26


45-48: Valida el paso de parámetros a la clase Decrypt
Se pasan correctamente this.config.ejson_file_path, this.config.ejson_key y this.config.ssm_prefix. Confirma que estos valores no se exponen en ningún log y que el campo ejson_key no se registre de forma inadvertida.

Copy link
Copy Markdown

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

🧹 Nitpick comments (2)
README.md (2)

7-10: Sugerencia de estilo en "Multi-environment Support":
Considera revisar el término "Multi-environment Support". Dependiendo de las guías de estilo, podría escribirse sin guión (por ejemplo, "Multienvironment Support") para mayor coherencia.

🧰 Tools
🪛 LanguageTool

[misspelling] ~9-~9: This word is normally spelled as one.
Context: ...s secrets with AWS Secrets Manager. - Multi-environment Support: Manages different sets of se...

(EN_COMPOUNDS_MULTI_ENVIRONMENT)


77-79: Corrección gramatical en la sección de Ejecución:
La frase "The plugin will runs automatically" debería corregirse a "The plugin will run automatically" para asegurar la concordancia gramatical.

📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between e1ecbd2 and d65454b.

📒 Files selected for processing (2)
  • .github/workflows/pull_request.yml (2 hunks)
  • README.md (1 hunks)
🧰 Additional context used
🪛 LanguageTool
README.md

[misspelling] ~9-~9: This word is normally spelled as one.
Context: ...s secrets with AWS Secrets Manager. - Multi-environment Support: Manages different sets of se...

(EN_COMPOUNDS_MULTI_ENVIRONMENT)


[uncategorized] ~82-~82: This verb does not appear to agree with the subject. Consider using a different form.
Context: ...se). | ## Execution The plugin will runs automatically when executing the serve...

(AI_EN_LECTOR_REPLACEMENT_VERB_AGREEMENT)

🔇 Additional comments (4)
.github/workflows/pull_request.yml (3)

9-9: Actualización del entorno para el job Lint:
Se ha cambiado el valor de runs-on a ubuntu-22.04, lo que garantiza un entorno más específico y consistente.


26-26: Actualización del entorno para el job Commit Lint:
El cambio de runs-on a ubuntu-22.04 mejora la coherencia con el entorno definido para otros jobs.


44-44: Eliminación del job de tests:
Se ha eliminado el job de pruebas. Asegúrate de que esta decisión esté bien justificada y documentada, ya que la ausencia de pruebas podría permitir la introducción de errores sin ser detectados.

README.md (1)

1-123: Documento README aprobado:
El README.md está bien estructurado y proporciona información clara y ejemplos útiles para la configuración y el uso del plugin. Excelente trabajo en la documentación.

🧰 Tools
🪛 LanguageTool

[misspelling] ~9-~9: This word is normally spelled as one.
Context: ...s secrets with AWS Secrets Manager. - Multi-environment Support: Manages different sets of se...

(EN_COMPOUNDS_MULTI_ENVIRONMENT)


[uncategorized] ~82-~82: This verb does not appear to agree with the subject. Consider using a different form.
Context: ...se). | ## Execution The plugin will runs automatically when executing the serve...

(AI_EN_LECTOR_REPLACEMENT_VERB_AGREEMENT)

@ArielSantos01 ArielSantos01 merged commit 348bf69 into main Mar 20, 2025
3 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant