翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
組織間でのデータ共有を目的として、最小実行可能データスペースを設定する
Amazon Web Services、Ramy Hcini、Michael Miller、Jorge Hernandez Suarez
Think-it、Ismail Abdellaoui、Malte Gasseling
概要
データスペースは、データ交換を目的としたフェデレーティッドネットワークであり、データの信頼と制御を基本原則としています。費用対効果が高く、テクノロジーに依存しないソリューションであるため、組織は大規模なデータの共有、交換、コラボレーションが可能になります。
データスペースは、関連するすべてのステークホルダーを巻き込んだエンドツーエンドのアプローチによる、データ駆動型の問題解決を通じて、持続可能な未来に向けた取り組みを大きく前進させる可能性を秘めています。
このパターンは、2 つの企業が Amazon Web Services (AWS) のデータスペーステクノロジーを使用して炭素排出量削減戦略を推進する方法の例を示しています。このシナリオでは、X 社は Y 社が消費する炭素排出量データを提供します。以下のデータスペース仕様の詳細については、「追加情報」セクションを参照してください。
参加者
ビジネスケース
データスペースの権限
データスペースコンポーネント
データスペースサービス
交換するデータ
データモデル
Tractus-X EDC コネクタ
このパターンには、以下のステップが含まれます。
このパターンは、Amazon Elastic Kubernetes Service (Amazon EKS) を通じてデータスペースコネクタとそのサービスをホストする Kubernetes クラスターをデプロイします。
Eclipse Dataspace Components (EDC) のコントロールプレーンおよびデータプレーンはどちらも Amazon EKS にデプロイされます。公式の Tractus-X Helm チャートは、依存サービスとして PostgreSQL と HashiCorp Vault をデプロイします。
さらに、ID サービスは Amazon Elastic Compute Cloud (Amazon EC2) にデプロイされ、最小実行可能なデータスペース (MVDS) の実際のシナリオをレプリケートします。
前提条件と制限
前提条件
製品バージョン
制限事項
コネクタの選択 – このデプロイでは、EDC ベースのコネクタを使用します。ただし、デプロイの特定のニーズに合った情報に基づいた意思決定を行うために、必ず EDC コネクタと FIWARE True コネクタの両方の長所と機能を考慮してください。
EDC コネクタビルド – 選択されたデプロイ方法は、実績があり、広範にテストされている Tractus-X EDC Connector の Helm チャートに基づいています。このチャートの採用理由は、一般的に広く利用されていることと、提供されているビルドに重要な拡張機能が含まれていることにあります。PostgreSQL と HashiCorp Vault はデフォルトコンポーネントですが、必要に応じて独自のコネクタビルドをカスタマイズすることも可能です。
プライベートクラスターアクセス – デプロイされた EKS クラスターへのアクセスはプライベートチャネルに制限されます。クラスターとのやり取りは、kubectl および IAM を使用したアクセスに限定されます。クラスターリソースへのパブリックアクセスは、ロードバランサーとドメイン名を使用することで有効化できます。ロードバランサーとドメイン名は、特定のサービスをより広範なネットワークに公開する際には選択的に実装してください。ただし、パブリックアクセスの提供は非推奨となっています。
セキュリティの焦点 – セキュリティ設定をデフォルトの仕様に抽象化することに重点を置いているため、EDC コネクタのデータ共有に関連するステップに集中できます。デフォルトのセキュリティ設定は維持されますが、クラスターをパブリックネットワークに公開する前に安全な通信を有効にすることが不可欠です。この予防策をとることで、データ処理を安全に行う基盤を確保できます。
インフラストラクチャコスト – インフラストラクチャの費用見積もりは、AWS 料金見積りツール を使用して確認できます。単純計算においては、デプロイするインフラストラクチャ費用は 1 か月あたりで最大 162.92 USD になる場合があります。
アーキテクチャ
MVDS アーキテクチャは、2 つの仮想プライベートクラウド (VPCs) で構成されます。1 つは動的属性プロビジョニングシステム (DAPS) ID サービス用、もう 1 つは Amazon EKS 用です。
DAPS アーキテクチャ
次の図は、Auto Scaling グループが制御する EC2 インスタンスで実行される DAPS を示しています。Application Load Balancer とルートテーブルは DAPS サーバーを公開します。Amazon Elastic File System (Amazon EFS) は DAPS インスタンス間でデータを同期します。
Amazon EKS アーキテクチャ
データスペースはテクノロジーに依存しないソリューションとして設計されており、複数の実装があります。このパターンでは、Amazon EKS クラスターを使用してデータスペースの技術コンポーネントをデプロイします。次の図は、EKS クラスターのデプロイを示しています。ワーカーノードはプライベートサブネットにインストールされます。Kubernetes ポッドは、プライベートサブネットにも存在する Amazon Relational Database Service (Amazon RDS) for PostgreSQL インスタンスにアクセスします。Kubernetes ポッドは、共有データを Amazon S3 に保存します。
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 Best Practices Guides」をご確認ください。
実際の状況では、各参加者は独自の AWS アカウント内で個別の Kubernetes クラスターを実行することになります。共有インフラストラクチャ (このパターンでは DAPS) は、データスペース参加者のインフラとは完全に分離されながらも、参加者によるアクセスは可能となります。
エピック
| タスク | 説明 | 必要なスキル |
|---|
リポジトリのクローン作成 | ワークステーションでリポジトリのクローンを作成するには、次のコマンドを実行してください。 git clone https://github.com/Think-iT-Labs/aws-patterns-edc
ワークステーションは にアクセスできる必要があります AWS アカウント。 | DevOps エンジニア |
Kubernetes クラスターをプロビジョニングし、名前空間を設定します。 | アカウントに簡略化されたデフォルトの EKS クラスターをデプロイするには、リポジトリをクローンしたワークステーションで次の eksctl コマンドを実行します。 eksctl create cluster
コマンドは VPC と 3 つの異なるアベイラビリティーゾーンにまたがる、プライベートサブネットとパブリックサブネットを作成します。ネットワークレイヤーが作成されると、コマンドは Auto Scaling グループ内に 2 つの 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
このパターンでは、次のステップの設定に合わせて名前空間として provider と consumer を使用する必要があります。 | DevOps エンジニア |
| タスク | 説明 | 必要なスキル |
|---|
を使用して DAPS をデプロイします AWS CloudFormation。 | DAPS オペレーションの管理を容易にするために、DAPS サーバーが EC2 インスタンスにインストールされています。 DAPS をインストールするには AWS CloudFormation テンプレートを使用します。前提条件セクションの ACM 証明書と DNS 名が必要です。テンプレートを使用して以下のリソースの構成とデプロイを行います。 AWS CloudFormation テンプレートをデプロイするには、 にサインイン AWS マネジメントコンソール し、 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
任意の環境名を設定してください。 AWS リソースタグに反映DapsInfrastructureされるため、 などの意味のある用語を使用することをお勧めします。 このパターンの場合、3 つの Docker コンテナを持つ DAPS ワークフローを実行するのに t3.small のサイズは十分です。 テンプレートは EC2 インスタンスをプライベートサブネットにデプロイします。つまり、インスタンスはインターネットから SSH (Secure Shell) 経由で直接アクセスすることはできません。インスタンスは、 の一機能である Session Manager を介して実行中のインスタンスへのアクセスを可能にするために必要な IAM ロールと AWS Systems Manager エージェントでプロビジョニングされます AWS Systems Manager。 アクセスには Session 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 インスタンス内から、参加者を登録します。 ルートユーザーを使用して、EC2 インスタンスで使用可能なスクリプトを実行します。 cd /srv/mvds/omejdn-daps
プロバイダーを登録します。 bash scripts/register_connector.sh <provider_name>
コンシューマーを登録します。 bash scripts/register_connector.sh <consumer_name>
選択した名称が次の手順に影響することはありません。provider と consumer、または companyx とcompanyy の使用を推奨します。 また、登録コマンドは作成した証明書とキーから取得した情報を使用し、DAPS サービスの自動設定を行います。 DAPS サーバーへログインした状態で、後のインストール手順で必要になる情報を収集します。 omejdn-daps/config/clients.yml からプロバイダーとコンシューマーの client id を取得します。client id 値は 16 進数の長い文字列です。
omejdn-daps/keys ディレクトリから consumer.cert、consumer.key、provider.cert、provider.key のファイルに含まれる内容をコピーします。
ワークステーション内に daps- という接頭辞を付けた同一名称のファイルを作成し、コピーしたテキストをそこへ貼り付けるようにしてください。 プロバイダーとコンシューマー双方のクライアント ID、およびワークステーションの作業ディレクトリに以下の 4 ファイルを用意してください。 ソースファイル名 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 チャートにはバージョンが複数存在します。このパターンでは DAPS サーバーを使用するため、バージョン 0.4.1 を指定します。 最新バージョンでは、ID サービスの分散実装で Managed Identity Wallet (MIW) を使用します。 2 つの 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.tpl の daps セクションに配置します。 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 を使用することを強くお勧めします。 PostgreSQL on Kubernetes を Amazon RDS に置き換えるには、次の手順を実行します。 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 エンジニア |
プロバイダーコネクタとそのサービスを設定してデプロイします。 | プロバイダーコネクタとそのサービスを設定するには、以下を実行します。 edc_helm_configs ディレクトリから現在の Helm チャートフォルダに provider_edc.yaml ファイルをダウンロードするには、次のコマンドを実行します。
wget -q https://raw.githubusercontent.com/Think-iT-Labs/aws-patterns-edc/main/edc_helm_configs/provider_edc.yaml> -P charts/tractusx-connector/
以下の変数 (ファイル上にマークがされます) を値に置き換えます。 CLIENT_ID – DAPS が生成する ID。CLIENT_ID は DAPS サーバー上の /srv/mvds/omejdn-daps/config/clients.yml/config/clients.yml から取得できます。16 進数文字の文字列である必要があります。
DAPS_URL – DAPS サーバーの URL。 AWS CloudFormation テンプレートの実行時に設定した DNS 名https://{DNS name}を使用している必要があります。
VAULT_TOKEN – ボールト認証に使用するトークン。値を選択します。
vault.fullnameOverride ‒ vault-provider.
vault.hashicorp.url ‒ http://vault-provider:8200/.
前の値は、デプロイ名と名前空間名がプロバイダーであることを前提としています。 ワークステーションから 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
Advanced Encryption Standard (AES) キー、プライベートキー、パブリックキー、および自己署名証明書がまず生成されます。その後、シークレットとしてボールトに追加されます。 さらに、このディレクトリには DAPS サーバーからコピーした daps-provider.cert および daps-provider.key ファイルが含まれている必要があります。 以下の コマンドを実行します。 # 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
ボールトにシークレットを追加する前に、改行を \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
ボールトに追加されるシークレットをフォーマットするには、次のコマンドを実行します。 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 形式となり、ボールトに追加できる状態になります。 ボールトのポッド名を取得するには、次のコマンドを実行します。 kubectl get pods -n provider|egrep "vault|NAME"
ポッド名は "vault-provider-0" と類似の値になります。この名前は、ボールトに転送されるポートを作成するときに使用されます。ポートフォワードを使用すると、ボールトにアクセスしてシークレットを追加できます。これは、AWS 認証情報が設定されたワークステーションから実行する必要があります。 ボールトにアクセスするには、kubectl を使用してポートフォワードを設定します。 kubectl port-forward <VAULT_POD_NAME> 8200:8200 -n provider
これで、ブラウザまたは CLI からボールトにアクセスできるようになります。 ブラウザ ブラウザを使用して、設定したポートフォワードを使用する http://127.0.0.1:8200 に移動します。 provider_edc.yml で事前に設定したトークンを使用してログインしてください。シークレットエンジンで、3 つのシークレットを作成します。それぞれのシークレットは Path for this secret というシークレット名を保有しています。各名称を以下のリストで示します。secret data セクション内においてキー名称は content となり、値には、対応する .line という名前のファイルに含まれる 1 行テキストが設定されます。
シークレット名は、provider_edc.yml ファイルの secretNames セクションから取得されます。 次のシークレットを作成します。 ファイル名 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
ボールト CLI CLI は、設定したポートフォワードも使用します。 HashiCorp Vault ドキュメントの指示に従い、ワークステーションで Vault CLI をインストールします。 provider_edc.yml で設定したトークンを使用してボールトにログインするには、次のコマンドを実行します。
vault login -address=http://127.0.0.1:8200
正しいトークンを使用すると「"Success! You are now authenticated."」というメッセージが表示されます。 次のコードを実行して、事前に作成した 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 エンジニア |
コンシューマーコネクタとそのサービスを設定してデプロイします。 | コンシューマーを設定してデプロイする手順は、プロバイダーに対して完了した手順と同一です。 aws-patterns-edc リポジトリから tractusx-edc/charts/tractusx-connector フォルダに consumer_edc.yaml をコピーするには、次のコマンドを実行します。 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/
次の変数を実際の値で更新します。 CONSUMER_CLIENT_ID – DAPS が生成する ID。CONSUMER_CLIENT_ID は DAPS サーバーの config/clients.yml から取得できます。
DAPS_URL – プロバイダーに使用したのと同じ DAPS URL。
VAULT_TOKEN – ボールト認証に使用するトークン。値を選択します。
vault.fullnameOverride ‒ vault-consumer
vault.hashicorp.url ‒ http://vault-provider:8200/
前の値は、デプロイ名と名前空間名が consumer であることを前提としています。 Helm チャートを実行するには、次のコマンドを使用します。 cd charts/tractusx-connector
helm upgrade --install consumer ./ -f consumer_edc.yaml -n consumer
| |
証明書とキーをコンシューマーボールトに追加します。 | セキュリティの観点から、各データスペース参加者の証明書とキーを再生成することをお勧めします。このパターンでは、コンシューマーの証明書とキーを再生成します。 プロバイダーでの手順と同一です。consumer_edc.yml ファイル内のシークレット名を確認できます。 ボールト内のシークレットの名前は、consumer_edc.yml file の 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
DAPS サーバーからコピーした daps-consumer.cert および daps-consumer.key ファイルは、このディレクトリに既に存在している必要があります。 以下の コマンドを実行します。 # 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
ファイルを手動で編集して改行を \n に置き換えるか、次のような 3 つのコマンドを使用します。 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
ボールトに追加されるシークレットをフォーマットするには、次のコマンドを実行します。 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 形式となり、ボールトに追加できる状態になります。 コンシューマーボールトのポッド名を取得するには、次のコマンドを実行します。 kubectl get pods -n consumer | egrep "vault|NAME"
ポッド名は "vault-consumer-0" と類似の値になります。この名前は、ボールトに転送されるポートを作成するときに使用されます。ポートフォワードを使用すると、ボールトにアクセスしてシークレットを追加できます。これは、 AWS 認証情報が設定されたワークステーションから実行する必要があります。 ボールトにアクセスするには、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
ボールト CLI ボールト CLI を使用すると、次のコマンドを実行してボールトにログインし、シークレットを作成できます。 consumer_edc.yml 内で設定したトークンを使用してボールトにログインします。
vault login -address=http://127.0.0.1:8201
正しいトークンを使用すると「"Success! You are now authenticated."」というメッセージが表示されます。 次のコードを実行して、事前に作成した 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 エンジニア |
| タスク | 説明 | 必要なスキル |
|---|
ポート転送を設定します。 | 次のコマンドを実行して、ポッドのステータスを確認します。 kubectl get pods -n provider
kubectl get pods -n consumer
Kubernetes デプロイが成功したことを確認するには、次のコマンドを実行して、プロバイダーとコンシューマーの Kubernetes ポッドのログを確認します。 kubectl logs -n provider <producer control plane pod name>
kubectl logs -n consumer <consumer control plane pod name>
クラスターはプライベートであるため、パブリックにアクセスすることはできません。コネクタを操作するには、Kubernetes ポート転送機能を使用して、マシンによって生成されたトラフィックをコネクタコントロールプレーンに転送します。 最初のターミナルで、コンシューマーのリクエストをポート 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 とシークレットアクセスキーの組み合わせの使用のみに対応しています。 後のステップでは 2 つの S3 バケットを使用します。S3 バケットは、ひとつをプロバイダーが利用できるデータを保存するために使用します。もうひとつの S3 バケットは、コンシューマーが受信したデータ用に使用します。 IAM ユーザーには、2 つの名前付きバケット内のオブジェクトのみを読み書きするアクセス許可が必要です。 アクセスキー 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 コレクション変数を使用してリクエストに入力を提供します。 | アプリ開発者、データエンジニア |
| タスク | 説明 | 必要なスキル |
|---|
X 社が共有するデータカタログをリクエストします。 | データスペースのデータコンシューマーとして、Y 社はまず他の参加者によって共有されているデータを検出する必要があります。 この基本セットアップでは、プロバイダーコネクタから使用可能なアセットのカタログを、直接リクエストするようコンシューマーコネクタに依頼することで、これを行うことができます。 | アプリ開発者、データエンジニア |
X 社からの炭素排出量データの契約交渉を開始します。 | 消費するアセットを特定したら、コンシューマーコネクタとプロバイダーコネクタの間で契約交渉プロセスを開始します。 プロセスが [VERIFIED] の状態になるまでに時間がかかる場合があります。 Get Negotiation リクエストを使用することで、契約の交渉状況と対応する契約 ID を確認できます。
| アプリ開発者、データエンジニア |
| タスク | 説明 | 必要なスキル |
|---|
HTTP エンドポイントからデータを使用します。 | (オプション 1) HTTP データプレーンを使用してデータスペース内のデータを消費するには、webhook.site を使用して HTTP サーバーをエミュレートし、コンシューマーコネクタで転送プロセスを開始します。 コネクタ: コンシューマー リクエスト: 契約交渉 コレクション変数: Contract Agreement ID 変数を EDC コネクタが生成した契約 ID で更新します。 リクエスト本文: リクエスト本文を更新して、ウェブフック URL とあわせて HTTP を dataDestination と指定します。 {
"dataDestination": {
"type": "HttpProxy"
},
"privateProperties": {
"receiverHttpEndpoint": "<WEBHOOK URL>"
}
}
コネクタは、ファイルのダウンロードに必要な情報をウェブフック 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 を追加して、各ファイルの内容を 1 行に連結します。
|
関連リソース
追加情報
データスペースの仕様
参加者
Participant | 会社の説明 | 会社の焦点 |
|---|
会社 X | 欧州と南米で車両フリートを運用し、さまざまな商品を輸送します。 | 炭素排出量を抑えるために、データ駆動型の意思決定を行うことを目指します。 |
会社 Y | 環境規制当局 | 環境規制とポリシーを適用し、炭素排出量など、企業や業界が環境に与える影響の監視・軽減を目指します。 |
ビジネスケース
X 社は、データスペーステクノロジーを使用して炭素排出量データをコンプライアンス監査者である Y 社と共有し、X 社の物流業務による環境への影響を評価して対処します。
データスペースの権限
データスペース機関は、データスペースを管理する組織のコンソーシアムです。このパターンでは、X 社と Y 社の両方がガバナンス組織を形成し、フェデレーティッドデータスペースの権限を表します。
データスペースコンポーネント
コンポーネント | 選択した実装 | 追加情報 |
|---|
データセット交換プロトコル | Dataspace Protocol バージョン 0.8 | |
データスペースコネクタ | Tractus-X EDC コネクタバージョン 0.4.1 | |
データ交換ポリシー | デフォルト USE ポリシー | |
データスペースサービス
サービス | 実装 | 追加情報 |
|---|
ID サービス | 動的属性プロビジョニングシステム (DAPS) | 「動的属性プロビジョニングシステム (DAPS) には、組織とコネクタに対する特定の属性を確認する意図があります。したがって、第三者は DAPS アサーションを信頼している限り、後者を信頼する必要はありません。」 – DAPS コネクタのロジックに焦点を当てるために、データスペースは Docker Compose を使用して Amazon EC2 マシンにデプロイされます。 |
検出サービス | Gaia–X Federated Catalogue | 「Federated Catalogue は、Gaia–X Self–Descriptions のインデックス付きリポジトリで構成され、プロバイダーとそのサービス提供の検出と選択を可能にします。Self–Descriptions は参加者によりプロパティとクレームの形式で提供され、参加者自身とサービスについての情報を伝えます。」 – Gaia–X Ecosystem 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 パブリック – ポート: 8081 パス: /api/dataplane/control プロキシ – ポート: 8186 パス: /proxy メトリクス – ポート: 9090 パス: /metrics オブザーバビリティ – ポート: 8085 パス: /observability |
ボールト | ポート: 8200 |
[PostgreSQL] | ポート: 5432 |
AWS Secrets Manager Manager の使用
HashiCorp Vault の代わりに Secrets Manager をシークレットマネージャーとして使用できます。そのためには、 は、 を使用するか、または " AWS Secrets Manager 拡張機能を構築する必要があります。
Tractus-X は Secrets Manager をサポートしていないため、独自イメージの作成と保守はお客様の責任となります。
そのためには、コントロールプレーンとコネクタのデータプレーンの両方のビルド Gradle ファイルを変更する必要があります。そのためには、 という拡張子 (例についてはこの Maven アーティファクトを参照) AWS Secrets Manager を導入し、Docker イメージを構築、保守、参照します。
Tractus-X コネクタの Docker イメージのリファクタリングについて、詳しくは「Refactor Tractus-X EDC Helm charts」をご確認ください。
理解しやすくする目的で、本パターンではコネクタイメージの再構築は行わず、HashiCorp Vault を使用しています。