建立最小可行数据空间以在组织之间共享数据 - AWS 规范指引

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

建立最小可行数据空间以在组织之间共享数据

Ramy Hcini、Michael Miller 和 Jorge Hernandez Suarez,Amazon Web Services

Ismail Abdellaoui 和 Malte Gasseling,Think-it

Summary

数据空间是以信任与数据控制为核心原则的数据交换联合网络,通过提供经济实惠且与技术无关的解决方案,助力组织大规模共享、交换和协作处理数据。

通过使用数据驱动的问题解决 end-to-end方法,让所有相关利益相关者都参与其中,数据空间有可能显著推动可持续未来的努力。

此模式通过两个企业的实践范例,展示如何利用 Amazon Web Services(AWS)的数据空间技术推动其碳减排战略的实施。在此场景中,X 公司提供碳排放数据,Y 公司使用这些数据。有关以下数据空间规范的详细信息,请参阅其他信息部分:

  • 参与者

  • 业务案例

  • 数据空间管理局

  • 数据空间组件

  • 数据空间服务

  • 要交换的数据

  • 数据模型

  • Tractus-X EDC 连接器

此模式包括以下步骤:

  • 部署由两个参与者运行的基本数据空间所需的基础架构 AWS。

  • 通过连接器以安全的方式交换碳排放强度数据。

此模式将部署一个 Kubernetes 集群,通过 Amazon Elastic Kubernetes Service(Amazon EKS)托管数据空间连接器及其服务。

Eclipse 数据空间组件(EDC)控制面板和数据面板都部署在 Amazon EKS 上。官方的 Tractus-X Helm 图表将 PostgreSQL 和 Vault 服务部署为依赖项。 HashiCorp

此外,身份服务部署在亚马逊弹性计算云 (Amazon EC2) 上,以复制最小可行数据空间 (MVDS) 的现实生活场景。

先决条件和限制

先决条件

  • 在您选择 AWS 账户 的环境中部署基础架构 AWS 区域

  • 有权访问 Amazon S3 并暂时用作技术用户的 AWS Identity and Access Management (IAM) 用户(EDC 连接器目前不支持使用角色。 我们建议您专门为此演示创建一个 IAM 用户,该用户将拥有与之关联的有限权限。)

  • AWS Command Line Interface (AWS CLI) 已在您选择的设备中安装和配置 AWS 区域

  • AWS 安全凭证

  • 您的工作站上安装了 eksctl

  • 您的工作站上安装了 Git

  • kubectl

  • Helm

  • 邮差

  • AWS Certificate Manager (ACM) 证书 SSL/TLS

  • 指向应用程序负载均衡器的 DNS 名称(DNS 名称必须在 ACM 证书的覆盖范围内)

  • HashiCorp Vault(有关使用 AWS Secrets Manager 管理密钥的信息,请参阅 “其他信息” 部分。)

产品版本

限制

  • 连接器选择 ‒ 此部署使用基于 EDC 的连接器。但是,请务必考虑 EDCFIWARE True 连接器的优势和功能,以便做出符合具体部署需求的明智决策。

  • EDC 连接器结构 ‒ 所选的部署解决方案依赖于 Tractus-X EDC 连接器 Helm 图表,这是经过充分验证和广泛测试的部署选项。之所以决定使用此图表,是因为其应用广泛,并且所提供的版本中包含必要扩展。虽然 PostgreSQL HashiCorp 和 Vault 是默认组件,但您可以根据需要灵活地自定义自己的连接器构建。

  • 私有集群访问权限 − 仅限私有渠道访问部署的 EKS 集群。与集群的交互只能通过 kubectl 和 IAM 实现。可通过负载均衡器和域名启用对集群资源的公共访问,必须有选择地部署这些功能,才能将特定服务暴露给更广泛的网络。但是,我们不建议提供公共访问权限。

  • 安全重点 − 重点在于将安全配置抽象为默认规范,以便您能够专注于 EDC 连接器数据交换涉及的步骤。尽管保留了默认的安全设置,但在将集群暴露给公共网络之前,必须启用安全通信。这项预防措施为安全处理数据奠定了坚实的基础。

  • 基础设施成本 ‒ 可以使用 AWS Pricing Calculator 估算基础设施的成本。一个简单的计算表明,所部署基础设施每月的成本可能高达 162.92 美元。

架构

MVDS 架构包括两个虚拟私有云 (VPCs),一个用于动态属性配置系统 (DAPS) 身份服务,另一个用于 Amazon EKS。

DAPS 架构

下图显示了在由 Auto Scaling 组控制的 EC2 实例上运行的 DAPS。应用程序负载均衡器和路由表会公开 DAPS 服务器。Amazon Elastic File System(Amazon EFS)可在 DAPS 实例之间同步数据。

AWS Cloud architecture with VPC, public/private subnets, load balancer, and DAPS servers across two availability zones.

亚马逊 EKS 架构

数据空间是与技术无关的解决方案,有多种实施方案。此模式使用 Amazon EKS 集群部署数据空间技术组件。下图所示为 EKS 集群部署方案。Worker 节点安装在私有子网。Kubernetes 容器组(pod)会访问也位于私有子网中的 Amazon Relational Database Service(Amazon RDS)for PostgreSQL 实例。Kubernetes 容器组(pod)在 Amazon S3 中存储共享数据。

AWS Cloud architecture with VPC, public/private subnets, NAT gateways, and EKS 集群 across two availability zones.

工具

AWS 服务

其他工具

  • eksctl 是一款命令行实用程序,用于在 Amazon EKS 上创建和管理 Kubernetes 集群。

  • Git 是开源分布式版本控制系统。

  • HashiCorp Vault 提供安全存储,可控制凭据和其他敏感信息的访问权限。

  • Helm 是 Kubernetes 的开源软件包管理器,可帮助您在 Kubernetes 集群上安装和管理应用程序。

  • kubectl:针对 Kubernetes 集群运行命令的命令行界面。

  • Postman 是 API 平台。

代码存储库

存储库中提供了该模式的 Kubernetes 配置 YAML 文件和 Python 脚本。 GitHub aws-patterns-edc此模式还使用 Tractus-X EDC 存储库。

最佳实践

Amazon EKS 和参与者基础设施的隔离

在此模式中,Kubernetes 中的命名空间会将 X 公司提供者的基础设施与 Y 公司使用者的基础设施分开。有关更多信息,请参阅 EKS 最佳实践指南

在更现实的情境中,每位参与者都会在其自有 AWS 账户内运行独立的 Kubernetes 集群。共享基础设施(此模式中的 DAPS)将可供数据空间参与者访问,同时与参与者的基础设施完全分开。

操作说明

Task说明所需技能

克隆存储库。

要将存储库克隆到工作站,请运行以下命令:

git clone https://github.com/Think-iT-Labs/aws-patterns-edc

工作站必须有权访问您的 AWS 账户。

DevOps 工程师

预调配 Kubernetes 集群并设置命名空间。

要在您的账户中部署简化的默认 EKS 集群,请在克隆存储库的工作站上运行以下 eksctl 命令:

eksctl create cluster

此命令可创建跨越三个不同可用区的 VPC 以及私有和公有子网。创建网络层后,该命令将在一个 Auto Scaling 组中创建两个m5.large EC2 实例。

有关更多信息和输出示例,请参阅 eksctl 指南

预调配私有集群后,运行以下命令以将新的 EKS 集群添加到本地 Kubernetes 配置中:

aws eks update-kubeconfig --name <EKS CLUSTER NAME> --region <AWS REGION>

此模式使用eu-west-1 AWS 区域 来运行所有命令。但是,您可以根据自己的喜好运行相同的命令 AWS 区域。

要确认您的 EKS 节点是否正在运行并且处于就绪状态,请运行以下命令:

kubectl get nodes
DevOps 工程师

设置命名空间。

要为提供者和使用者创建命名空间,请运行以下命令:

kubectl create ns provider kubectl create ns consumer

在这种模式中,使用 providerconsumer 作为命名空间以适应下一步的配置,这一点非常重要。

DevOps 工程师
Task说明所需技能

使用部署 DAPS AWS CloudFormation。

为了便于管理 DAPS 操作,DAPS 服务器安装在实例上 EC2 。

要安装 DAPS,请使用 AWS CloudFormation 模板。您需要先决条件部分的 ACM 证书和 DNS 名称。模板会部署和配置以下资源:

  • 应用程序负载均衡器

  • 自动扩缩组

  • EC2 实例配置了用户数据以安装所有必需的软件包

  • IAM 角色

  • DAPS

您可以登录 AWS Management Console 并使用AWS CloudFormation 控制台来部署 AWS CloudFormation 模板。您也可以使用如下 AWS CLI 命令来部署模板:

aws cloudformation create-stack --stack-name daps \ --template-body file://aws-patterns-edc/cloudformation.yml --parameters \ ParameterKey=CertificateARN,ParameterValue=<ACM Certificate ARN> \ ParameterKey=DNSName,ParameterValue=<DNS name> \ ParameterKey=InstanceType,ParameterValue=<EC2 instance type> \ ParameterKey=EnvironmentName,ParameterValue=<Environment Name> --capabilities CAPABILITY_NAMED_IAM

环境名称由您自己选择。我们建议使用有意义的术语DapsInfrastructure,例如,因为它会反映在 AWS 资源标签中。

对于此模式,t3.small 足够大,可以运行有三个 Docker 容器的 DAPS 工作流。

该模板将 EC2 实例部署在私有子网中。这意味着我们无法通过 SSH(安全外壳)从互联网直接访问这些实例。这些实例已配置必要的 IAM 角色和 AWS Systems Manager 代理,以便能够通过会话管理器访问正在运行的 AWS Systems Manager实例,该功能为。

我们建议使用会话管理器进行访问。或者,您可以预调配堡垒主机以允许从互联网访问 SSH。使用堡垒主机方法时, EC2 实例可能需要几分钟才能开始运行。

成功部署 AWS CloudFormation 模板后,将 DNS 名称指向您的 Application Load Balancer DNS 名称。要确认这一点,请运行以下命令:

dig <DNS NAME>

此输出应当类似于如下所示:

; <<>> DiG 9.16.1-Ubuntu <<>> edc-pattern.think-it.io ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 42344 ;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 1 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 65494 ;; QUESTION SECTION: ;edc-pattern.think-it.io. IN A ;; ANSWER SECTION: edc-pattern.think-it.io. 276 IN CNAME daps-alb-iap9zmwy3kn8-1328773120.eu-west-1.elb.amazonaws.com. daps-alb-iap9zmwy3kn8-1328773120.eu-west-1.elb.amazonaws.com. 36 IN A 52.208.240.129 daps-alb-iap9zmwy3kn8-1328773120.eu-west-1.elb.amazonaws.com. 36 IN A 52.210.155.124
DevOps 工程师

将参与者的连接器注册到 DAPS 服务。

在为 DAPS 预置的任何 EC2 实例中,注册参与者:

  1. 使用 root 用户在 EC2 实例上运行可用的脚本:

    cd /srv/mvds/omejdn-daps
  2. 注册提供者:

    bash scripts/register_connector.sh <provider_name>
  3. 取消注册使用者:

    bash scripts/register_connector.sh <consumer_name>

名称的选择不影响后续步骤。我们建议使用 providerconsumer,或者使用 companyxcompanyy

注册命令还将使用从创建的证书和密钥中获取的必要信息,自动配置 DAPS 服务。

登录到 DAPS 服务器时,收集后续安装步骤所需的信息:

  1. omejdn-daps/config/clients.yml 中获取提供者和使用者的 client idclient id 值是由十六进制数字组成的长字符串。

  2. omejdn-daps/keys 目录中复制 consumer.certconsumer.keyprovider.certprovider.key 文件的内容。

我们建议将文本复制粘贴到工作站上以 daps- 为前缀的同名文件中。

您应该拥有提供者和 IDs 使用者的客户端,并且工作站的工作目录中应有四个文件:

  • 源文件名 consumer.cert 变更为工作站文件名 daps-consumer.cert

  • 源文件名 consumer.key 变更为工作站文件名 daps-consumer.key

  • 源文件名 provider.cert 变更为工作站文件名 daps-provider.cert

  • 源文件名 provider.key 变更为工作站文件名 daps-provider.key

DevOps 工程师
Task说明所需技能

克隆 Tractus-X EDC 存储库并使用 0.4.1 版本。

Tractus-X EDC 连接器的版本需要部署和使用 PostgreSQL(资产数据库)和 HashiCorp 保管库(机密管理)服务。

Tractus-X EDC Helm 图表有许多不同版本。此模式指定 0.4.1 版,因其使用 DAPS 服务器。

最新版本采用托管身份钱包(MIW),其身份服务以分布式架构实现。

在您创建了两个 Kubernetes 命名空间的工作站上,克隆 tractusx-edc 存储库,然后查看 release/0.4.1 分支。

git clone https://github.com/eclipse-tractusx/tractusx-edc cd tractusx-edc git checkout release/0.4.1
DevOps 工程师

配置 Tractus-X EDC Helm 图表。

修改 Tractus-X Helm 图表模板配置,使两个连接器能够相互协作。

为此,您需要将命名空间添加到服务的 DNS 名称中,以便集群中的其他服务可以对其进行解析。应对 charts/tractusx-connector/templates/_helpers.tpl 文件做这些修改。此模式提供了此文件的最终修改版本供您使用。请将其复制并放在文件 charts/tractusx-connector/templates/_helpers.tpldaps 部分。

请务必在 charts/tractusx-connector/Chart.yaml 为所有 DAPS 依赖项添加注释:

dependencies: # IDS Dynamic Attribute Provisioning Service (IAM) # - name: daps # version: 0.0.1 # repository: "file://./subcharts/omejdn" # alias: daps # condition: install.daps
DevOps 工程师

配置连接器以在 Amazon RDS 上使用 PostgreSQL。

(可选)此模式中不需要 Amazon Relational Database Service(Amazon RDS)实例。但是,我们强烈建议使用 Amazon RDS 或 Amazon Aurora,因为它们提供高可用性、备份和恢复等功能。

要将 Kubernetes 上的 PostgreSQL 替换为 Amazon RDS,请执行以下操作:

  1. 预调配 Amazon RDS for PostgreSQL 实例

  2. Chart.yaml 中,针对 PostgreSQL 部分添加注释。

  3. provider_values.ymlconsumer_values.yml 中,按如下方式配置 postgresql 部分:

postgresql: auth: database: edc password: <RDS PASSWORD> username: <RDS Username> jdbcUrl: jdbc:postgresql://<RDS DNS NAME>:5432/edc username: <RDS Username> password: <RDS PASSWORD> primary: persistence: enabled: false readReplicas: persistence: enabled: false
DevOps 工程师

配置和部署提供者连接器及其服务。

要配置提供者连接器及其服务,请执行以下操作:

  1. 要将 provider_edc.yaml 文件从 edc_helm_configs 目录下载到当前的 Helm 图表文件夹,请运行以下命令:

    wget -q https://raw.githubusercontent.com/Think-iT-Labs/aws-patterns-edc/main/edc_helm_configs/provider_edc.yaml> -P charts/tractusx-connector/

  2. 将以下变量(文件中亦有标记)替换为其值:

    • CLIENT_ID − DAPS 生成的 ID。CLIENT_ID 应位于 DAPS 服务器上的 /srv/mvds/omejdn-daps/config/clients.yml/config/clients.yml。该值应为十六进制字符串。

    • DAPS_URL − DAPS 服务器的 URL。它应该https://{DNS name}使用您在运行 AWS CloudFormation 模板时设置的 DNS 名称。

    • VAULT_TOKEN – 用于 Vault 授权的令牌。选择任意值。

    • vault.fullnameOverridevault-provider.

    • vault.hashicorp.urlhttp://vault-provider:8200/.

    前面的值假设部署名称和命名空间名称是提供者。

  3. 要从工作站运行 Helm 图表,请使用以下命令:

    cd charts/tractusx-connector helm dependency build helm upgrade --install provider ./ -f provider_edc.yaml -n provider
DevOps 工程师

将证书和密钥添加到提供者备份库。

为避免混淆,请在 tractusx-edc/charts 目录之外生成以下证书。

例如,运行以下命令以更改到主目录:

cd ~

现在,您需要将提供者所需的密钥添加到备份库中。

备份库中密钥的名称是 provider_edc.yml 文件 secretNames: 部分密钥的值。其配置默认如下:

secretNames: transferProxyTokenSignerPrivateKey: transfer-proxy-token-signer-private-key transferProxyTokenSignerPublicKey: transfer-proxy-token-signer-public-key transferProxyTokenEncryptionAesKey: transfer-proxy-token-encryption-aes-key dapsPrivateKey: daps-private-key dapsPublicKey: daps-public-key

首先生成高级加密标准(AES)密钥、私钥、公钥和自签名证书。这些随后会作为密钥添加到备份库中。

此外,此目录应包含您从 DAPS 服务器复制的 daps-provider.certdaps-provider.key 文件。

  1. 运行以下 命令:

    # generate a private key openssl ecparam -name prime256v1 -genkey -noout -out provider-private-key.pem # generate corresponding public key openssl ec -in provider-private-key.pem -pubout -out provider-public-key.pem # create a self-signed certificate openssl req -new -x509 -key provider-private-key.pem -out provider-cert.pem -days 360 # generate aes key openssl rand -base64 32 > provider-aes.key
  2. 在将密钥添加到备份库之前,请将换行符替换为 \n

    cat provider-private-key.pem | sed 's/$/\\\\n/'|tr -d '\\n' > provider-private-key.pem.line cat provider-public-key.pem | sed 's/$/\\\\n/'|tr -d '\\n' > provider-public-key.pem.line cat provider-cert.pem | sed 's/$/\\\\n/'|tr -d '\\n' > provider-cert.pem.line cat provider-aes.key | sed 's/$/\\\\n/'|tr -d '\\n' > provider-aes.key.line ## The following block is for daps certificate and key openssl x509 -in daps-provider.cert -outform PEM | sed 's/$/\\\\n/'|tr -d '\\n' > daps-provider.cert.line cat daps-provider.key | sed 's/$/\\\\n/'|tr -d '\\n' > daps-provider.key.line
  3. 要格式化将添加到备份库中的密钥,请运行以下命令:

    JSONFORMAT='{"content": "%s"}' #create a single line in JSON format printf "${JSONFORMAT}\\n" "`cat provider-private-key.pem.line`" > provider-private-key.json printf "${JSONFORMAT}\\n" "`cat provider-public-key.pem.line`" > provider-public-key.json printf "${JSONFORMAT}\\n" "`cat provider-cert.pem.line`" > provider-cert.json printf "${JSONFORMAT}\\n" "`cat provider-aes.key.line`" > provider-aes.json printf "${JSONFORMAT}\\n" "`cat daps-provider.key.line`" > daps-provider.key.json printf "${JSONFORMAT}\\n" "`cat daps-provider.cert.line`" > daps-provider.cert.json

    密钥现在采用 JSON 格式,可以随时添加到备份库中。

  4. 要获取备份库的容器组(pod)名称,请运行以下命令:

    kubectl get pods -n provider|egrep "vault|NAME"

    容器组(pod)名称将类似于 "vault-provider-0"。此名称用于创建指向备份库的端口转发。端口转发允许您访问备份库以添加密钥。您应该在配置了 AWS 凭证的工作站上运行它。

  5. 要访问备份库,请使用 kubectl 配置端口转发:

    kubectl port-forward <VAULT_POD_NAME> 8200:8200 -n provider

现在,您应该能够通过浏览器或 CLI 访问备份库。

浏览器

  1. 使用浏览器导航到 http://127.0.0.1:8200,这会使用您配置的端口转发。

  2. 使用您之前在 provider_edc.yml 中配置的令牌登录。在密钥引擎中,创建三个密钥。每个密钥都有一个 Path for this secret 值,即以下列表中显示的密钥名称。在 secret data 部分,密钥名称将是 content,值则是名为 .line 的对应文件中的一行文本。

  3. 密钥名称来自 provider_edc.yml 文件的 secretNames 部分。

  4. 创建以下密钥:

    • 含文件名 provider-private-key.pem.line 的密钥 transfer-proxy-token-signer-private-key

    • 含文件名 provider-cert.pem.line 的密钥 transfer-proxy-token-signer-public-key

    • 含文件名 provider-aes.key.line 的密钥 transfer-proxy-token-encryption-aes-key

    • 含文件名 daps-provider.key.line 的密钥 daps-private-key

    • 含文件名 daps-provider.cert.line 的密钥 daps-public-key

Vault CLI

CLI 也会使用您配置的端口转发。

  1. 在您的工作站上,按照保险柜文档中的说明安装 HashiCorp Vault CLI。

  2. 要使用您在 provider_edc.yml 中设置的令牌登录备份库,请运行以下命令:

    vault login -address=http://127.0.0.1:8200

    使用正确的令牌时,您应该会看到消息:"Success! You are now authenticated."

  3. 要使用之前创建的 JSON 格式的文件创建密钥,请运行以下代码:

    vault kv put -address=http://127.0.0.1:8200 secret/transfer-proxy-token-signer-private-key @provider-private-key.json vault kv put -address=http://127.0.0.1:8200 secret/transfer-proxy-token-signer-public-key @provider-cert.json vault kv put -address=http://127.0.0.1:8200 secret/transfer-proxy-token-encryption-aes-key @provider-aes.json vault kv put -address=http://127.0.0.1:8200 secret/daps-private-key @daps-provider.key.json vault kv put -address=http://127.0.0.1:8200 secret/daps-public-key @daps-provider.cert.json
DevOps 工程师

配置和部署使用者连接器及其服务。

配置和部署使用者的步骤与您为提供者完成的步骤类似:

  1. consumer_edc.yamlaws-patterns-edcrepo 中复制到 tractusx-edc/charts/tractusx-connecto r 文件夹,请运行以下命令:

    cd tractusx-edc wget -q https://raw.githubusercontent.com/Think-iT-Labs/aws-patterns-edc/main/edc_helm_configs/consumer_edc.yaml -P charts/tractusx-connector/
  2. 使用实际值更新以下变量:

    • CONSUMER_CLIENT_ID − DAPS 生成的 ID。CONSUMER_CLIENT_ID 应位于 DAPS 服务器上的 config/clients.yml

    • DAPS_URL − 与您用于提供者的 DAPS URL 相同。

    • VAULT_TOKEN – 用于 Vault 授权的令牌。选择任意值。

    • vault.fullnameOverridevault-consumer

    • vault.hashicorp.urlhttp://vault-provider:8200/

    前面的值假设部署名称和命名空间名称为 consumer

  3. 要运行 Helm 图表,请使用以下命令:

    cd charts/tractusx-connector helm upgrade --install consumer ./ -f consumer_edc.yaml -n consumer

将证书和密钥添加到使用者备份库。

出于安全考量,我们建议为每个数据空间参与者重新生成证书和密钥。此模式会为使用者重新生成证书和密钥。

这些步骤与适用于提供者的步骤非常类似。您可以验证 consumer_edc.yml 文件中的密钥名称。

备份库中密钥的名称是 consumer_edc.yml filesecretNames: 部分密钥的值。其配置默认如下:

secretNames: transferProxyTokenSignerPrivateKey: transfer-proxy-token-signer-private-key transferProxyTokenSignerPublicKey: transfer-proxy-token-signer-public-key transferProxyTokenEncryptionAesKey: transfer-proxy-token-encryption-aes-key dapsPrivateKey: daps-private-key dapsPublicKey: daps-public-key

您从 DAPS 服务器复制的 daps-consumer.certdaps-consumer.key 文件应该已经存在于此目录中。

  1. 运行以下 命令:

    # generate a private key openssl ecparam -name prime256v1 -genkey -noout -out consumer-private-key.pem # generate corresponding public key openssl ec -in consumer-private-key.pem -pubout -out consumer-public-key.pem # create a self-signed certificate openssl req -new -x509 -key consumer-private-key.pem -out consumer-cert.pem -days 360 # generate aes key openssl rand -base64 32 > consumer-aes.key
  2. 手动编辑文件以将换行符替换为 \n,或者使用三个如下所示的命令:

    cat consumer-private-key.pem | sed 's/$/\\\\n/'|tr -d '\\n' > consumer-private-key.pem.line cat consumer-public-key.pem | sed 's/$/\\\\n/'|tr -d '\\n' > consumer-public-key.pem.line cat consumer-cert.pem | sed 's/$/\\\\n/'|tr -d '\\n' > consumer-cert.pem.line cat consumer-aes.key | sed 's/$/\\\\n/'|tr -d '\\n' > consumer-aes.key.line cat daps-consumer.cert | sed 's/$/\\\\n/'|tr -d '\\n' > daps-consumer.cert.line cat daps-consumer.key | sed 's/$/\\\\n/'|tr -d '\\n' > daps-consumer.key.line
  3. 要格式化将添加到备份库中的密钥,请运行以下命令:

    JSONFORMAT='{"content": "%s"}' #create a single line in JSON format printf "${JSONFORMAT}\\n" "`cat consumer-private-key.pem.line`" > consumer-private-key.json printf "${JSONFORMAT}\\n" "`cat consumer-public-key.pem.line`" > consumer-public-key.json printf "${JSONFORMAT}\\n" "`cat consumer-cert.pem.line`" > consumer-cert.json printf "${JSONFORMAT}\\n" "`cat consumer-aes.key.line`" > consumer-aes.json printf "${JSONFORMAT}\\n" "`cat daps-consumer.key.line`" > daps-consumer.key.json printf "${JSONFORMAT}\\n" "`cat daps-consumer.cert.line`" > daps-consumer.cert.json

    密钥现在采用 JSON 格式,可以随时添加到备份库中。

  4. 要获取使用者备份库的容器组(pod)名称,请运行以下命令:

    kubectl get pods -n consumer | egrep "vault|NAME"

    容器组(pod)名称将类似于 "vault-consumer-0"。此名称用于创建指向备份库的端口转发。端口转发允许您访问备份库以添加密钥。您应该在配置了 AWS 凭据的工作站上运行它。

  5. 要访问备份库,请使用 kubectl 配置端口转发:

    kubectl port-forward <VAULT_POD_NAME> 8201:8200 -n consumer

这次的本地端口是 8201,因此您可以为生产者和使用者设置端口转发。

浏览器

您可以使用浏览器连接到 http://localhost:8201/ 以访问实用者备份库,并使用概述的名称和内容创建密钥。

包含内容的密钥和文件如下:

  • 含文件名 consumer-private-key.pem.line 的密钥 transfer-proxy-token-signer-private-key

  • 含文件名 consumer-cert.pem.line 的密钥 transfer-proxy-token-signer-public-key

  • 含文件名 consumer-aes.key.line 的密钥 transfer-proxy-token-encryption-aes-key

Vault CLI

通过 Vault CLI,您可以运行以下命令登录备份库并创建密钥:

  1. 使用您在 consumer_edc.yml 内配置的令牌登录备份库:

    vault login -address=http://127.0.0.1:8201

    使用正确的令牌时,您应该会看到消息:"Success! You are now authenticated."

  2. 要使用您之前创建的 JSON 格式的文件创建密钥,请运行以下代码:

    vault kv put -address=http://127.0.0.1:8201 secret/transfer-proxy-token-signer-private-key @consumer-private-key.json vault kv put -address=http://127.0.0.1:8201 secret/transfer-proxy-token-signer-public-key @consumer-cert.json vault kv put -address=http://127.0.0.1:8201 secret/transfer-proxy-token-encryption-aes-key @consumer-aes.json vault kv put -address=http://127.0.0.1:8201 secret/daps-private-key @daps-consumer.key.json vault kv put -address=http://127.0.0.1:8201 secret/daps-public-key @daps-consumer.cert.json
DevOps 工程师
Task说明所需技能

设置端口转发。

  1. 要检查容器组(pod)的状态,请运行以下命令:

    kubectl get pods -n provider kubectl get pods -n consumer
  2. 要确保 Kubernetes 部署成功,请运行以下命令,查看提供者和使用者 Kubernetes 容器组(pod)的日志:

    kubectl logs -n provider <producer control plane pod name> kubectl logs -n consumer <consumer control plane pod name>

集群是私有的,不能公开访问。要与连接器交互,请使用 Kubernetes 端口转发功能,将计算机生成的流量转发到连接器控制面板。

  1. 在第一个终端上,通过端口 8300 将使用者的请求转发到管理 API:

    kubectl port-forward deployment/consumer-tractusx-connector-controlplane 8300:8081 -n consumer
  2. 在第二个终端上,通过端口 8400 将提供者的请求转发到管理 API:

    kubectl port-forward deployment/provider-tractusx-connector-controlplane 8400:8081 -n provider
DevOps 工程师

为提供者和使用者创建 S3 存储桶。

EDC 连接器目前不使用临时 AWS 凭证,例如通过承担角色而提供的凭证。EDC 仅支持 IAM 访问密钥 ID 和秘密访问密钥组合

后续步骤需要两个 S3 存储桶。一个 S3 存储桶用于存储提供者提供的数据。另一个 S3 存储桶用于存储使用者接收的数据。

IAM 用户应仅被授予读取和写入两个指定存储桶中对象的权限。

需要创建并妥善保管访问密钥 ID 和秘密访问密钥对。在此 MVDS 停用后,应删除 IAM 用户。

以下代码是用户的 IAM 策略示例。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "Stmt1708699805237", "Action": [ "s3:GetObject", "s3:GetObjectVersion", "s3:ListAllMyBuckets", "s3:ListBucket", "s3:ListBucketMultipartUploads", "s3:ListBucketVersions", "s3:PutObject" ], "Effect": "Allow", "Resource": [ "arn:aws:s3:::<S3 Provider Bucket>", "arn:aws:s3:::<S3 Consumer Bucket>", "arn:aws:s3:::<S3 Provider Bucket>/*", "arn:aws:s3:::<S3 Consumer Bucket>/*" ] } ] }
DevOps 工程师

将 Postman 设置为与连接器交互。

现在,您可以通过 EC2 实例与连接器进行交互。使用 Postman 作为 HTTP 客户端,为提供者和使用者连接器提供 Postman 集合。

集合aws-pattern-edc存储库导入到您的 Postman 实例。

此模式使用 Postman 集合变量来为您的请求提供输入。

应用程序开发人员、数据工程师
Task说明所需技能

准备要共享的碳排放强度数据。

首先,您需要确定要共享的数据资产。X 公司的数据代表其车队的碳排放足迹。根据(WTW)测量,重量是以吨为单位的车辆总重(GVW),排放量以克/千米(g e CO2 /t-km)为单位: CO2 Wheel-to-Well

  • 车辆类型:面包车;重量:< 3.5;排放量:800

  • 车辆类型:城市卡车;重量:3.5−7.5;排放量:315

  • 车辆类型:中型货车(MGV);重量:7.5−20;排放量:195

  • 车辆类型:重型货车(HGV);重量:> 20;排放量:115

示例数据位于 aws-patterns-edc 存储库的 carbon_emissions_data.json 文件中。

X 公司使用 Amazon S3 存储对象。

创建 S3 存储桶,并将示例数据对象存储其中。以下命令可创建采用默认安全设置的 S3 存储桶。我们强烈建议您参阅 Amazon S3 安全最佳实践

aws s3api create-bucket <BUCKET_NAME> --region <AWS_REGION> # You need to add '--create-bucket-configuration # LocationConstraint=<AWS_REGION>' if you want to create # the bucket outside of us-east-1 region aws s3api put-object --bucket <BUCKET_NAME> \ --key <S3 OBJECT NAME> \ --body <PATH OF THE FILE TO UPLOAD>

S3 存储桶名称应全局唯一。有关命名规则的更多信息,请参阅 AWS 文档

数据工程师、应用程序开发人员

使用 Postman 将数据资产注册到提供者的连接器。

EDC 连接器数据资产包含数据名称及其位置信息。这种情况下,EDC 连接器数据资产将指向 S3 存储桶中创建的对象:

  • 连接器:提供者

  • 请求:创建资产

  • 集合变量:更新 ASSET_NAME。选择能代表资产的有意义的名称。

  • 请求正文:使用您为提供者创建的 S3 存储桶更新请求正文。

    "dataAddress": { "edc:type": "AmazonS3", "name": "Vehicle Carbon Footprint", "bucketName": "<REPLACE WITH THE SOURCE BUCKET NAME>", "keyName": "<REPLACE WITH YOUR OBJECT NAME>", "region": "<REPLACE WITH THE BUCKET REGION>", "accessKeyId": "<REPLACE WITH YOUR ACCESS KEY ID>", "secretAccessKey": "<REPLACE WITH SECRET ACCESS KEY>" }
  • 响应:成功的请求会返回创建时间和新创建资产的资产 ID。

    { "@id": "c89aa31c-ec4c-44ed-9e8c-1647f19d7583" }
  • 集合变量 ASSET_ID:使用 EDC 连接器在创建后自动生成的 ID 更新 Postman 集合变量 ASSET_ID

应用程序开发人员、数据工程师

定义资产的使用策略。

EDC 数据资产必须与明确的使用策略关联。首先,在提供者连接器中创建策略定义。

X 公司的策略是允许数据空间参与者使用碳排放足迹数据。

  • 请求正文:

    • 连接器:提供者

    • 请求:创建策略

    • 集合变量:使用策略名称更新 Policy Name 变量。

  • 响应:成功的请求会返回创建时间和新创建策略的策略 ID。使用 EDC 连接器在创建后生成的策略 ID 更新集合变量 POLICY_ID

应用程序开发人员、数据工程师

为资产及其使用策略定义 EDC 合同要约。

为允许其他参与者请求访问您的数据,请在合同中明确规定使用条件和权限:

  • 连接器:提供者

  • 请求:创建合同定义

  • 集合变量:使用合同要约或定义的名称更新 Contract Name 变量。

应用程序开发人员、数据工程师
Task说明所需技能

索取 X 公司共享的数据目录。

作为数据领域的数据使用者,Y 公司首先需要发现其他参与者正在共享的数据。

在此基本设置中,您可以要求使用者连接器直接向提供者连接器请求可用资产的目录,以达成此目的。

  • 连接器:使用者

  • 请求:索取目录

  • 响应:提供者提供的所有可用数据资产及其附带的使用策略。作为数据使用者,请查找您感兴趣的合同,并相应更新以下集合变量。

    • CONTRACT_OFFER_ID ‒ 使用者想要协商的合同要约的 ID

    • ASSET_ID ‒ 使用者想要协商的资产的 ID

    • PROVIDER_CLIENT_ID − 要与之协商的提供者连接器的 ID

应用程序开发人员、数据工程师

就 X 公司的碳排放强度数据启动合同协商

既然您已确定要使用的资产,请启动使用者连接器与提供者连接器之间的合同协商流程。

  • 连接器:使用者

  • 请求:合同协商

  • 集合变量:使用要与之协商的使用者连接器的 ID 更新 CONSUMER_CLIENT_ID 变量。

此过程可能需要一些时间才能达到“已验证”状态。

您可以使用 Get Negotiation 请求来检查合同协商的状态和相应的协议 ID。

应用程序开发人员、数据工程师
Task说明所需技能

使用来自 HTTP 端点的数据。

(选项 1)要使用 HTTP 数据面板来使用数据空间中的数据,可以使用 webhook.site 来模拟 HTTP 服务器,然后在使用者连接器中启动传输过程:

  • 连接器:使用者

  • 请求:合同协商

  • 集合变量:使用 EDC 连接器生成的合同协议的 ID 更新 Contract Agreement ID 变量。

  • 请求正文:更新请求正文,将 HTTP 指定为 webhook URL 旁边的 dataDestination

    { "dataDestination": { "type": "HttpProxy" }, "privateProperties": { "receiverHttpEndpoint": "<WEBHOOK URL>" } }

    连接器会将下载文件所需的信息直接发送到 webhook URL。

    收到的有效载荷如下所示:

    { "id": "dcc90391-3819-4b54-b401-1a005a029b78", "endpoint": "http://consumer-tractusx-connector-dataplane.consumer:8081/api/public", "authKey": "Authorization", "authCode": "<AUTH CODE YOU RECEIVE IN THE ENDPOINT>", "properties": { "https://w3id.org/edc/v0.0.1/ns/cid": "vehicle-carbon-footprint-contract:4563abf7-5dc7-4c28-bc3d-97f45e32edac:b073669b-db20-4c83-82df-46b583c4c062" } }

    使用收到的凭证获取提供者共享的 S3 资产。

在最后一步,您必须将请求发送到使用者数据面板(正确转发端口),如有效载荷(endpoint)中所述。

应用程序开发人员、数据工程师

直接使用 S3 存储桶中的数据。

(选项 2)将 Amazon S3 集成到 EDC 连接器中,并直接将使用者基础设施中的 S3 存储桶作为目标位置:

  • 请求正文:更新请求正文以将 S3 存储桶指定为 dataDestination。

    这应该是您之前创建的 S3 存储桶,用于存储使用者收到的数据。

    { "dataDestination": { "type": "AmazonS3", "bucketName": "{{ REPLACE WITH THE DESTINATION BUCKET NAME }}", "keyName": "{{ REPLACE WITH YOUR OBJECT NAME }}", "region": "{{ REPLACE WITH THE BUCKET REGION }}", "accessKeyId": "{{ REPLACE WITH YOUR ACCESS KEY ID }}", "secretAccessKey": "{{ REPLACE WITH SECRET ACCESS KEY }}" } } }
数据工程师、应用程序开发人员

问题排查

问题解决方案

连接器可能引发有关证书 PEM 格式的问题。

添加 \n,将每个文件的内容连接成一行。

相关资源

附加信息

数据空间规格

参与者

参与者

公司的描述

公司的重点

X 公司

运营一支横跨欧洲和南美的车队,用于运输各种货物。

旨在做出数据驱动型决策,以降低碳排放足迹强度。

Y 公司

环境监管机构

执行旨在监测和减轻企业及工业环境影响(包括碳排放强度)的环境法规和政策。

业务案例

X 公司使用数据空间技术与合规审计机构 Y 公司共享碳足迹数据,以评估和消除 X 公司物流运营对环境的影响。

数据空间管理局

数据空间管理局是一个由管理数据空间的组织组成的联盟。此模式中,X 公司和 Y 公司组成治理机构,代表联邦数据空间管理局。

数据空间组件

组件

选择的实施

附加信息

数据集交换协议

数据空间协议 0.8 版

数据空间连接器

Tractus-X EDC 连接器 0.4.1 版

数据交换策略

默认 USE 策略

数据空间服务

服务

实施

附加信息

身份服务

动态属性预调配系统(DAPS)

“动态属性预调配系统(DAPS)旨在确定组织和连接器的某些属性。因此,第三方无需信任后者,前提是他们信任 DAPS 断言。” — DAPS

为了专注于连接器的逻辑,数据空间是使用 Docker Compose 在亚马逊 EC2 计算机上部署的。

发现服务

Gaia-X 联邦目录

“联邦目录构成了 Gaia-X 自我描述的索引存储库,用于发现和选择提供商及其服务产品。自我描述是指参与者以属性和声明的形式提供的关于他们自身及其服务的信息。” — Gaia-X 生态系统 Kickstarter

要交换的数据

数据资产

说明

Format

碳排放量数据

整个车队中,不同车型在指定区域(欧洲和南美洲)内的强度值

JSON 文件

数据模型

{ "region": "string", "vehicles": [ // Each vehicle type has its Gross Vehicle Weight (GVW) category and its emission intensity in grams of CO2 per Tonne-Kilometer (g CO2 e/t-km) according to the "Well-to-Wheel" (WTW) measurement. { "type": "string", "gross_vehicle_weight": "string", "emission_intensity": { "CO2": "number", "unit": "string" } } ] }

Tractus-X EDC 连接器

有关每个 Tractus-X EDC 参数的文档,请参阅原始值文件

下表列出了所有服务及其对应的公开端口和端点,供参考。

服务名称

端口和路径

控制面板

●        管理 − 端口:8081 路径:/management

●        控制 − 端口:8083 路径:/control

●        协议 − 端口:8084 路径:/api/v1/dsp

●        指标 − 端口:9090 路径:/metrics

●        可观测性 − 端口:8085 路径:/observability

数据面板

默认 − 端口:8080 路径:/api

公共 ‒ 端口:8081 路径:/api/dataplane/control

代理 − 端口:8186 路径:/proxy

指标 ‒ 端口:9090 路径:/metrics

可观测性 ‒ 端口:8085 路径:/observability

文件库

端口:8200

PostgreSQL

端口:5432

使用 AWS Secrets Manager 管理器

可以使用 Secrets Manager 代替 HashiCorp Vault 作为密钥管理器。为此,您必须使用或构建 AWS Secrets Manager EDC 扩展。

您将负责创建和维护自己的映像,因为 Tractus-X 不支持 Secrets Manager。

为此,你需要通过引入你的 AWS Secrets Manager EDC 扩展来修改连接器的控制平面数据平面的构建 Gradle 文件(有关示例,请参阅此 maven 工件),然后构建、维护和引用 Docker 镜像。

有关重构 Tractus-X 连接器 Docker 映像的更多见解,请参阅 重构 Tractus-X EDC Helm 图表

为简单起见,我们避免以这种模式重建连接器映像,而是使用 HashiCorp Vault。