

Amazon Web Services Blockchain Templates 已于 2019 年 4 月 30 日停产。不会对本服务或本支持文档进行进一步更新。为了获得最佳的托管区块链体验 AWS，我们建议您使用[亚马逊托管区块链 (AMB)](https://aws.amazon.com/managed-blockchain/)。要了解有关 Amazon Managed Blockchain 入门的更多信息，请参阅 [Hyperledger Fabric 研讨会](https://catalog.us-east-1.prod.workshops.aws/workshops/008da2cb-8454-42d0-877b-bc290bff7fcf/en-US)或[关于部署 Ethereum 节点的博客](https://aws.amazon.com/blogs/database/deploy-an-ethereum-node-on-amazon-managed-blockchain/)。如果您对 AMB 有疑问或需要进一步支持，[请联系 支持](https://console.aws.amazon.com/support/home#/case/create?issueType=technical)或您的 AWS 客户团队。

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

# 设置先决条件
<a name="blockchain-template-getting-started-prerequisites"></a>

您在本教程中指定的适用于 Ethereum 的 AWS Blockchain Template 配置要求您执行以下操作：
+ [创建 VPC 和子网](#blockchain-templates-create-a-vpc)
+ [创建安全组](#blockchain-templates-create-security-group)
+ [为 Amazon ECS 创建 IAM 角色和 EC2 实例配置文件](#blockchain-templates-iam-roles)
+ [创建堡垒主机](#blockchain-templates-bastion-host)

## 创建 VPC 和子网
<a name="blockchain-templates-create-a-vpc"></a>

适用于 Ethereum 的 Amazon Web Services Blockchain Templates 将资源启动到使用 Amazon Virtual Private Cloud (Amazon VPC) 定义的虚拟网络中。您在本教程中指定的配置创建应用程序负载均衡器，它需要使用两个位于不同可用区中的公有子网。此外，容器实例需要使用一个私有子网，该子网必须与应用程序负载均衡器位于同一可用区中。首先，您使用 VPC 向导在同一可用区中创建一个公有子网和一个私有子网。然后，您在该 VPC 上的另一个可用区中创建第二个公有子网。

有关更多信息，请参阅《Amazon VPC 用户指南》**中的[什么是 Amazon VPC？](https://docs.aws.amazon.com/vpc/latest/userguide/)。

使用 Amazon VPC 控制台 ([https://console.aws.amazon.com/vpc/](https://console.aws.amazon.com/vpc/)) 创建弹性 IP 地址、VPC 和子网，如下所述。

**创建弹性 IP 地址**

1. 打开位于 [https://console.aws.amazon.com/vpc/](https://console.aws.amazon.com/vpc/) 的 Amazon VPC 控制台。

1. 选择**弹性 IPs**、**分配新地址**、**分配**。

1. 记下您创建的弹性 IP 地址，然后选择 **Close (关闭)**。

1. 在弹性 IP 地址列表中，找到以前创建的弹性 IP 地址的 **Allocation ID (分配 ID)**。在创建 VPC 时会用到它。

**创建 VPC**

1. 在导航栏中，为 VPC 选择一个区域。 VPCs 特定于某个区域，因此请选择您在其中创建密钥对以及启动以太坊堆栈的相同区域。有关更多信息，请参阅 [创建密钥对](blockchain-templates-setting-up.md#blockchain-templates-create-a-key-pair)。

1. 在 VPC 控制面板上，选择 **Start VPC Wizard**。

1. 在 **Step 1: Select a VPC Configuration (步骤1: 选择 VPC 配置)** 页面上，选择 **VPC with Public and Private Subnets (具有公有子网和私有子网的 VPC)**，然后选择 **Select (选择)**。

1. 在 “**步骤 2：包含公有和私有子网的 VPC**” 页面上，将 **IPv4 CIDR 块**和 **IPv6 CIDR 块**保留为默认值。对于 **VPC name (VPC 名称)**，输入一个易于理解的名称。

1. 对于**公有子网的 IPv4 CIDR**，请保留默认值。对于 **Availability Zone (可用区)**，选择一个区域。对于 **Public subnet name (公有子网名称)**，输入一个易于理解的名称。

   如果使用模板，您可以将此子网指定为应用程序负载均衡器的两个子网中的第一个。

   记下该子网的可用区，因为您为私有子网选择相同的可用区，并为另一个公有子网选择不同的可用区。

1. 对于**私有子网的 IPv4 CIDR**，请保留默认值。对于 **Availability Zone (可用区)**，选择与上一步相同的可用区。对于 **Private subnet name (私有子网名称)**，输入一个易于理解的名称。

1. 对于 **Elastic IP Allocation ID (弹性 IP 分配 ID)**，选择您以前创建的弹性 IP 地址。

1. 为其他设置保留默认值。

1. 选择**创建 VPC**。

   **以下示例显示了具有公有子网 **EthereumPubSub1 和私有子网 1** 的 **EthereumNetworkV** PC VPC。EthereumPvtSub**公有子网使用 **us-west-2a** 可用区。  
![\[VPC configuration form with public and private subnet details for EthereumVPC.\]](http://docs.aws.amazon.com/zh_cn/blockchain-templates/latest/developerguide/images/VPC.png)

**在其他可用区中创建第二个公有子网。**

1. 选择 **Subnets (子网)**，然后从列表中选择以前创建的公有子网。选择 **Route Table (路由表)** 选项卡，并记下 **Route table (路由表)** ID。您为下面的第二个公有子网指定相同的路由表。

1. 选择**创建子网**。

1. 对于**名称标签**，输入子网的名称。稍后在该网络中创建堡垒主机时，您将使用该名称。

1. 对于 **VPC**，选择您以前创建的 VPC。

1. 对于 **Availability Zone (可用区)**，选择与第一个公有子网不同的可用区。

1. 对于 **IPv4 CIDR 块**，请输入 **10.** 0.2.0/24。

1. 选择**是，创建**。该子网将添加到子网列表中。

1. 从列表中选择子网后，选择 **Subnet Actions (子网操作)**，然后选择 **Modify auto-assign IP settings (修改自动分配 IP 设置)**。选择 “**自动分配**”、“**保存**” IPs、“**关闭**”。这样，在该子网中创建堡垒主机时，该主机可以获得一个公有 IP 地址。

1. 在 **Route Table (路由表)** 选项卡上，选择 **Edit (编辑)**。对于 **Change to (更改为)**，选择您以前记下的路由表 ID，然后选择 **Save (保存)**。

您现在应该可以看到之前创建的 VPC 的三个子网。记下子网名称， IDs 以便您可以使用模板指定它们。

![\[VPC Dashboard showing three subnets with their IDs, states, and IPv4 CIDR ranges.\]](http://docs.aws.amazon.com/zh_cn/blockchain-templates/latest/developerguide/images/subnets-listing.png)


## 创建安全组
<a name="blockchain-templates-create-security-group"></a>

安全组可充当防火墙，控制资源的入站和出站流量。当您使用模板在 Amazon ECS 集群上创建 Ethererum 网络时，需指定两个安全组：
+ 适用于 EC2 实例的安全组，用于控制集群中 EC2 实例的进出流量
+ Application Load Balancer 的安全组，用于控制应用程序负载均衡器、 EC2 实例和堡垒主机之间的流量。您也将该安全组与堡垒主机相关联。

每个安全组都有允许 Application Load Balancer 与 EC2 实例之间通信的规则以及其他最低规则。这就要求安全组相互引用。因此，您可以首先创建安全组，然后用适当的规则进行更新。

**创建两个安全组**

1. 打开亚马逊 EC2 控制台，网址为[https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)。

1. 在导航窗格中，选择 **Security Groups**（安全组），然后选择 **Create Security Group**（创建安全组）。

1. 在**安全组名称**中，输入一个易于识别且能与其他安全组区分开来的名称，例如*以太坊 EC2-SG 或 Eth *er* eumalb-SG*。稍后会用到这些名称。对于 **Description (描述)**，输入简短摘要。

1. 对于 **VPC**，选择您以前创建的 VPC。

1. 选择**创建**。

1. 重复以上步骤创建其他安全组。

**向 EC2 实例的安全组添加入站规则**

1. 为之前创建的 EC2 实例选择安全组

1. 在 **Inbound (入站)** 选项卡上，选择 **Edit (编辑)**。

1. 对于**类型**，请选择**所有流量**。对于 “**来源**”，选择 “**自定义**”，然后从列表中选择您当前正在编辑的安全组，例如 Ethere *um EC2-SG*。这允许安全组中的 EC2 实例相互通信。

1. 选择**添加规则**。

1. 对于 **Type (类型)**，请选择 **All traffic (所有流量)**。对于 **Source (来源)**，将 **Custom (自定义)** 保持选中状态，然后从列表中选择应用程序负载均衡器的安全组，例如 *EthereumALB-SG*。这允许安全组中的 EC2 实例与 Application Load Balancer 通信。

1. 选择**保存**。

**针对应用程序负载均衡器的安全组添加入站规则并编辑出站规则**

1. 选择您之前创建的应用程序负载均衡器安全组

1. 在 **Inbound (入站)** 选项卡上选择 **Edit (编辑)**，然后添加以下入站规则：

   1. 对于**类型**，请选择**所有流量**。对于 **Source (来源)**，将 **Custom (自定义)** 保持选中状态，然后从列表中选择您当前编辑的安全组，例如 *EthereumALB-SG*。这允许应用程序负载均衡器与自身和堡垒主机进行通信。

   1. 选择**添加规则**。

   1. 对于 **Type (类型)**，请选择 **All traffic (所有流量)**。对于 “**来源**”，选择 “**自定义**”，然后从列表中选择 EC2 实例的安全组，例如 Ethere *um EC2-SG*。这允许安全组中的 EC2 实例与 Application Load Balancer 和堡垒主机通信。

   1. 选择**添加规则**。

   1. 对于 **Type**，选择 **SSH**。对于 **Source (来源)**，选择 **My IP (我的 IP)**，这会检测并输入您的计算机的 IP CIDR。
**重要**  
此规则允许堡垒主机接受来自您计算机的 SSH 流量，从而使您的计算机能够使用堡垒主机查看 Web 界面并连接到以太坊网络上的 EC2 实例。要允许其他计算机连接到 Ethereum 网络，请将其添加为该规则的来源。仅允许到受信任的来源的入站流量。

   1. 选择**保存**。

1. 在 **Outbound (出站)** 选项卡上选择 **Edit (编辑)**，然后删除自动创建的规则以允许到所有 IP 地址的出站流量。

1. 选择**添加规则**。

1. 对于 **Type (类型)**，请选择 **All traffic (所有流量)**。对于 “**目标**”，选择 “**自定义**”，然后从列表中选择 EC2 实例的安全组。这允许从 Application Load Balancer 和堡垒主机到以太坊网络中的 EC2 实例的出站连接。

1. 选择**添加规则**。

1. 对于 **Type (类型)**，请选择 **All traffic (所有流量)**。对于 **Destination (目标)**，将 **Custom (自定义)** 保持选中状态，然后从列表中选择您当前编辑的安全组，例如 *EthereumALB-SG*。这允许应用程序负载均衡器与自身和堡垒主机进行通信。

1. 选择**保存**。

## 为 Amazon ECS 创建 IAM 角色和 EC2 实例配置文件
<a name="blockchain-templates-iam-roles"></a>

使用此模板时，您可以为 Amazon ECS 指定一个 IAM 角色和一个 EC2 实例配置文件。附加到这些角色的权限策略允许您集群中的 AWS 资源和实例与其他 AWS 资源进行交互。有关更多信息，请参阅《IAM 用户指南》**中的 [IAM 角色](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles.html)。您可以使用 IAM 控制台 ([https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/)) 为 Amazon ECS 和 EC2 实例配置文件设置 IAM 角色。

**创建适用于 Amazon ECS 的 IAM 角色。**

1. 使用 [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) 打开 IAM 控制台。

1. 在导航窗格中，选择 **角色** 和 **创建角色**。

1. 在 **Select type of trusted entity**（选择受信任实体的类型）下，选择 **Amazon Web Services service**（亚马逊云科技服务）。

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

1. 在 **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.\]](http://docs.aws.amazon.com/zh_cn/blockchain-templates/latest/developerguide/images/ecs-role.png)

1. 对于**权限策略**，保留默认策略 (**Amazon EC2 ContainerServiceRole**) 处于选中状态，然后选择 “**下一步：查看**”。

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

1. 选择**创建角色**。

1. 从列表中选择您刚刚创建的角色。如果您的账户中包含许多角色，则可搜索角色名称。  
![\[AWSIAM console showing a role named "ECSRoleForEtherum" with its description.\]](http://docs.aws.amazon.com/zh_cn/blockchain-templates/latest/developerguide/images/ecs-role-list.png)

1. 复制 **Role ARN (角色 ARN)** 值并保存，以便再次复制。创建 Ethereum 网络时需要此 ARN。  
![\[AWSIAM role summary page showing role ARN, description, and attached policies.\]](http://docs.aws.amazon.com/zh_cn/blockchain-templates/latest/developerguide/images/ecs-role-arn.png)

您在模板中指定的 EC2 实例配置文件由以太坊网络中的 EC2 实例使用，用于与其他 AWS 服务进行交互。您可以为角色创建权限策略，创建角色 (自动创建同名实例配置文件)，然后将权限策略附加到角色。

**创建 EC2 实例配置文件**

1. 在导航窗格中，选择 **Policies**、**Create policy**。

1. 选择 **JSON**，并将默认策略语句替换为以下 JSON 策略：

   ```
   {
       "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": "*"
           }
       ]
   }
   ```

1. 选择**查看策略**。

1. 例如，在 “**名称**” 中，输入一个可以帮助您识别此权限策略的值*EthereumPolicyForEC2*。对于 **Description (描述)**，输入简短摘要。选择**创建策略**。  
![\[AWS console showing Create policy page with name, description, and service permissions.\]](http://docs.aws.amazon.com/zh_cn/blockchain-templates/latest/developerguide/images/ec2-perms-policy.png)

1. 依次选择**角色**和**创建角色**。

1. 选择 “**EC2****下一步：权限”**。

1. 例如，在**搜索**字段中，输入您之前创建的权限策略的名称*EthereumPolicyForEC2*。

1. 选中您以前创建的策略的复选标记，然后选择 **Next: Review(下一步: 检查)**。  
![\[AWS console showing Create role page with EthereumPolicyForEC2 policy selected.\]](http://docs.aws.amazon.com/zh_cn/blockchain-templates/latest/developerguide/images/ec2-select-policy.png)

1. 例如，**在角色名称**中，输入一个可以帮助您识别角色的值*EC2RoleForEthereum*。对于 **Role description (角色描述)**，输入简短摘要。选择 **Create role (创建角色)**。

1. 从列表中选择您刚刚创建的角色。如果您的账户具有很多角色，您可以在 **Search (搜索)** 字段中输入角色名称。  
![\[AWSIAM interface showing a role named EC2RoleforEther with associated description and trusted entity.\]](http://docs.aws.amazon.com/zh_cn/blockchain-templates/latest/developerguide/images/ec2-select-role.png)

1. 复制并保存 **Instance Profile ARN (实例配置文件 ARN)** 值，以便您可以再次复制该值。创建 Ethereum 网络时需要此 ARN。  
![\[AWSIAM role summary page showing Role ARN and Instance Profile ARNs fields.\]](http://docs.aws.amazon.com/zh_cn/blockchain-templates/latest/developerguide/images/ec2-role-arn.png)

## 创建堡垒主机
<a name="blockchain-templates-bastion-host"></a>

在本教程中，您创建一个堡垒主机。这是您用来连接以太坊网络中的 Web 界面和实例的实例。 EC2 它的唯一用途是从 VPC 外部的受信任客户端转发 SSH 流量，以便它们可以访问 Ethereum 网络资源。

您可以设置堡垒主机，因为模板创建的应用程序负载均衡器是内部的，这意味着它仅路由内部 IP 地址。堡垒主机：
+ 具有应用程序负载均衡器可识别的内部 IP 地址，因为您在以前创建的第二个公有子网中启动它。
+ 具有子网分配的公有 IP 地址，VPC 外部的受信任来源可以访问该地址。
+ 与您以前创建的应用程序负载均衡器的安全组关联，该安全组具有一个入站规则以允许来自受信任的客户端的 SSH 流量（端口 22）。

要能够访问 Ethereum 网络，需要设置受信任的客户端以通过堡垒主机进行连接。有关更多信息，请参阅 [连接 EthStats 并 EthExplorer 使用堡垒主机](blockchain-bastion-host-connect.md)。堡垒主机只是一种方法。您可以使用从受信任的客户端访问 VPC 中的私有资源的任何方法。

**创建堡垒主机**

1. 按照《*Amazon EC2 用户指南》*中的前五个步骤[启动实例](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/EC2_GetStarted.html#ec2-launch-instance)。

1. 选择 **Edit Instance Details**。对于 **Network (网络)**，选择您以前创建的 VPC；对于 **Subnet (子网)**，选择您以前创建的第二个公有子网。将所有其他设置保留默认值。

1. 在出现提示时确认更改，然后选择 **Review and Launch (检查并启动)**。

1. 选择 **Edit Security Groups (编辑安全组)**。对于**分配安全组**，选择**选择现有安全组**。

1. 从安全组列表中，为您以前创建的应用程序负载均衡器选择安全组，然后选择 **Review and Launch (检查并启动)**。

1. 选择**启动**。

1. 记下实例 ID。稍后在[连接 EthStats 并 EthExplorer 使用堡垒主机](blockchain-bastion-host-connect.md)时，您需要使用该 ID。  
![\[Green checkmark indicating successful instance launch with partially obscured instance ID.\]](http://docs.aws.amazon.com/zh_cn/blockchain-templates/latest/developerguide/images/bastion-instance.png)