使用适用于 Ethereum 的 Amazon Web Services Blockchain Templates - AWS Blockchain Templates

Amazon Web Services Blockchain Templates 已于 2019 年 4 月 30 日停产。不会对本服务或本支持文档进行进一步更新。为了获得最佳的托管区块链体验 AWS,我们建议您使用亚马逊托管区块链 (AMB)。要了解有关 Amazon Managed Blockchain 入门的更多信息,请参阅 Hyperledger Fabric 研讨会关于部署 Ethereum 节点的博客。如果您对 AMB 有疑问或需要进一步支持,请联系 AWS Support或您的 AWS 客户团队。

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

使用适用于 Ethereum 的 Amazon Web Services Blockchain Templates

Ethereum 是一个区块链框架,它使用Ethereum 特定的语言 Solidity 来运行智能合同。Homestead 是 Ethereum 的最新版本。有关更多信息,请参阅 Ethereum Homestead 文档Solidity 文档。

启动链接

请参阅 AWS Blockchain Templates 入门,以获取使用 模板在特定区域中启动 的链接。

Ethereum 选项

如果您使用模板配置 Ethereum 网络,您做出的选择将决定后续要求:

选择容器平台

AWS Blockchain Templates 使用 Amazon ECR 中存储的 Docker 容器部署区块链软件。AWS Blockchain Templates 提供两种备选容器平台

  • ecs —指定 Ethereum 在 Amazon EC2 实例的 Amazon ECS 集群上运行。

  • docker-local—指定 Ethereum 在单个 EC2 实例上运行。

使用 Amazon ECS 容器平台

通过使用 Amazon ECS,您可以在包含多个 EC2 实例的 ECS 集群上创建 Ethereum 网络,并具有应用程序负载均衡器和相关的资源。有关使用 Amazon ECS 配置的更多信息,请参阅 Amazon Web Services Blockchain Templates 入门 教程。

下图描述了使用 ECS 容器平台选项通过模板创建的 Ethereum 网络:

AWS diagram showing VPC with public and private subnets, load balancers, and Ethereum nodes in ECS containers.

使用 Docker-Local 平台

您也可以在单独的 Amazon EC2 实例中启动 Ethereum 容器。所有容器都在单个 EC2 实例上运行。这是简化的设置。

下图描述了使用 docker-local 容器平台选项通过模板创建的 Ethereum 网络:

Diagram of Ethereum network on AWS with VPC, EC2 instance, containers, and ECR registry.

选择私有或公有 Ethereum 网络

选择 1–4 以外的 Ethereum Network ID (Ethereum 网络 ID) 值,可在您定义的网络中,使用您指定的私有网络参数创建私有 Ethereum 节点。

如果您选择 1-4 之间的值作为 Ethereum Network ID (Ethereum 网络 ID),您创建的 Ethereum 节点会加入公有 Ethereum 网络。您可以忽略私有网络设置及其默认值。如果您选择将 Ethereum 节点加入公有 Ethereum 网络,请确保您的网络中的相应服务可通过 Internet 访问。

更改默认账户和助记词

助记词是一组随机单词,可用于为任何网络上的关联账户生成 Ethereum 包(即,私有密钥/公有密钥对)。助记词可用于访问关联账户的 Ether。我们创建了一个默认助记符,它与 Ethereum 模板使用的默认账户相关联。

警告

仅出于测试目的使用默认账户和关联的助记词。请勿使用默认账户集发送真实的 Ether,因为任何有权访问助记词的人都可以从账户中访问或窃取 Ether。相反,应出于生产目的指定自定义账户。与默认账户关联的助记词为 outdoor father modify clever trophy abandon vital feel portion grit evolve twist

先决条件

在使用 AWS Blockchain Template 设置 Ethereum 网络时,必须满足下面列出的最低要求。该模板需要使用为每个以下类别列出的 AWS 组件:

访问 Ethereum 资源的先决条件

先决条件 对于 ECS 平台 对于 Docker-Local

用于访问 EC2 实例的 Amazon EC2 密钥对。该密钥必须与 ECS 集群和其他资源同在一个区域中。

具有内部地址的面向 Internet 的组件(例如堡垒主机或面向 Internet 的负载均衡器),允许流量从该地址进入应用程序负载均衡器。ECS 平台需要使用该组件,因为模板创建内部负载均衡器以保护安全。在 EC2 实例位于私有子网时(建议的配置),docker-local 平台需要使用该组件。有关配置堡垒主机的信息,请参阅创建堡垒主机

✔ (具有私有子网)

IAM 的先决条件

先决条件 对于 ECS 平台 对于 Docker-Local

有权使用所有相关服务的 IAM 主体(用户或组)。

Amazon EC2 实例配置文件,其中的权限允许 EC2 实例与其他服务进行交互。有关更多信息,请参阅 To create an EC2 instance profile

IAM 角色,其权限允许 Amazon ECS 与其他服务进行交互。有关更多信息,请参阅 创建 ECS 角色和权限

安全组先决条件

先决条件 对于 ECS 平台 对于 Docker-Local

EC2 实例的安全组需满足以下要求:

  • 出站规则,允许流量流至 0.0.0.0/0 (默认)。

  • 入站规则,它允许来自自身(同一安全组)的流量。

  • 入站规则,它允许来自应用程序负载均衡器的安全组的所有流量。

  • 允许来自可信外部来源(例如客户端计算机的 IP CIDR)的 HTTP EthStats (端口 80)、(在端口 8080 上提供服务)、通过 HTTP 的 JSON RPC(端口 8545)和 SSH(端口 22)的入站规则。

应用程序负载均衡器的安全组需满足以下要求:

  • 入站规则,它允许来自自身(同一安全组)的流量。

  • 入站规则,允许来自 EC2 实例的安全组的全部流量。

  • 出站规则,它仅允许进入 EC2 实例的安全组的所有流量。有关更多信息,请参阅 创建安全组

  • 如果将该相同安全组与堡垒主机关联,则为允许来自受信任来源的 SSH(端口 22)流量的入站规则。

  • 如果堡垒主机或其他面向 Internet 的组件位于不同的安全组中,则为允许来自该组件的流量的入站规则。

VPC 先决条件

先决条件 对于 ECS 平台 对于 Docker-Local

弹性 IP 地址,用于访问 Ethereum 服务。

运行 EC2 实例的子网。我们强烈建议使用私有子网。

两个可公开访问的子网。每个子网必须位于彼此不同的可用区中,并且一个子网位于与 EC2 实例的子网相同的可用区中。

EC2 实例配置文件和 ECS 角色的示例 IAM 权限

您在使用模板时需指定 EC2 实例配置文件 ARN,作为参数之一。如果您使用 ECS 容器平台,还需指定 ECS 角色 ARN。附加到这些角色的权限策略允许集群中的 AWS 资源和实例与其他 AWS 资源进行交互。有关更多信息,请参阅《IAM 用户指南》中的 IAM 角色。使用以下策略语句和过程作为创建权限的起点。

EC2 实例配置文件的示例权限策略

以下权限策略说明了选择 ECS 容器平台的情况下 EC2 实例配置文件允许的操作。Docker-Local 容器平台中也可以使用相同的策略语句,只需移除 ecs 上下文密钥以限制访问。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "ecs:CreateCluster", "ecs:DeregisterContainerInstance", "ecs:DiscoverPollEndpoint", "ecs:Poll", "ecs:RegisterContainerInstance", "ecs:StartTelemetrySession", "ecs:Submit*", "ecr:GetAuthorizationToken", "ecr:BatchCheckLayerAvailability", "ecr:GetDownloadUrlForLayer", "ecr:BatchGetImage", "logs:CreateLogStream", "logs:PutLogEvents", "dynamodb:BatchGetItem", "dynamodb:BatchWriteItem", "dynamodb:PutItem", "dynamodb:DeleteItem", "dynamodb:GetItem", "dynamodb:Scan", "dynamodb:Query", "dynamodb:UpdateItem" ], "Resource": "*" } ] }

创建 ECS 角色和权限

对于附加到 ECS 角色的权限,我们建议您从 AmazonEC2 ContainerServiceRole 权限策略开始。使用以下过程创建角色并附加此权限策略。使用 IAM 控制台查看此策略中最多的 up-to-date 权限。

创建适用于 Amazon ECS 的 IAM 角色。
  1. 通过以下网址打开 IAM 控制台:https://console.aws.amazon.com/iam/

  2. 在导航窗格中,选择 角色创建角色

  3. Select type of trusted entity(选择受信任实体的类型)下,选择 Amazon Web Services service(亚马逊云科技服务)。

  4. 对于 Choose the service that will use this role (选择将使用此角色的服务),选择 Elastic Container Service

  5. Select your use case (选择您的使用案例) 下,选择 Elastic Container Service (弹性容器服务)Next:Permissions (下一步: 权限)

    AWS console interface for creating a role, with Elastic Container Service selected as the use case.
  6. 对于权限策略,保留默认策略 (AmazonEC2 ContainerServiceRole) 处于选中状态,然后选择 “下一步:查看”。

  7. 在角色名称中,输入一个可以帮助您识别角色的值,例如 ECS RoleForEthereum。对于 Role Description (角色描述),输入简短摘要。请记下角色名称,以备后用。

  8. 选择创建角色

  9. 从列表中选择您刚刚创建的角色。如果您的账户中包含许多角色,则可搜索角色名称。

    AWSIAM console showing a role named "ECSRoleForEtherum" with its description.
  10. 复制 Role ARN (角色 ARN) 值并保存,以便再次复制。创建 Ethereum 网络时需要此 ARN。

    AWSIAM role summary page showing role ARN, description, and attached policies.

连接到 Ethereum 资源

在使用模板创建的根堆栈显示 CREATE_COMPLETE 后,您可以使用 AWS CloudFormation 控制台连接到 Ethereum 资源。连接方式依赖于您所选的容器平台,即 ECS 或 Docker-Local:

  • ECS — 根堆栈的 输出 选项卡为应用程序负载均衡器上运行的服务提供链接。出于安全考虑,这些 URL 无法直接访问。要进行连接,您可以设置并使用堡垒主机以作为它们的连接代理。有关更多信息,请参阅下面的 使用堡垒主机的代理连接

  • docker-local — 您使用托管 Ethereum 服务的 EC2 实例的 IP 地址进行连接,如下所示。请使用 EC2 控制台查找模板创建的实例的 ec2-IP-address

    • EthStats—使用 http://ec2-IP 地址

    • EthExplorer—使用 http://ec2-IP-地址:8080

    • EthJsonRpc—使用 http://ec2-IP-地址:8545

    如果您为 Ethereum Network Subnet ID (Ethereum 网络子网 ID) 指定了公有子网(模板中的 List of VPC Subnets to use (要使用的 VPC 子网列表)),您可以直接进行连接。您的客户端必须是 SSH 的入站流量 (端口 22) 以及所列端口的可信来源。这是由您使用 Ethereum 的 AWS Blockchain Template 指定的 EC2 安全组决定的。

    如果您指定了私有子网,您可以设置并使用堡垒主机以作为到这些地址的连接代理。有关更多信息,请参阅下面的 使用堡垒主机的代理连接

使用堡垒主机的代理连接

包含某些配置的 Ethereum 服务可能不会公开。在这种情况下,您可以通过堡垒主机连接到 Ethereum 资源。有关堡垒主机的更多信息,请参阅 Linux 堡垒主机快速入门指南中的 Linux 堡垒主机架构

堡垒主机是 EC2 实例。确保满足以下要求:

  • 堡垒主机的 EC2 实例位于启用了自动分配公有 IP 且具有互联网网关的公有子网内。

  • 堡垒主机拥有允许 ssh 连接的密钥对。

  • 堡垒主机与允许来自连接的客户端的入站 SSH 流量的安全组关联。

  • 分配给 Ethereum 主机的安全组(例如,如果 ECS 是容器平台,则分配给应用程序负载均衡器;如果 docker-local 是容器平台,则分配给主机 EC2 实例)允许 VPC 内的所有端口上的入站流量。

设置堡垒主机后,请确保连接的客户端使用堡垒主机作为代理。以下示例演示了如何使用 Mac OS 设置代理连接。B astionIP 替换为堡垒主机 EC2 实例MySshKey的 IP 地址,将.pem 替换为您复制到堡垒主机的密钥对文件。

在命令行键入以下内容:

ssh -i mySshKey.pem ec2-user@BastionIP -D 9001

这将为本地计算机上的端口 9001 设置至堡垒主机的端口转发。

接下来,将您的浏览器或系统设置为使用适用于localhost:9001 的 SOCKS 代理。例如,使用 Mac OS,选择 System Preferences (系统首选项)Network (网络)Advanced (高级),再选择 SOCKS proxy (SOCKS 代理),然后键入 localhost:9001

在 Chrome 中使用 FoxyProxy 标准版,选择 “更多工具”、“扩展程序”。在 “FoxyProxy 标准” 下,选择 “详细信息”、“扩展选项”、“添加新代理”。选择 Manual Proxy Configuration (手动代理配置)。对于 Host or IP Address (主机或 IP 地址),键入 localhost,对于 Port (端口),键入 9001。选择 SOCKS Proxy? (SOCKS 代理?)Save (保存)

您现在应能连接到模板输出中列出的 Ethereum 主机地址。