设置最小可行数据空间,以便在组织之间共享数据 - AWS Prescriptive Guidance

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

设置最小可行数据空间,以便在组织之间共享数据

由 Ramy Hcini(Think-it)、Ismail Abdellaoui(Think-it)、Malte Gasseling(Think-it)、豪尔赫·埃尔南德斯·苏亚雷斯(AWS)和迈克尔·米勒(AWS)创作

环境:PoC 或试点

技术:分析;容器和微服务;数据湖;数据库;基础架构

工作负载:开源

AWS 服务:亚马逊 Aurora;AWS Certifice Manager (ACM);AWS;亚马逊 EC2 CloudFormation;亚马逊 EFS;亚马逊 EKS;Elastic Load Balancing (ELB);亚马逊 RDS;亚马逊 S3;AWS Systems Manager

Summary

数据空间是用于数据交换的联合网络,其核心原则是信任和控制自己的数据。它们通过提供经济实惠且与技术无关的解决方案,使组织能够大规模共享、交换和协作处理数据。

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

这种模式将引导您了解两家公司如何在 Amazon Web Services (AWS) 上使用数据空间技术来推动其碳减排战略向前发展的示例。在这种情况下,X公司提供碳排放数据,Y公司使用这些数据。有关以下数据空间规范的详细信息,请参阅 “其他信息” 部分:

  • 参与者

  • 商业案例

  • 数据空间管理局

  • 数据空间组件

  • 数据空间服务

  • 要交换的数据

  • 数据模型

  • Tractus-X EDC 连接器

该模式包括以下步骤:

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

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

这种模式部署了一个 Kubernetes 集群,该集群将通过亚马逊 Elastic Kubernetes Service(亚马逊 EKS)托管数据空间连接器及其服务。

Eclipse 数据空间组件 (EDC) 控制平面和数据平面都部署在 A mazon 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 证书

  • 指向 Application Load Balancer 的 DNS 名称(ACM 证书必须覆盖 DNS 名称)

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

产品版本

限制

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

  • EDC 连接器构建 − 所选的部署解决方案依赖于 Tractus-X EDC Connect or Helm 图表,这是一个成熟且经过广泛测试的部署选项。之所以决定使用此图表,是因为它的常见用法以及在提供的版本中包含了基本的扩展。虽然 PostgreSQL HashiCorp 和 Vault 是默认组件,但您可以根据需要灵活地自定义自己的连接器构建。

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

  • 安全重点 − 重点是将安全配置抽象为默认规范,这样您就可以集中精力 EDC 连接器数据交换所涉及的步骤。尽管保留了默认的安全设置,但在将集群暴露给公共网络之前,必须启用安全通信。这种预防措施确保了安全数据处理的坚实基础。

  • 基础设施成本 ¿基础设施成本的估算值可通过以下方式找到AWS Pricing Calculator。一个简单的计算表明,部署的基础架构每月的成本可能高达162.92美元。

架构

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

DAPS 架构

下图显示了在由 Auto Scaling 组控制的 EC2 实例上运行的 DAPS。Application Load Balancer 和路由表公开 DAPS 服务器。Amazon Elastic File System(亚马逊 EFS)在 DAPS 实例之间同步数据。

亚马逊 EKS 架构

数据空间被设计为与技术无关的解决方案,并且存在多种实现方式。此模式使用 Amazon EKS 集群来部署数据空间技术组件。下图显示了 EKS 集群的部署情况。工作节点安装在私有子网中。Kubernetes 容器可以访问同样位于私有子网中的 PostgreSQL 版亚马逊关系数据库服务 (Amazon RDS) 实例。Kubernetes 容器在 Amazon S3 中存储共享数据。

工具

AWS 服务

其他工具

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

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

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

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

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

  • Postman 是一个 API 平台。

代码存储库

此模式的 Kubernetes 配置 YAML 文件和 Python 脚本可在 aws-patterns-edc 存储库中找到。 GitHub 该模式还使用 Tractus-X E DC 存储库。

最佳实践

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

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

在更现实的情况下,每个参与者都将在自己的集群中运行一个单独的 Kubernetes 集群。 AWS 账户共享基础设施(这种模式下的DAPS)将可供数据空间参与者访问,同时与参与者的基础设施完全分开。

操作说明

任务描述所需技能

克隆存储库。

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

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 工程师
任务描述所需技能

使用部署 DAPS AWS CloudFormation。

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

要安装 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它足够大,可以运行 DAPS 工作流程,该工作流程有三个 Docker 容器。

该模板将 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. 使用根用户在 EC2 实例上运行可用的脚本:

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

    bash scripts/register_connector.sh <provider_name>
  3. 注册消费者:

    bash scripts/register_connector.sh <consumer_name>

名称的选择不会影响后续步骤。我们建议使用providerconsumercompanyxcompanyy

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

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

  1. omejdn-daps/config/clients.ymlclient id为提供者和消费者获取。这些client id值是十六进制数字的长字符串。

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

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

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

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

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

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

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

DevOps 工程师
任务描述所需技能

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

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

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

最新版本使用托管身份钱包 (MIW) 和身份服务的分布式实现。

在你创建两个 Kubernetes 命名空间的工作站上,克隆 t ractusx-ed c 存储库,然后查看分支。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文件进行这些修改。此模式提供了此文件的最终修改版本供您使用。将其复制并放在文件的daps部分中charts/tractusx-connector/templates/_helpers.tpl

请务必在以下位置注释所有 DAPS 依赖项:charts/tractusx-connector/Chart.yaml

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

将连接器配置为在亚马逊 RDS 上使用 PostgreSQL。

(可选)此模式中不需要亚马逊关系数据库服务 (Amazon RDS) 实例。但是,我们强烈建议使用 Amazon RDS 或 Amazon Aurora,因为它们提供高可用性以及备份和恢复等功能。

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

  1. 预配置 Amazon RDS for PostgreSQL 实例

  2. 在中Chart.yaml,评论该PostgreSQL部分。

  3. provider_values.yml和中consumer_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 chart 文件夹,请运行以下命令:

    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 生成的身份证。CLIENT_ID应该在 DAPS 服务器/srv/mvds/omejdn-daps/config/clients.yml/config/clients.yml上。它应该是一串十六进制字符。

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

    • VAULT_TOKEN− 用于保管库授权的令牌。选择任意值。

    • vault.fullnameOverridevault-provider.

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

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

  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. 要格式化将添加到 Vault 中的密钥,请运行以下命令:

    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. 创建以下密钥:

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

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

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

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

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

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-edc 存储库中复制到 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 生成的身份证。CONSUMER_CLIENT_ID应该在 DAPS 服务器config/clients.yml上。

    • DAPS_URL− 与您用于提供商的 DAPS 网址相同。

    • VAULT_TOKEN− 用于保管库授权的令牌。选择任意值。

    • 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文件中的密钥名称。

保管库中密钥的名称是该secretNames:部分中密钥的值consumer_edc.yml file。默认情况下,它们的配置如下:

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. 要格式化将添加到 Vault 中的密钥,请运行以下命令:

    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/ 以访问消费者保管库,并使用概述的名称和内容创建机密。

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

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

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

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

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 工程师
任务描述所需技能

设置端口转发。

  1. 要检查 Pod 的状态,请运行以下命令:

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

    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 和私有访问密钥 pair 并妥善保管。在此 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 集合变量为您的请求提供输入。

应用程序开发人员、数据工程师
任务描述所需技能

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

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

  • 车辆类型:面包车;重量:< 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:ASSET_ID使用 EDC 连接器在创建后自动生成的 ID 更新 Postman 集合变量。

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

定义资产的使用政策。

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

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

  • 请求正文:

    • 连接器:提供商

    • 请求:创建策略

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

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

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

为资产及其使用政策定义 EDC 合同报价。

要允许其他参与者请求访问您的数据,请在合同中提供该数据,该合同规定了使用条件和权限:

  • 连接器:提供商

  • 请求:创建合同定义

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

应用程序开发人员、数据工程师
任务描述所需技能

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

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

在此基本设置中,您可以通过要求消费者连接器直接向提供商连接器请求可用资产目录来实现此目的。

  • 连接器:消费类

  • 请求:索取产品目录

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

    • CONTRACT_OFFER_ID-消费者想要协商的合同报价的ID

    • ASSET_ID-消费者想要协商的资产的ID

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

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

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

既然您已经确定了要消耗的资产,那么在消费者和提供商连接器之间启动合同谈判流程。

  • 连接器:消费类

  • 请求:合同谈判

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

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

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

应用程序开发人员、数据工程师
任务描述所需技能

使用来自 HTTP 端点的数据。

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

  • 连接器:消费类

  • 请求:合同谈判

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

  • 请求正文:更新请求正文,将其指定HTTP为 webhook 网址dataDestination旁边:

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

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

    收到的有效载荷类似于以下内容:

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

数据交换政策

默认使用政策

数据空间服务

服务

实施

其他信息

身份服务

动态属性配置系统 (DAPS)

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

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

发现服务

Gaia-X 联邦目录

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

要交换的数据

数据资产

描述

格式

碳排放数据

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

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

p@@ ubli c − 端口:8081 路径:/api/dataplane/control

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

metrics − 端口: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 镜像的更多见解,请参阅 Refactus-X EDC Helm 图表。

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