

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

# 使用 AWS PrivateLink 和 Network Load Balancer 在 Amazon ECS 上私密访问容器应用程序
<a name="access-container-applications-privately-on-amazon-ecs-by-using-aws-privatelink-and-a-network-load-balancer"></a>

*Kirankumar Chandrashekar，Amazon Web Services*

## Summary
<a name="access-container-applications-privately-on-amazon-ecs-by-using-aws-privatelink-and-a-network-load-balancer-summary"></a>

此模式描述了如何在网络负载均衡器后面的亚马逊弹性容器服务 (Amazon ECS) 上私下托管 Docker 容器应用程序，以及如何使用 AWS 访问该应用程序。 PrivateLink然后，您便可以使用专用网络安全地访问 Amazon Web Services (AWS) Cloud 上的服务。Amazon Relational Database Service (Amazon RDS) 为在具有高可用性 (HA) 的 Amazon ECS 上运行的应用程序关系数据库提供托管。如果应用程序需要持久性存储，请使用 Amazon Elastic File System (Amazon EFS)。

运行 Docker 应用程序的 Amazon ECS 服务在前端装有 Network Load Balancer，可以与虚拟私有云 (VPC) 终端节点相关联，以便通过 AWS PrivateLink 进行访问。然后，可以使用 VPC 终端节点与其他 VPCs 人共享此 VPC 终端节点服务。

你也可以使用 [AWS Fargate](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/AWS_Fargate.html) 代替 Amazon A EC2 uto Scaling 群组。有关更多信息，请参阅[使用 AWS Fargate、AWS 和网络负载均衡器在 Amazon ECS PrivateLink 上私下访问容器应用程序](https://docs.aws.amazon.com/prescriptive-guidance/latest/patterns/access-container-applications-privately-on-amazon-ecs-by-using-aws-fargate-aws-privatelink-and-a-network-load-balancer.html?did=pg_card)。

## 先决条件和限制
<a name="access-container-applications-privately-on-amazon-ecs-by-using-aws-privatelink-and-a-network-load-balancer-prereqs"></a>

**先决条件**
+ 一个活跃的 AWS 账户
+ 已在 Linux、macOS 或 Windows 上安装并配置 [AWS 命令行界面（AWS CLI）版本 2](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)
+ [Docker](https://www.docker.com/)，已在 Linux、macOS 或 Windows 上安装并配置
+ 在 Docker 上运行的应用程序

## 架构
<a name="access-container-applications-privately-on-amazon-ecs-by-using-aws-privatelink-and-a-network-load-balancer-architecture"></a>

![使用 AWS PrivateLink 在网络负载均衡器后面访问 Amazon ECS 上的容器应用程序。](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/images/pattern-img/a316bf46-24db-4514-957d-abc60f8f6962/images/573951ed-74bb-4023-9d9c-43e77e4f8eda.png)


 

**技术堆栈**
+ Amazon CloudWatch
+ 亚马逊弹性计算云（亚马逊 EC2）
+ Amazon A EC2 uto Scaling
+ Amazon Elastic Container Registry(Amazon ECR)
+ Amazon ECS
+ Amazon RDS
+ Amazon Simple Storage Service（Amazon S3）
+ AWS Lambda
+ AWS PrivateLink
+ AWS Secrets Manager
+ 应用程序负载均衡器
+ Network Load Balancer
+ VPC

*自动化和扩展*
+ 您可以使用 [AWS](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/Welcome.html) 通过使用[基础设施即代码 CloudFormation](https://docs.aws.amazon.com/whitepapers/latest/introduction-devops-aws/infrastructure-as-code.html)来创建此模式。

## 工具
<a name="access-container-applications-privately-on-amazon-ecs-by-using-aws-privatelink-and-a-network-load-balancer-tools"></a>
+ [亚马逊 EC2](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/concepts.html) — 亚马逊弹性计算云 (Amazon EC2) 在 AWS 云中提供可扩展的计算容量。
+ [Amazon A EC2 ut](https://docs.aws.amazon.com/autoscaling/ec2/userguide/what-is-amazon-ec2-auto-scaling.html) EC2 o Scaling — Amazon Auto Scaling 可帮助您确保有正确数量的亚马逊 EC2 实例可用来处理应用程序的负载。
+ [Amazon ECS](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/Welcome.html) - Amazon Elastic Container Service (Amazon ECS)是一项高度可扩展的快速容器管理服务，可帮助轻松运行、停止和管理集群上的容器。
+ [Amazon ECR](https://docs.aws.amazon.com/AmazonECR/latest/userguide/what-is-ecr.html) - Amazon Elastic Container Registry (Amazon ECR) 是一项安全、可靠且可扩展的 AWS 托管容器映像注册表服务。
+ [Amazon EFS](https://docs.aws.amazon.com/efs/latest/ug/whatisefs.html) - Amazon Elastic File System (Amazon EFS)可提供简单、可扩展、完全托管的弹性 NFS 文件系统，以便与 Amazon Web Services Cloud 服务和本地资源配合使用。
+ [AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html) - Lambda 是一项计算服务，使您无需预调配或管理服务器即可运行代码。
+ [Amazon RDS](https://docs.aws.amazon.com/rds/) – Amazon Relational Database Service (Amazon RDS) 是一项 Web 服务，使用户能够在 Amazon Web Services Cloud 中轻松设置、操作和扩展关系数据库。
+ [Amazon S3](https://docs.aws.amazon.com/AmazonS3/latest/userguide/Welcome.html) – Amazon Simple Storage Service (Amazon S3) 是一项面向互联网的存储服务。该服务旨在降低开发人员进行网络规模级计算的难度。
+ [AWS Secrets Manager](https://docs.aws.amazon.com/secretsmanager/latest/userguide/intro.html) - Secrets Manager 允许您将代码中的硬编码凭证(包括密码)替换为对 Secrets Manager 的 API 调用，并以编程方式检索密钥。
+ [Amazon VPC](https://docs.aws.amazon.com/vpc/latest/userguide/what-is-amazon-vpc.html) - Amazon Virtual Private Cloud (Amazon VPC)可助您将 AWS 资源启动到您已定义的虚拟网络中。
+ [Elastic L](https://docs.aws.amazon.com/elasticloadbalancing/latest/userguide/what-is-load-balancing.html) oad Balancing — Elastic Load Balancing 将传入的应用程序或网络流量分配到多个可用区的多个目标，例如亚马逊 EC2 实例、容器和 IP 地址。
+ [Docker](https://www.docker.com/) - Docker 允许开发人员打包、交付和运行任何应用程序，并将其作为轻量、便携且自给自足的容器。

## 操作说明
<a name="access-container-applications-privately-on-amazon-ecs-by-using-aws-privatelink-and-a-network-load-balancer-epics"></a>

### 创建联网组件
<a name="create-networking-components"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 创建 VPC。 | [See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/access-container-applications-privately-on-amazon-ecs-by-using-aws-privatelink-and-a-network-load-balancer.html) | 云管理员 | 

### 创建负载均衡器
<a name="create-the-load-balancers"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 创建网络负载均衡器。 | [See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/access-container-applications-privately-on-amazon-ecs-by-using-aws-privatelink-and-a-network-load-balancer.html) | 云管理员 | 
| 创建应用程序负载均衡器。 | [See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/access-container-applications-privately-on-amazon-ecs-by-using-aws-privatelink-and-a-network-load-balancer.html) | 云管理员 | 

### 创建 Amazon EFS 文件系统
<a name="create-an-amazon-efs-file-system"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 创建 Amazon EFS 文件系统。 | [See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/access-container-applications-privately-on-amazon-ecs-by-using-aws-privatelink-and-a-network-load-balancer.html) | 云管理员 | 
| 子网的挂载目标。 | [See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/access-container-applications-privately-on-amazon-ecs-by-using-aws-privatelink-and-a-network-load-balancer.html) | 云管理员 | 
| 验证子网是否已挂载为目标。 | [See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/access-container-applications-privately-on-amazon-ecs-by-using-aws-privatelink-and-a-network-load-balancer.html) | 云管理员 | 

### 创建 S3 存储桶
<a name="create-an-s3-bucket"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 创建 S3 存储桶。 | 打开 Amazon S3 控制台并创建一个 S3 存储桶，以在需要时存储应用程序的静态资产。 | 云管理员 | 

### 创建 Secrets Manager 密钥
<a name="create-a-secrets-manager-secret"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 创建 AWS KMS 密钥以加密 Secrets Manager 密钥。 | 打开 AWS Key Management Service (AWS KMS)控制台并创建 KMS 密钥。 | 云管理员 | 
|  创建 Secrets Manager 密钥以存储 Amazon RDS 密码。 | [See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/access-container-applications-privately-on-amazon-ecs-by-using-aws-privatelink-and-a-network-load-balancer.html) | 云管理员  | 

### 创建 Amazon RDS 实例
<a name="create-an-amazon-rds-instance"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 创建数据库子网组。 | [See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/access-container-applications-privately-on-amazon-ecs-by-using-aws-privatelink-and-a-network-load-balancer.html) | 云管理员 | 
| 创建 Amazon RDS 实例。 | 在私有子网中创建和配置 Amazon RDS 实例。确保已启用**多可用区**以实现高可用性(HA)。 | 云管理员 | 
| 将数据载入 Amazon RDS 实例。 | 将应用程序所需关系数据加载到 Amazon RDS 实例中。此流程将根据应用程序的需求以及数据库架构的定义和设计方式而有所不同。 | 云管理员、数据库管理员 | 

### 创建 Amazon ECS 组件
<a name="create-the-amazon-ecs-components"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 创建 ECS 集群。 | [See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/access-container-applications-privately-on-amazon-ecs-by-using-aws-privatelink-and-a-network-load-balancer.html) | 云管理员 | 
| 创建 Docker 映像  | 按照*相关资源*部分中的说明创建 Docker 映像。 | 云管理员 | 
| 创建 Amazon ECR 存储库。 | [See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/access-container-applications-privately-on-amazon-ecs-by-using-aws-privatelink-and-a-network-load-balancer.html) | 云管理员、 DevOps 工程师 | 
| 对您的 Amazon ECR 注册表进行 Docker CLI 身份验证。 | 要对 Amazon ECR 存储库的 Docker 客户端进行身份验证，请在 AWS CLI 中运行 "`aws ecr get-login-password` 命令。 | 云管理员 | 
| 推送 Docker 映像至 Amazon ECR 存储库  | [See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/access-container-applications-privately-on-amazon-ecs-by-using-aws-privatelink-and-a-network-load-balancer.html) | 云管理员 | 
| 创建 Amazon ECS 任务定义。 | 需要任务定义才能在 Amazon ECS 中运行 Docker 容器。 [See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/access-container-applications-privately-on-amazon-ecs-by-using-aws-privatelink-and-a-network-load-balancer.html)有关设置任务定义的帮助，请参阅*相关资源*部分中的“创建任务定义”。请务必提供您推送至 Amazon ECR 的 Docker 映像。 | 云管理员 | 
| 创建 Amazon ECS 服务  | 使用您之前创建的 ECS 集群创建 Amazon ECS 服务。确保选择 Amazon EC2 作为启动类型，然后选择在上一步中创建的任务定义以及 Application Load Balancer 的目标组。 | 云管理员 | 

### 创建 Amazon A EC2 uto Scaling 群组
<a name="create-an-amazon-ec2-auto-scaling-group"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 创建启动配置。 | 打开 Amazon EC2 控制台，然后创建启动配置。确保用户数据包含允许 EC2 实例加入所需的 ECS 集群的代码。有关所需代码的示例，请参阅*相关资源*部分。 | 云管理员 | 
| 创建 Amazon A EC2 uto Scaling 群组。 | 返回亚马逊 EC2 控制台，在 A **uto S** caling 下，选择 A **uto Scaling 群组**。设置一个 Amazon A EC2 uto Scaling 群组。请确保您选择了之前创建的私有子网和启动配置。 | 云管理员 | 

### 设置 AWS PrivateLink
<a name="set-up-aws-privatelink"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 设置 AWS 终 PrivateLink 端节点。 | [See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/access-container-applications-privately-on-amazon-ecs-by-using-aws-privatelink-and-a-network-load-balancer.html)有关更多信息，请参阅*相关资源*部分。 | 云管理员 | 

### 创建 VPC 端点
<a name="create-a-vpc-endpoint"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 创建 VPC 端点。 | 为您之前创建的 AWS 终端 PrivateLink 节点创建 VPC 终端节点。VPC 终端节点完全限定域名 (FQDN) 将指向 AWS PrivateLink 终端节点 FQDN。这将创建一个 DNS 端点可以访问的 VPC 端点服务的弹性网络接口。 | 云管理员 | 

### 创建 Lambda 函数
<a name="create-the-lambda-function"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 创建 Lambda 函数。 | 在 AWS Lambda 控制台上，创建 Lambda 函数以将应用程序负载均衡器 IP 地址更新为网络负载均衡器的目标。有关这方面的更多信息，请参阅[使用 AWS Lambda 为应用程序负载均衡器启用静态 IP 地址](https://aws.amazon.com/blogs/networking-and-content-delivery/using-aws-lambda-to-enable-static-ip-addresses-for-application-load-balancers/)博客文章。 | 应用程序开发人员 | 

## 相关资源
<a name="access-container-applications-privately-on-amazon-ecs-by-using-aws-privatelink-and-a-network-load-balancer-resources"></a>

**创建负载均衡器：**
+ [为 Amazon ECS 使用网络负载均衡器](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/nlb.html)
+ [创建网络负载均衡器](https://docs.aws.amazon.com/elasticloadbalancing/latest/network/create-network-load-balancer.html)
+ [为 Amazon ECS 使用应用程序负载均衡器](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/alb.html)
+ [创建应用程序负载均衡器](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/create-application-load-balancer.html)

**创建 Amazon EFS 文件系统：**
+ [创建 Amazon EFS 文件系统](https://docs.aws.amazon.com/efs/latest/ug/creating-using-create-fs.html)
+ [在 Amazon EFS 中创建挂载目标](https://docs.aws.amazon.com/efs/latest/ug/accessing-fs.html)

**创建 S3 存储桶：**
+ [创建 S3 存储桶](https://docs.aws.amazon.com/AmazonS3/latest/userguide/GetStartedWithS3.html#creating-bucket)

**创建 Secrets Manager 密钥：**
+ [在 AWS KMS 中创建密钥](https://docs.aws.amazon.com/kms/latest/developerguide/create-keys.html)
+ [在 AWS Secrets Manager 中创建密钥](https://docs.aws.amazon.com/secretsmanager/latest/userguide/intro.html)

**创建 Amazon RDS 实例：**
+ [创建 Amazon RDS 数据库实例](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_CreateDBInstance.html)

**创建 Amazon ECS 组件：**
+ [创建 Amazon ECS 集群 ](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/create-ec2-cluster-console-v2.html)
+ [创建 Docker 映像 ](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/create-container-image.html)
+ [创建 Amazon ECR 存储库 ](https://docs.aws.amazon.com/AmazonECR/latest/userguide/repository-create.html)
+ [使用 Amazon ECR 存储库对 Docker 进行身份验证](https://docs.aws.amazon.com/AmazonECR/latest/userguide/Registries.html#registry_auth)
+ [将映像推送至 Amazon ECR 存储库](https://docs.aws.amazon.com/AmazonECR/latest/userguide/docker-push-ecr-image.html)
+ [创建 Amazon ECS 任务定义](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definitions.html)
+ [创建 Amazon ECS 服务](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/create-service-console-v2.html)

**创建 Amazon A EC2 uto Scaling 群组：**
+ [创建启动配置](https://docs.aws.amazon.com/autoscaling/ec2/userguide/create-launch-config.html)
+ [使用启动配置创建自动扩缩组](https://docs.aws.amazon.com/autoscaling/ec2/userguide/create-asg.html)
+ [使用亚马逊 EC2 用户数据引导容器实例](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/bootstrap_container_instance.html)

**设置 AWS PrivateLink：**
+ [VPC 终端节点服务 (AWS PrivateLink)](https://docs.aws.amazon.com/vpc/latest/privatelink/privatelink-share-your-services.html)

**创建 VPC 端点：**
+ [接口 VPC 终端节点 (AWS PrivateLink)](https://docs.aws.amazon.com/vpc/latest/privatelink/create-interface-endpoint.html)

**创建 Lambda 函数：**
+ [创建 Lambda 函数](https://docs.aws.amazon.com/lambda/latest/dg/getting-started.html)

**其他资源：**
+ [为应用程序负载均衡器使用静态 IP 地址](https://aws.amazon.com/blogs/networking-and-content-delivery/using-static-ip-addresses-for-application-load-balancers/)
+ [通过 AWS 安全访问服务 PrivateLink](https://d1.awsstatic.com/whitepapers/aws-privatelink.pdf)