

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

# 使用 Lambda 函数、Amazon VPC 和无服务器架构生成静态出站 IP 地址
<a name="generate-a-static-outbound-ip-address-using-a-lambda-function-amazon-vpc-and-a-serverless-architecture"></a>

*Thomas Scott，Amazon Web Services*

## Summary
<a name="generate-a-static-outbound-ip-address-using-a-lambda-function-amazon-vpc-and-a-serverless-architecture-summary"></a>

此模式描述如何使用无服务器架构在 Amazon Web Services (AWS) Cloud 中生成静态出站 IP 地址。如果您的组织想要使用安全文件传输协议 (SFTP) 将文件发送到单独的业务实体，则可以从此方法中受益。这意味着业务实体必须有权访问允许文件通过防火墙的 IP 地址。 

该模式的方法可以帮助您创建使用[弹性 IP 地址](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/elastic-ip-addresses-eip.html)作为出站 IP 地址的 AWS Lambda 函数。通过遵循此模式中的步骤，您可以创建 Lambda 函数和虚拟私有云（VPC），通过具有静态 IP 地址的互联网网关路由出站流量。要使用静态 IP 地址，您可将 Lambda 函数附加到 VPC 及其子网。 

## 先决条件和限制
<a name="generate-a-static-outbound-ip-address-using-a-lambda-function-amazon-vpc-and-a-serverless-architecture-prereqs"></a>

**先决条件**
+ 一个有效的 Amazon Web Services account。 
+ AWS Identity and Access Management (IAM) 权限，用于创建和部署 Lambda 函数，以创建 VPC 及其子网。有关这方面的更多信息，请参阅 AWS Lambda 文档中的[执行角色和用户权限](https://docs.aws.amazon.com/lambda/latest/dg/configuration-vpc.html#vpc-permissions)。
+ 如果您计划使用基础设施即代码（IaC）实施此模式的方法，则需要集成式开发环境（IDE），例如 AWS Cloud9。有关这方面的更多信息，请参阅 AWS Cloud9 文档中的 [AWS Cloud9 是什么？](https://docs.aws.amazon.com/cloud9/latest/user-guide/welcome.html)。

## 架构
<a name="generate-a-static-outbound-ip-address-using-a-lambda-function-amazon-vpc-and-a-serverless-architecture-architecture"></a>

下图显示此模式的无服务器架构。

![](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/images/pattern-img/eb1d0b05-df33-45ae-b27e-36090055b300/images/c15cc6da-ce4e-4ea0-9feb-de1c845d3ce8.png)


下图显示了如下工作流：

1. 出站流量离开 `Public subnet 1` 中的 `NAT gateway 1`。

1. 出站流量离开 `Public subnet 2` 中的 `NAT gateway 2`。

1. Lambda 函数可在 `Private subnet 1` 或 `Private subnet 2` 中运行。

1. `Private subnet 1` 和 `Private subnet 2` 将流量路由到公有子网中的 NAT 网关。

1. NAT 网关将出站流量从公共子网发送至互联网网关。

1. 出站数据从互联网网关传输至外部服务器。



**技术堆栈**
+ Lambda
+ Amazon Virtual Private Cloud (Amazon VPC)

 

**自动化和扩缩**

您可以通过在不同的可用区使用两个公有子网和两个私有子网，确保高可用性 (HA)。即使一个可用区不可用，该模式的解决方案仍能继续发挥作用。

## 工具
<a name="generate-a-static-outbound-ip-address-using-a-lambda-function-amazon-vpc-and-a-serverless-architecture-tools"></a>
+ [AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html) – AWS Lambda 是一项计算服务，支持无需预置或管理服务器即可运行代码。只有在需要时 Lambda 才运行您的代码，并且能自动扩缩，从每天几个请求扩展到每秒数千个请求。您只需为消耗的计算时间付费 - 代码未运行时不产生费用。
+ [Amazon VPC](https://docs.aws.amazon.com/vpc/) – Amazon Virtual Private Cloud (Amazon VPC) 预调配 Amazon Web Services Cloud 的逻辑隔离部分，您可以在其中启动您定义的虚拟网络中的 AWS 资源。此虚拟网络与您在自己的数据中心中运营的传统网络极其相似，您将获得使用 AWS 可扩展基础设施的优势。

## 操作说明
<a name="generate-a-static-outbound-ip-address-using-a-lambda-function-amazon-vpc-and-a-serverless-architecture-epics"></a>

### 创建新的 VPC
<a name="create-a-new-vpc"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 创建新的 VPC。 | 登录 AWS 管理控制台，打开 Amazon VPC 控制台，然后创建一个名为 `Lambda VPC` IPv4 CIDR 范围的 VPC。`10.0.0.0/25`****<br />有关创建 VPC 的更多信息，请参阅 Amazon VPC 文档中的 [Amazon VPC 入门](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-getting-started.html#getting-started-create-vpc)。  | AWS 管理员 | 

### 创建两个公有子网
<a name="create-two-public-subnets"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 创建第一个公有子网。 | 1. 在 Amazon VPC 控制台上，选择**子网**，然后选择**创建子网**。 <br />2. 对于**名称标签**，输入 `public-one`。<br />3. 对于 **VPC**，选择 `Lambda VPC`。<br />4. 选择一个可用区并记录它。 <br />5. 对于 **IPv4 CIDR 块**，输入，`10.0.0.0/28`****然后选择**创建子网**。 | AWS 管理员 | 
| 创建第二个公有子网。 | 1. 在 Amazon VPC 控制台上，选择**子网**，然后选择**创建子网**。 <br />2. 对于**名称标签**，输入 `public-two`。<br />3. 对于 **VPC**，选择 `Lambda VPC`。<br />4. 选择一个可用区并记录它。：您不能使用包含该 `public-one` 子网的可用区。 <br />5. 对于 **IPv4 CIDR 块**，输入，`10.0.0.16/28`****然后选择**创建子网**。 | AWS 管理员 | 

### 创建两个私有子网
<a name="create-two-private-subnets"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 创建第一个私有子网。 | 1. 在 Amazon VPC 控制台上，选择**子网**，然后选择**创建子网**。 <br />2. 对于**名称标签**，输入 `private-one`。<br />3. 对于 **VPC**，选择 `Lambda VPC`。<br />4. 选择包含您之前创建的 `public-one` 子网的可用区。 <br />5. 对于 **IPv4 CIDR 块**，输入，`10.0.0.32/28`****然后选择**创建子网**。 | AWS 管理员 | 
| 创建第二个私有子网。 | 1. 在 Amazon VPC 控制台上，选择**子网**，然后选择**创建子网**。 <br />2. 对于**名称标签**，输入 `private-two`。<br />3. 对于 **VPC**，选择 `Lambda VPC`。<br />4. 选择包含您之前创建的 `public-two` 子网的相同可用区。 <br />5. 对于 **IPv4 CIDR 块**，输入，`10.0.0.64/28`****然后选择**创建子网**。 | AWS 管理员 | 

### 为您的 NAT 网关创建两个弹性 IP 地址
<a name="create-two-elastic-ip-addresses-for-your-nat-gateways"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
|  创建第一个弹性 IP 地址。 | 1. 在 Amazon VPC 控制台上，选择**弹性**， IPs然后选择**分配新地址**。 ****<br />2. 选择**分配**并为您新创建的弹性 IP 地址记录**分配 ID**。****此弹性 IP 地址用于您的第一个 NAT 网关。  | AWS 管理员 | 
| 创建第二个弹性 IP 地址。 | 1. 在 Amazon VPC 控制台上，选择**弹性**， IPs然后选择**分配新地址**。 ****<br />2. 选择**分配**，并为第二个弹性 IP 地址记录**分配 ID**。此弹性 IP 地址用于您的第二个 NAT 网关。 | AWS 管理员 | 

### 创建互联网网关
<a name="create-an-internet-gateway"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 创建互联网网关。 | 1. 在 Amazon VPC 控制台上，选择**互联网网关**，然后选择**创建互联网网关**。<br />2. 输入 `Lambda internet gateway` 作为名称，然后选择**创建互联网网关**。务必记录互联网网关 ID。  | AWS 管理员 | 
| 将互联网网关连接到 VPC。 | 选择刚刚创建的 Internet 网关，然后选择 **Actions, Attach to VPC (操作，附加到 VPC)**。 | AWS 管理员 | 

### 创建两个 NAT 网关
<a name="create-two-nat-gateways"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 创建第一个 NAT 网关。 | 1. 在 Amazon VPC 控制台上，选择 **NAT 网关**，然后选择**创建 NAT 网关**。<br />2. 输入 `nat-one`** **作为 NAT 网关名称。****<br />3. 选择 `public-one`** **作为子网，以在其中创建 NAT 网关。****<br />4. 对于**连接类型**，选择**公共**。<br />5. 对于**弹性 IP 分配 ID**，选择您之前创建的第一个弹性 IP 地址，并将其与 NAT 网关关联。<br />6. 选择**创建 NAT 网关**。 | AWS 管理员 | 
| 创建第二个 NAT 网关。 | 1. 在 Amazon VPC 控制台上，选择 **NAT 网关**，然后选择**创建 NAT 网关**。<br />2. 输入 `nat-two`** **作为 NAT 网关名称。****<br />3. 选择 `public-two`** **作为子网，以在其中创建 NAT 网关。<br />4. 对于**连接类型**，选择**公共**。<br />5. 对于**弹性 IP 分配 ID**，选择您之前创建的第二个弹性 IP 地址，并将其与 NAT 网关关联。<br />6. 选择**创建 NAT 网关**。 | AWS 管理员 | 

### 为您的公有子网与私有子网创建路由表
<a name="create-route-tables-for-your-public-and-private-subnets"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 为公有子网创建路由表。 | 1. 在 Amazon VPC 控制台中，选择**路由表**，然后选择**创建路由表**。<br />2. 输入 `public-one-subnet`** **作为路由表名称，然后选择**创建路由表**。<br />3. 选择 `public-one-subnet` 路由表，选择**编辑路由**，然后选择**添加路由**。<br />4. 在**目的地**框中指定 `0.0.0.0`****，然后在**目标**列表中选择互联网网关 ID。<br />5. 在**子网关联**选项卡上，选择**编辑子网关联**，选择 CIDR 范围为 `10.0.0.0/28`** **的 `public-one` 子网****，然后选择**保存关联**。<br />6. 选择**保存更改**。 | AWS 管理员 | 
| 为 public-two 子网创建路由表。 | 1. 在 Amazon VPC 控制台中，选择**路由表**，然后选择**创建路由表**。<br />2. 输入 `public-two-subnet`** **作为路由表名称，然后选择**创建路由表**。<br />3. 选择 `public-two-subnet`** **路由表，选择**编辑路由**，然后选择**添加路由**。<br />4. 在**目的地**框中指定 `0.0.0.0`****，然后在**目标**列表中选择互联网网关 ID。<br />5. 在**子网关联**选项卡上，选择**编辑子网关联**，选择 CIDR 范围为 `10.0.0.16/28`** **的 `public-two`** **子网，然后选择**保存关联**。<br />6. 选择**保存更改**。 | AWS 管理员 | 
| 为 private-one 子网创建路由表。 | 1. 在 Amazon VPC 控制台中，选择**路由表**，然后选择**创建路由表**。<br />2. 输入 `private-one-subnet`** **作为路由表名称，然后选择**创建路由表**。<br />3. 选择 `private-one-subnet`** **路由表，选择**编辑路由**，然后选择**添加路由**。<br />4. 在**目的地**框中指定 `0.0.0.0`****，然后在**目标**列表中选择 `public-one` 子网中的 NAT 网关。<br />5. 在**子网关联**选项卡上，选择**编辑子网关联**，选择 CIDR 范围为 `10.0.0.32/28`** **的 `private-one`子网，然后选择**保存关联**。<br />6. 选择**保存更改**。 | AWS 管理员 | 
| 为 private-two 子网创建路由表。 | 1. 在 Amazon VPC 控制台中，选择**路由表**，然后选择**创建路由表**。<br />2. 输入 `private-two-subnet`** **作为路由表名称，然后选择**创建路由表**。<br />3. 选择 `private-two-subnet`** **路由表，选择**编辑路由**，然后选择**添加路由**。<br />4. 在**目的地**框中指定 `0.0.0.0`****，然后在**目标**列表中选择 `public-two` 子网中的 NAT 网关。<br />5. 在**子网关联**选项卡上，选择**编辑子网关联**，选择 CIDR 范围为 `10.0.0.64/28` 的 `private-two`** **子网，然后选择**保存关联**。<br />6. 选择**保存更改**。 | AWS 管理员 | 

### 创建 Lambda 函数，将其添加至 VPC，然后测试解决方案
<a name="create-the-lambda-function-add-it-to-the-vpc-and-test-the-solution"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 新建 Lambda 函数。 | 1. 打开 AWS Lambda 控制台，然后选择**创建函数**。** **<br />2. 在**基本信息**下方，在**函数名称**下输入 `Lambda test`，然后在**运行时系统**下选择所选语言。****<br />3. 选择**创建函数**。 | AWS 管理员 | 
| 将 Lambda 函数添加到您的 VPC。 | 1. 在 AWS Lambda 控制台上，选择**函数**，然后选择您之前创建的函数。 <br />2. 选择 **Configuration**（配置），然后选择 **VPC**。<br />3. 选择**编辑**，然后选择 `Lambda VPC`** **和两个私有子网。<br />4. 选择用于测试的**默认安全组**，然后选择**保存**。 | AWS 管理员 | 
| 编写代码来调用外部服务。 | 1. 使用您选择的编程语言编写代码，调用返回您的 IP 地址的外部服务。<br />2. 验证返回的 IP 地址是否与您的一个弹性 IP 地址相匹配。 | AWS 管理员 | 

## 相关资源
<a name="generate-a-static-outbound-ip-address-using-a-lambda-function-amazon-vpc-and-a-serverless-architecture-resources"></a>
+ [配置 Lambda 函数以访问 VPC 中的资源](https://docs.aws.amazon.com/lambda/latest/dg/configuration-vpc.html)