

**本文档仅适用于 AWS CLI 版本 1。**

我们已宣布即将终止对 AWS CLI 版本 1 的支持。建议您迁移到 AWS CLI 版本 2。有关日期、其它详细信息以及如何迁移的信息，请参阅[公告](https://aws.amazon.com/blogs/developer/cli-v1-maintenance-mode-announcement/)。有关 AWS CLI 版本 2 的相关文档，请参阅[版本 2 用户指南](https://docs.aws.amazon.com/cli/latest/userguide/)。

# 在 AWS CLI 中生成 AWS CLI 骨架和输入文件
<a name="cli-usage-skeleton"></a>

大多数 AWS CLI 命令接受从文件导入参数输入。可以使用 `generate-cli-skeleton` 选项生成这些模板，然后使用 `--cli-input-json` 参数将其导入。

**Topics**
+ [关于 AWS CLI 框架和输入文件](#cli-usage-skeleton-about)
+ [生成和导入命令骨架](#cli-usage-skeleton-generate)
+ [合并输入文件和命令行参数](#cli-usage-skeleton-combine)

## 关于 AWS CLI 框架和输入文件
<a name="cli-usage-skeleton-about"></a>

大多数 AWS Command Line Interface（AWS CLI）命令支持使用 `--cli-input-json` 参数接受文件中的参数输入的功能。

这些相同的命令使用 `--generate-cli-skeleton` 参数通过所有可编辑和填写的参数以 JSON 格式生成文件。然后，您可以运行带 `--cli-input-json` 参数的命令并指向填充的文件。

**重要**  
自定义 AWS CLI 命令（例如 [`aws s3` 命令](https://docs.aws.amazon.com/cli/v1/reference/s3/index.html)）不支持本主题中介绍的 `--generate-cli-skeleton` 或 `--cli-input-json` 参数。要检查特定命令是否支持这些参数，请为要使用的命令运行 [`help` 命令](cli-usage-help.md#cli-usage-help-command)，或参阅 [AWS CLI 版本 1 参考指南](https://docs.aws.amazon.com/cli/v1/reference/)。

`--generate-cli-skeleton` 生成和显示可自定义并用作命令输入的参数模板。生成的模板包含命令支持的所有参数。

`--generate-cli-skeleton` 参数接受以下值之一：
+ `input` – 生成的模板包括格式化为 JSON 的所有输入参数。这是默认值。
+ `output` – 生成的模板包括格式化为 JSON 的所有输出参数。

由于 AWS CLI 本质上是围绕服务 API 的“包装程序”，骨架文件预计您会通过他们底层的 API 参数名称引用所有参数。该参数名称可能与 AWS CLI 参数名称不同。例如，一个名为 AWS CLI 的 `user-name` 参数可能映射到名为 AWS 的 `UserName` 服务 API 参数（注意，更改后的大写字母和缺失的破折号）。我们建议您使用 `--generate-cli-skeleton` 选项，用“正确”的参数名称生成模板，以避免错误。您可以参考服务的《API 参考指南》，查看预期的参数名称。您可以从模板中删除不需要的和不想为其提供值的任何参数。

例如，如果您运行以下命令，它会为 Amazon Elastic Compute Cloud（Amazon EC2）命令 **run-instances** 生成参数模板。

------
#### [ JSON ]

以下示例演示如何使用 `input` 参数的默认值（`--generate-cli-skeleton`）生成格式化为 JSON 的模板。

```
$ aws ec2 run-instances --generate-cli-skeleton
```

```
{
    "DryRun": true,
    "ImageId": "",
    "MinCount": 0,
    "MaxCount": 0,
    "KeyName": "",
    "SecurityGroups": [
        ""
    ],
    "SecurityGroupIds": [
        ""
    ],
    "UserData": "",
    "InstanceType": "",
    "Placement": {
        "AvailabilityZone": "",
        "GroupName": "",
        "Tenancy": ""
    },
    "KernelId": "",
    "RamdiskId": "",
    "BlockDeviceMappings": [
        {
            "VirtualName": "",
            "DeviceName": "",
            "Ebs": {
                "SnapshotId": "",
                "VolumeSize": 0,
                "DeleteOnTermination": true,
                "VolumeType": "",
                "Iops": 0,
                "Encrypted": true
            },
            "NoDevice": ""
        }
    ],
    "Monitoring": {
        "Enabled": true
    },
    "SubnetId": "",
    "DisableApiTermination": true,
    "InstanceInitiatedShutdownBehavior": "",
    "PrivateIpAddress": "",
    "ClientToken": "",
    "AdditionalInfo": "",
    "NetworkInterfaces": [
        {
            "NetworkInterfaceId": "",
            "DeviceIndex": 0,
            "SubnetId": "",
            "Description": "",
            "PrivateIpAddress": "",
            "Groups": [
                ""
            ],
            "DeleteOnTermination": true,
            "PrivateIpAddresses": [
                {
                    "PrivateIpAddress": "",
                    "Primary": true
                }
            ],
            "SecondaryPrivateIpAddressCount": 0,
            "AssociatePublicIpAddress": true
        }
    ],
    "IamInstanceProfile": {
        "Arn": "",
        "Name": ""
    },
    "EbsOptimized": true
}
```

------

## 生成和导入命令骨架
<a name="cli-usage-skeleton-generate"></a>

**生成并使用参数框架文件**

1. 使用 `--generate-cli-skeleton` 参数运行命令以生成 JSON，并将输出定向到某个文件以保存它。

------
#### [ JSON ]

   ```
   $ aws ec2 run-instances --generate-cli-skeleton input > ec2runinst.json
   ```

------

1. 在文本编辑器中打开参数骨架文件，并删除任何不需要的参数。例如，您可以将模板缩减到以下内容。请确认在删除不需要的元素后，文件仍是有效的 JSON。

------
#### [ JSON ]

   ```
   {
       "DryRun": true,
       "ImageId": "",
       "KeyName": "",
       "SecurityGroups": [
           ""
       ],
       "InstanceType": "",
       "Monitoring": {
           "Enabled": true
       }
   }
   ```

------

   在此示例中，我们将 `DryRun` 参数设置为 `true` 以使用 Amazon EC2 空运行功能。通过此功能，您可以安全地测试命令，而无需实际创建或修改任何资源。

1. 使用适合您的场景的值填入剩余的值。在本例中，我们提供要使用的 Amazon 机器映像（AMI）的实例类型、密钥名称、安全组和标识符。此示例假定默认 AWS 区域。AMI `ami-dfc39aef` 是 `us-west-2` 区域中托管的 64 位 Amazon Linux 映像。如果您使用不同的区域，您必须[查找正确 AMI ID 来使用](https://aws.amazon.com/amazon-linux-ami/)。

------
#### [ JSON ]

   ```
   {
       "DryRun": true,
       "ImageId": "ami-dfc39aef",
       "KeyName": "mykey",
       "SecurityGroups": [
           "my-sg"
       ],
       "InstanceType": "t2.micro",
       "Monitoring": {
           "Enabled": true
       }
   }
   ```

------

1. 通过使用 `file://` 前缀将完成的模板文件传递到 `--cli-input-json` 参数，使用填写的参数运行命令。AWS CLI 将路径解释为相对于当前工作目录。在以下示例中，AWS CLI 在当前工作目录中查找文件。

------
#### [ JSON ]

   ```
   $ aws ec2 run-instances --cli-input-json file://ec2runinst.json
   ```

   ```
   A client error (DryRunOperation) occurred when calling the RunInstances operation: Request would have succeeded, but DryRun flag is set.
   ```

------

   空运行错误表明，JSON 格式正确且参数值有效。如果输出中报告了其他问题，请解决这些问题并重复上一步，直到显示“`Request would have succeeded`”消息。

1. 现在，您可以将 `DryRun` 参数设置为 `false` 以禁用空运行。

------
#### [ JSON ]

   ```
   {
       "DryRun": false,
       "ImageId": "ami-dfc39aef",
       "KeyName": "mykey",
       "SecurityGroups": [
           "my-sg"
       ],
       "InstanceType": "t2.micro",
       "Monitoring": {
           "Enabled": true
       }
   }
   ```

------

1. 运行此命令，`run-instances` 实际上会启动 Amazon EC2 实例并显示成功启动所生成的详细信息。输出格式由 `--output` 参数控制，与输入参数模板的格式分开。

------
#### [ JSON ]

   ```
   $ aws ec2 run-instances --cli-input-json file://ec2runinst.json --output json
   ```

   ```
   {
       "OwnerId": "123456789012",
       "ReservationId": "r-d94a2b1",
       "Groups": [],
       "Instances": [
   ...
   ```

------

## 合并输入文件和命令行参数
<a name="cli-usage-skeleton-combine"></a>

输入文件可用于所有参数，也可与 AWS CLI 中指定的参数组合使用。您可以将此功能用于在输入文件中频繁重用的设置，并将个人设置保留在命令本身中。

以下 `aws ec2 run-instances` 示例结合使用了输入文件和参数。我们提供要使用的亚马逊机器映像（AMI）的实例类型、密钥名称、安全组和标识符，并假定默认 AWS 区域。AMI `ami-dfc39aef` 是 `us-west-2` 区域中托管的 64 位 Amazon Linux 映像。如果您使用不同的区域，您必须[查找正确 AMI ID 来使用](https://aws.amazon.com/amazon-linux-ami/)。

------
#### [ JSON ]

JSON 文件的内容：

```
{
    "ImageId": "ami-dfc39aef",
    "KeyName": "mykey",
    "SecurityGroups": [
        "my-sg"
    ],
    "InstanceType": "t2.micro",
    "Monitoring": {
        "Enabled": true
    }
}
```

------

以下示例结合使用输入文件与 `--dry-run` 参数来试运行命令，以确认您是否拥有所需的权限并在文件中填入了有效值。

------
#### [ JSON ]

```
$ aws ec2 run-instances --cli-input-json file://ec2runinst.json --dry-run
```

```
A client error (DryRunOperation) occurred when calling the RunInstances operation: Request would have succeeded, but DryRun flag is set.
```

------

之后，以下示例将同一输入文件与 `--no-dry-run` 参数结合使用来执行完整命令。

------
#### [ JSON ]

```
$ aws ec2 run-instances --cli-input-json file://ec2runinst.json --no-dry-run --output json
```

```
{
    "OwnerId": "123456789012",
    "ReservationId": "r-d94a2b1",
    "Groups": [],
    "Instances": [
...
```

------