

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 客户团队。

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

# 使用适用于 Ethereum 的 Amazon Web Services Blockchain Templates
<a name="blockchain-templates-ethereum"></a>

Ethereum 是一个区块链框架，它使用Ethereum 特定的语言 Solidity 来运行智能合同。Homestead 是 Ethereum 的最新版本。有关更多信息，请参阅 [Ethereum Homestead 文档](http://www.ethdocs.org/en/latest/)和 [Solidity](https://solidity.readthedocs.io/en/v0.4.21/#) 文档。

## 启动链接
<a name="blockchain-ethereum-launch"></a>

有关使用以太坊[模板 CloudFormation 在特定区域启动的链接，请参阅 AWS Blockchain 模板入门](https://aws.amazon.com/blockchain/templates/getting-started/)。

## Ethereum 选项
<a name="blockchain-ethereum-options"></a>

如果您使用模板配置 Ethereum 网络，您做出的选择将决定后续要求：
+ [选择容器平台](#blockchain-ethereum-platform)
+ [选择私有或公有 Ethereum 网络](#blockchain-private-public)
+ [更改默认账户和助记词](#blockchain-ethereum-mnemonic)

### 选择容器平台
<a name="blockchain-ethereum-platform"></a>

AWS Blockchain Templates 使用 Amazon ECR 中存储的 Docker 容器部署区块链软件。AWS Blockchain Templates 提供两种备选**容器平台**：
+ **ecs** —指定 Ethereum 在 Amazon EC2 实例的 Amazon ECS 集群上运行。
+ **docker-local**—指定 Ethereum 在单个 EC2 实例上运行。

#### 使用 Amazon ECS 容器平台
<a name="blockchain-ethereum-ecs"></a>

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

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

![具有两个可用区的 VPC，其中包含公有子网和私有子网，带有 ECS 容器实例。](http://docs.aws.amazon.com/zh_cn/blockchain-templates/latest/developerguide/images/ethereum-ecs-arch.png)


#### 使用 Docker-Local 平台
<a name="blockchain-ethereum-docker-local"></a>

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

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

![公有子网中的 EC2 实例运行四个容器，这些容器通过互联网网关连接到 ECR 注册表。](http://docs.aws.amazon.com/zh_cn/blockchain-templates/latest/developerguide/images/ethereum-docker-local-arch.png)


### 选择私有或公有 Ethereum 网络
<a name="blockchain-private-public"></a>

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

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

### 更改默认账户和助记词
<a name="blockchain-ethereum-mnemonic"></a>

助记词是一组随机的单词，可用于为任何网络上的关联账户生成以太坊钱包（即 private/public 密钥对）。助记词可用于访问关联账户的 Ether。我们创建了一个默认助记符，它与 Ethereum 模板使用的默认账户相关联。

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

## 先决条件
<a name="blockchain-ethereum-prereq"></a>

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

**Topics**
+ [访问 Ethereum 资源的先决条件](#blockchain-ethereum-prereq-access)
+ [IAM 的先决条件](#blockchain-ethereum-prereq-iam)
+ [安全组先决条件](#blockchain-ethereum-prereq-sec)
+ [VPC 先决条件](#blockchain-ethereum-prereq-vpc)
+ [EC2 实例配置文件和 ECS 角色的示例 IAM 权限](#blockchain-ethereum-iam-examples)

### 访问 Ethereum 资源的先决条件
<a name="blockchain-ethereum-prereq-access"></a>


| 先决条件 | 对于 ECS 平台 | 对于 Docker-Local | 
| --- | --- | --- | 
| 用于访问 EC2 实例的 Amazon EC2 密钥对。该密钥必须与 ECS 集群和其他资源同在一个区域中。 | ✔ | ✔ | 
| 具有内部地址的面向 Internet 的组件（例如堡垒主机或面向 Internet 的负载均衡器），允许流量从该地址进入应用程序负载均衡器。ECS 平台需要使用该组件，因为模板创建内部负载均衡器以保护安全。在 EC2 实例位于私有子网时（建议的配置），docker-local 平台需要使用该组件。有关配置堡垒主机的信息，请参阅[创建堡垒主机](blockchain-template-getting-started-prerequisites.md#blockchain-templates-bastion-host)。 | ✔ | ✔ （具有私有子网） | 

### IAM 的先决条件
<a name="blockchain-ethereum-prereq-iam"></a>


| 先决条件 | 对于 ECS 平台 | 对于 Docker-Local | 
| --- | --- | --- | 
| 有权使用所有相关服务的 IAM 主体（用户或组）。 | ✔ | ✔ | 
| Amazon EC2 实例配置文件，其中的权限允许 EC2 实例与其他服务进行交互。有关更多信息，请参阅 [To create an EC2 instance profile](blockchain-template-getting-started-prerequisites.md#create-ec2-role)。 | ✔ | ✔ | 
| IAM 角色，其权限允许 Amazon ECS 与其他服务进行交互。有关更多信息，请参阅 [创建 ECS 角色和权限](#blockchain-ethereum-ecs-role)。 | ✔ |  | 

### 安全组先决条件
<a name="blockchain-ethereum-prereq-sec"></a>


| 先决条件 | 对于 ECS 平台 | 对于 Docker-Local | 
| --- | --- | --- | 
| EC2 实例的安全组需满足以下要求： | ✔ | ✔ | 
|  [See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_cn/blockchain-templates/latest/developerguide/blockchain-templates-ethereum.html)  | ✔ | ✔ | 
|  [See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_cn/blockchain-templates/latest/developerguide/blockchain-templates-ethereum.html)  | ✔ | ✔ | 
| [See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_cn/blockchain-templates/latest/developerguide/blockchain-templates-ethereum.html) | ✔ |  | 
| [See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_cn/blockchain-templates/latest/developerguide/blockchain-templates-ethereum.html) |  | ✔ | 
| 应用程序负载均衡器的安全组需满足以下要求：[See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_cn/blockchain-templates/latest/developerguide/blockchain-templates-ethereum.html) | ✔ |  | 

### VPC 先决条件
<a name="blockchain-ethereum-prereq-vpc"></a>


| 先决条件 | 对于 ECS 平台 | 对于 Docker-Local | 
| --- | --- | --- | 
| 弹性 IP 地址，用于访问 Ethereum 服务。 | ✔ | ✔ | 
| 运行 EC2 实例的子网。我们强烈建议使用私有子网。 | ✔ | ✔ | 
| 两个可公开访问的子网。每个子网必须位于彼此不同的可用区中，并且一个子网位于与 EC2 实例的子网相同的可用区中。 | ✔ |  | 

### EC2 实例配置文件和 ECS 角色的示例 IAM 权限
<a name="blockchain-ethereum-iam-examples"></a>

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

#### EC2 实例配置文件的示例权限策略
<a name="blockchain-ethereum-ec2-instance"></a>

以下权限策略说明了选择 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 角色和权限
<a name="blockchain-ethereum-ecs-role"></a>

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

**创建适用于 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 用于创建角色的控制台界面，选择弹性容器服务作为用例。](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. 从列表中选择您刚刚创建的角色。如果您的账户中包含许多角色，则可搜索角色名称。  
![IAM 控制台显示 ECSRoleForEtherium 使用搜索过滤器在角色列表中选择的角色。](http://docs.aws.amazon.com/zh_cn/blockchain-templates/latest/developerguide/images/ecs-role-list.png)

1. 复制 **Role ARN (角色 ARN)** 值并保存，以便再次复制。创建 Ethereum 网络时需要此 ARN。  
![AWS IAM 角色摘要页面显示角色 ARN、描述和附加策略。](http://docs.aws.amazon.com/zh_cn/blockchain-templates/latest/developerguide/images/ecs-role-arn.png)

## 连接到 Ethereum 资源
<a name="blockchain-ethereum-connecting"></a>

使用模板创建的根堆栈显示 **CREATE\_COMPLET** E 后，您可以使用控制台连接到以太坊资源。 CloudFormation 连接方式依赖于您所选的容器平台，即 ECS 或 Docker-Local：
+ **ECS** — 根堆栈的 **输出** 选项卡为应用程序负载均衡器上运行的服务提供链接。出于安全考虑， URLs 这些无法直接访问。要进行连接，您可以设置并使用*堡垒主机*以作为它们的连接代理。有关更多信息，请参阅下面的 [使用堡垒主机的代理连接](#ethereum-create-bastion-host)。
+ **docker-local** — 您使用托管 Ethereum 服务的 EC2 实例的 IP 地址进行连接，如下所示。使用 EC2 控制台查找模板创建{{ec2-IP-address}}的实例。
  + **EthStats**—使用 http://{{ec2-IP-address}}
  + **EthExplorer**—使用 http: //: 8080 {{ec2-IP-address}}
  + **EthJsonRpc**—使用 http: //: 8545 {{ec2-IP-address}}

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

  如果您指定了私有子网，您可以设置并使用*堡垒主机*以作为到这些地址的连接代理。有关更多信息，请参阅下面的 [使用堡垒主机的代理连接](#ethereum-create-bastion-host)。

### 使用堡垒主机的代理连接
<a name="ethereum-create-bastion-host"></a>

包含某些配置的 Ethereum 服务可能不会公开。在这种情况下，您可以通过*堡垒主机*连接到 Ethereum 资源。有关堡垒主机的更多信息，请参阅 [Linux 堡垒主机快速入门指南*中的 *Linux 堡垒主机架构](https://docs.aws.amazon.com/quickstart/latest/linux-bastion/architecture.html)。

堡垒主机是 EC2 实例。确保满足以下要求：
+ 堡垒主机的 EC2 实例位于启用了自动分配公有 IP 且具有互联网网关的公有子网内。
+ 堡垒主机拥有允许 ssh 连接的密钥对。
+ 堡垒主机与允许来自连接的客户端的入站 SSH 流量的安全组关联。
+ 分配给 Ethereum 主机的安全组（例如，如果 ECS 是容器平台，则分配给应用程序负载均衡器；如果 docker-local 是容器平台，则分配给主机 EC2 实例）允许 VPC 内的所有端口上的入站流量。

设置堡垒主机后，请确保连接的客户端使用堡垒主机作为代理。以下示例演示了如何使用 Mac OS 设置代理连接。{{BastionIP}}替换为堡垒主机 EC2 实例的 IP 地址和{{MySshKey.pem}}您复制到堡垒主机的 key pair 文件。

在命令行键入以下内容：

```
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 主机地址。