

# 开始通过 Amazon CLI 使用 IPAM
<a name="getting-started-with-ipam-using-the-aws-cli"></a>

本教程将指导您完成使用单个 Amazon 账户在 Amazon CLI 中设置和使用 Amazon VPC IP 地址管理器（IPAM）的过程。到本教程结束时，您将已经创建 IPAM 和 IP 地址池层次结构，并将 CIDR 分配给了 VPC。

## 先决条件
<a name="prerequisites"></a>

在开始本教程之前，请确保您具有：
+ 有权创建和管理 IPAM 资源的 Amazon 账户。
+ 已安装 Amazon CLI 并配置了相应的凭证。有关安装 Amazon CLI 的信息，请参阅[安装或更新最新版本的 Amazon CLI](https://docs.amazonaws.cn/cli/latest/userguide/getting-started-install.html)。有关配置 Amazon CLI 的信息，请参阅[基本配置](https://docs.amazonaws.cn/cli/latest/userguide/cli-configure-quickstart.html)。
+ 有关 IP 寻址和 CIDR 表示法的基础知识。
+ 有关 Amazon VPC 概念的基础知识。
+ 完成本教程大约需要 30 分钟。

## 创建 IPAM
<a name="create-an-ipam"></a>

第一步是根据运营区域创建 IPAM。您可以使用 IPAM 来计划、跟踪和监控 Amazon 工作负载的 IP 地址。

创建 IPAM，其运营区域为 us-east-1 和 us-west-2：

```
aws ec2 create-ipam \
  --description "My IPAM" \
  --operating-regions RegionName=us-east-1 RegionName=us-west-2
```

此命令会创建 IPAM 并使其能够管理指定区域中的 IP 地址。运营区域是允许 IPAM 在其中管理 IP 地址 CIDR 的 Amazon 区域。

验证 IPAM 是否已创建：

```
aws ec2 describe-ipams
```

记下输出中的 IPAM ID，您将在后续步骤中用到它。

等待 IPAM 创建完毕并可用（约 20 秒）：

```
sleep 20
```

## 获取 IPAM 范围 ID
<a name="get-the-ipam-scope-id"></a>

创建 IPAM 时，Amazon 将自动创建一个私有范围和一个公有范围。在本教程中，我们将使用私有范围。

检索 IPAM 详细信息并提取私有范围 ID：

```
aws ec2 describe-ipams --ipam-id ipam-0abcd1234
```

将 `ipam-0abcd1234` 替换为实际的 IPAM ID。

在输出中，找到 `PrivateDefaultScopeId` 字段中的私有范围 ID 并记下来。该条目看起来类似于 `ipam-scope-0abcd1234`。

## 创建顶级 IPv4 池
<a name="create-a-top-level-ipv4-pool"></a>

现在，我们在私有范围中创建一个顶级池。该池将作为层次结构中所有其他池的父池。

创建顶级 IPv4 池：

```
aws ec2 create-ipam-pool \
  --ipam-scope-id ipam-scope-0abcd1234 \
  --address-family ipv4 \
  --description "Top-level pool"
```

将 `ipam-scope-0abcd1234` 替换为实际的私有范围 ID。

等待池创建完毕并可用：

```
aws ec2 describe-ipam-pools --ipam-pool-ids ipam-pool-0abcd1234 --query 'IpamPools[0].State' --output text
```

将 `ipam-pool-0abcd1234` 替换为实际的顶级池 ID。应等待状态显示 `create-complete` 之后，再继续操作。

池可用后，向池预置 CIDR 块：

```
aws ec2 provision-ipam-pool-cidr \
  --ipam-pool-id ipam-pool-0abcd1234 \
  --cidr 10.0.0.0/8
```

等待 CIDR 预置完毕：

```
aws ec2 get-ipam-pool-cidrs --ipam-pool-id ipam-pool-0abcd1234 --query "IpamPoolCidrs[?Cidr=='10.0.0.0/8'].State" --output text
```

应等待状态显示 `provisioned` 之后，再继续操作。

## 创建区域 IPv4 池
<a name="create-a-regional-ipv4-pool"></a>

接下来，在顶级池中创建区域池。该池特定于某个特别的 Amazon 区域。

创建区域 IPv4 池：

```
aws ec2 create-ipam-pool \
  --ipam-scope-id ipam-scope-0abcd1234 \
  --source-ipam-pool-id ipam-pool-0abcd1234 \
  --locale us-east-1 \
  --address-family ipv4 \
  --description "Regional pool in us-east-1"
```

将 `ipam-scope-0abcd1234` 替换为实际的私有范围 ID，将 `ipam-pool-0abcd1234` 替换为顶级池 ID。

等待区域池创建完毕并可用：

```
aws ec2 describe-ipam-pools --ipam-pool-ids ipam-pool-1abcd1234 --query 'IpamPools[0].State' --output text
```

将 `ipam-pool-1abcd1234` 替换为实际的区域池 ID。应等待状态显示 `create-complete` 之后，再继续操作。

池可用后，向池预置 CIDR 块：

```
aws ec2 provision-ipam-pool-cidr \
  --ipam-pool-id ipam-pool-1abcd1234 \
  --cidr 10.0.0.0/16
```

等待 CIDR 预置完毕：

```
aws ec2 get-ipam-pool-cidrs --ipam-pool-id ipam-pool-1abcd1234 --query "IpamPoolCidrs[?Cidr=='10.0.0.0/16'].State" --output text
```

应等待状态显示 `provisioned` 之后，再继续操作。

## 创建开发 IPv4 池
<a name="create-a-development-ipv4-pool"></a>

现在，在区域池中创建开发池。该池将用于开发环境。

创建开发 IPv4 池：

```
aws ec2 create-ipam-pool \
  --ipam-scope-id ipam-scope-0abcd1234 \
  --source-ipam-pool-id ipam-pool-1abcd1234 \
  --locale us-east-1 \
  --address-family ipv4 \
  --description "Development pool"
```

将 `ipam-scope-0abcd1234` 替换为实际的私有范围 ID，将 `ipam-pool-1abcd1234` 替换为区域池 ID。

注意：务必添加 `--locale` 参数，以便与父池的区域一致。

等待开发池创建完毕并可用：

```
aws ec2 describe-ipam-pools --ipam-pool-ids ipam-pool-2abcd1234 --query 'IpamPools[0].State' --output text
```

将 `ipam-pool-2abcd1234` 替换为实际的开发池 ID。应等待状态显示 `create-complete` 之后，再继续操作。

池可用后，向池预置 CIDR 块：

```
aws ec2 provision-ipam-pool-cidr \
  --ipam-pool-id ipam-pool-2abcd1234 \
  --cidr 10.0.0.0/24
```

等待 CIDR 预置完毕：

```
aws ec2 get-ipam-pool-cidrs --ipam-pool-id ipam-pool-2abcd1234 --query "IpamPoolCidrs[?Cidr=='10.0.0.0/24'].State" --output text
```

应等待状态显示 `provisioned` 之后，再继续操作。

## 创建使用 IPAM 池 CIDR 的 VPC
<a name="create-a-vpc-using-an-ipam-pool-cidr"></a>

最后，创建使用 IPAM 池中 CIDR 的 VPC。此处演示了如何使用 IPAM 为 Amazon 资源分配 IP 地址空间。

创建使用 IPAM 池 CIDR 的 VPC：

```
aws ec2 create-vpc \
  --ipv4-ipam-pool-id ipam-pool-2abcd1234 \
  --ipv4-netmask-length 26 \
  --tag-specifications 'ResourceType=vpc,Tags=[{Key=Name,Value=IPAM-VPC}]'
```

将 `ipam-pool-2abcd1234` 替换为实际的开发池 ID。

`--ipv4-netmask-length 26` 参数指定了您希望从池中分配 /26 CIDR 块（64 个 IP 地址）。选择此网络掩码长度是为了确保它小于池的 CIDR 块（/24）。

验证 VPC 是否已创建：

```
aws ec2 describe-vpcs --filters "Name=tag:Name,Values=IPAM-VPC"
```

## 验证 IPAM 池的分配情况
<a name="verify-the-ipam-pool-allocation"></a>

检查 CIDR 是否已从 IPAM 池中分配：

```
aws ec2 get-ipam-pool-allocations \
  --ipam-pool-id ipam-pool-2abcd1234
```

将 `ipam-pool-2abcd1234` 替换为实际的开发池 ID。

此命令显示了来自指定 IPAM 池的所有分配，包括您刚刚创建的 VPC。

## 故障排除
<a name="troubleshooting"></a>

以下是在使用 IPAM 时可能会遇到的一些常见问题：
+ **权限错误**：请确保 IAM 用户或角色具有创建和管理 IPAM 资源所需的权限。您可能需要 `ec2:CreateIpam`、`ec2:CreateIpamPool` 和其他相关权限。
+ **超出资源限制**：默认情况下，只能为每个账户创建一个 IPAM。如果已经有一个 IPAM，则需要先将其删除，然后再创建新的 IPAM，或者使用现有的 IPAM。
+ **CIDR 分配失败**：向池预置 CIDR 时，请确保要预置的 CIDR 不会与其他池中的现有分配重叠。
+ **API 请求超时**：如果您遇到“RequestExpired”错误，这可能是由于网络延迟或时间同步问题所致。请尝试再次运行命令。
+ **“状态错误”报错**：如果您收到“IncorrectState”错误，这可能是因为您尝试对其执行操作的资源未处于正确状态。请等待资源创建或预置完毕再继续。
+ **分配大小错误**：如果您收到有关分配大小的“InvalidParameterValue”错误，请确保您请求的网络掩码长度适合池大小。例如，您不能从 /24 池中分配 /25 CIDR。
+ **依赖项冲突**：清理资源时，您可能会遇到“DependencyViolation”错误。这是因为资源之间存在依赖关系。在删除池之前，请确保按照与创建时相反的顺序删除资源，并取消预置 CIDR。

## 清理资源
<a name="clean-up-resources"></a>

完成本教程后，应清除您创建的资源，以免产生不必要的费用。

1. 删除 VPC：

   ```
   aws ec2 delete-vpc --vpc-id vpc-0abcd1234
   ```

1. 从开发池中取消预置 CIDR：

   ```
   aws ec2 deprovision-ipam-pool-cidr --ipam-pool-id ipam-pool-2abcd1234 --cidr 10.0.0.0/24
   ```

1. 删除开发池：

   ```
   aws ec2 delete-ipam-pool --ipam-pool-id ipam-pool-2abcd1234
   ```

1. 从区域池中取消预置 CIDR：

   ```
   aws ec2 deprovision-ipam-pool-cidr --ipam-pool-id ipam-pool-1abcd1234 --cidr 10.0.0.0/16
   ```

1. 删除区域池：

   ```
   aws ec2 delete-ipam-pool --ipam-pool-id ipam-pool-1abcd1234
   ```

1. 从顶级池中取消预置 CIDR：

   ```
   aws ec2 deprovision-ipam-pool-cidr --ipam-pool-id ipam-pool-0abcd1234 --cidr 10.0.0.0/8
   ```

1. 删除顶级池：

   ```
   aws ec2 delete-ipam-pool --ipam-pool-id ipam-pool-0abcd1234
   ```

1. 删除 IPAM：

   ```
   aws ec2 delete-ipam --ipam-id ipam-0abcd1234
   ```

将所有 ID 替换为实际的资源 ID。

**注意**  
前后两个操作的间隔时间应稍微延长一些，以确保资源完全删除，然后再继续下一步操作。如果您遇到依赖项冲突的问题，请等待几秒，然后重试。

## 后续步骤
<a name="next-steps"></a>

现在，您已经学会了如何通过 Amazon CLI 创建和使用 IPAM，您可能需要探索更多高级功能：
+ [计划 IP 地址预置](planning-ipam.md)：了解如何有效规划 IP 地址空间
+ [按资源监控 CIDR 使用情况](monitor-cidr-compliance-ipam.md)：了解如何监控 IP 地址使用情况
+ [使用 Amazon RAM 共享 IPAM 池](share-pool-ipam.md)：了解如何跨 Amazon 账户共享 IPAM 池
+ [将 IPAM 与 Amazon Organization 中的账户集成](enable-integ-ipam.md)：了解如何在整个组织中使用 IPAM