組織間でのデータ共有を目的として、最小実行可能データスペースを設定する - AWS 規範ガイダンス

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

組織間でのデータ共有を目的として、最小実行可能データスペースを設定する

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 コネクタ

このパターンには、以下のステップが含まれます。

  • 2 人の参加者が実行されている基本的なデータスペースに必要なインフラストラクチャをデプロイします AWS。

  • コネクタを安全に使用し、炭素排出量と強度のデータを交換します。

このパターンは、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) の実際のシナリオをレプリケートします。

前提条件と制限

前提条件

  • 選択した にインフラストラクチャをデプロイ AWS アカウント するアクティブな AWS リージョン

  • 技術ユーザーとして一時的に使用される Amazon S3 にアクセスできる AWS Identity and Access Management (IAM) ユーザー (現在、 " コネクタはロールの使用をサポートしていません。 このデモ専用の IAM ユーザーを 1 人作成し、このユーザーには限定されたアクセス許可が関連付けられることをお勧めします)。

  • 選択した に AWS Command Line Interface (AWS CLI) がインストールされ、設定されている AWS リージョン

  • AWS セキュリティ認証情報

  • ワークステーションの eksctl

  • ワークステーションの Git

  • kubectl

  • Helm

  • ポストマン

  • AWS Certificate Manager (ACM) SSL/TLS 証明書

  • Application Load Balancer を指す DNS 名 (DNS 名は ACM 証明書でカバーされている必要があります)

  • HashiCorp ボールト ( AWS Secrets Manager を使用してシークレットを管理する方法については、「追加情報」セクションを参照してください)。

製品バージョン

制限事項

  • コネクタの選択 – このデプロイでは、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 インスタンス間でデータを同期します。

AWS クラウド architecture with VPC, public/private subnets, load balancer, and DAPS servers across two availability zones.

Amazon EKS アーキテクチャ

データスペースはテクノロジーに依存しないソリューションとして設計されており、複数の実装があります。このパターンでは、Amazon EKS クラスターを使用してデータスペースの技術コンポーネントをデプロイします。次の図は、EKS クラスターのデプロイを示しています。ワーカーノードはプライベートサブネットにインストールされます。Kubernetes ポッドは、プライベートサブネットにも存在する Amazon Relational Database Service (Amazon RDS) for PostgreSQL インスタンスにアクセスします。Kubernetes ポッドは、共有データを Amazon S3 に保存します。

AWS クラウド architecture with VPC, public/private subnets, NAT gateways, and EKS クラスター across two availability zones.

ツール

AWS サービス

  • AWS CloudFormation は、 AWS リソースをセットアップし、迅速かつ一貫してプロビジョニングし、 AWS アカウント および リージョン全体のライフサイクルを通じてリソースを管理するのに役立ちます。

  • Amazon Elastic Compute Cloud (Amazon EC2) は、 AWS クラウドでスケーラブルなコンピューティング容量を提供します。仮想サーバーを必要な数だけ起動して、迅速にスケールアップまたはスケールダウンができます。

  • Amazon Elastic File System (Amazon EFS) は、 AWS クラウドでの共有ファイルシステムの作成と設定に役立ちます。

  • Amazon Elastic Kubernetes Service (Amazon EKS) を使用すると、独自の Kubernetes コントロールプレーンやノードをインストールまたは維持 AWS することなく、 で Kubernetes を実行できます。

  • Amazon Simple Storage Service (Amazon S3) は、あらゆる量のデータを保存、保護、取得できるクラウドベースのオブジェクトストレージサービスです。

  • ELB (ELB) は、受信アプリケーションまたはネットワークトラフィックを複数のターゲットに分散します。例えば、1 つ以上のアベイラビリティーゾーンの EC2 インスタンス、コンテナ、IP アドレスにトラフィックを分散できます。

その他のツール

  • 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

このパターンでは、次のステップの設定に合わせて名前空間として providerconsumer を使用する必要があります。

DevOps エンジニア
タスク説明必要なスキル

を使用して DAPS をデプロイします AWS CloudFormation。

DAPS オペレーションの管理を容易にするために、DAPS サーバーが EC2 インスタンスにインストールされています。

DAPS をインストールするには AWS CloudFormation テンプレートを使用します。前提条件セクションの ACM 証明書と DNS 名が必要です。テンプレートを使用して以下のリソースの構成とデプロイを行います。

  • Application Load Balancer

  • Auto Scaling グループ

  • 必要なすべてのパッケージをインストールするためのユーザーデータで設定された EC2 インスタンス

  • IAM ロール

  • DAPS

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 インスタンス内から、参加者を登録します。

  1. ルートユーザーを使用して、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 id を取得します。client id 値は 16 進数の長い文字列です。

  2. omejdn-daps/keys ディレクトリから consumer.certconsumer.keyprovider.certprovider.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.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 を使用することを強くお勧めします。

PostgreSQL on Kubernetes を Amazon RDS に置き換えるには、次の手順を実行します。

  1. Amazon RDS for PostgreSQL インスタンスをプロビジョニングする

  2. Chart.yamlPostgreSQL セクションをコメントします。

  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. 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/

  2. 以下の変数 (ファイル上にマークがされます) を値に置き換えます。

    • 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.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

Advanced Encryption Standard (AES) キー、プライベートキー、パブリックキー、および自己署名証明書がまず生成されます。その後、シークレットとしてボールトに追加されます。

さらに、このディレクトリには DAPS サーバーからコピーした daps-provider.cert および daps-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. ボールトのポッド名を取得するには、次のコマンドを実行します。

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

    ポッド名は "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 で事前に設定したトークンを使用してログインしてください。シークレットエンジンで、3 つのシークレットを作成します。それぞれのシークレットは Path for this secret というシークレット名を保有しています。各名称を以下のリストで示します。secret data セクション内においてキー名称は content となり、値には、対応する .line という名前のファイルに含まれる 1 行テキストが設定されます。

  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

ボールト CLI

CLI は、設定したポートフォワードも使用します。

  1. HashiCorp Vault ドキュメントの指示に従い、ワークステーションで 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. 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/
  2. 次の変数を実際の値で更新します。

    • CONSUMER_CLIENT_ID – DAPS が生成する ID。CONSUMER_CLIENT_ID は DAPS サーバーの config/clients.yml から取得できます。

    • DAPS_URL – プロバイダーに使用したのと同じ DAPS URL。

    • 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 ファイル内のシークレット名を確認できます。

ボールト内のシークレットの名前は、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.cert および daps-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 に置き換えるか、次のような 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
  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. コンシューマーボールトのポッド名を取得するには、次のコマンドを実行します。

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

    ポッド名は "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

ボールト CLI

ボールト 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. 次のコマンドを実行して、ポッドのステータスを確認します。

    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. 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 社のデータは、車両フリートの炭素排出量を表します。重量はトン単位の車両総重量 (GVW) で、排出量は Wheel-to-Well (WTW) 測定値に基づく 1 トン/キロメートル (g CO2 e/t-km) あたりの CO2 のグラム単位です。

  • 車両タイプ: バン、重量: < 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: Postman コレクション変数 ASSET_ID を、作成後に EDC コネクタによって自動的に生成された ID で更新します。

アプリ開発者、データエンジニア

アセットの使用ポリシーを定義します。

EDC データアセットは、明確な使用ポリシーに関連付ける必要があります。まず、プロバイダーコネクタでポリシー定義を作成します。

X 社の目的は、データスペースの参加者が炭素排出量データを使用できるようにすることです。

  • リクエスト本文:

    • コネクタ: プロバイダー

    • リクエスト: ポリシーの作成

    • コレクション変数: ポリシーの名前で Policy Name 変数を更新します。

  • レスポンス: リクエストが成功すると、作成された時刻と新しく作成されたポリシーのポリシー ID が返されます。作成後に EDC コネクタが生成したポリシーの ID でコレクション変数 POLICY_ID を更新します。

アプリ開発者、データエンジニア

アセットとその使用ポリシーの EDC 契約オファーを定義します。

他の参加者がデータへのアクセスをリクエストできるようにするには、使用状況とアクセス許可を指定する契約でデータを提供します。

  • コネクタ: プロバイダー

  • リクエスト: 契約定義の作成

  • コレクション変数: Contract Name 変数を契約オファーまたは定義の名前で更新します。

アプリ開発者、データエンジニア
タスク説明必要なスキル

X 社が共有するデータカタログをリクエストします。

データスペースのデータコンシューマーとして、Y 社はまず他の参加者によって共有されているデータを検出する必要があります。

この基本セットアップでは、プロバイダーコネクタから使用可能なアセットのカタログを、直接リクエストするようコンシューマーコネクタに依頼することで、これを行うことができます。

  • コネクタ: コンシューマー

  • リクエスト: リクエストカタログ

  • レスポンス: プロバイダーから利用可能なすべてのデータアセットと、アタッチされた使用ポリシー。データコンシューマーは、関心のある契約を探し、それに応じて以下のコレクション変数を更新します。

    • CONTRACT_OFFER_ID – コンシューマーが交渉したい契約オファーの ID

    • ASSET_ID – コンシューマーが交渉したいアセットの ID

    • PROVIDER_CLIENT_ID – 交渉するプロバイダーコネクタの ID

アプリ開発者、データエンジニア

X 社からの炭素排出量データの契約交渉を開始します。

消費するアセットを特定したら、コンシューマーコネクタとプロバイダーコネクタの間で契約交渉プロセスを開始します。

  • コネクタ: コンシューマー

  • リクエスト: 契約交渉

  • コレクション変数: 交渉するコンシューマーコネクタの ID で CONSUMER_CLIENT_ID 変数を更新します。

プロセスが [VERIFIED] の状態になるまでに時間がかかる場合があります。

Get Negotiation リクエストを使用することで、契約の交渉状況と対応する契約 ID を確認できます。

アプリ開発者、データエンジニア
タスク説明必要なスキル

HTTP エンドポイントからデータを使用します。

(オプション 1) HTTP データプレーンを使用してデータスペース内のデータを消費するには、webhook.site を使用して HTTP サーバーをエミュレートし、コンシューマーコネクタで転送プロセスを開始します。

  • コネクタ: コンシューマー

  • リクエスト: 契約交渉

  • コレクション変数: Contract Agreement ID 変数を EDC コネクタが生成した契約 ID で更新します。

  • リクエスト本文: リクエスト本文を更新して、ウェブフック URL とあわせて HTTPdataDestination と指定します。

    { "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 を使用しています。