

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

# Recupere valores secretos
<a name="ipc-secret-manager"></a>

Utilice el servicio IPC del administrador secreto para recuperar los valores secretos de los secretos del dispositivo principal. El [componente administrador de secretos](secret-manager-component.md) se utiliza para implementar secretos cifrados en los dispositivos principales. A continuación, puede utilizar una operación de IPC para descifrar el secreto y utilizar su valor en los componentes personalizados.

**Topics**
+ [Versiones mínimas de SDK](#ipc-secret-manager-sdk-versions)
+ [Autorización](#ipc-secret-manager-authorization)
+ [GetSecretValue](#ipc-operation-getsecretvalue)
+ [Ejemplos](#ipc-secret-manager-examples)

## Versiones mínimas de SDK
<a name="ipc-secret-manager-sdk-versions"></a>

En la siguiente tabla se enumeran las versiones mínimas de las SDK para dispositivos con AWS IoT que debe utilizar para recuperar los valores secretos de los secretos del dispositivo principal.


| SDK | Versión mínima | 
| --- | --- | 
|  [SDK para dispositivos con AWS IoT para Java v2](https://github.com/aws/aws-iot-device-sdk-java-v2)  |  Versión 1.2.10  | 
|  [SDK para dispositivos con AWS IoT para Python v2](https://github.com/aws/aws-iot-device-sdk-python-v2)  |  Versión 1.5.3  | 
|  [SDK para dispositivos con AWS IoT para C\$1\$1 v2](https://github.com/aws/aws-iot-device-sdk-cpp-v2)  |  Versión 1.17.0  | 
|  [SDK para dispositivos con AWS IoT para JavaScript v2](https://github.com/aws/aws-iot-device-sdk-js-v2)  |  Versión 1.12.0  | 

## Autorización
<a name="ipc-secret-manager-authorization"></a>

Para usar el administrador de secretos en un componente personalizado, debe definir políticas de autorización que permitan a su componente obtener el valor de los secretos que almacena en el dispositivo principal. Para obtener información sobre cómo definir las políticas de autorización, consulte [Autorización de los componentes para realizar operaciones de IPC](interprocess-communication.md#ipc-authorization-policies).

Las políticas de autorización del administrador de secretos tienen las siguientes propiedades.

**Identificador de servicio IPC:** `aws.greengrass.SecretManager`


| Operación | Description (Descripción) | Recursos | 
| --- | --- | --- | 
|  `aws.greengrass#GetSecretValue` o `*`  |  Permite que un componente obtenga el valor de los secretos que están cifrados en el dispositivo principal.  |  Un ARN secreto de Secrets Manager, o `*` para permitir el acceso a todos los secretos.  | 

### Ejemplos de políticas de autorización
<a name="ipc-secret-manager-authorization-policy-examples"></a>

Puede consultar el siguiente ejemplo de política de autorización con el fin de configurar las políticas de autorización para sus componentes.

**Example Ejemplo de política de autorización**  
El siguiente ejemplo de política de autorización permite a un componente obtener el valor de cualquier secreto del dispositivo principal.  
En un entorno de producción, se recomienda reducir el alcance de la política de autorización para que el componente recupere solo los secretos que utiliza. Puede cambiar el `*` comodín por una lista de secretos ARNs al implementar el componente.

```
{
  "accessControl": {
    "aws.greengrass.SecretManager": {
      "com.example.MySecretComponent:secrets:1": {
        "policyDescription": "Allows access to a secret.",
        "operations": [
          "aws.greengrass#GetSecretValue"
        ],
        "resources": [
          "*"
        ]
      }
    }
  }
}
```

## GetSecretValue
<a name="ipc-operation-getsecretvalue"></a>

Obtiene el valor de un secreto que se almacena en el dispositivo principal.

Esta operación es similar a la operación de Secrets Manager, que puede utilizar para obtener el valor de un secreto en Nube de AWS. Para obtener más información, consulta [GetSecretValue](https://docs.aws.amazon.com/secretsmanager/latest/apireference/API_GetSecretValue.html) en la *AWS Secrets Manager Referencia de la API de *.

### Solicitud
<a name="ipc-operation-getsecretvalue-request"></a>

Esta solicitud de operación tiene los siguientes parámetros:

`refresh` (Python: `refresh`)  
(opcional): si se debe sincronizar el secreto solicitado con su último valor del AWS Secrets Manager servicio.  
Si se establece en true, el administrador de secretos solicitará al AWS Secrets Manager servicio el valor más reciente de la etiqueta secreta especificada y devolverá ese valor como respuesta. De lo contrario, se devolverá el valor secreto que estaba almacenado localmente.  
 Este parámetro no funcionará junto con el parámetro `versionId` en la solicitud. Este parámetro funciona cuando se utiliza junto con la versión 2.13.0 y posteriores del núcleo.

`secretId` (Python: `secret_id`)  
El nombre del secreto que se obtendrá. Puede especificar el Nombre de recurso de Amazon (ARN) o el nombre fácil de recordar del secreto.

`versionId` (Python: `version_id`)  
(Opcional) El ID de versión que se obtendrá.  
Puede especificar `versionId` o `versionStage`.  
Si no especifica `versionId` o `versionStage`, esta operación se establece de forma predeterminada en la versión con la etiqueta `AWSCURRENT`.

`versionStage` (Python: `version_stage`)  
(Opcional) La etiqueta de fase de la versión que se obtendrá.  
Puede especificar `versionId` o `versionStage`.  
Si no especifica `versionId` o `versionStage`, esta operación se establece de forma predeterminada en la versión con la etiqueta `AWSCURRENT`.

### Respuesta
<a name="ipc-operation-getsecretvalue-response"></a>

Esta respuesta de operación contiene la siguiente información:

`secretId` (Python: `secret_id`)  
El ID del secreto.

`versionId` (Python: `version_id`)  
El ID de esta versión del secreto.

`versionStage` (Python: `version_stage`)  
La lista de etiquetas de fase adjunta a la versión del secreto.

`secretValue` (Python: `secret_value`)  
El valor de esta versión del secreto. Este objeto, `SecretValue`, contiene la siguiente información.    
`secretString` (Python: `secret_string`)  
La parte descifrada de la información secreta protegida que proporcionó a Secrets Manager en forma de cadena.  
`secretBinary` (Python: `secret_binary`)  
(Opcional) La parte descifrada de la información secreta protegida que proporcionó a Secrets Manager como datos binarios en forma de matriz de bytes. Esta propiedad contiene los datos binarios como una cadena codificada en base64.  
Esta propiedad no se utiliza si creó el secreto en la consola de Secrets Manager.

### Ejemplos
<a name="ipc-operation-getsecretvalue-examples"></a>

En los ejemplos siguientes, se muestra cómo llamar a esta operación en código de componente personalizado.

------
#### [ Java (IPC client V1) ]

**Example Ejemplo: obtener un valor secreto**  
En este ejemplo, se utiliza una `IPCUtils` clase para crear una conexión con el servicio AWS IoT Greengrass Core IPC. Para obtener más información, consulte [Conéctese al AWS IoT Greengrass servicio Core IPC](interprocess-communication.md#ipc-service-connect).

```
package com.aws.greengrass.docs.samples.ipc;

import com.aws.greengrass.docs.samples.ipc.util.IPCUtils;
import software.amazon.awssdk.aws.greengrass.GetSecretValueResponseHandler;
import software.amazon.awssdk.aws.greengrass.GreengrassCoreIPCClient;
import software.amazon.awssdk.aws.greengrass.model.GetSecretValueRequest;
import software.amazon.awssdk.aws.greengrass.model.GetSecretValueResponse;
import software.amazon.awssdk.aws.greengrass.model.UnauthorizedError;
import software.amazon.awssdk.eventstreamrpc.EventStreamRPCConnection;

import java.util.Optional;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;

public class GetSecretValue {

    public static final int TIMEOUT_SECONDS = 10;

    public static void main(String[] args) {
        String secretArn = args[0];
        String versionStage = args[1];
        try (EventStreamRPCConnection eventStreamRPCConnection =
                     IPCUtils.getEventStreamRpcConnection()) {
            GreengrassCoreIPCClient ipcClient =
                    new GreengrassCoreIPCClient(eventStreamRPCConnection);
            GetSecretValueResponseHandler responseHandler =
                    GetSecretValue.getSecretValue(ipcClient, secretArn, versionStage);
            CompletableFuture<GetSecretValueResponse> futureResponse =
                    responseHandler.getResponse();
            try {
                GetSecretValueResponse response = futureResponse.get(TIMEOUT_SECONDS, TimeUnit.SECONDS);
                response.getSecretValue().postFromJson();
                String secretString = response.getSecretValue().getSecretString();
                System.out.println("Successfully retrieved secret value: " + secretString);
            } catch (TimeoutException e) {
                System.err.println("Timeout occurred while retrieving secret: " + secretArn);
            } catch (ExecutionException e) {
                if (e.getCause() instanceof UnauthorizedError) {
                    System.err.println("Unauthorized error while retrieving secret: " + secretArn);
                } else {
                    throw e;
                }
            }
        } catch (InterruptedException e) {
            System.out.println("IPC interrupted.");
        } catch (ExecutionException e) {
            System.err.println("Exception occurred when using IPC.");
            e.printStackTrace();
            System.exit(1);
        }
    }

    public static GetSecretValueResponseHandler getSecretValue(GreengrassCoreIPCClient greengrassCoreIPCClient, String secretArn, String versionStage) {
        GetSecretValueRequest getSecretValueRequest = new GetSecretValueRequest();
        getSecretValueRequest.setSecretId(secretArn);
        getSecretValueRequest.setVersionStage(versionStage);
        return greengrassCoreIPCClient.getSecretValue(getSecretValueRequest, Optional.empty());
    }
}
```

------
#### [ Python (IPC client V1) ]

**Example Ejemplo: obtener un valor secreto**  
En este ejemplo se supone que está utilizando la versión 1.5.4 o posterior de SDK para dispositivos con AWS IoT para Python v2. 

```
import json

import awsiot.greengrasscoreipc
from awsiot.greengrasscoreipc.model import (
    GetSecretValueRequest,
    GetSecretValueResponse,
    UnauthorizedError
)

secret_id = 'arn:aws:secretsmanager:us-west-2:123456789012:secret:MyGreengrassSecret-abcdef'
TIMEOUT = 10

ipc_client = awsiot.greengrasscoreipc.connect()

request = GetSecretValueRequest()
request.secret_id = secret_id
request.version_stage = 'AWSCURRENT'
operation = ipc_client.new_get_secret_value()
operation.activate(request)
future_response = operation.get_response()
response = future_response.result(TIMEOUT)
secret_json = json.loads(response.secret_value.secret_string)
# Handle secret value.
```

------
#### [ JavaScript ]

**Example Ejemplo: obtener un valor secreto**  

```
import {
    GetSecretValueRequest,
} from 'aws-iot-device-sdk-v2/dist/greengrasscoreipc/model';
import * as greengrasscoreipc from "aws-iot-device-sdk-v2/dist/greengrasscoreipc";
 
class GetSecretValue {
    private readonly secretId : string;
    private readonly versionStage : string;
    private ipcClient : greengrasscoreipc.Client
 
    constructor() {
        this.secretId = "<define_your_own_secretId>"
        this.versionStage = "<define_your_own_versionStage>"
 
        this.getSecretValue().then(r => console.log("Started workflow"));
    }
 
    private async getSecretValue() {
        try {
            this.ipcClient = await getIpcClient();
 
            const getSecretValueRequest : GetSecretValueRequest = {
                secretId: this.secretId,
                versionStage: this.versionStage,
            };
 
            const result = await this.ipcClient.getSecretValue(getSecretValueRequest);
            const secretString = result.secretValue.secretString;
            console.log("Successfully retrieved secret value: " + secretString)
        } catch (e) {
            // parse the error depending on your use cases
            throw e
        }
    }
}
 
export async function getIpcClient(){
    try {
        const ipcClient = greengrasscoreipc.createClient();
        await ipcClient.connect()
            .catch(error => {
                // parse the error depending on your use cases
                throw error;
            });
        return ipcClient
    } catch (err) {
        // parse the error depending on your use cases
        throw err
    }
}
 
const getSecretValue = new GetSecretValue();
```

------

## Ejemplos
<a name="ipc-secret-manager-examples"></a>

Utilice los siguientes ejemplos para aprender a utilizar el servicio IPC del administrador de secretos en sus componentes.

### Ejemplo: impresión del secreto (Python, cliente IPC V1)
<a name="ipc-secret-manager-example-print-secret-python"></a>

Este componente de ejemplo imprime el valor de un secreto que se implementa en el dispositivo principal.

**importante**  
Este componente de ejemplo imprime el valor de un secreto, así que utilícelo solo con los secretos que almacenan datos de prueba. No utilice este componente para imprimir el valor de un secreto que almacena información importante.

**Topics**
+ [Fórmula](#ipc-secret-manager-example-print-secret-python-recipe)
+ [Artefactos](#ipc-secret-manager-example-print-secret-python-artifacts)
+ [De uso](#ipc-secret-manager-example-print-secret-python-usage)

#### Fórmula
<a name="ipc-secret-manager-example-print-secret-python-recipe"></a>

La siguiente receta de ejemplo define un parámetro de configuración de ARN oculto y permite que el componente obtenga el valor de cualquier secreto del dispositivo principal.

**nota**  <a name="ipc-secret-manager-authorization-policy-resource-wildcard"></a>
En un entorno de producción, se recomienda reducir el alcance de la política de autorización para que el componente recupere solo los secretos que utiliza. Puede cambiar el `*` comodín por una lista de secretos ARNs al implementar el componente.

------
#### [ JSON ]

```
{
  "RecipeFormatVersion": "2020-01-25",
  "ComponentName": "com.example.PrintSecret",
  "ComponentVersion": "1.0.0",
  "ComponentDescription": "Prints the value of an AWS Secrets Manager secret.",
  "ComponentPublisher": "Amazon",
  "ComponentDependencies": {
    "aws.greengrass.SecretManager": {
      "VersionRequirement": "^2.0.0",
      "DependencyType": "HARD"
    }
  },
  "ComponentConfiguration": {
    "DefaultConfiguration": {
      "SecretArn": "",
      "accessControl": {
        "aws.greengrass.SecretManager": {
          "com.example.PrintSecret:secrets:1": {
            "policyDescription": "Allows access to a secret.",
            "operations": [
              "aws.greengrass#GetSecretValue"
            ],
            "resources": [
              "*"
            ]
          }
        }
      }
    }
  },
  "Manifests": [
    {
      "Platform": {
        "os": "linux"
      },
      "Lifecycle": {
        "install": "python3 -m pip install --user awsiotsdk",
        "Run": "python3 -u {artifacts:path}/print_secret.py \"{configuration:/SecretArn}\""
      }
    },
    {
      "Platform": {
        "os": "windows"
      },
      "Lifecycle": {
        "install": "py -3 -m pip install --user awsiotsdk",
        "Run": "py -3 -u {artifacts:path}/print_secret.py \"{configuration:/SecretArn}\""
      }
    }
  ]
}
```

------
#### [ YAML ]

```
---
RecipeFormatVersion: '2020-01-25'
ComponentName: com.example.PrintSecret
ComponentVersion: 1.0.0
ComponentDescription: Prints the value of a Secrets Manager secret.
ComponentPublisher: Amazon
ComponentDependencies:
  aws.greengrass.SecretManager:
    VersionRequirement: "^2.0.0"
    DependencyType: HARD
ComponentConfiguration:
  DefaultConfiguration:
    SecretArn: ''
    accessControl:
      aws.greengrass.SecretManager:
        com.example.PrintSecret:secrets:1:
          policyDescription: Allows access to a secret.
          operations:
            - aws.greengrass#GetSecretValue
          resources:
            - "*"
Manifests:
  - Platform:
      os: linux
    Lifecycle:
      install: python3 -m pip install --user awsiotsdk
      Run: python3 -u {artifacts:path}/print_secret.py "{configuration:/SecretArn}"
  - Platform:
      os: windows
    Lifecycle:
      install: py -3 -m pip install --user awsiotsdk
      Run: py -3 -u {artifacts:path}/print_secret.py "{configuration:/SecretArn}"
```

------

#### Artefactos
<a name="ipc-secret-manager-example-print-secret-python-artifacts"></a>

El siguiente ejemplo de aplicación de Python demuestra cómo utilizar el servicio IPC del administrador de secretos para obtener el valor de un secreto en el dispositivo principal.

```
import concurrent.futures
import json
import sys
import traceback

import awsiot.greengrasscoreipc
from awsiot.greengrasscoreipc.model import (
    GetSecretValueRequest,
    GetSecretValueResponse,
    UnauthorizedError
)

TIMEOUT = 10

if len(sys.argv) == 1:
    print('Provide SecretArn in the component configuration.', file=sys.stdout)
    exit(1)

secret_id = sys.argv[1]

try:
    ipc_client = awsiot.greengrasscoreipc.connect()

    request = GetSecretValueRequest()
    request.secret_id = secret_id
    operation = ipc_client.new_get_secret_value()
    operation.activate(request)
    future_response = operation.get_response()

    try:
        response = future_response.result(TIMEOUT)
        secret_json = json.loads(response.secret_value.secret_string)
        print('Successfully got secret: ' + secret_id)
        print('Secret value: ' + str(secret_json))
    except concurrent.futures.TimeoutError:
        print('Timeout occurred while getting secret: ' + secret_id, file=sys.stderr)
    except UnauthorizedError as e:
        print('Unauthorized error while getting secret: ' + secret_id, file=sys.stderr)
        raise e
    except Exception as e:
        print('Exception while getting secret: ' + secret_id, file=sys.stderr)
        raise e
except Exception:
    print('Exception occurred when using IPC.', file=sys.stderr)
    traceback.print_exc()
    exit(1)
```

#### De uso
<a name="ipc-secret-manager-example-print-secret-python-usage"></a>

Puede usar este componente de ejemplo con el [componente de administrador de secretos](secret-manager-component.md) para implementar e imprimir el valor de un secreto en su dispositivo principal.

**Cómo crear, implementar e imprimir un secreto de prueba**

1. Crear un secreto en Secrets Manager con datos de prueba.

------
#### [ Linux or Unix ]

   ```
   aws secretsmanager create-secret \
     --name MyTestGreengrassSecret \
     --secret-string '{"my-secret-key": "my-secret-value"}'
   ```

------
#### [ Windows Command Prompt (CMD) ]

   ```
   aws secretsmanager create-secret ^
     --name MyTestGreengrassSecret ^
     --secret-string '{"my-secret-key": "my-secret-value"}'
   ```

------
#### [ PowerShell ]

   ```
   aws secretsmanager create-secret `
     --name MyTestGreengrassSecret `
     --secret-string '{"my-secret-key": "my-secret-value"}'
   ```

------

   Guarde el ARN del secreto para utilizarlo en los pasos siguientes.

   Para obtener más información, consulte [Creación de un secreto](https://docs.aws.amazon.com/secretsmanager/latest/userguide/manage_create-basic-secret.html) en la *Guía del usuario de AWS Secrets Manager *.

1. Implemente el [componente de administrador de secretos](secret-manager-component.md) (`aws.greengrass.SecretManager`) con la siguiente actualización de combinación de configuraciones. Especifique el ARN del secreto que creó anteriormente.

   ```
   {
     "cloudSecrets": [
       {
         "arn": "arn:aws:secretsmanager:us-west-2:123456789012:secret:MyTestGreengrassSecret-abcdef"
       }
     ]
   }
   ```

   Para obtener más información, consulte [Implemente AWS IoT Greengrass componentes en los dispositivos](manage-deployments.md) o el [comando de implementación de la CLI de Greengrass](gg-cli-deployment.md).

1. Cree e implemente el componente de ejemplo de esta sección con la siguiente actualización de combinación de configuraciones. Especifique el ARN del secreto que creó anteriormente.

   ```
   {
     "SecretArn": "arn:aws:secretsmanager:us-west-2:123456789012:secret:MyTestGreengrassSecret",
     "accessControl": {
       "aws.greengrass.SecretManager": {
         "com.example.PrintSecret:secrets:1": {
           "policyDescription": "Allows access to a secret.",
           "operations": [
             "aws.greengrass#GetSecretValue"
           ],
           "resources": [
             "arn:aws:secretsmanager:us-west-2:123456789012:secret:MyTestGreengrassSecret-abcdef"
           ]
         }
       }
     }
   }
   ```

   Para obtener más información, consulte [Creación de componentes de AWS IoT Greengrass](create-components.md)

1. Consulte los registros del software AWS IoT Greengrass principal para comprobar que las implementaciones se han realizado correctamente y consulte el registro de `com.example.PrintSecret` componentes para ver impreso el valor secreto. Para obtener más información, consulte [Supervisión de los registros de AWS IoT Greengrass](monitor-logs.md).