本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
擷取秘密值
使用密碼管理員IPC服務從核心裝置上的密碼擷取密碼值。您可以使用 Secret Manager 元件將加密的密碼部署到核心裝置。然後,您可以使用IPC作業來解密密碼,並在自訂元件中使用其值。
最低SDK版本
下表列出從核心裝置上 AWS IoT Device SDK 的密碼擷取秘密值所必須使用的最低版本。
授權
若要在自訂元件中使用密碼管理員,您必須定義授權原則,以允許元件取得儲存在核心裝置上的密碼值。如需有關定義授權原則的資訊,請參閱授權元件執行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": [
"*"
]
}
}
}
}
GetSecretValue
取得您儲存在核心裝置上的密碼值。
此作業類似於 Secrets Manager 作業,您可以用來取得中密碼的值 AWS 雲端。如需詳細資訊,請參閱〈AWS Secrets Manager API參考〉GetSecretValue中的〈〉。
請求
此操作的請求具有以下參數:
refresh
(Python:refresh
)
-
(可選):是否將請求的密碼與其來自 AWS Secrets Manager 服務的最新值同步。
當設置為 true,秘密管理器將請求指定密鑰標籤的最新值的 AWS Secrets Manager 服務,並返回該值作為響應。否則,將返回存儲在本地的密碼值。
此參數不會與請求中的versionId
參數一起使用。
secretId
(Python:secret_id
)
-
要獲得的秘密的名稱。您可以指定 Amazon 資源名稱 (ARN) 或機密的易記名稱。
versionId
(Python:version_id
)
-
(選擇性) 要取得的版本 ID。
您可指定為 versionId
或 versionStage
。
如果未指定versionId
或versionStage
,則此作業預設為帶有AWSCURRENT
標籤的版本。
versionStage
(Python:version_stage
)
-
(選擇性) 要取得之版本的暫存標籤。
您可指定為 versionId
或 versionStage
。
如果未指定versionId
或versionStage
,則此作業預設為帶有AWSCURRENT
標籤的版本。
回應
此作業的回應包含下列資訊:
secretId
(Python:secret_id
)
-
密碼的識別碼。
versionId
(Python:version_id
)
-
此密碼版本的識別碼。
versionStage
(Python:version_stage
)
-
附加至此密碼版本的暫存標籤清單。
secretValue
(Python:secret_value
)
-
這個版本的密碼的值。此物件SecretValue
包含下列資訊。
secretString
(Python:secret_string
)
-
您以字串形式提供給 Secret Secrets Manager 之受保護機密資訊的解密部分。
secretBinary
(Python:secret_binary
)
-
(選擇性) 受保護機密資訊的解密部分,您以位元組陣列的二進位資料形式提供給 Secrets Manager。此內容包含以 base64 編碼字串的二進位資料。
如果您在秘密管理員主控台中建立密碼,則不會使用此屬性。
範例
下列範例示範如何在自訂元件程式碼中呼叫此作業。
- Java (IPC client V1)
-
範例:取得秘密值
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)
-
範例:取得秘密值
這個範例假設您使用的是適用 AWS IoT Device SDK 於 Python v2 的 1.5.4 版或更新版本。
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
-
範例:取得秘密值
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();
範例
使用下列範例來瞭解如何在元件中使用 Secret Manager 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": [
{
"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}"
成品
下面的實例 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)
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)
用量
您可以將這個範例元件與 secret Manager 元件搭配使用,在核心裝置上部署和列印密碼的值。
若要建立、部署和列印測試密碼
-
使用測試資料建立密碼管理員密碼。
- 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"}'
在以下步驟中保存要使用的密碼。ARN
若要取得更多資訊,請參閱《AWS Secrets Manager 使用指南》中的〈建立密碼〉。
-
使用下列組態合併更新部署秘密管理員元件 (aws.greengrass.SecretManager
)。指定ARN您先前建立的密碼。
{
"cloudSecrets": [
{
"arn": "arn:aws:secretsmanager:us-west-2:123456789012:secret:MyTestGreengrassSecret-abcdef
"
}
]
}
如需詳細資訊,請參閱將AWS IoT Greengrass元件部署到裝置或 Greengrass CLI 部署指令。
-
使用下列組態合併更新,在本節中建立及部署範例元件。指定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 IoT Greengrass 元件
-
檢視 AWS IoT Greengrass 核心軟體記錄檔以確認部署是否成功,並檢視com.example.PrintSecret
元件記錄以查看列印的密碼值。如需詳細資訊,請參閱監控AWS IoT Greengrass日誌。