检索密钥值 - AWS IoT Greengrass
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

检索密钥值

使用密钥管理器 IPC 服务从核心设备上的密钥中检索密钥值。您可以使用 Secret Manager 组件将加密密钥部署到核心设备。然后,您可以使用 IPC 操作解密密钥并在自定义组件中使用其值。

Authorization

要在自定义组件中使用密钥管理器,您必须定义授权策略,以允许组件获取存储在核心设备上的密钥值。有关定义授权策略的信息,请参阅授权组件执行 IPC 操作

密钥管理器的授权策略具有以下属性。

IPC 服务标识符: aws.greengrass.SecretManager

操作 描述 资源

aws.greengrass#GetSecretValue*

允许组件获取核心设备上加密的密钥值。

Secrets Manager 密钥 ARN,或*允许访问所有密钥。

例 授权策略示例

以下示例授权策略允许组件获取核心设备上任何密钥的值。

注意

在生产中,我们建议您缩小授权策略的范围,以便组件只能检索它使用的密钥。在部署组件时,您可以将 * 通配符更改为密钥 ARNs列表。

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

Operations

使用以下操作获取密钥的值。

GetSecretValue

获取您存储在核心设备上的密钥的值。

此操作类似于 Secrets Manager 操作,您可以使用该操作在 AWS 云中获取密钥的值。有关更多信息,请参阅AWS Secrets Manager API 参考》中的 GetSecretValue

Request

此操作的请求具有以下参数:

secretId

要获取的密钥的名称。您可以指定 Amazon 资源名称 (ARN) 或密钥的友好名称。

versionId

(可选)要获取的版本的 ID。

您可以指定 versionIdversionStage

如果未指定 versionIdversionStage,则此操作默认为具有 AWSCURRENT 标签的版本。

versionStage

(可选)要获取的版本的暂存标签。

您可以指定 versionIdversionStage

如果未指定 versionIdversionStage,则此操作默认为具有 AWSCURRENT 标签的版本。

Response

此操作的响应包含以下信息:

secretId

密钥的 ID。

versionId

此密钥版本的 ID。

versionStage

附加到此密钥版本的暂存标签的列表。

secretValue

此密钥版本的值。此对象 SecretValue包含以下信息。

secretString

您以字符串形式提供给 Secrets Manager 的受保护密钥信息的解密部分。

secretBinary

(可选)您作为二进制数据以字节数组的形式提供给 Secrets Manager 的受保护密钥信息的解密部分。此属性包含二进制数据作为 base64 编码字符串。

如果您在 Secrets Manager 控制台中创建了密钥,则不会使用该属性。

Examples

以下示例演示如何在自定义组件代码中调用此操作。

Java

例 示例:获取密钥值

String secretId = "arn:aws:secretsmanager:us-west-2:123456789012:secret:MyGreengrassSecret-abcdef"; String versionStage = "AWSCURRENT"; int TIMEOUT = 10; GetSecretValueRequest request = new GetSecretValueRequest(); request.setSecretId(secretId); request.setVersionStage(versionStage); CompletableFuture<GetSecretValueResponse> futureResponse = greengrassCoreIPCClient .getSecretValue(request, Optional.empty()).getResponse(); GetSecretValueResponse result = futureResponse.get(TIMEOUT, TimeUnit.SECONDS); result.getSecretValue().postFromJson(); // Set the SecretValue's internal union. String secretString = result.getSecretValue().getSecretString(); # Handle secret value.
Python

例 示例:获取密钥值

注意

此示例假定您使用的是适用于 Python v2 的 AWS IoT IoT 设备开发工具包版本 1.5.4 或更高版本。如果您使用的是开发工具包的版本 1.5.3,请参阅使用适用于 Python 的 AWS IoT 设备开发工具包 v2,以了解有关连接到 AWS AWS IoT Greengrass 核心 IPC 服务的信息。

注意

此示例假定您使用的是适用于 Python v2 的 AWS IoT IoT 设备开发工具包版本 1.5.4 或更高版本。如果您使用的是开发工具包的版本 1.5.3,请参阅使用适用于 Python 的 AWS IoT 设备开发工具包 v2,以了解有关连接到 AWS AWS IoT Greengrass 核心 IPC 服务的信息。

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) futureResponse = operation.get_response() response = futureResponse.result(TIMEOUT) secret_json = json.loads(response.secret_value.secret_string) # Handle secret value.

Examples

使用以下示例了解如何在您的组件中使用密钥管理器 IPC 服务。

此示例组件打印您部署到核心设备的密钥的值。

重要

此示例组件打印密钥的值,因此,请仅将其用于存储测试数据的密钥。请勿使用此组件打印存储重要信息的密钥的值。

Recipe

以下示例配方定义一个密钥 ARN 配置参数,并允许 组件获取核心设备上任何密钥的值。

注意

在生产中,我们建议您缩小授权策略的范围,以便组件只能检索它使用的密钥。在部署组件时,您可以将 * 通配符更改为密钥 ARNs列表。

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": [ { "Lifecycle": { "Run": "python3 -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 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: - Lifecycle: Run: python3 -u {artifacts:path}/print_secret.py '{configuration:/SecretArn}'

Artifacts

以下示例 Python 应用程序演示如何使用密钥管理器 IPC 服务获取核心设备上的密钥值。

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) futureResponse = operation.get_response() try: response = futureResponse.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)

Usage

您可以将此示例组件与 Secret Manager 组件一起使用,以在核心设备上部署和打印密钥的值。

创建、部署和打印测试密钥

  1. 使用测试数据创建 Secrets Manager 密钥。

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

    保存密钥的 ARN,以便在以下步骤中使用。

    有关更多信息,请参阅AWS Secrets Manager 用户指南》中的“创建密钥”。

  2. 使用以下配置合并更新部署 Secret Manager 组件aws.greengrass.SecretManager)。指定您之前创建的密钥的 ARN。

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

    有关更多信息,请参阅将 AWS AWS IoT Greengrass 组件部署到设备Greengrass CLI 部署命令

  3. 使用以下配置合并更新创建和部署此部分中的示例组件。指定您之前创建的密钥的 ARN。

    { "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" ] } } } }

    有关更多信息,请参阅 创建自定义 AWS AWS IoT Greengrass 组件

  4. 查看 AWS AWS IoT Greengrass 核心软件日志以验证部署是否成功,并查看com.example.PrintSecret组件日志以查看打印的密钥值。有关更多信息,请参阅 查看 AWS IoT IoT Greengrass 核心软件日志查看组件日志