Amazon Web Services ブログ

AWS CDKを使用したAmazon EC2上でのEthereumノードバリデーターの自動展開

この記事は、Automate Ethereum node validator deployment on Amazon EC2 using AWS CDKを翻訳したものです。

イーサリアムは、スマートコントラクト機能を持つ分散型のオープンソースブロックチェーンです。 Beacon chain(ETH2)は、イーサリアムのアップグレード版で、イーサリアムのエコシステムにプルーフ・オブ・ステークの概念を導入したものです。ETH2でのステークは、Ethereumネットワークのセキュリティとスケーラビリティを向上させるために、認証や新しいブロック作成の提案などのアクションを実行するバリデーターによって行われます。バリデーターは、ステーキングを行うことで報酬を得ることができます。 AWSは現在、Amazon Managed Blockchain (AMB)を提供しています。これは、一般的なオープンソースフレームワークを使用して、スケーラブルなブロックチェーンネットワークを簡単に作成・管理できるフルマネージドサービスです。現在、私たちはHyperledger Fabric としてプライベート許可型ネットワークを、またパブリックのmainnetと2つの人気テストネットであるRinkebyとRopsten(*)に接続するイーサリアムフルノードをサポートしています。Amazon Managed Blockchainは、現時点ではEthereum Beaconチェーンをサポートしていません。 Rocket Poolは、Beaconチェーンをサポートする分散型ステーキングプールの1つです。ステーキングで報酬を得たいバリデーターは、Rocket Poolを使用して自分の検証ノードを作成することができます。これらの検証ノードは、Graviton2プロセッサを搭載したAmazon Elastic Compute Cloud (Amazon EC2) 上で実行することができます。この記事では、Amazon Elastic Compute Cloud上での Rocket Pool のデプロイを簡素化する AWS Cloud Development Kit(AWS CDK) アプリについて紹介します。

(*) 2022/11/1時点でGoerilのテストネットもサポートされています。

ソリューションの概要

CDKは、オープンソースのソフトウェア開発フレームワークで、使い慣れたプログラミング言語を使ってクラウドアプリケーションリソースを定義することができます。 私たちのCDKアプリは、8つのvCPUと16GBのメモリを含むc6g.2xlargeインスタンスを使用して、Rocket Pool検証ノードを作成します。c6gインスタンスはGraviton2プロセッサを搭載しており、Ethereum検証のようなブロックチェーンワークロードに理想的です。また、高性能なブロックストレージとして2TBのAmazon Elastic Block Store(EBS)デバイスを、安全なアクセスとしてAWS Systems Manager Session Managerを構成しています。 次の図は、AWS CDKを使用してアプリを初期化、合成、デプロイするプロセスを示しています。

このデプロイメントでは、ETH1とETH2の両方のブロックチェーンネットワークの検証を実行します。デフォルトでは、このノードはETH1検証用にGethクライアント、ETH2検証用にLighthouseクライアントを使用するように設定されています。デプロイ後にRocket Pool CLIを使用してこれらのクライアント設定を変更することができます。 ローカルのデスクトップでAWS CDKを使用することができます。手順のドキュメントを参照してAWS CDKを使い始めることができます。

依存関係とRocket Pool AWS CDKアプリケーションをダウンロードしインストール

以下のコードを使用して、AWS CDKと前提アプリをダウンロードおよびインストールします。

# Install TypeScript globally for CDK
npm i -g typescript

# If you are running these commands in Cloud9 or already have CDK installed, then
# skip this command
npm i -g aws-cdk

# Clone the demo CDK application code
git clone https://github.com/aws-samples/cdk-rocketpool-validator-node

# Change directory
cd cdk-rocketpool-validator-node

# Install the CDK application
npm install

Rocket Poolは16GBまたは32GBのメモリを搭載したノードをデプロイすることを推奨しています。この記事では、16GBのインスタンスでデプロイしています。ただし、メモリを増やしたい場合は  lib/cdk-rocketpool-validator-stack.ts ファイルを修正します。例えば、以下のデプロイコードで、ec2.InstanceSize.XLARGE2 を ec2.InstanceSize.XLARGE3 または XLARGE4 に変更します。

   // Create the instance 
    const ec2Instance = new ec2.Instance(this, 'Instance', {
      vpc,
      instanceType: ec2.InstanceType.of(ec2.InstanceClass.C6G, ec2.InstanceSize.XLARGE2),
      machineImage: ami,
      securityGroup: securityGroup,
      role: role,
      blockDevices: [rootVolume]
    });

# Bootstrap the CDK application for first time
cdk bootstrap

# Deploy the CDK application
cdk deploy


➜ rocketpool-blog git:(main) cdk deploy
This deployment will make potentially sensitive changes according to your current security approval level (—require-approval broadening).
Please confirm you intend to make the following modifications:

IAM Statement Changes
┌───┬──────────────────────────────────┬────────┬──────────────────────────────────┬──────────────────────────────────┬───────────┐
│ │ Resource │ Effect │ Action │ Principal │ Condition │
├───┼──────────────────────────────────┼────────┼──────────────────────────────────┼──────────────────────────────────┼───────────┤
│ + │ ${ec2Role.Arn} │ Allow │ sts:AssumeRole │ Service:ec2.${AWS::URLSuffix} │ │
├───┼──────────────────────────────────┼────────┼──────────────────────────────────┼──────────────────────────────────┼───────────┤
│ + │ arn:${AWS::Partition}:s3:::{"Fn: │ Allow │ s3:GetBucket* │ AWS:${ec2Role} │ │
│ │ :Sub":"cdk-hnb659fds-assets-${AW │ │ s3:GetObject* │ │ │
│ │ S::AccountId}-${AWS::Region}"} │ │ s3:List* │ │ │
│ │ arn:${AWS::Partition}:s3:::{"Fn: │ │ │ │ │
│ │ :Sub":"cdk-hnb659fds-assets-${AW │ │ │ │ │
│ │ S::AccountId}-${AWS::Region}"}/* │ │ │ │ │
└───┴──────────────────────────────────┴────────┴──────────────────────────────────┴──────────────────────────────────┴───────────┘
IAM Policy Changes
┌───┬────────────┬────────────────────────────────────────────────────────────────────┐
│ │ Resource │ Managed Policy ARN │
├───┼────────────┼────────────────────────────────────────────────────────────────────┤
│ + │ ${ec2Role} │ arn:${AWS::Partition}:iam::aws:policy/AmazonSSMManagedInstanceCore │
└───┴────────────┴────────────────────────────────────────────────────────────────────┘
Security Group Changes
┌───┬──────────────────────────┬─────┬────────────┬─────────────────┐
│ │ Group │ Dir │ Protocol │ Peer │
├───┼──────────────────────────┼─────┼────────────┼─────────────────┤
│ + │ ${SecurityGroup.GroupId} │ In │ TCP 22 │ Everyone (IPv4) │
│ + │ ${SecurityGroup.GroupId} │ Out │ Everything │ Everyone (IPv4) │
└───┴──────────────────────────┴─────┴────────────┴─────────────────┘
(NOTE: There may be security-related changes not in this list. See https://github.com/aws/aws-cdk/issues/1299)

Do you wish to deploy these changes (y/n)? y

CdkRocketpoolValidatorStack: deploying...
[0%] start: Publishing 1e05055f04e0f731f0605c1138bcef8f9b37398dac16b3c617b743b9e9ff1b36:current_account-current_region
[50%] success: Published 1e05055f04e0f731f0605c1138bcef8f9b37398dac16b3c617b743b9e9ff1b36:current_account-current_region
[50%] start: Publishing 83d98b3d48439ff5155c3381d7bb65e8e94aff567b80132f374e41e033c588c9:current_account-current_region
[100%] success: Published 83d98b3d48439ff5155c3381d7bb65e8e94aff567b80132f374e41e033c588c9:current_account-current_region
CdkRocketpoolValidatorStack: creating CloudFormation changeset...
[··························································] (0/18)

10:17:23 PM | CREATE_IN_PROGRESS | AWS::CloudFormation::Stack | CdkRocketpoolValidatorStack

デプロイメントが完了すると、次のような出力が得られます。


✅ CdkRocketpoolValidatorStack 

Outputs: 
CdkRocketpoolValidatorStack.IPAddress = 3.92.48.208 
CdkRocketpoolValidatorStack.sshcommand = aws ssm start-session --target i-03deeff4f403fa189 —document-name SSM-RocketPoolConfiguration 

Stack ARN:arn:aws:cloudformation:us-east-1:1218594674:stack/CdkRocketpoolValidatorStack/4d31dd40-7979-11ec-a7cb-12

この時点で、AWS CDK Outputsからsshコマンドを実行し、インスタンスにログインしてください。


aws ssm start-session --target i-03deeff403fa189 —document-name SSM-RocketPoolConfiguration

以下は出力例です。

Starting session with SessionId: <>
cd ~ && bash
sh-4.2$ cd ~ && bash
[ec2-user@ip-10-0-0-16 ~]$ 

インストールの完了

接続が完了したら、以下のコマンドを実行して残りのインストールを完了させることができます。


rocketpool service start

(オプション) ETH1/ ETH2 のクライアントを変更したい場合は、以下のコマンドを実行します。ETH1のデフォルトクライアントはGeth、ETH2のデフォルトクライアントはLighthouseです。


rocketpool service config

詳細については、Configuring the Smartnode Stackを参照してください。前述のスタックはPraterテストネットワークで実装されています。メインネットに切り替えたい場合は、Pool Staking on Mainnetを参照してください。 Rocket pool には Grafana のサポートが付属しており、ETH2 クライアントごとにあらかじめダッシュボードが構築されています。ブラウザで http://<your node IP>:<grafana port> に移動して、Grafana にログインすることができます。Grafana ポートは、デフォルトで 3100 に設定されています。デフォルトのログイン認証情報やダッシュボードのインポート方法などの追加情報は、Rocket Pool のドキュメントの Setting up Grafana セクションに記載されている場合があります。以下は、Prysm ETH2 クライアントのメトリクスを表示するダッシュボードのサンプル画像です。

クリーンアップ

この記事で作成したリソースを次のコードでクリーンアップします。


cdk destroy CdkRocketpoolValidatorStack

まとめ

Rocket Poolは、Ethereumノードバリデーターがプルーフ・オブ・ステーキングによって報酬を得ることを可能にします。この投稿では、AWS CDKを使用して最小限のセットアップ時間でAWSクラウドのRocket PoolにETH2バリデーターをデプロイする方法を示しました。また、Session Managerを使用してノードに安全にアクセスする方法も紹介しました。ETHバリデータをメインネットにデプロイする前に、テストネットで試してみることをお勧めします。 フィードバックや追加の質問がある場合は、コメントを残すことをお勧めします。

本稿はソリューションアーキテクト畑が翻訳を担当しました。