

# AWS CLI 的引导式命令示例
<a name="cli-chap-services"></a>

AWS Command Line Interface（AWS CLI）是一种开源工具，使您能够使用命令行 Shell 中的命令与众多 AWS 服务进行交互。本节提供了指导示例，说明如何利用 AWS CLI 来访问其中一些 AWS 服务。这包括一些自定义 AWS CLI 命令，例如高级 `aws s3` 命令。这些命令示例演示了某些 AWS 服务命令使用的常见操作，并提供了更多有用资源。

无论您是经验丰富的 AWS 用户还是初次接触 AWS CLI，这些指导示例都可以作为简化 AWS 操作的资源。

有关可用于每种 AWS 服务的命令的完整参考，请参阅 [AWS CLI 版本 2 参考指南](https://docs.aws.amazon.com/cli/latest/reference/index.html)。此外，您还可以利用[内置命令行帮助](cli-usage-help.md)来浏览 AWS CLI 中的一系列 AWS 服务、命令、选项和功能。

有关本节中未提供的更多命令示例，请参阅 [AWS CLI 命令示例](cli_code_examples.md)一节。这些是开源命令示例，也可在 [AWS CLI 版本 2 参考指南](https://docs.aws.amazon.com/cli/latest/reference/index.html)中找到。命令示例托管在 *GitHub* 上的 [AWS CLI](https://github.com/aws/aws-cli/tree/develop/awscli/examples) 存储库中。



 有关开源 bash 脚本示例，请参阅[AWS CLI 与 Bash 脚本结合使用的代码示例](bash_code_examples.md)。Bash 脚本示例托管在 *GitHub* 上的 [AWS 代码示例存储库](https://github.com/awsdocs/aws-doc-sdk-examples)中。

**Topics**
+ [DynamoDB](cli-services-dynamodb.md)
+ [Amazon EC2](cli-services-ec2.md)
+ [Amazon Glacier](cli-services-glacier.md)
+ [IAM](cli-services-iam.md)
+ [Amazon S3](cli-services-s3.md)
+ [Amazon SNS](cli-services-sns.md)

# 在 AWS CLI 中使用 Amazon DynamoDB
<a name="cli-services-dynamodb"></a>

AWS Command Line Interface (AWS CLI) 为所有AWS数据库服务（包括 Amazon DynamoDB）提供支持。您可以使用 AWS CLI 进行临时操作，如创建表。您还可以使用它在实用工具脚本中嵌入 DynamoDB 操作。

有关将 AWS CLI 与 DynamoDB 结合使用的更多信息，请参阅**《AWS CLI 命令参考》中的 ```[dynamodb](https://docs.aws.amazon.com/cli/latest/reference/dynamodb/index.html)`。

要列出适用于 DynamoDB 的 AWS CLI 命令，请使用以下命令。

```
$ aws dynamodb help
```

**Topics**
+ [先决条件](#cli-services-dynamodb-prereqs)
+ [创建和使用 DynamoDB 表](#cli-services-dynamodb-using)
+ [使用 DynamoDB Local](#cli-services-dynamodb-local)
+ [资源](#cli-services-dynamodb-resources)

## 先决条件
<a name="cli-services-dynamodb-prereqs"></a>

要运行 `dynamodb` 命令，您需要：
+ 安装和配置 AWS CLI。有关更多信息，请参阅[安装或更新最新版本的 AWS CLI](getting-started-install.md)和[AWS CLI 身份验证和访问凭证](cli-chap-authentication.md)。

## 创建和使用 DynamoDB 表
<a name="cli-services-dynamodb-using"></a>

命令行格式为 DynamoDB 命令名称后接该命令的参数。AWS CLI 对于参数值支持 CLI [速记语法](cli-usage-shorthand.md)和完全 JSON。

下面的示例创建了一个名为 `MusicCollection` 的表。

```
$ aws dynamodb create-table \
    --table-name MusicCollection \
    --attribute-definitions AttributeName=Artist,AttributeType=S AttributeName=SongTitle,AttributeType=S \
    --key-schema AttributeName=Artist,KeyType=HASH AttributeName=SongTitle,KeyType=RANGE \
    --provisioned-throughput ReadCapacityUnits=1,WriteCapacityUnits=1
```

您可以使用类似下面的命令向表中添加新行，如以下示例所示。这些示例使用速记语法和 JSON 的组合。

```
$ aws dynamodb put-item \
    --table-name MusicCollection \
    --item '{
        "Artist": {"S": "No One You Know"},
        "SongTitle": {"S": "Call Me Today"} ,
        "AlbumTitle": {"S": "Somewhat Famous"} 
      }' \
    --return-consumed-capacity TOTAL
{
    "ConsumedCapacity": {
        "CapacityUnits": 1.0,
        "TableName": "MusicCollection"
    }
}
```

```
$ aws dynamodb put-item \
    --table-name MusicCollection \
    --item '{ 
        "Artist": {"S": "Acme Band"}, 
        "SongTitle": {"S": "Happy Day"} , 
        "AlbumTitle": {"S": "Songs About Life"} 
      }' \
    --return-consumed-capacity TOTAL
{
    "ConsumedCapacity": {
        "CapacityUnits": 1.0,
        "TableName": "MusicCollection"
    }
}
```

可能难以在单行命令中编写有效的 JSON。为了使之更简单，AWS CLI 可以读取 JSON 文件。例如，请考虑以下 JSON 代码段，它存储在一个名为 `expression-attributes.json` 的文件中。

```
{
  ":v1": {"S": "No One You Know"},
  ":v2": {"S": "Call Me Today"}
}
```

您可以使用此文件通过 `query` 发出 AWS CLI 请求。在下面的示例中，`expression-attributes.json` 文件的内容用作 `--expression-attribute-values` 参数的值。

```
$ aws dynamodb query --table-name MusicCollection \
    --key-condition-expression "Artist = :v1 AND SongTitle = :v2" \
    --expression-attribute-values file://expression-attributes.json
{
    "Count": 1,
    "Items": [
        {
            "AlbumTitle": {
                "S": "Somewhat Famous"
            },
            "SongTitle": {
                "S": "Call Me Today"
            },
            "Artist": {
                "S": "No One You Know"
            }
        }
    ],
    "ScannedCount": 1,
    "ConsumedCapacity": null
}
```

## 使用 DynamoDB Local
<a name="cli-services-dynamodb-local"></a>

除了 DynamoDB 之外，您还可以将 AWS CLI 与 DynamoDB Local 结合使用。DynamoDB Local 是模拟 DynamoDB 服务的小客户端数据库和服务器。通过 DynamoDB Local 可编写使用 DynamoDB API 的应用程序，而无需操作 DynamoDB Web 服务中的任何表或数据。而所有 API 操作均重新路由到本地数据库。这样可节省预配置吞吐量、数据存储和数据传输费用。

有关 DynamoDB Local 以及如何将其与 AWS CLI 结合使用的更多信息，请参阅 [Amazon DynamoDB 开发人员指南](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/)中的以下部分：
+ [DynamoDB Local](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Tools.DynamoDBLocal.html)
+ [将 AWS CLI 与 DynamoDB Local 结合使用](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Tools.CLI.html#UsingWithDDBLocal)

## 资源
<a name="cli-services-dynamodb-resources"></a>

《AWS CLI 参考：》****
+ [https://docs.aws.amazon.com/cli/latest/reference/dynamodb/index.html](https://docs.aws.amazon.com/cli/latest/reference/dynamodb/index.html)
+ [https://docs.aws.amazon.com/cli/latest/reference/dynamodb/create-table.html](https://docs.aws.amazon.com/cli/latest/reference/dynamodb/create-table.html)
+ [https://docs.aws.amazon.com/cli/latest/reference/dynamodb/put-item.html](https://docs.aws.amazon.com/cli/latest/reference/dynamodb/put-item.html)
+ [https://docs.aws.amazon.com/cli/latest/reference/dynamodb/query.html](https://docs.aws.amazon.com/cli/latest/reference/dynamodb/query.html)

《服务参考：》****
+ Amazon DynamoDB 开发人员指南中的 [DynamoDB Local](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Tools.DynamoDBLocal.html)
+ Amazon DynamoDB 开发人员指南中的[将 AWS CLI 与 DynamoDB Local 结合使用](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Tools.CLI.html#UsingWithDDBLocal)

# 在 AWS CLI 中使用 Amazon EC2
<a name="cli-services-ec2"></a>


| Amazon Elastic Compute Cloud 简介 | 
| --- | 
|  [![AWS Videos](http://img.youtube.com/vi/https://www.youtube.com/embed/TsRBftzZsQo/0.jpg)](http://www.youtube.com/watch?v=https://www.youtube.com/embed/TsRBftzZsQo)  | 

Amazon Elastic Compute Cloud（Amazon EC2）提供高度可扩展的灵活虚拟计算环境。Amazon EC2 允许您预置和管理虚拟服务器（称为 Amazon EC2 实例），以满足各种计算需求。

Amazon EC2 实例是虚拟机，可以使用不同的 CPU、内存、存储和联网能力配置对其进行自定义。根据您的应用程序要求，您可以从多种实例类型中进行选择，从轻量级、经济高效的选项到功能强大的高性能实例，不一而足。这种灵活性使您能够满足自己的计算需求，从而优化性能和成本效益。

此外，Amazon EC2 还提供了一套功能，使您能够有效地管理计算资源。其中包括快速启动新实例、创建用于快速部署的自定义机器映像（AMI），以及根据需要向上或向下扩展计算容量的功能。

您可以使用 AWS Command Line Interface（AWS CLI）访问 Amazon EC2 功能。要列出适用于 Amazon EC2 的 AWS CLI 命令，请使用以下命令。

```
aws ec2 help
```

在运行任何命令之前，请设置默认证书。有关更多信息，请参阅 [配置 AWS CLI 设置](cli-chap-configure.md)。

本主题展示了执行 Amazon EC2 常见任务的 AWS CLI 命令的短格式示例。

有关 AWS CLI 命令的长格式示例，请参阅 *GitHub* 上的 [AWS CLI 代码示例存储库](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/aws-cli)。

**Topics**
+ [在 AWS CLI 中创建、显示和删除 Amazon EC2 密钥对](cli-services-ec2-keypairs.md)
+ [在 AWS CLI 中创建、配置和删除 Amazon EC2 安全组](cli-services-ec2-sg.md)
+ [在 AWS CLI 中启动、列出和删除 Amazon EC2 实例](cli-services-ec2-instances.md)
+ [在 AWS CLI 中使用 bash 脚本更改 Amazon EC2 实例类型](cli-services-ec2-instance-type-script.md)

# 在 AWS CLI 中创建、显示和删除 Amazon EC2 密钥对
<a name="cli-services-ec2-keypairs"></a>

您可以使用 AWS Command Line Interface (AWS CLI) 创建、显示和删除 Amazon Elastic Compute Cloud (Amazon EC2) 密钥对。您可以使用密钥对连接 Amazon EC2 实例。在创建实例时您可以向 Amazon EC2 提供密钥对，然后在连接到实例时使用该密钥对进行身份验证。

**注意**  
有关其他命令示例，请参阅[《AWS CLI 参考指南》](https://docs.aws.amazon.com/cli/latest/reference/index.html)。

**Topics**
+ [先决条件](#cli-services-ec2-keypairs-prereqs)
+ [创建密钥对](#creating-a-key-pair)
+ [显示您的密钥对](#displaying-a-key-pair)
+ [删除您的密钥对](#deleting-a-key-pair)
+ [引用](#cli-services-ec2-keypairs-references)

## 先决条件
<a name="cli-services-ec2-keypairs-prereqs"></a>

要运行 `ec2` 命令，您需要：
+ 安装和配置 AWS CLI。有关更多信息，请参阅 [安装或更新最新版本的 AWS CLI](getting-started-install.md) 和 [AWS CLI 身份验证和访问凭证](cli-chap-authentication.md)。
+ 设置您的 IAM 权限以允许访问 Amazon EC2。有关 Amazon EC2 的 IAM 权限的更多信息，请参阅《Amazon EC2 用户指南》**中的 [Amazon EC2 的 IAM 策略](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-policies-for-amazon-ec2.html)。

## 创建密钥对
<a name="creating-a-key-pair"></a>

要创建密钥对，请使用 `[aws ec2 create-key-pair](https://docs.aws.amazon.com/cli/latest/reference/ec2/create-key-pair.html)` 命令以及 `--query` 选项和 `--output text` 选项，以通过管道将私有密钥直接传输到文件。

```
$ aws ec2 create-key-pair --key-name MyKeyPair --query 'KeyMaterial' --output text > MyKeyPair.pem
```

对于 Windows PowerShell，`> file` 重定向会默认采用 UTF-8 编码，这种编码不能用于某些 SSH 客户端。因此，您必须通过管道将输出传输到 `out-file` 命令和显式将编码设置为 `ascii` 来转换输出。

```
PS C:\>aws ec2 create-key-pair --key-name MyKeyPair --query 'KeyMaterial' --output text | out-file -encoding ascii -filepath MyKeyPair.pem
```

生成的 `MyKeyPair.pem` 文件类似于以下内容。

```
-----BEGIN RSA PRIVATE KEY-----
EXAMPLEKEYKCAQEAy7WZhaDsrA1W3mRlQtvhwyORRX8gnxgDAfRt/gx42kWXsT4rXE/b5CpSgie/
vBoU7jLxx92pNHoFnByP+Dc21eyyz6CvjTmWA0JwfWiW5/akH7iO5dSrvC7dQkW2duV5QuUdE0QW
Z/aNxMniGQE6XAgfwlnXVBwrerrQo+ZWQeqiUwwMkuEbLeJFLhMCvYURpUMSC1oehm449ilx9X1F
G50TCFeOzfl8dqqCP6GzbPaIjiU19xX/azOR9V+tpUOzEL+wmXnZt3/nHPQ5xvD2OJH67km6SuPW
oPzev/D8V+x4+bHthfSjR9Y7DvQFjfBVwHXigBdtZcU2/wei8D/HYwIDAQABAoIBAGZ1kaEvnrqu
/uler7vgIn5m7lN5LKw4hJLAIW6tUT/fzvtcHK0SkbQCQXuriHmQ2MQyJX/0kn2NfjLV/ufGxbL1
mb5qwMGUnEpJaZD6QSSs3kICLwWUYUiGfc0uiSbmJoap/GTLU0W5Mfcv36PaBUNy5p53V6G7hXb2
bahyWyJNfjLe4M86yd2YK3V2CmK+X/BOsShnJ36+hjrXPPWmV3N9zEmCdJjA+K15DYmhm/tJWSD9
81oGk9TopEp7CkIfatEATyyZiVqoRq6k64iuM9JkA3OzdXzMQexXVJ1TLZVEH0E7bhlY9d8O1ozR
oQs/FiZNAx2iijCWyv0lpjE73+kCgYEA9mZtyhkHkFDpwrSM1APaL8oNAbbjwEy7Z5Mqfql+lIp1
YkriL0DbLXlvRAH+yHPRit2hHOjtUNZh4Axv+cpg09qbUI3+43eEy24B7G/Uh+GTfbjsXsOxQx/x
p9otyVwc7hsQ5TA5PZb+mvkJ5OBEKzet9XcKwONBYELGhnEPe7cCgYEA06Vgov6YHleHui9kHuws
ayav0elc5zkxjF9nfHFJRry21R1trw2Vdpn+9g481URrpzWVOEihvm+xTtmaZlSp//lkq75XDwnU
WA8gkn6O3QE3fq2yN98BURsAKdJfJ5RL1HvGQvTe10HLYYXpJnEkHv+Unl2ajLivWUt5pbBrKbUC
gYBjbO+OZk0sCcpZ29sbzjYjpIddErySIyRX5gV2uNQwAjLdp9PfN295yQ+BxMBXiIycWVQiw0bH
oMo7yykABY7Ozd5wQewBQ4AdSlWSX4nGDtsiFxWiI5sKuAAeOCbTosy1s8w8fxoJ5Tz1sdoxNeGs
Arq6Wv/G16zQuAE9zK9vvwKBgF+09VI/1wJBirsDGz9whVWfFPrTkJNvJZzYt69qezxlsjgFKshy
WBhd4xHZtmCqpBPlAymEjr/TOlbxyARmXMnIOWIAnNXMGB4KGSyl1mzSVAoQ+fqR+cJ3d0dyPl1j
jjb0Ed/NY8frlNDxAVHE8BSkdsx2f6ELEyBKJSRr9snRAoGAMrTwYneXzvTskF/S5Fyu0iOegLDa
NWUH38v/nDCgEpIXD5Hn3qAEcju1IjmbwlvtW+nY2jVhv7UGd8MjwUTNGItdb6nsYqM2asrnF3qS
VRkAKKKYeGjkpUfVTrW0YFjXkfcrR/V+QFL5OndHAKJXjW7a4ejJLncTzmZSpYzwApc=
-----END RSA PRIVATE KEY-----
```

您的私有密钥不存储在 AWS 中，并且***只有*** 在创建后才能检索。以后您无法恢复它。而如果您丢失了私有密钥，则必须创建新的密钥对。

如果您要从 Linux 电脑连接到您的实例，建议您使用以下命令设置您的私有密钥文件的权限，以确保只有您可以读取该文件。

```
$ chmod 400 MyKeyPair.pem
```

## 显示您的密钥对
<a name="displaying-a-key-pair"></a>

指纹是从密钥对生成的，您可以使用指纹验证您本地电脑上的私有密钥是否与 AWS 中存储的公有密钥匹配。

指纹是取自私有密钥的 DER 编码副本的 SHA1 哈希。在创建密钥对时将捕获此值，此值与公有密钥一起存储在 AWS 中。您可以在 Amazon EC2 控制台中或通过运行 AWS CLI 命令 `[aws ec2 describe-key-pairs](https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-key-pairs.html)` 查看指纹。

以下示例显示 `MyKeyPair` 的指纹。

```
$ aws ec2 describe-key-pairs --key-name MyKeyPair
{
    "KeyPairs": [
        {
            "KeyName": "MyKeyPair",
            "KeyFingerprint": "1f:51:ae:28:bf:89:e9:d8:1f:25:5d:37:2d:7d:b8:ca:9f:f5:f1:6f"
        }
    ]
}
```

有关密钥和指纹的更多信息，请参阅《Amazon EC2 用户指南》**中的 [Amazon EC2 密钥对](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-key-pairs.html)。

## 删除您的密钥对
<a name="deleting-a-key-pair"></a>

要删除密钥对，请运行 `[aws ec2 delete-key-pair](https://docs.aws.amazon.com/cli/latest/reference/ec2/delete-key-pair.html)` 命令，将 *`MyKeyPair`* 替换为要删除的密钥对的名称。

```
$ aws ec2 delete-key-pair --key-name MyKeyPair
```

## 引用
<a name="cli-services-ec2-keypairs-references"></a>

**AWS CLI 参考：**
+ `[aws ec2](https://docs.aws.amazon.com/cli/latest/reference/ec2/index.html)`
+ `[aws ec2 create-key-pair](https://docs.aws.amazon.com/cli/latest/reference/ec2/create-key-pair.html)`
+ `[aws ec2 delete-key-pair](https://docs.aws.amazon.com/cli/latest/reference/ec2/delete-key-pair.html)`
+ `[aws ec2 describe-key-pairs](https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-key-pairs.html)`

**其他参考资料：**
+ [Amazon Elastic Compute Cloud 文档](https://docs.aws.amazon.com/ec2/)
+ 要查看和贡献 AWS 开发工具包和 AWS CLI 代码示例，请参阅 *GitHub* 上的 [AWS 代码示例存储库](https://github.com/awsdocs/aws-doc-sdk-examples/)。

# 在 AWS CLI 中创建、配置和删除 Amazon EC2 安全组
<a name="cli-services-ec2-sg"></a>

您可以为您的 Amazon Elastic Compute Cloud（Amazon EC2）实例创建安全组，安全组本质上用作一个防火墙，具有可确定哪些网络流量可以进入和离开的规则。

使用 AWS Command Line Interface (AWS CLI) 创建一个安全组，向现有安全组添加规则，以及删除安全组。

**注意**  
有关其他命令示例，请参阅[《AWS CLI 参考指南》](https://docs.aws.amazon.com/cli/latest/reference/index.html)。

**Topics**
+ [先决条件](#cli-services-ec2-sg-prereqs)
+ [创建安全组](#creating-a-security-group)
+ [为您的安全组添加规则](#configuring-a-security-group)
+ [删除您的安全组](#deleting-a-security-group)
+ [引用](#cli-services-ec2-sg-references)

## 先决条件
<a name="cli-services-ec2-sg-prereqs"></a>

要运行 `ec2` 命令，您需要：
+ 安装和配置 AWS CLI。有关更多信息，请参阅 [安装或更新最新版本的 AWS CLI](getting-started-install.md) 和 [AWS CLI 身份验证和访问凭证](cli-chap-authentication.md)。
+ 设置您的 IAM 权限以允许访问 Amazon EC2。有关 Amazon EC2 的 IAM 权限的更多信息，请参阅《Amazon EC2 用户指南》**中的 [Amazon EC2 的 IAM 策略](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-policies-for-amazon-ec2.html)。

## 创建安全组
<a name="creating-a-security-group"></a>

您可以创建与虚拟私有云（VPC）关联的安全组。

以下 `[aws ec2 create-security-group](https://docs.aws.amazon.com/cli/latest/reference/ec2/create-security-group.html)` 示例说明如何为指定的 VPC 创建安全组。

```
$ aws ec2 create-security-group --group-name my-sg --description "My security group" --vpc-id vpc-1a2b3c4d
{
    "GroupId": "sg-903004f8"
}
```

要查看安全组的初始信息，请运行 `[aws ec2 describe-security-groups](https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-security-groups.html)` 命令。您不能仅通过其 `vpc-id` 而非其名称引用 EC2-VPC 安全组。

```
$ aws ec2 describe-security-groups --group-ids sg-903004f8
{
    "SecurityGroups": [
        {
            "IpPermissionsEgress": [
                {
                    "IpProtocol": "-1",
                    "IpRanges": [
                        {
                            "CidrIp": "0.0.0.0/0"
                        }
                    ],
                    "UserIdGroupPairs": []
                }
            ],
            "Description": "My security group"
            "IpPermissions": [],
            "GroupName": "my-sg",
            "VpcId": "vpc-1a2b3c4d",
            "OwnerId": "123456789012",
            "GroupId": "sg-903004f8"
        }
    ]
}
```

## 为您的安全组添加规则
<a name="configuring-a-security-group"></a>

运行 Amazon EC2 实例时，您必须启用安全组中的规则，以便为连接到镜像的方法允许入站网络流量。

例如，如果您要启动 Windows 实例，您通常会添加规则以允许 TCP 端口 3389 (RDP) 上的入站流量，从而支持远程桌面协议 (RDP)。如果您要启动 Linux 实例，则通常会添加规则以允许 TCP 端口 22 上的入站流量，从而支持 SSH 连接。

使用 `[aws ec2 authorize-security-group-ingress](https://docs.aws.amazon.com/cli/latest/reference/ec2/authorize-security-group-ingress.html)` 命令向安全组添加规则。此命令的必需参数是您电脑的公有 IP 地址，或您的电脑连接到的网络（以地址范围形式）（采用 [CIDR](https://wikipedia.org/wiki/Classless_Inter-Domain_Routing) 表示法）。

**注意**  
我们提供以下服务 [https://checkip.global.api.aws/](https://checkip.global.api.aws/)，使您可以确定您的公有 IP 地址。要查找可以帮助您识别 IP 地址的其他服务，请使用您的浏览器搜索“*what is my IP address*”。如果您使用动态 IP 地址通过 ISP 或从防火墙后面进行连接（通过私有网络的 NAT 网关），则您的地址可能会定期更改。在这种情况下，您必须找到客户端电脑使用的 IP 地址的范围。

以下示例说明如何使用 IP 地址将适用于 RDP 的规则（TCP 端口 3389）添加到 ID 为 `sg-903004f8` 的 EC2-VPC 安全组。

首先，确定您的 IP 地址。

```
$ curl https://checkip.amazonaws.com
x.x.x.x
```

然后，您可以运行 `[aws ec2 authorize-security-group-ingress](https://docs.aws.amazon.com/cli/latest/reference/ec2/authorize-security-group-ingress.html)` 命令以将 IP 地址添加到安全组。

```
$ aws ec2 authorize-security-group-ingress --group-id sg-903004f8 --protocol tcp --port 3389 --cidr x.x.x.x/x
```

以下命令添加另一个规则以对同一安全组中的实例启用 SSH。

```
$ aws ec2 authorize-security-group-ingress --group-id sg-903004f8 --protocol tcp --port 22 --cidr x.x.x.x/x
```

要查看对安全组所做的更改，请运行 `[aws ec2 describe-security-groups](https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-security-groups.html)` 命令。

```
$ aws ec2 describe-security-groups --group-ids sg-903004f8
{
    "SecurityGroups": [
        {
            "IpPermissionsEgress": [
                {
                    "IpProtocol": "-1",
                    "IpRanges": [
                        {
                            "CidrIp": "0.0.0.0/0"
                        }
                    ],
                    "UserIdGroupPairs": []
                }
            ],
            "Description": "My security group"
            "IpPermissions": [
                {
                    "ToPort": 22,
                    "IpProtocol": "tcp",
                    "IpRanges": [
                        {
                            "CidrIp": "x.x.x.x/x"
                        }
                    ]
                    "UserIdGroupPairs": [],
                    "FromPort": 22
                }
            ],
            "GroupName": "my-sg",
            "OwnerId": "123456789012",
            "GroupId": "sg-903004f8"
        }
    ]
}
```

## 删除您的安全组
<a name="deleting-a-security-group"></a>

要删除安全组，请运行 `[aws ec2 delete-security-group](https://docs.aws.amazon.com/cli/latest/reference/ec2/delete-security-group.html)` 命令。

**注意**  
如果安全组当前已附加到环境，则无法删除。

以下命令示例删除 EC2-VPC 安全组。

```
$ aws ec2 delete-security-group --group-id sg-903004f8
```

## 引用
<a name="cli-services-ec2-sg-references"></a>

**AWS CLI 参考：**
+ `[aws ec2](https://docs.aws.amazon.com/cli/latest/reference/ec2/index.html)`
+ `[aws ec2 authorize-security-group-ingress](https://docs.aws.amazon.com/cli/latest/reference/ec2/authorize-security-group-ingress.html)`
+ `[aws ec2 create-security-group](https://docs.aws.amazon.com/cli/latest/reference/ec2/create-security-group.html)`
+ `[aws ec2 delete-security-group](https://docs.aws.amazon.com/cli/latest/reference/ec2/delete-security-group.html)`
+ `[aws ec2 describe-security-groups](https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-security-groups.html)`

**其他参考资料：**
+ [Amazon Elastic Compute Cloud 文档](https://docs.aws.amazon.com/ec2/)
+ 要查看和贡献 AWS 开发工具包和 AWS CLI 代码示例，请参阅 *GitHub* 上的 [AWS 代码示例存储库](https://github.com/awsdocs/aws-doc-sdk-examples/)。

# 在 AWS CLI 中启动、列出和删除 Amazon EC2 实例
<a name="cli-services-ec2-instances"></a>

您可以使用 AWS Command Line Interface（AWS CLI）启动、列出和删除 Amazon Elastic Compute Cloud（Amazon EC2）实例。如果您启动不在 AWS 免费套餐范围内的实例，那么在启动实例后您将需要付费，费用按实例的运行时间计算，即使实例处于闲置状态也需付费。

**注意**  
有关其他命令示例，请参阅[《AWS CLI 参考指南》](https://docs.aws.amazon.com/cli/latest/reference/index.html)。

**Topics**
+ [先决条件](#cli-services-ec2-instances-prereqs)
+ [启动实例](#launching-instances)
+ [向实例添加块储存设备](#block-device-mapping)
+ [向您的实例添加标签](#tagging-instances)
+ [连接到您的实例](#connecting-to-instances)
+ [列出您的实例](#listing-instances)
+ [删除实例](#terminating-instances)
+ [引用](#cli-services-ec2-instances-references)

## 先决条件
<a name="cli-services-ec2-instances-prereqs"></a>

要运行本主题中的 `ec2` 命令，您需要先完成以下操作：
+ 安装和配置 AWS CLI。有关更多信息，请参阅 [安装或更新最新版本的 AWS CLI](getting-started-install.md) 和 [AWS CLI 身份验证和访问凭证](cli-chap-authentication.md)。
+ 设置您的 IAM 权限以允许访问 Amazon EC2。有关 Amazon EC2 的 IAM 权限的更多信息，请参阅《Amazon EC2 用户指南》**中的 [Amazon EC2 的 IAM 策略](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-policies-for-amazon-ec2.html)。
+ 创建[密钥对](cli-services-ec2-keypairs.md)和[安全组](cli-services-ec2-sg.md)。
+ 选择 Amazon Machine Image（AMI）并记下 AMI ID。有关更多信息，请参阅《Amazon EC2 用户指南》**中的[查找适合的 AMI](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/finding-an-ami.html)。

## 启动实例
<a name="launching-instances"></a>

要使用所选的 AMI 启动单个 Amazon EC2 实例，请使用 `[aws ec2 run-instances](https://docs.aws.amazon.com/cli/latest/reference/ec2/run-instances.html)` 命令。您可以将实例启动到虚拟私有云（VPC）中。

最初，您的实例显示为 `pending` 状态，但在几分钟后将更改为 `running` 状态。

以下示例在 VPC 的指定子网中启动 `t2.micro` 实例。将*斜体*参数值替换为您自己的值。

```
$ aws ec2 run-instances --image-id ami-xxxxxxxx --count 1 --instance-type t2.micro --key-name MyKeyPair --security-group-ids sg-903004f8 --subnet-id subnet-6e7f829e
{
    "OwnerId": "123456789012",
    "ReservationId": "r-5875ca20",
    "Groups": [
        {
            "GroupName": "my-sg",
            "GroupId": "sg-903004f8"
        }
    ],
    "Instances": [
        {
            "Monitoring": {
                "State": "disabled"
            },
            "PublicDnsName": null,
            "Platform": "windows",
            "State": {
                "Code": 0,
                "Name": "pending"
            },
            "EbsOptimized": false,
            "LaunchTime": "2013-07-19T02:42:39.000Z",
            "PrivateIpAddress": "10.0.1.114",
            "ProductCodes": [],
            "VpcId": "vpc-1a2b3c4d",
            "InstanceId": "i-5203422c",
            "ImageId": "ami-173d747e",
            "PrivateDnsName": "ip-10-0-1-114.ec2.internal",
            "KeyName": "MyKeyPair",
            "SecurityGroups": [
                {
                    "GroupName": "my-sg",
                    "GroupId": "sg-903004f8"
                }
            ],
            "ClientToken": null,
            "SubnetId": "subnet-6e7f829e",
            "InstanceType": "t2.micro",
            "NetworkInterfaces": [
                {
                    "Status": "in-use",
                    "SourceDestCheck": true,
                    "VpcId": "vpc-1a2b3c4d",
                    "Description": "Primary network interface",
                    "NetworkInterfaceId": "eni-a7edb1c9",
                    "PrivateIpAddresses": [
                        {
                            "PrivateDnsName": "ip-10-0-1-114.ec2.internal",
                            "Primary": true,
                            "PrivateIpAddress": "10.0.1.114"
                        }
                    ],
                    "PrivateDnsName": "ip-10-0-1-114.ec2.internal",
                    "Attachment": {
                        "Status": "attached",
                        "DeviceIndex": 0,
                        "DeleteOnTermination": true,
                        "AttachmentId": "eni-attach-52193138",
                        "AttachTime": "2013-07-19T02:42:39.000Z"
                    },
                    "Groups": [
                        {
                            "GroupName": "my-sg",
                            "GroupId": "sg-903004f8"
                        }
                    ],
                    "SubnetId": "subnet-6e7f829e",
                    "OwnerId": "123456789012",
                    "PrivateIpAddress": "10.0.1.114"
                }              
            ],
            "SourceDestCheck": true,
            "Placement": {
                "Tenancy": "default",
                "GroupName": null,
                "AvailabilityZone": "us-west-2b"
            },
            "Hypervisor": "xen",
            "BlockDeviceMappings": [
                {
                    "DeviceName": "/dev/sda1",
                    "Ebs": {
                        "Status": "attached",
                        "DeleteOnTermination": true,
                        "VolumeId": "vol-877166c8",
                        "AttachTime": "2013-07-19T02:42:39.000Z"
                    }
                }              
            ],
            "Architecture": "x86_64",
            "StateReason": {
                "Message": "pending",
                "Code": "pending"
            },
            "RootDeviceName": "/dev/sda1",
            "VirtualizationType": "hvm",
            "RootDeviceType": "ebs",
            "Tags": [
                {
                    "Value": "MyInstance",
                    "Key": "Name"
                }
            ],
            "AmiLaunchIndex": 0
        }
    ]
}
```

## 向实例添加块储存设备
<a name="block-device-mapping"></a>

每个启动的实例都具有关联的根设备卷。您可以使用块储存设备映射来指定实例启动时要连接的其他 Amazon Elastic Block Store (Amazon EBS) 卷或实例存储卷。

要向实例添加块储存设备，请在使用 `--block-device-mappings` 时指定 `run-instances` 选项。

以下示例参数配置大小为 20 GB 的标准 Amazon EBS 卷，并使用标识符 `/dev/sdf` 将其映射到您的实例。

```
--block-device-mappings "[{\"DeviceName\":\"/dev/sdf\",\"Ebs\":{\"VolumeSize\":20,\"DeleteOnTermination\":false}}]"
```

以下示例基于现有快照添加映射到 `/dev/sdf` Amazon EBS 卷。快照表示加载到卷的镜像。指定快照时，无需指定卷大小；它的大小足够容纳您的镜像。但是，如果您确定指定大小，则大小必须大于或等于快照的大小。

```
--block-device-mappings "[{\"DeviceName\":\"/dev/sdf\",\"Ebs\":{\"SnapshotId\":\"snap-a1b2c3d4\"}}]"
```

以下示例向实例添加两个卷。可用于您的实例的卷的数目取决于其实例类型。

```
--block-device-mappings "[{\"DeviceName\":\"/dev/sdf\",\"VirtualName\":\"ephemeral0\"},{\"DeviceName\":\"/dev/sdg\",\"VirtualName\":\"ephemeral1\"}]"
```

以下示例创建映射 (`/dev/sdj`)，但未为实例预配置卷。

```
--block-device-mappings "[{\"DeviceName\":\"/dev/sdj\",\"NoDevice\":\"\"}]"
```

有关更多信息，请参阅《Amazon EC2 用户指南》**中的[块设备映射](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/block-device-mapping-concepts.html)。

## 向您的实例添加标签
<a name="tagging-instances"></a>

标签是为 AWS 资源分配的标记。它允许您向您可用于各种目的的资源添加元数据。有关更多信息，请参阅《Amazon EC2 用户指南》**中的[标记您的资源](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/Using_Tags.html)。

以下示例显示如何使用 `[aws ec2 create-tags](https://docs.aws.amazon.com/cli/latest/reference/ec2/create-tags.html)` 命令，将带有密钥名称“`Name`”和值“`MyInstance`”的标签添加到指定的实例。

```
$ aws ec2 create-tags --resources i-5203422c --tags Key=Name,Value=MyInstance
```

## 连接到您的实例
<a name="connecting-to-instances"></a>

当您的实例运行时，您可以连接到该实例，然后像使用您面前的电脑一样使用该实例。有关更多信息，请参阅《Amazon EC2 用户指南》**中的[连接到您的 Amazon EC2 实例](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/connect-to-linux-instance.html)。

## 列出您的实例
<a name="listing-instances"></a>

您可以使用 AWS CLI 列出您的实例并查看有关这些实例的信息。您可以列出所有实例，或根据您感兴趣的实例对结果进行筛选。

以下示例演示了如何使用 `[aws ec2 describe-instances](https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-instances.html)` 命令。

以下命令列出您的所有实例。

```
$ aws ec2 describe-instances
```

以下命令将列表筛选到只仅限您的 `t2.micro` 实例，并仅为每个匹配项输出 `InstanceId` 值。

```
$ aws ec2 describe-instances --filters "Name=instance-type,Values=t2.micro" --query "Reservations[].Instances[].InstanceId"
[
    "i-05e998023d9c69f9a"
]
```

以下命令列出具有标签 `Name=MyInstance` 的任何实例。

```
$ aws ec2 describe-instances --filters "Name=tag:Name,Values=MyInstance"
```

以下命令列出使用以下任何 AMI 启动的实例：`ami-x0123456`、`ami-y0123456` 和 `ami-z0123456`。

```
$ aws ec2 describe-instances --filters "Name=image-id,Values=ami-x0123456,ami-y0123456,ami-z0123456"
```

## 删除实例
<a name="terminating-instances"></a>

当您不再需要某个 Amazon EC2 实例时，可以使用 AWS CLI 来终止（删除）该实例。

**重要**  
**终止实例是永久且不可逆转的。**  
终止一个实例后，您将无法再连接到该实例，而且也无法对其进行恢复操作。被配置为在终止后删除的所有连接的 Amazon EBS 卷也将被永久删除并且无法恢复。实例存储卷中存储的所有数据将永久丢失。有关更多信息，请参阅[实例终止的工作原理](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/how-ec2-instance-termination-works.html)。  
在终止实例之前，请务必确保已将需要在终止后保留的所有数据备份到持久存储中。

一旦实例的状态变为 `shutting-down` 或 `terminated`，您即停止为该实例付费。如果您希望稍后重新连接到实例，请使用 [stop-instances](https://docs.aws.amazon.com/cli/v1/reference/ec2/stop-instances.html)，而不是 `terminate-instances`。有关更多信息，请参阅《Amazon EC2 用户指南》**中的[终止实例](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/terminating-instances.html)。

以下示例说明如何使用 `[aws ec2 terminate-instances](https://docs.aws.amazon.com/cli/latest/reference/ec2/terminate-instances.html)` 命令删除实例。

```
$ aws ec2 terminate-instances --instance-ids i-5203422c
{
    "TerminatingInstances": [
        {
            "InstanceId": "i-5203422c",
            "CurrentState": {
                "Code": 32,
                "Name": "shutting-down"
            },
            "PreviousState": {
                "Code": 16,
                "Name": "running"
            }
        }
    ]
}
```

## 引用
<a name="cli-services-ec2-instances-references"></a>

**AWS CLI 参考：**
+ `[aws ec2](https://docs.aws.amazon.com/cli/latest/reference/ec2/index.html)`
+ `[aws ec2 create-tags](https://docs.aws.amazon.com/cli/latest/reference/ec2/create-tags.html)`
+ `[aws ec2 describe-instances](https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-instances.html)`
+ `[aws ec2 run-instances](https://docs.aws.amazon.com/cli/latest/reference/ec2/run-instances.html)`
+ `[aws ec2 terminate-instances](https://docs.aws.amazon.com/cli/latest/reference/ec2/terminate-instances.html)`

**其他参考资料：**
+ [Amazon Elastic Compute Cloud 文档](https://docs.aws.amazon.com/ec2/)
+ 要查看和贡献 AWS 开发工具包和 AWS CLI 代码示例，请参阅 *GitHub* 上的 [AWS 代码示例存储库](https://github.com/awsdocs/aws-doc-sdk-examples/)。

# 在 AWS CLI 中使用 bash 脚本更改 Amazon EC2 实例类型
<a name="cli-services-ec2-instance-type-script"></a>

Amazon EC2 的这一 bash 脚本示例使用 AWS Command Line Interface (AWS CLI) 更改 Amazon EC2 实例的实例类型。如果实例正在运行，它会停止实例，更改实例类型，然后根据请求重启实例。Shell 脚本是专用于在命令行界面中运行的程序。

**注意**  
有关其他命令示例，请参阅[《AWS CLI 参考指南》](https://docs.aws.amazon.com/cli/latest/reference/index.html)。

**Topics**
+ [开始之前](#cli-services-ec2-instance-type-script-prereqs)
+ [关于此示例](#cli-services-ec2-instance-type-script-about)
+ [参数](#cli-services-ec2-instance-type-script-params)
+ [文件](#cli-services-ec2-instance-type-script-files.title)
+ [引用](#cli-services-ec2-instance-type-script-references)

## 开始之前
<a name="cli-services-ec2-instance-type-script-prereqs"></a>

您需要先满足以下条件，才能运行下文中的任何示例代码。
+ 安装和配置 AWS CLI。有关更多信息，请参阅 [安装或更新最新版本的 AWS CLI](getting-started-install.md) 和 [AWS CLI 身份验证和访问凭证](cli-chap-authentication.md)。
+ 您使用的配置文件必须具有允许示例代码执行AWS操作的权限。
+ 在账户中有正在运行的 Amazon EC2 实例，并且您有权停止和修改该实例。如果您运行测试脚本，它会为您启动一个实例，测试更改类型，然后终止该实例。
+ 作为 AWS 的最佳实践，请授予此代码最低的权限，或者仅授予它执行任务所需的权限。有关更多信息，请参阅 *AWS Identity and Access Management (IAM) 用户指南*中的[授予最低权限](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html#grant-least-privilege)。
+ 此代码尚未在所有 AWS 区域中进行测试。有些 AWS 服务仅在特定区域中提供。有关更多信息，请参阅《AWS 一般参考指南》**中的[服务端点和配额](https://docs.aws.amazon.com/general/latest/gr/aws-service-information.html)。
+ 运行此代码可能会导致您的 AWS 账户产生相关费用。您有责任确保在使用完由此脚本创建的任何资源后删除这些资源。

## 关于此示例
<a name="cli-services-ec2-instance-type-script-about"></a>

此示例是作为 shell 脚本文件 `change_ec2_instance_type.sh` 中的一个函数编写的，您可以通过其他脚本或命令行 `source` 该函数。每个脚本文件都包含了介绍每个函数的注释。一旦该函数进入内存，您就可以通过命令行调用它。例如，以下命令会将指定实例的类型更改为 `t2.nano`：

```
$ source ./change_ec2_instance_type.sh
$ ./change_ec2_instance_type -i *instance-id* -t new-type
```

有关完整示例和可下载的脚本文件，请参阅 *GitHub* 上的 *AWS 代码示例存储库* 中的[更改 Amazon EC2 实例类型](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/aws-cli/bash-linux/ec2/change-ec2-instance-type)。

## 参数
<a name="cli-services-ec2-instance-type-script-params"></a>

**-i** -*（字符串）*指定要修改的实例 ID。

**-t** -*（字符串）*指定要切换到的 Amazon EC2 实例类型。

**-r** -*（开关）*默认情况下，此参数未设置。如果设置了 `-r`，则在类型切换后将会重启实例。

**-f** -*（开关）*默认情况下，脚本在进行切换之前会提示用户确认关闭实例。如果设置了 `-f`，则函数在关闭实例以进行类型切换之前不会提示用户

**-v** -*（开关）*默认情况下，脚本会以静默方式运行，仅在出现错误时才显示输出。如果设置了 `-v`，则函数会在整个运行过程中显示状态。

## 文件
<a name="cli-services-ec2-instance-type-script-files.title"></a>

**`change_ec2_instance_type.sh`**  
该主脚本文件包含执行以下任务的 `change_ec2_instance_type()` 函数：  
+ 验证指定的 Amazon EC2 实例是否存在。
+ 除非选择了 `-f`，否则函数会在停止实例之前向用户发出警告。
+ 更改实例类型
+ 如果您设置了 `-r`，请重启实例并确认实例正在运行
在 *GitHub* 上查看 `[change\$1ec2\$1instance\$1type.sh](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/aws-cli/bash-linux/ec2/change-ec2-instance-type/change_ec2_instance_type.sh)` 的代码。

**`test_change_ec2_instance_type.sh`**  
脚本文件 `test_change_ec2_instance_type.sh` 会测试 `change_ec2_instance_type` 函数的各种代码路径。如果测试脚本中的所有步骤都正确完成，测试脚本将会删除它创建的所有资源。  
您可以使用以下参数运行该测试脚本：  
+ **-v** -*（开关）*每个测试在运行时都会显示通过/失败状态。默认情况下，测试以静默方式运行，输出仅包含最终的总体通过/失败状态。
+ **-i** -*（开关）*脚本会在每个测试后暂停，以便您能查看每个步骤的中间结果。让您能够使用 Amazon EC2 控制台检查实例的当前状态。您在系统提示符处按 *Enter* 后，脚本才会继续执行下一步。
在 *GitHub* 上查看 `[test\$1change\$1ec2\$1instance\$1type.sh](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/aws-cli/bash-linux/ec2/change-ec2-instance-type/test_change_ec2_instance_type.sh)` 的代码。

**`awsdocs_general.sh`**  
脚本文件 `awsdocs_general.sh` 中包含了在 AWS CLI 的高级示例中使用的通用函数。  
在 *GitHub* 上查看 `[awsdocs\$1general.sh](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/aws-cli/bash-linux/ec2/change-ec2-instance-type/awsdocs_general.sh)` 的代码。

## 引用
<a name="cli-services-ec2-instance-type-script-references"></a>

**AWS CLI 参考：**
+ `[aws ec2](https://docs.aws.amazon.com/cli/v1/reference/ec2/index.html)`
+ `[aws ec2 describe-instances](https://docs.aws.amazon.com/cli/v1/reference/ec2/describe-instances.html)`
+ `[aws ec2 modify-instance-attribute](https://docs.aws.amazon.com/cli/v1/reference/ec2/modify-instance-attribute.html)`
+ `[aws ec2 start-instances](https://docs.aws.amazon.com/cli/v1/reference/ec2/start-instances.html)`
+ `[aws ec2 stop-instances](https://docs.aws.amazon.com/cli/v1/reference/ec2/stop-instances.html)`
+ `[aws ec2 wait instance-running](https://docs.aws.amazon.com/cli/v1/reference/ec2/wait/instance-running.html)`
+ `[aws ec2 wait instance-stopped](https://docs.aws.amazon.com/cli/v1/reference/ec2/wait/instance-stopped.html)`

**其他参考资料：**
+ [Amazon Elastic Compute Cloud 文档](https://docs.aws.amazon.com/ec2/)
+ 要查看和贡献 AWS 开发工具包和 AWS CLI 代码示例，请参阅 *GitHub* 上的 [AWS 代码示例存储库](https://github.com/awsdocs/aws-doc-sdk-examples/)。

# 在 AWS CLI 中使用 Amazon Glacier
<a name="cli-services-glacier"></a>


| Amazon Glacier 简介 | 
| --- | 
|    | 

本主题显示执行 Amazon Glacier 常见任务的 AWS CLI 命令的一些示例。这些示例演示如何使用 AWS CLI 将大型文件上传到 Amazon Glacier，方法是将它拆分为较小的部分并从命令行上传它们。

您可以使用 AWS Command Line Interface（AWS CLI）访问 Amazon Glacier 功能。要列出 Amazon Glacier 的 AWS CLI 命令，请使用以下命令。

```
aws glacier help
```

**注意**  
有关命令参考和其他示例，请参阅**《AWS CLI 命令参考》中的 `[aws glacier](https://docs.aws.amazon.com/cli/latest/reference/glacier/index.html)`。

**Topics**
+ [先决条件](#cli-services-glacier-prereqs)
+ [创建 Amazon Glacier 保管库](#cli-services-glacier-vault)
+ [准备要上传的文件](#cli-services-glacier-prep)
+ [启动文件分段上传和上传](#cli-services-glacier-initiate)
+ [完成上传](#cli-services-glacier-complete)
+ [资源](#cli-services-glacier-resources)

## 先决条件
<a name="cli-services-glacier-prereqs"></a>

要运行 `glacier` 命令，您需要：
+ 安装和配置 AWS CLI。有关更多信息，请参阅 [安装或更新最新版本的 AWS CLI](getting-started-install.md) 和 [AWS CLI 身份验证和访问凭证](cli-chap-authentication.md)。
+ 本教程使用几个命令行工具，这些工具通常预装在 Unix 类操作系统上，包括 Linux 和 macOS。Windows 用户可以通过安装 [Cygwin](https://www.cygwin.com/) 并从 Cygwin 终端运行命令来使用相同的工具。如有可执行相同功能的 Windows 本机命令和实用工具，我们会注明。

## 创建 Amazon Glacier 保管库
<a name="cli-services-glacier-vault"></a>

使用 `[create-vault](https://docs.aws.amazon.com/cli/latest/reference/glacier/create-vault.html)` 命令创建文件库。

```
$ aws glacier create-vault --account-id - --vault-name myvault
{
    "location": "/123456789012/vaults/myvault"
}
```

**注意**  
所有 Amazon Glacier 命令都需要一个账户 ID 参数。使用连字符 (`--account-id -`) 以使用当前账户。

## 准备要上传的文件
<a name="cli-services-glacier-prep"></a>

创建一个用于测试上传的文件。以下命令将创建一个正好包含 3 MiB 随机数据的名为 *largefile* 的文件。

**Linux 或 macOS**

```
$ dd if=/dev/urandom of=largefile bs=3145728 count=1
1+0 records in
1+0 records out
3145728 bytes (3.1 MB) copied, 0.205813 s, 15.3 MB/s
```

`dd` 是一个实用工具，该实用工具将大量字节从输入文件复制到输出文件。上一个示例使用系统设备文件 `/dev/urandom` 作为随机数据的源。`fsutil` 在 Windows 中执行相似的功能。

**Windows**

```
C:\> fsutil file createnew largefile 3145728
File C:\temp\largefile is created
```

接下来，使用文件拆分器将文件拆分为 1 MiB（1,048,576 字节）的块。

```
$ split -b 1048576 --verbose largefile chunk
creating file `chunkaa'
creating file `chunkab'
creating file `chunkac'
```

## 启动文件分段上传和上传
<a name="cli-services-glacier-initiate"></a>

使用 `[initiate-multipart-upload](https://docs.aws.amazon.com/cli/latest/reference/glacier/initiate-multipart-upload.html)` 命令在 Amazon Glacier 中创建分段上传。

```
$ aws glacier initiate-multipart-upload --account-id - --archive-description "multipart upload test" --part-size 1048576 --vault-name myvault
{
    "uploadId": "19gaRezEXAMPLES6Ry5YYdqthHOC_kGRCT03L9yetr220UmPtBYKk-OssZtLqyFu7sY1_lR7vgFuJV6NtcV5zpsJ",
    "location": "/123456789012/vaults/myvault/multipart-uploads/19gaRezEXAMPLES6Ry5YYdqthHOC_kGRCT03L9yetr220UmPtBYKk-OssZtLqyFu7sY1_lR7vgFuJV6NtcV5zpsJ"
}
```

Amazon Glacier 需要每个部分的大小以字节为单位（本例中以 1 MiB 为单位）、您的保管库名称和一个账户 ID，用来配置分段上传。操作完成时，AWS CLI 会输出一个上传 ID。将上传 ID 保存到 shell 变量以待将来使用。

**Linux 或 macOS**

```
$ UPLOADID="19gaRezEXAMPLES6Ry5YYdqthHOC_kGRCT03L9yetr220UmPtBYKk-OssZtLqyFu7sY1_lR7vgFuJV6NtcV5zpsJ"
```

**Windows**

```
C:\> set UPLOADID="19gaRezEXAMPLES6Ry5YYdqthHOC_kGRCT03L9yetr220UmPtBYKk-OssZtLqyFu7sY1_lR7vgFuJV6NtcV5zpsJ"
```

接下来，使用 `[upload-multipart-part](https://docs.aws.amazon.com/cli/latest/reference/glacier/upload-multipart-part.html)` 命令上传三个部分的每个部分。

```
$ aws glacier upload-multipart-part --upload-id $UPLOADID --body chunkaa --range 'bytes 0-1048575/*' --account-id - --vault-name myvault
{
    "checksum": "e1f2a7cd6e047fa606fe2f0280350f69b9f8cfa602097a9a026360a7edc1f553"
}
$ aws glacier upload-multipart-part --upload-id $UPLOADID --body chunkab --range 'bytes 1048576-2097151/*' --account-id - --vault-name myvault
{
    "checksum": "e1f2a7cd6e047fa606fe2f0280350f69b9f8cfa602097a9a026360a7edc1f553"
}
$ aws glacier upload-multipart-part --upload-id $UPLOADID --body chunkac --range 'bytes 2097152-3145727/*' --account-id - --vault-name myvault
{
    "checksum": "e1f2a7cd6e047fa606fe2f0280350f69b9f8cfa602097a9a026360a7edc1f553"
}
```

**注意**  
上一个示例使用美元符号 (`$`) 在 Linux 上引用 `UPLOADID` shell 变量的内容。在 Windows 命令行上，在变量名称（例如， `%UPLOADID%`）的任一侧使用百分号 (%) 。

在上传各个部分时，您必须指定其字节范围，以便 Amazon Glacier 可以按正确的顺序重组它。由于每个部分的大小为 1,048,576 字节，因此第一个部分占用 0-1048575 字节，第二个部分占用 1048576-2097151 字节，第三个部分占用 2097152-3145727 字节。

## 完成上传
<a name="cli-services-glacier-complete"></a>

Amazon Glacier 需要原始文件的树形哈希，以确认所有上传的部分都已完整地到达AWS。

要计算树形哈希，必须将文件拆分为 1 MiB 的部分并计算每个部分的二进制 SHA-256 哈希。然后，将哈希列表拆分成对，合并每对中的两个二进制哈希，并采用结果的哈希。重复此步骤，直到只剩下一个哈希。如果任一级别出现奇数数量的哈希，请将其提升到下一级别而无需修改。

在使用命令行实用工具时，正确计算树形哈希的关键是以二进制的形式存储每个哈希，并且仅在最后一步将其转换为十六进制。对树中的任何哈希的十六进制版本进行合并或哈希处理将导致错误结果。

**注意**  
Windows 用户可使用 `type` 命令来代替 `cat`。OpenSSL 适用于 Windows，可在 [OpenSSL.org](https://www.openssl.org/source/) 找到。

**计算树形哈希**

1. 将原始文件拆分为 1 MiB 的部分（如果您还没有这样做）。

   ```
   $ split --bytes=1048576 --verbose largefile chunk
   creating file `chunkaa'
   creating file `chunkab'
   creating file `chunkac'
   ```

1. 计算并存储每个区块的二进制 SHA-256 哈希。

   ```
   $ openssl dgst -sha256 -binary chunkaa > hash1
   $ openssl dgst -sha256 -binary chunkab > hash2
   $ openssl dgst -sha256 -binary chunkac > hash3
   ```

1. 合并前两个哈希，并采用结果的二进制哈希。

   ```
   $ cat hash1 hash2 > hash12
   $ openssl dgst -sha256 -binary hash12 > hash12hash
   ```

1. 将区块 `aa` 和 `ab` 的父哈希与区块 `ac` 的哈希合并并对结果进行哈希处理，此时将输出十六进制。将结果存储在 shell 变量中。

   ```
   $ cat hash12hash hash3 > hash123
   $ openssl dgst -sha256 hash123
   SHA256(hash123)= 9628195fcdbcbbe76cdde932d4646fa7de5f219fb39823836d81f0cc0e18aa67
   $ TREEHASH=9628195fcdbcbbe76cdde932d4646fa7de5f219fb39823836d81f0cc0e18aa67
   ```

最后，使用 `[complete-multipart-upload](https://docs.aws.amazon.com/cli/latest/reference/glacier/complete-multipart-upload.html)` 命令完成上传。此命令采用原始文件的大小（以字节为单位）、最终树形哈希值（十六进制形式）以及您的账户 ID 和文件库名称。

```
$ aws glacier complete-multipart-upload --checksum $TREEHASH --archive-size 3145728 --upload-id $UPLOADID --account-id - --vault-name myvault
{
    "archiveId": "d3AbWhE0YE1m6f_fI1jPG82F8xzbMEEZmrAlLGAAONJAzo5QdP-N83MKqd96Unspoa5H5lItWX-sK8-QS0ZhwsyGiu9-R-kwWUyS1dSBlmgPPWkEbeFfqDSav053rU7FvVLHfRc6hg",
    "checksum": "9628195fcdbcbbe76cdde932d4646fa7de5f219fb39823836d81f0cc0e18aa67",
    "location": "/123456789012/vaults/myvault/archives/d3AbWhE0YE1m6f_fI1jPG82F8xzbMEEZmrAlLGAAONJAzo5QdP-N83MKqd96Unspoa5H5lItWX-sK8-QS0ZhwsyGiu9-R-kwWUyS1dSBlmgPPWkEbeFfqDSav053rU7FvVLHfRc6hg"
}
```

您也可以使用 `[describe-vault](https://docs.aws.amazon.com/cli/latest/reference/glacier/describe-vault.html)` 命令查看文件库的状态。

```
$ aws glacier describe-vault --account-id - --vault-name myvault
{
    "SizeInBytes": 3178496,
    "VaultARN": "arn:aws:glacier:us-west-2:123456789012:vaults/myvault",
    "LastInventoryDate": "2018-12-07T00:26:19.028Z",
    "NumberOfArchives": 1,
    "CreationDate": "2018-12-06T21:23:45.708Z",
    "VaultName": "myvault"
}
```

**注意**  
基本上每天都会更新一次文件库的状态。有关更多信息，请参阅 [使用文件库](https://docs.aws.amazon.com/amazonglacier/latest/dev/working-with-vaults.html)。

现在可以安全删除您创建的块和哈希文件。

```
$ rm chunk* hash*
```

有关分段上传的更多信息，请参阅**《Amazon Glacier 开发人员指南》中的[分段上传大型档案](https://docs.aws.amazon.com/amazonglacier/latest/dev/uploading-archive-mpu.html)和[计算校验和](https://docs.aws.amazon.com/amazonglacier/latest/dev/checksum-calculations.html)。

## 资源
<a name="cli-services-glacier-resources"></a>

** AWS CLI《参考：**》
+ `[aws glacier](https://docs.aws.amazon.com/cli/latest/reference/glacier/index.html)`
+ `[aws glacier complete-multipart-upload](https://docs.aws.amazon.com/cli/latest/reference/glacier/complete-multipart-upload.html)`
+ `[aws glacier create-vault](https://docs.aws.amazon.com/cli/latest/reference/glacier/create-vault.html)`
+ `[aws glacier describe-vault](https://docs.aws.amazon.com/cli/latest/reference/glacier/describe-vault.html)`
+ `[aws glacier initiate-multipart-upload](https://docs.aws.amazon.com/cli/latest/reference/glacier/initiate-multipart-upload.html)`

**《服务参考：**》
+ [《Amazon Glacier 开发人员指南》](https://docs.aws.amazon.com/amazonglacier/latest/dev/)
+ **《Amazon Glacier 开发人员指南》中的[分段上传大型档案](https://docs.aws.amazon.com/amazonglacier/latest/dev/uploading-archive-mpu.html)
+ **《Amazon Glacier 开发人员指南》中的[计算校验和](https://docs.aws.amazon.com/amazonglacier/latest/dev/checksum-calculations.html)
+ **《Amazon Glacier 开发人员指南》中的[处理保管库](https://docs.aws.amazon.com/amazonglacier/latest/dev/working-with-vaults.html)

# 在 AWS CLI 中使用 IAM
<a name="cli-services-iam"></a>


| AWS Identity and Access Management 简介 | 
| --- | 
|    | 

您可以使用 AWS Command Line Interface (AWS CLI) 访问 AWS Identity and Access Management (IAM) 的功能。要列出 IAM 的 AWS CLI 命令，请使用以下命令。

```
aws iam help
```

本主题显示执行 IAM 常见任务的 AWS CLI 命令。

在运行任何命令之前，请设置默认证书。有关更多信息，请参阅 [配置 AWS CLI 设置](cli-chap-configure.md)。

有关 IAM 服务的更多信息，请参阅 [AWS Identity and Access Management 用户指南](https://docs.aws.amazon.com/IAM/latest/UserGuide/introduction.html)。

**Topics**
+ [创建 IAM 用户和组](#cli-services-iam-new-user-group)
+ [将 IAM 托管式策略附加到用户](#cli-services-iam-policy)
+ [为 IAM 用户设置初始密码](#cli-services-iam-set-pw)
+ [为 IAM 用户创建访问密钥](#cli-services-iam-create-creds)

## 创建 IAM 用户和组
<a name="cli-services-iam-new-user-group"></a>

**创建组并向其中添加新用户**

1. 使用 [https://docs.aws.amazon.com/cli/latest/reference/iam/create-group.html](https://docs.aws.amazon.com/cli/latest/reference/iam/create-group.html) 命令创建组。

   ```
   $ aws iam create-group --group-name MyIamGroup
   {
       "Group": {
           "GroupName": "MyIamGroup",
           "CreateDate": "2018-12-14T03:03:52.834Z",
           "GroupId": "AGPAJNUJ2W4IJVEXAMPLE",
           "Arn": "arn:aws:iam::123456789012:group/MyIamGroup",
           "Path": "/"
       }
   }
   ```

1. 使用 [https://docs.aws.amazon.com/cli/latest/reference/iam/create-user.html](https://docs.aws.amazon.com/cli/latest/reference/iam/create-user.html) 命令创建用户。

   ```
   $ aws iam create-user --user-name MyUser
   {
       "User": {
           "UserName": "MyUser",
           "Path": "/",
           "CreateDate": "2018-12-14T03:13:02.581Z",
           "UserId": "AIDAJY2PE5XUZ4EXAMPLE",
           "Arn": "arn:aws:iam::123456789012:user/MyUser"
       }
   }
   ```

1. 使用 [https://docs.aws.amazon.com/cli/latest/reference/iam/add-user-to-group.html](https://docs.aws.amazon.com/cli/latest/reference/iam/add-user-to-group.html) 命令将用户添加到组。

   ```
   $ aws iam add-user-to-group --user-name MyUser --group-name MyIamGroup
   ```

1. 要验证 `MyIamGroup` 组包含 `MyUser`，请使用 [https://docs.aws.amazon.com/cli/latest/reference/iam/get-group.html](https://docs.aws.amazon.com/cli/latest/reference/iam/get-group.html) 命令。

   ```
   $ aws iam get-group --group-name MyIamGroup
   {
       "Group": {
           "GroupName": "MyIamGroup",
           "CreateDate": "2018-12-14T03:03:52Z",
           "GroupId": "AGPAJNUJ2W4IJVEXAMPLE",
           "Arn": "arn:aws:iam::123456789012:group/MyIamGroup",
           "Path": "/"
       },
       "Users": [
           {
               "UserName": "MyUser",
               "Path": "/",
               "CreateDate": "2018-12-14T03:13:02Z",
               "UserId": "AIDAJY2PE5XUZ4EXAMPLE",
               "Arn": "arn:aws:iam::123456789012:user/MyUser"
           }
       ],
       "IsTruncated": "false"
   }
   ```

## 将 IAM 托管式策略附加到用户
<a name="cli-services-iam-policy"></a>

此示例中的策略为用户提供“高级用户访问”。

**将 IAM 托管式策略附加到用户**

1. 确定要附加的策略的 Amazon 资源名称 (ARN)。以下命令使用 `list-policies` 查找具有名称 `PowerUserAccess` 的策略的 ARN。然后，它会将该 ARN 存储在环境变量中。

   ```
   $ export POLICYARN=$(aws iam list-policies --query 'Policies[?PolicyName==`PowerUserAccess`].{ARN:Arn}' --output text)       ~
   $ echo $POLICYARN
   arn:aws:iam::aws:policy/PowerUserAccess
   ```

1. 要附加策略，请使用 [https://docs.aws.amazon.com/cli/latest/reference/iam/attach-user-policy.html](https://docs.aws.amazon.com/cli/latest/reference/iam/attach-user-policy.html) 命令，并引用存放策略 ARN 的环境变量。

   ```
   $ aws iam attach-user-policy --user-name MyUser --policy-arn $POLICYARN
   ```

1. 通过运行 [https://docs.aws.amazon.com/cli/latest/reference/iam/list-attached-user-policies.html](https://docs.aws.amazon.com/cli/latest/reference/iam/list-attached-user-policies.html) 命令验证策略已附加到此用户。

   ```
   $ aws iam list-attached-user-policies --user-name MyUser
   {
       "AttachedPolicies": [
           {
               "PolicyName": "PowerUserAccess",
               "PolicyArn": "arn:aws:iam::aws:policy/PowerUserAccess"
           }
       ]
   }
   ```

有关更多信息，请参阅 [访问管理资源](https://docs.aws.amazon.com/IAM/latest/UserGuide/policies-additional-resources.html)。该主题提供权限和策略概览的链接以及用于访问 Amazon S3、Amazon EC2 和其他服务的示例策略的链接。

## 为 IAM 用户设置初始密码
<a name="cli-services-iam-set-pw"></a>

以下命令使用 `[create-login-profile](https://docs.aws.amazon.com/cli/latest/reference/iam/create-login-profile.html)` 为指定用户设置初始密码。当用户首次登录时，用户需要将密码更改为只有用户知道的内容。

```
$ aws iam create-login-profile --user-name MyUser --password My!User1Login8P@ssword --password-reset-required
{
    "LoginProfile": {
        "UserName": "MyUser",
        "CreateDate": "2018-12-14T17:27:18Z",
        "PasswordResetRequired": true
    }
}
```

您可以使用 `update-login-profile` 命令*更改*用户的密码。

```
$ aws iam update-login-profile --user-name MyUser --password My!User1ADifferentP@ssword
```

## 为 IAM 用户创建访问密钥
<a name="cli-services-iam-create-creds"></a>

您可以使用 [https://docs.aws.amazon.com/cli/latest/reference/iam/create-access-key.html](https://docs.aws.amazon.com/cli/latest/reference/iam/create-access-key.html) 命令为用户创建访问密钥。访问密钥是一组安全凭证，由访问密钥 ID 和私有密钥组成。

用户一次只能创建两个访问密钥。如果您尝试创建第三组，则命令返回 `LimitExceeded` 错误。

```
$ aws iam create-access-key --user-name MyUser
{
    "AccessKey": {
        "UserName": "MyUser",
        "AccessKeyId": "AKIAIOSFODNN7EXAMPLE",
        "Status": "Active",
        "SecretAccessKey": "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY",
        "CreateDate": "2018-12-14T17:34:16Z"
    }
}
```

使用 [https://docs.aws.amazon.com/cli/latest/reference/iam/delete-access-key.html](https://docs.aws.amazon.com/cli/latest/reference/iam/delete-access-key.html) 命令为用户删除访问密钥。使用访问密钥 ID 指定要删除的访问密钥。

```
$ aws iam delete-access-key --user-name MyUser --access-key-id AKIAIOSFODNN7EXAMPLE
```

# 在 AWS CLI 中使用 Amazon S3
<a name="cli-services-s3"></a>


| Amazon Simple Storage Service (Amazon S3) 简介 | 
| --- | 
|    | 

您可以使用 AWS Command Line Interface (AWS CLI) 访问 Amazon Simple Storage Service (Amazon S3) 的功能。Amazon S3 是一种高度可扩展的持久对象存储服务。Amazon S3 旨在提供几乎无限的存储容量，使其成为满足各种数据存储和管理需求的理想解决方案。

借助 Amazon S3，您能够以对象的形式存储和检索从小文件到大型数据集的任意数量的数据。每个对象都存储在名为存储桶的容器中，可以通过 AWS 管理控制台或 AWS SDK、工具和 AWS CLI 以编程方式访问和管理存储桶。

除基本存储之外，Amazon S3 还提供一系列功能，包括生命周期管理、版本控制、可扩展性和安全性。这些功能可与其他 AWS 服务集成，使您能够构建可根据需要扩展的云端解决方案。

AWS CLI 提供两个层级的命令来访问 Amazon S3：
+ **s3** – 自定义专门针对 AWS CLI 执行的高级命令，以简化常见任务，比如创建、操作、删除和同步对象及存储桶。
+ **s3api** – 提供对所有 Amazon S3 API 操作的直接访问，使您能够执行高级操作。

**Topics**
+ [在 AWS CLI 中使用高级（s3）命令](cli-services-s3-commands.md)
+ [在 AWS CLI 中使用 API 级 (s3api) 命令](cli-services-s3-apicommands.md)
+ [AWS CLI 中的 Amazon S3 存储桶生命周期脚本示例](cli-services-s3-lifecycle-example.md)

# 在 AWS CLI 中使用高级（s3）命令
<a name="cli-services-s3-commands"></a>

本主题介绍一些命令，可用于在 AWS CLI 中通过 [https://docs.aws.amazon.com/cli/latest/reference/s3/index.html](https://docs.aws.amazon.com/cli/latest/reference/s3/index.html) 命令管理 Amazon S3 存储桶和对象。有关本主题未涵盖的命令和其他命令示例，请参阅**《AWS CLI 参考》中的 [https://docs.aws.amazon.com/cli/latest/reference/s3/index.html](https://docs.aws.amazon.com/cli/latest/reference/s3/index.html) 命令。

高级别 `aws s3` 命令简化了 Amazon S3 对象管理。使用这些命令，您能够在 Amazon S3 自身中管理其内容以及使用本地目录管理这些内容。

**Topics**
+ [先决条件](#using-s3-commands-prereqs)
+ [开始之前](#using-s3-commands-before)
+ [创建存储桶](#using-s3-commands-managing-buckets-creating)
+ [列出存储桶和对象](#using-s3-commands-listing-buckets)
+ [删除存储桶](#using-s3-commands-delete-buckets)
+ [删除对象](#using-s3-commands-delete-objects)
+ [移动对象](#using-s3-commands-managing-objects-move)
+ [复制对象](#using-s3-commands-managing-objects-copy)
+ [同步对象](#using-s3-commands-managing-objects-sync)
+ [s3 命令的常用选项](#using-s3-commands-managing-objects-param)
+ [资源](#using-s3-commands-managing-buckets-references)

## 先决条件
<a name="using-s3-commands-prereqs"></a>

要运行 `s3` 命令，您需要：
+ 安装和配置 AWS CLI。有关更多信息，请参阅 [安装或更新最新版本的 AWS CLI](getting-started-install.md) 和 [AWS CLI 身份验证和访问凭证](cli-chap-authentication.md)。
+ 您使用的配置文件必须具有允许示例代码执行AWS操作的权限。
+ 需了解如下 Amazon S3 术语：
  + **存储桶** – 顶级 Amazon S3 文件夹。
  + **前缀 ** – 存储桶中的 Amazon S3 文件夹。
  + **对象** – 托管在 Amazon S3 存储桶中的任何项。

## 开始之前
<a name="using-s3-commands-before"></a>

本节介绍在使用 `aws s3` 命令之前需要注意的一些事项。

### 大型对象上载
<a name="using-s3-commands-before-large"></a>

当您使用 `aws s3` 命令将大型对象上传到 Amazon S3 存储桶时，AWS CLI 会自动执行分段上传。使用这些 `aws s3` 命令时，您无法恢复失败的上传操作。

如果分段上传由于超时而失败，或者您在 AWS CLI 中手动取消该操作，则 AWS CLI 会停止上传并清除已创建的任何文件。此过程可能耗时数分钟。

如果使用 kill 命令或者由于系统故障而取消了分段上传或清理过程，则创建的文件将保留在 Amazon S3 存储桶中。要清除分段上传，请使用 [s3api abort-multipart-upload](https://docs.aws.amazon.com/cli/latest/reference/s3api/abort-multipart-upload.html) 命令。

### 分段复制中的文件属性和标签
<a name="using-s3-commands-before-tags"></a>

当您使用 `aws s3` 命名空间中的 AWS CLI 版本 1 版本命令将文件从一个 Amazon S3 存储桶位置复制到另一个 Amazon S3 存储桶位置，并且该操作使用[分段复制](https://docs.aws.amazon.com/AmazonS3/latest/userguide/CopyingObjctsMPUapi.html)时，源对象中的文件属性不会被复制到目标对象。

原定设置情况下，`s3` 命名空间中执行分段复制的 AWS CLI 版本 2 命令会将所有标签和以下属性集从源副本传输到目标副本：`content-type`、`content-language`、`content-encoding`、`content-disposition`、`cache-control`、`expires` 和 `metadata`。

这可能会导致对 Amazon S3 端点进行其他 AWS API 调用，而在使用 AWS CLI 版本 1 时，将不会进行这些调用。这些调用可能包括：`HeadObject`、`GetObjectTagging` 和 `PutObjectTagging`。

如果需要在 AWS CLI 版本 2 命令中更改此默认行为，请使用 `--copy-props` 参数指定以下选项之一：
+ **default** – 默认值。指定该复制包含附加到源对象的所有标签以及用于非分段复制的 `--metadata-directive` 参数所包含的属性：`content-type`、`content-language`、`content-encoding`、`content-disposition`、`cache-control`、`expires` 和 `metadata`。
+ **metadata-directive** – 指定该复制仅包含用于非分段复制的 `--metadata-directive` 参数所包含的属性。它不会复制任何标签。
+ **none** – 指定该复制不包含源对象中的任何属性。

## 创建存储桶
<a name="using-s3-commands-managing-buckets-creating"></a>

使用 [https://docs.aws.amazon.com/cli/latest/reference/s3/mb.html](https://docs.aws.amazon.com/cli/latest/reference/s3/mb.html) 命令创建存储桶。存储桶名称必须是***全局*** 唯一的（在所有 Amazon S3 存储桶中都是唯一的），并且应符合 DNS 标准。

存储桶名称可以包含小写字母、数字、连字符和点号。存储桶名称只能以字母或数字开头和结尾，连字符或点号后不能跟点号。

**语法**

```
$ aws s3 mb <target> [--options]
```

### s3 mb 示例
<a name="using-s3-commands-managing-buckets-creating-examples"></a>

以下示例将创建 `s3://amzn-s3-demo-bucket` 存储桶。

```
$ aws s3 mb s3://amzn-s3-demo-bucket
```

## 列出存储桶和对象
<a name="using-s3-commands-listing-buckets"></a>

要列出存储桶、文件夹或对象，请使用 [https://docs.aws.amazon.com/cli/latest/reference/s3/ls.html](https://docs.aws.amazon.com/cli/latest/reference/s3/ls.html) 命令。使用不带目标或选项的命令时，将会列出所有存储桶。

**语法**

```
$ aws s3 ls <target> [--options]
```

有关与此命令一起使用的一些常见选项以及相关示例，请参阅 [s3 命令的常用选项](#using-s3-commands-managing-objects-param)。有关可用选项的完整列表，请参阅*《AWS CLI 命令参考》*中的 [https://docs.aws.amazon.com/cli/latest/reference/s3/ls.html](https://docs.aws.amazon.com/cli/latest/reference/s3/ls.html)。

### s3 ls 示例
<a name="using-s3-commands-managing-objects-list-examples"></a>

以下示例列出您的所有 Amazon S3 存储桶。

```
$ aws s3 ls
2018-12-11 17:08:50 amzn-s3-demo-bucket1
2018-12-14 14:55:44 amzn-s3-demo-bucket2
```

下面的命令列出一个存储桶中的所有对象和前缀。在本示例输出中，前缀 `example/` 有一个名为 `MyFile1.txt` 的文件。

```
$ aws s3 ls s3://amzn-s3-demo-bucket
                           PRE example/
2018-12-04 19:05:48          3 MyFile1.txt
```

您可以通过在命令中包含特定前缀将输出筛选到此前缀。下面的命令列出 *bucket-name/example/* 中的对象（即 *bucket-name* 中按前缀 *example/* 筛选出的对象）。

```
$ aws s3 ls s3://amzn-s3-demo-bucket/example/
2018-12-06 18:59:32          3 MyFile1.txt
```

要仅显示特定区域内的存储桶和对象，请使用 `--region` 选项

```
$ aws s3 ls --region us-east-2
2018-12-06 18:59:32          3 MyFile1.txt
```

如果您的存储桶和对象列表比较大，可以使用 `--max-items` 或 `--page-size` 选项对结果进行分页。`--max-items` 选项可限制调用中返回的存储桶和对象的总数，`--page-size` 选项可限制页面上列出的存储桶和对象的数量。

```
$ aws s3 ls --max-items 100 --page-size 10
```

有关分页的更多信息，请参阅[如何使用 --page-size 参数](cli-usage-pagination.md#cli-usage-pagination-pagesize)和[如何使用 --max-items 参数](cli-usage-pagination.md#cli-usage-pagination-maxitems)。

## 删除存储桶
<a name="using-s3-commands-delete-buckets"></a>

要删除存储桶，请使用 [https://docs.aws.amazon.com/cli/latest/reference/s3/rb.html](https://docs.aws.amazon.com/cli/latest/reference/s3/rb.html) 命令。

**语法**

```
$ aws s3 rb <target> [--options]
```

### s3 rb 示例
<a name="using-s3-commands-removing-buckets-examples"></a>

以下示例删除 `s3://amzn-s3-demo-bucket` 存储桶。

```
$ aws s3 rb s3://amzn-s3-demo-bucket
```

默认情况下，存储桶必须为空，此操作才能成功。要删除不为空的存储桶，您必须包含 `--force` 选项。如果您使用的是受版本控制的存储桶，即其中包含以前删除“但仍保留”的对象，则此命令 *不* 允许您删除该存储桶。您必须先删除所有内容。

以下示例命令删除存储桶中的所有对象和前缀，然后删除存储桶本身。

```
$ aws s3 rb s3://amzn-s3-demo-bucket --force
```

## 删除对象
<a name="using-s3-commands-delete-objects"></a>

要删除存储桶或本地目录中的对象，请使用 [https://docs.aws.amazon.com/cli/latest/reference/s3/rm.html](https://docs.aws.amazon.com/cli/latest/reference/s3/rm.html) 命令。

**语法**

```
$ aws s3 rm  <target> [--options]
```

有关与此命令一起使用的一些常见选项以及相关示例，请参阅 [s3 命令的常用选项](#using-s3-commands-managing-objects-param)。有关选项的完整列表，请参阅**《AWS CLI 命令参考》中的 [https://docs.aws.amazon.com/cli/latest/reference/s3/rm.html](https://docs.aws.amazon.com/cli/latest/reference/s3/rm.html)。

### s3 rm 示例
<a name="using-s3-commands-delete-objects-examples"></a>

以下示例将从 `filename.txt` 删除 `s3://amzn-s3-demo-bucket/example`。

```
$ aws s3 rm s3://amzn-s3-demo-bucket/example/filename.txt
```

以下示例使用 `s3://amzn-s3-demo-bucket/example` 选项从 `--recursive` 删除所有对象。

```
$ aws s3 rm s3://amzn-s3-demo-bucket/example --recursive
```

## 移动对象
<a name="using-s3-commands-managing-objects-move"></a>

使用 [https://docs.aws.amazon.com/cli/latest/reference/s3/mv.html](https://docs.aws.amazon.com/cli/latest/reference/s3/mv.html) 命令可从存储桶或本地目录中移动对象。`s3 mv` 命令将源对象或文件复制到指定目标，然后删除源对象或文件。

**语法**

```
$ aws s3 mv <source> <target> [--options]
```

有关与此命令一起使用的一些常见选项以及相关示例，请参阅 [s3 命令的常用选项](#using-s3-commands-managing-objects-param)。有关可用选项的完整列表，请参阅*《AWS CLI 命令参考》*中的 [https://docs.aws.amazon.com/cli/latest/reference/s3/mv.html](https://docs.aws.amazon.com/cli/latest/reference/s3/mv.html)。

**警告**  
如果您在 Amazon S3 源或目标 URI 中使用任何类型的接入点 ARN 或接入点别名，则必须格外注意源和目标 Amazon S3 URI 解析到不同的底层存储桶。如果源存储桶和目标存储桶相同，则可以将源文件或对象移到其自身上，这可能会导致源文件或对象被意外删除。要验证源存储桶和目标存储桶是否不同，请使用 `--validate-same-s3-paths` 参数或将环境变量 ``AWS_CLI_S3_MV_VALIDATE_SAME_S3_PATHS`` 设置为 `true`。

### s3 mv 示例
<a name="using-s3-commands-managing-objects-move-examples"></a>

以下示例将所有对象从 `s3://amzn-s3-demo-bucket/example` 移动到 `s3://amzn-s3-demo-bucket/`。

```
$ aws s3 mv s3://amzn-s3-demo-bucket/example s3://amzn-s3-demo-bucket/
```

以下示例使用 `s3 mv` 命令，将本地文件从当前工作目录移动到 Amazon S3 存储桶。

```
$ aws s3 mv filename.txt s3://amzn-s3-demo-bucket
```

以下示例将文件从 Amazon S3 存储桶移动到当前工作目录，其中 `./` 指定当前的工作目录。

```
$ aws s3 mv s3://amzn-s3-demo-bucket/filename.txt ./
```

## 复制对象
<a name="using-s3-commands-managing-objects-copy"></a>

使用 [https://docs.aws.amazon.com/cli/latest/reference/s3/cp.html](https://docs.aws.amazon.com/cli/latest/reference/s3/cp.html) 命令可从存储桶或本地目录复制对象。

**语法**

```
$ aws s3 cp <source> <target> [--options]
```

您可以使用短划线参数，将文件流式传输到标准输入（`stdin`）或标准输出（`stdout`）。

**警告**  
如果您使用的是 PowerShell，则 Shell 可能会更改 CRLF 编码，或者将 CRLF 添加到管道输入或输出或重定向的输出中。

`s3 cp` 命令使用以下语法，将文件流从 `stdin` 上传到指定的存储桶。

**语法**

```
$ aws s3 cp - <target> [--options]
```

`s3 cp` 命令使用以下语法下载 `stdout` 的 Amazon S3 文件流。

**语法**

```
$ aws s3 cp <target> [--options] -
```

有关与此命令一起使用的一些常见选项以及相关示例，请参阅 [s3 命令的常用选项](#using-s3-commands-managing-objects-param)。有关选项的完整列表，请参阅**《AWS CLI 命令参考》中的 [https://docs.aws.amazon.com/cli/latest/reference/s3/cp.html](https://docs.aws.amazon.com/cli/latest/reference/s3/cp.html)。

### `s3 cp` 示例
<a name="using-s3-commands-managing-objects-copy-examples"></a>

以下示例将所有对象从 `s3://amzn-s3-demo-bucket/example` 复制到 `s3://amzn-s3-demo-bucket/`。

```
$ aws s3 cp s3://amzn-s3-demo-bucket/example s3://amzn-s3-demo-bucket/
```

以下示例使用 `s3 cp` 命令，将本地文件从当前工作目录复制到 Amazon S3 存储桶。

```
$ aws s3 cp filename.txt s3://amzn-s3-demo-bucket
```

以下示例将文件从 Amazon S3 存储桶复制到当前工作目录，其中 `./` 指定当前的工作目录。

```
$ aws s3 cp s3://amzn-s3-demo-bucket/filename.txt ./
```

以下示例使用 echo 将文本“hello world”流式传输到 `s3://bucket-name/filename.txt` 文件。

```
$ echo "hello world" | aws s3 cp - s3://amzn-s3-demo-bucket/filename.txt
```

以下示例将 `s3://amzn-s3-demo-bucket/filename.txt` 文件流式传输到 `stdout`，并将内容输出到控制台。

```
$ aws s3 cp s3://amzn-s3-demo-bucket/filename.txt -
hello world
```

以下示例将 `s3://bucket-name/pre` 的内容流式传输到 `stdout`，使用 `bzip2` 命令压缩文件，并将名为 `key.bz2` 的新压缩文件上传到 `s3://bucket-name`。

```
$ aws s3 cp s3://amzn-s3-demo-bucket/pre - | bzip2 --best | aws s3 cp - s3://amzn-s3-demo-bucket/key.bz2
```

## 同步对象
<a name="using-s3-commands-managing-objects-sync"></a>

[https://docs.aws.amazon.com/cli/latest/reference/s3/sync.html](https://docs.aws.amazon.com/cli/latest/reference/s3/sync.html) 命令同步一个存储桶与一个目录中的内容，或者同步两个存储桶中的内容。通常，`s3 sync` 在源和目标之间复制缺失或过时的文件或对象。不过，您还可以提供 `--delete` 选项来从目标中删除源中不存在的文件或对象。

**语法**

```
$ aws s3 sync <source> <target> [--options]
```

有关与此命令一起使用的一些常见选项以及相关示例，请参阅 [s3 命令的常用选项](#using-s3-commands-managing-objects-param)。有关选项的完整列表，请参阅**《AWS CLI 命令参考》中的 [https://docs.aws.amazon.com/cli/latest/reference/s3/sync.html](https://docs.aws.amazon.com/cli/latest/reference/s3/sync.html)。

### s3 sync 示例
<a name="using-s3-commands-managing-objects-sync-examples"></a>

下面的示例将名为 *amzn-s3-demo-bucket* 的存储桶中名为 *path* 的 Amazon S3 前缀中的内容与当前工作目录同步。

`s3 sync` 将更新与目标位置中同名文件的大小或修改时间不同的任何文件。输出显示在同步期间执行的特定操作。请注意，该操作将与 `MySubdirectory` 递归地同步子目录 `s3://amzn-s3-demo-bucket/path/MySubdirectory` 及其内容。

```
$ aws s3 sync . s3://amzn-s3-demo-bucket/path
upload: MySubdirectory\MyFile3.txt to s3://amzn-s3-demo-bucket/path/MySubdirectory/MyFile3.txt
upload: MyFile2.txt to s3://amzn-s3-demo-bucket/path/MyFile2.txt
upload: MyFile1.txt to s3://amzn-s3-demo-bucket/path/MyFile1.txt
```

下面的示例对上一示例进行了扩展，显示了如何使用 `--delete` 选项。

```
// Delete local file
$ rm ./MyFile1.txt

// Attempt sync without --delete option - nothing happens
$ aws s3 sync . s3://amzn-s3-demo-bucket/path

// Sync with deletion - object is deleted from bucket
$ aws s3 sync . s3://amzn-s3-demo-bucket/path --delete
delete: s3://amzn-s3-demo-bucket/path/MyFile1.txt

// Delete object from bucket
$ aws s3 rm s3://amzn-s3-demo-bucket/path/MySubdirectory/MyFile3.txt
delete: s3://amzn-s3-demo-bucket/path/MySubdirectory/MyFile3.txt

// Sync with deletion - local file is deleted
$ aws s3 sync s3://amzn-s3-demo-bucket/path . --delete
delete: MySubdirectory\MyFile3.txt

// Sync with Infrequent Access storage class
$ aws s3 sync . s3://amzn-s3-demo-bucket/path --storage-class STANDARD_IA
```

使用 `--delete` 选项时，`--exclude` 和 `--include` 选项可以筛选要在 `s3 sync` 操作过程中删除的文件或对象。在这种情况下，参数字符串必须指定要在目标目录或存储桶上下文中包含或排除在删除操作中的文件。下面是一个示例。

```
Assume local directory and s3://amzn-s3-demo-bucket/path currently in sync and each contains 3 files:
MyFile1.txt
MyFile2.rtf
MyFile88.txt
'''

// Sync with delete, excluding files that match a pattern. MyFile88.txt is deleted, while remote MyFile1.txt is not.
$ aws s3 sync . s3://amzn-s3-demo-bucket/path --delete --exclude "path/MyFile?.txt"
delete: s3://amzn-s3-demo-bucket/path/MyFile88.txt
'''

// Sync with delete, excluding MyFile2.rtf - local file is NOT deleted
$ aws s3 sync s3://amzn-s3-demo-bucket/path . --delete --exclude "./MyFile2.rtf"
download: s3://amzn-s3-demo-bucket/path/MyFile1.txt to MyFile1.txt
'''

// Sync with delete, local copy of MyFile2.rtf is deleted
$ aws s3 sync s3://amzn-s3-demo-bucket/path . --delete
delete: MyFile2.rtf
```

## s3 命令的常用选项
<a name="using-s3-commands-managing-objects-param"></a>

以下选项经常用于本主题中所述的命令。有关可在命令中使用的选项的完整列表，请参阅[《AWS CLI 版本 2 参考指南》](https://docs.aws.amazon.com/cli/latest/reference/index.html)中的特定命令。

**acl**  
`s3 sync` 和 `s3 cp` 可以使用 `--acl` 选项。这样您能够为复制到 Amazon S3 的文件设置访问权限。`--acl` 选项接受 `private`、`public-read` 和 `public-read-write` 值。有关更多信息，请参阅《Amazon S3 用户指南》**中的[标准 ACL](https://docs.aws.amazon.com/AmazonS3/latest/userguide/acl-overview.html#canned-acl)。  

```
$ aws s3 sync . s3://amzn-s3-demo-bucket/path --acl public-read
```

**exclude**  
使用 `s3 cp`、`s3 mv`、`s3 sync` 或 `s3 rm` 命令时，可以使用 `--exclude` 或 `--include` 选项筛选结果。`--exclude` 选项将规则设置为仅从命令中排除对象，并且系统将按照指定的顺序应用这些选项。如下例所示。  

```
Local directory contains 3 files:
MyFile1.txt
MyFile2.rtf
MyFile88.txt

// Exclude all .txt files, resulting in only MyFile2.rtf being copied
$ aws s3 cp . s3://amzn-s3-demo-bucket/path --exclude "*.txt"

// Exclude all .txt files but include all files with the "MyFile*.txt" format, resulting in, MyFile1.txt, MyFile2.rtf, MyFile88.txt being copied
$ aws s3 cp . s3://amzn-s3-demo-bucket/path --exclude "*.txt" --include "MyFile*.txt"

// Exclude all .txt files, but include all files with the "MyFile*.txt" format, but exclude all files with the "MyFile?.txt" format resulting in, MyFile2.rtf and MyFile88.txt being copied
$ aws s3 cp . s3://amzn-s3-demo-bucket/path --exclude "*.txt" --include "MyFile*.txt" --exclude "MyFile?.txt"
```

**情况如：**  
使用 `s3 cp`、`s3 mv`、`s3 sync` 或 `s3 rm` 命令时，可以使用 `--exclude` 或 `--include` 选项筛选结果。`--include` 选项将规则设置为仅包括为命令指定的对象，并且系统将按照指定的顺序应用这些选项。如下例所示。  

```
Local directory contains 3 files:
MyFile1.txt
MyFile2.rtf
MyFile88.txt

// Include all .txt files, resulting in MyFile1.txt and MyFile88.txt being copied
$ aws s3 cp . s3://amzn-s3-demo-bucket/path --include "*.txt"

// Include all .txt files but exclude all files with the "MyFile*.txt" format, resulting in no files being copied
$ aws s3 cp . s3://amzn-s3-demo-bucket/path --include "*.txt" --exclude "MyFile*.txt"

// Include all .txt files, but exclude all files with the "MyFile*.txt" format, but include all files with the "MyFile?.txt" format resulting in MyFile1.txt being copied

$ aws s3 cp . s3://amzn-s3-demo-bucket/path --include "*.txt" --exclude "MyFile*.txt" --include "MyFile?.txt"
```

**授予**  
`s3 cp`、`s3 mv` 和 `s3 sync` 命令包括一个 `--grants` 选项，可用来向指定的用户或组授予对对象的权限。使用以下语法对权限列表设置 `--grants` 选项。将 `Permission`、`Grantee_Type` 和 `Grantee_ID` 替换为您自己的值。  
**语法**  

```
--grants Permission=Grantee_Type=Grantee_ID
         [Permission=Grantee_Type=Grantee_ID ...]
```
每个值都包含以下元素：  
+ *权限* – 指定授予的权限。可以设置为 `read`、`readacl`、`writeacl` 或 `full`。
+ *Grantee\$1Type* – 指定如何标识被授权者。可以设置为 `uri`、`emailaddress` 或 `id`。
+ *Grantee\$1ID* – 根据 *Grantee\$1Type*.指定被授权者。
  + `uri` – 组 URI。有关更多信息，请参阅 [谁是授权者？](https://docs.aws.amazon.com/AmazonS3/latest/userguide/ACLOverview.html#SpecifyingGrantee)
  + `emailaddress` – 账户的电子邮件地址。
  + `id` – 账户的规范 ID。
有关 Amazon S3 访问控制的更多信息，请参阅 [访问控制](https://docs.aws.amazon.com/AmazonS3/latest/userguide/UsingAuthAccess.html)。  
下面的示例将一个对象复制到一个存储桶中。它授予所有人对对象的 `read` 权限，向 `full` 的关联账户授予 `read` 权限（`readacl`、`writeacl` 和 `user@example.com`）。  

```
$ aws s3 cp file.txt s3://amzn-s3-demo-bucket/ --grants read=uri=http://acs.amazonaws.com/groups/global/AllUsers full=emailaddress=user@example.com
```
还可以为上传到 Amazon S3 的对象指定非默认存储类（`REDUCED_REDUNDANCY` 或 `STANDARD_IA`）。为此，请使用 `--storage-class` 选项。  

```
$ aws s3 cp file.txt s3://amzn-s3-demo-bucket/ --storage-class REDUCED_REDUNDANCY
```

**no-overwrite**  
`s3 cp`、`s3 mv` 和 `s3 sync` 命令包含一个 `--no-overwrite` 选项，您可以使用该选项来防止覆盖目标中已存在的对象。  
以下示例仅当在本地目录中尚不存在对象时，才会将该对象从存储桶复制到本地目录。  

```
$ aws s3 cp --no-overwrite s3://amzn-s3-demo-bucket/file.txt file.txt
```
以下示例以递归方式将文件从本地目录复制到存储桶。它只会复制那些在存储桶中尚未存在的文件。  

```
$ aws s3 cp --recursive --no-overwrite /path/to/demo-files/ s3://amzn-s3-demo-bucket/demo-files/
```
以下示例仅当在存储桶目标位置中尚不存在对象时，才会将该对象从本地目录移动到存储桶。  

```
$ aws s3 mv --no-overwrite file.txt s3://amzn-s3-demo-bucket/file.txt
```
以下示例将文件从本地目录同步到存储桶。它只会同步目标存储桶中尚不存在的文件。  

```
$ aws s3 sync --no-overwrite /path/to/demo-files/ s3://amzn-s3-demo-bucket/demo-files/
```

**recursive**  
使用此选项时，系统针对所指定目录或前缀下的所有文件或对象执行该命令。以下示例删除 `s3://amzn-s3-demo-bucket/path` 及其所有内容。  

```
$ aws s3 rm s3://amzn-s3-demo-bucket/path --recursive
```

## 资源
<a name="using-s3-commands-managing-buckets-references"></a>

** AWS CLI《参考：**》
+ [https://docs.aws.amazon.com/cli/latest/reference/s3/index.html](https://docs.aws.amazon.com/cli/latest/reference/s3/index.html)
+ [https://docs.aws.amazon.com/cli/latest/reference/s3/cp.html](https://docs.aws.amazon.com/cli/latest/reference/s3/cp.html)
+ [https://docs.aws.amazon.com/cli/latest/reference/s3/mb.html](https://docs.aws.amazon.com/cli/latest/reference/s3/mb.html)
+ [https://docs.aws.amazon.com/cli/latest/reference/s3/mv.html](https://docs.aws.amazon.com/cli/latest/reference/s3/mv.html)
+ [https://docs.aws.amazon.com/cli/latest/reference/s3/ls.html](https://docs.aws.amazon.com/cli/latest/reference/s3/ls.html)
+ [https://docs.aws.amazon.com/cli/latest/reference/s3/rb.html](https://docs.aws.amazon.com/cli/latest/reference/s3/rb.html)
+ [https://docs.aws.amazon.com/cli/latest/reference/s3/rm.html](https://docs.aws.amazon.com/cli/latest/reference/s3/rm.html)
+ [https://docs.aws.amazon.com/cli/latest/reference/s3/sync.html](https://docs.aws.amazon.com/cli/latest/reference/s3/sync.html)

**《服务参考：**》
+ 《Amazon S3 开发人员指南》**中的[使用 Amazon S3 存储桶](https://docs.aws.amazon.com//AmazonS3/latest/userguide/UsingBucket.html)
+ 《Amazon S3 用户指南》**中的[使用 Amazon S3 对象](https://docs.aws.amazon.com//AmazonS3/latest/userguide/UsingObjects.html)
+ 《Amazon S3 用户指南》**中的[使用前缀和分隔符按层次结构列出密钥](https://docs.aws.amazon.com//AmazonS3/latest/userguide/ListingKeysHierarchy.html)
+ 《Amazon S3 用户指南》**中的[使用 适用于 .NET 的 AWS SDK（低级别）中止到 S3 存储桶的分段上传](https://docs.aws.amazon.com//AmazonS3/latest/userguide/LLAbortMPUnet.html)

# 在 AWS CLI 中使用 API 级 (s3api) 命令
<a name="cli-services-s3-apicommands"></a>

API 级命令（包含在 `s3api` 命令集中）提供对 Amazon Simple Storage Service (Amazon S3) API 的直接访问，并且可以执行高级别 `s3` 命令中未公开的某些操作。这些命令等同于对服务功能提供 API 级访问的其他 AWS 服务的命令。有关 `s3` 命令的更多信息，请参阅 [在 AWS CLI 中使用高级（s3）命令](cli-services-s3-commands.md)。

本主题提供了若干示例，以演示如何使用映射到 Amazon S3 API 的低级别命令。此外，您可以在[《AWS CLI 版本 2 参考指南》](https://docs.aws.amazon.com/cli/latest/reference/s3api/index.html)的 `s3api` 部分中找到每个 S3 API 命令的示例。

**Topics**
+ [先决条件](#cli-services-s3-apicommands-prereqs)
+ [应用自定义 ACL](#cli-services-s3-apicommands-acls)
+ [配置日志记录策略](#cli-services-s3-apicommands-logpol)
+ [资源](#cli-services-s3-apicommands-resources)

## 先决条件
<a name="cli-services-s3-apicommands-prereqs"></a>

要运行 `s3api` 命令，您需要：
+ 安装和配置 AWS CLI。有关更多信息，请参阅 [安装或更新最新版本的 AWS CLI](getting-started-install.md) 和 [AWS CLI 身份验证和访问凭证](cli-chap-authentication.md)。
+ 您使用的配置文件必须具有允许示例代码执行AWS操作的权限。
+ 需了解如下 Amazon S3 术语：
  + **存储桶** – 顶级 Amazon S3 文件夹。
  + **前缀 ** – 存储桶中的 Amazon S3 文件夹。
  + **对象 ** – 托管在 Amazon S3 存储桶中的任何项。

## 应用自定义 ACL
<a name="cli-services-s3-apicommands-acls"></a>

对于高级别命令，您可以使用 `--acl` 选项对 Amazon S3 对象应用预定义的访问控制列表 (ACL)。但不能使用该命令设置存储桶范围的 ACL。不过，您可以通过使用 ```[put-bucket-acl](https://docs.aws.amazon.com/cli/latest/reference/s3api/put-bucket-acl.html)` API 级命令来执行此操作。

下面的示例说明如何向两个 AWS 用户（*user1@example.com* 和 *user2@example.com*）授予完全控制权限，并向所有人授予读取权限。“everyone”的标识符来自作为参数传递的特殊 URI。

```
$ aws s3api put-bucket-acl --bucket amzn-s3-demo-bucket --grant-full-control 'emailaddress="user1@example.com",emailaddress="user2@example.com"' --grant-read 'uri="http://acs.amazonaws.com/groups/global/AllUsers"'
```

有关如何构建 ACL 的详细信息，请参阅 * Amazon Simple Storage Service API 参考*中的 [PUT Bucket acl](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketPUTacl.html)。CLI 中的 `s3api` ACL 命令（如 `put-bucket-acl`）使用相同的 [简化参数表示法](https://docs.aws.amazon.com/cli/latest/userguide/cli-usage-shorthand.html)。

## 配置日志记录策略
<a name="cli-services-s3-apicommands-logpol"></a>

API 命令 `put-bucket-logging` 配置存储桶日志记录策略。

在下面的示例中，已向AWS用户 *user@example.com* 授予对日志文件的完全控制权限，而向所有用户授予了读取访问权限。请注意，还需要使用 `put-bucket-acl` 命令向 Amazon S3 的日志传输系统（由 URI 指定）授予必要的权限，以读取和向存储桶写入日志。

```
$ aws s3api put-bucket-acl --bucket amzn-s3-demo-bucket --grant-read-acp 'URI="http://acs.amazonaws.com/groups/s3/LogDelivery"' --grant-write 'URI="http://acs.amazonaws.com/groups/s3/LogDelivery"'
$ aws s3api put-bucket-logging --bucket amzn-s3-demo-bucket --bucket-logging-status file://logging.json
```

上一个命令中的 `logging.json` 文件具有以下内容。

```
{
  "LoggingEnabled": {
    "TargetBucket": "amzn-s3-demo-bucket",
    "TargetPrefix": "amzn-s3-demo-bucketLogs/",
    "TargetGrants": [
      {
        "Grantee": {
          "Type": "AmazonCustomerByEmail",
          "EmailAddress": "user@example.com"
        },
        "Permission": "FULL_CONTROL"
      },
      {
        "Grantee": {
          "Type": "Group",
          "URI": "http://acs.amazonaws.com/groups/global/AllUsers"
        },
        "Permission": "READ"
      }
    ]
  }
}
```

## 资源
<a name="cli-services-s3-apicommands-resources"></a>

《AWS CLI 参考：》****
+ [https://docs.aws.amazon.com/cli/latest/reference/s3api/index.html](https://docs.aws.amazon.com/cli/latest/reference/s3api/index.html)
+ [https://docs.aws.amazon.com/cli/latest/reference/s3api/put-bucket-acl.html](https://docs.aws.amazon.com/cli/latest/reference/s3api/put-bucket-acl.html)
+ [https://docs.aws.amazon.com/cli/latest/reference/s3api/put-bucket-logging.html](https://docs.aws.amazon.com/cli/latest/reference/s3api/put-bucket-logging.html)

《服务参考：》****
+ 《Amazon S3 开发人员指南》**中的[使用 Amazon S3 存储桶](https://docs.aws.amazon.com//AmazonS3/latest/userguide/UsingBucket.html)
+ 《Amazon S3 用户指南》**中的[使用 Amazon S3 对象](https://docs.aws.amazon.com//AmazonS3/latest/userguide/UsingObjects.html)
+ 《Amazon S3 用户指南》**中的[使用前缀和分隔符按层次结构列出密钥](https://docs.aws.amazon.com//AmazonS3/latest/userguide/ListingKeysHierarchy.html)
+ 《Amazon S3 用户指南》**中的[使用 适用于 .NET 的 AWS SDK（低级别）中止到 S3 存储桶的分段上传](https://docs.aws.amazon.com//AmazonS3/latest/userguide/LLAbortMPUnet.html)

# AWS CLI 中的 Amazon S3 存储桶生命周期脚本示例
<a name="cli-services-s3-lifecycle-example"></a>

本主题介绍使用 AWS Command Line Interface (AWS CLI) 的 Amazon S3 存储桶生命周期操作的 bash 脚本示例。此脚本示例使用 [https://docs.aws.amazon.com/cli/latest/reference/s3api/index.html](https://docs.aws.amazon.com/cli/latest/reference/s3api/index.html) 命令集。Shell 脚本是专用于在命令行界面中运行的程序。

**Topics**
+ [在您开始之前](#cli-services-s3-lifecycle-example-before)
+ [关于此示例](#cli-services-s3-lifecycle-example-about)
+ [文件](#cli-services-s3-lifecycle-example-files)
+ [引用](#cli-services-s3-lifecycle-example-references)

## 在您开始之前
<a name="cli-services-s3-lifecycle-example-before"></a>

您需要先满足以下条件，才能运行下文中的任何示例代码。
+ 安装和配置 AWS CLI。有关更多信息，请参阅 [安装或更新最新版本的 AWS CLI](getting-started-install.md) 和 [AWS CLI 身份验证和访问凭证](cli-chap-authentication.md)。
+ 您使用的配置文件必须具有允许示例代码执行AWS操作的权限。
+ 作为AWS的最佳实践，请授予此代码最低的权限，或者仅授予它执行任务所需的权限。有关更多信息，请参阅 *IAM 用户指南* 中的 [授予最低权限](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html#grant-least-privilege)。
+ 此代码尚未在所有AWS区域中进行测试。有些 AWS 服务仅在特定区域中提供。有关更多信息，请参阅《AWS 一般参考指南》**中的[服务端点和配额](https://docs.aws.amazon.com/general/latest/gr/aws-service-information.html)。
+ 运行此代码可能会导致您的 AWS 账户产生相关费用。您有责任确保在使用完由此脚本创建的任何资源后删除这些资源。

Amazon S3 服务使用以下术语：
+ 存储桶 – 顶级 Amazon S3 文件夹。
+ 前缀 – 存储桶中的 Amazon S3 文件夹。
+ 对象 – Amazon S3 存储桶中托管的任何项。

## 关于此示例
<a name="cli-services-s3-lifecycle-example-about"></a>

此示例说明如何使用 shell 脚本文件中的一组函数与一些基本的 Amazon S3 操作进行交互。这些函数包含在名为 `bucket-operations.sh` 的 shell 脚本文件中。您可以在另一个文件中调用这些函数。每个脚本文件都包含了介绍每个函数的注释。

要查看每个步骤的中间结果，请使用 `-i` 参数运行脚本。您可以使用 Amazon S3 控制台查看存储桶或其内容的当前状态。仅当您在系统提示符处按 **Enter** 后，脚本才会继续执行下一步。

有关完整示例和可下载的脚本文件，请参阅 *GitHub* 上的 *AWS 代码示例存储库* 中的 [Amazon S3 存储桶生命周期操作](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/aws-cli/bash-linux/s3/bucket-lifecycle-operations)。

## 文件
<a name="cli-services-s3-lifecycle-example-files"></a>

此示例包含以下文件：

**bucket-operations.sh**  
此主脚本文件可以从另一个文件中调取。它包含了执行以下任务的函数：  
+ 创建存储桶并验证它是否存在
+ 将文件从本地电脑复制到存储桶
+ 将文件从一个存储桶位置复制到另一个存储桶位置
+ 列出存储桶中的内容
+ 从存储桶中删除文件
+ 删除存储桶
在 *GitHub* 上查看 `[bucket-operations.sh](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/aws-cli/bash-linux/s3/bucket-lifecycle-operations/bucket_operations.sh)` 的代码。

**test-bucket-operations.sh**  
shell 脚本文件 `test-bucket-operations.sh` 演示了如何调用这些函数，即调取 `bucket-operations.sh` 文件然后调用其中的每个函数。调用函数后，该测试脚本会删除它创建的所有资源。  
在 *GitHub* 上查看 `[test-bucket-operations.sh](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/aws-cli/bash-linux/s3/bucket-lifecycle-operations/test_bucket_operations.sh)` 的代码。

**awsdocs-general.sh**  
脚本文件 `awsdocs-general.sh` 中包含了在 AWS CLI 的高级代码示例中使用的通用函数。  
在 *GitHub* 上查看 `[awsdocs-general.sh](https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/aws-cli/bash-linux/s3/bucket-lifecycle-operations/awsdocs_general.sh)` 的代码。

## 引用
<a name="cli-services-s3-lifecycle-example-references"></a>

**AWS CLI 参考：**
+ [https://docs.aws.amazon.com/cli/latest/reference/s3api/index.html](https://docs.aws.amazon.com/cli/latest/reference/s3api/index.html)
+ [https://docs.aws.amazon.com/cli/latest/reference/s3api/create-bucket.html](https://docs.aws.amazon.com/cli/latest/reference/s3api/create-bucket.html)
+ [https://docs.aws.amazon.com/cli/latest/reference/s3api/copy-object.html](https://docs.aws.amazon.com/cli/latest/reference/s3api/copy-object.html)
+ [https://docs.aws.amazon.com/cli/latest/reference/s3api/delete-bucket.html](https://docs.aws.amazon.com/cli/latest/reference/s3api/delete-bucket.html)
+ [https://docs.aws.amazon.com/cli/latest/reference/s3api/delete-object.html](https://docs.aws.amazon.com/cli/latest/reference/s3api/delete-object.html)
+ [https://docs.aws.amazon.com/cli/latest/reference/s3api/head-bucket.html](https://docs.aws.amazon.com/cli/latest/reference/s3api/head-bucket.html)
+ [https://docs.aws.amazon.com/cli/latest/reference/s3api/list-objects.html](https://docs.aws.amazon.com/cli/latest/reference/s3api/list-objects.html)
+ [https://docs.aws.amazon.com/cli/latest/reference/s3api/put-object.html](https://docs.aws.amazon.com/cli/latest/reference/s3api/put-object.html)

**其他参考资料：**
+ 《Amazon S3 开发人员指南》**中的[使用 Amazon S3 存储桶](https://docs.aws.amazon.com//AmazonS3/latest/userguide/UsingBucket.html)
+ 《Amazon S3 用户指南》**中的[使用 Amazon S3 对象](https://docs.aws.amazon.com//AmazonS3/latest/userguide/UsingObjects.html)
+ 要查看和贡献 AWS 开发工具包和 AWS CLI 代码示例，请参阅 *GitHub* 上的 [AWS 代码示例存储库](https://github.com/awsdocs/aws-doc-sdk-examples/)。

# 在 AWS CLI 中访问 Amazon SNS
<a name="cli-services-sns"></a>

您可以使用 AWS Command Line Interface (AWS CLI)访问 Amazon Simple Notification Service (Amazon SNS) 的功能。要列出适用于 Amazon SNS 的 AWS CLI 命令，请使用以下命令。

```
aws sns help
```

在运行任何命令之前，请设置默认证书。有关更多信息，请参阅 [配置 AWS CLI 设置](cli-chap-configure.md)。

本主题显示执行 Amazon SNS 常见任务的 AWS CLI 命令。

**Topics**
+ [创建主题](#cli-create-sns-topic)
+ [订阅主题](#cli-subscribe-sns-topic)
+ [向主题发布](#cli-publish-sns-topic)
+ [取消订阅主题](#cli-unsubscribe-sns-topic)
+ [删除主题](#cli-delete-sns-topic)

## 创建主题
<a name="cli-create-sns-topic"></a>

要创建主题，请使用 [https://docs.aws.amazon.com/cli/latest/reference/sns/create-topic.html](https://docs.aws.amazon.com/cli/latest/reference/sns/create-topic.html) 命令并指定要分配给该主题的名称。

```
$ aws sns create-topic --name my-topic
{
    "TopicArn": "arn:aws:sns:us-west-2:123456789012:my-topic"
}
```

记下响应的 `TopicArn`，您随后将用它来发布消息。

## 订阅主题
<a name="cli-subscribe-sns-topic"></a>

要订阅主题，请使用 [https://docs.aws.amazon.com/cli/latest/reference/sns/subscribe.html](https://docs.aws.amazon.com/cli/latest/reference/sns/subscribe.html) 命令。

以下示例为 `email` 指定 `notification-endpoint` 协议和电子邮件地址。

```
$ aws sns subscribe --topic-arn arn:aws:sns:us-west-2:123456789012:my-topic --protocol email --notification-endpoint saanvi@example.com
{
    "SubscriptionArn": "pending confirmation"
}
```

AWS 通过向您在 `subscribe` 命令中指定的地址发送电子邮件，立即发送确认电子邮件。电子邮件具有以下文本。

```
You have chosen to subscribe to the topic:
arn:aws:sns:us-west-2:123456789012:my-topic
To confirm this subscription, click or visit the following link (If this was in error no action is necessary):
Confirm subscription
```

收件人单击**确认订阅**链接后，收件人的浏览器显示通知消息，信息类似于以下内容。

```
Subscription confirmed!

You have subscribed saanvi@example.com to the topic:my-topic.

Your subscription's id is:
arn:aws:sns:us-west-2:123456789012:my-topic:1328f057-de93-4c15-512e-8bb22EXAMPLE

If it was not your intention to subscribe, click here to unsubscribe.
```

## 向主题发布
<a name="cli-publish-sns-topic"></a>

要将消息发送给某一主题的所有订阅者，请使用 [https://docs.aws.amazon.com/cli/latest/reference/sns/publish.html](https://docs.aws.amazon.com/cli/latest/reference/sns/publish.html) 命令。

以下示例发送消息“Hello World\$1” 特定主体的所有订阅者。

```
$ aws sns publish --topic-arn arn:aws:sns:us-west-2:123456789012:my-topic --message "Hello World!"
{
    "MessageId": "4e41661d-5eec-5ddf-8dab-2c867EXAMPLE"
}
```

在本示例中，AWS 将包含文本“Hello World\$1”的电子邮件发送 到 `saanvi@example.com`。

## 取消订阅主题
<a name="cli-unsubscribe-sns-topic"></a>

要取消订阅某个主题并停止接收向该主题发布的消息，请使用 [https://docs.aws.amazon.com/cli/latest/reference/sns/unsubscribe.html](https://docs.aws.amazon.com/cli/latest/reference/sns/unsubscribe.html) 命令并指定您要取消订阅的主题的 ARN。

```
$ aws sns unsubscribe --subscription-arn arn:aws:sns:us-west-2:123456789012:my-topic:1328f057-de93-4c15-512e-8bb22EXAMPLE
```

要验证您已成功取消订阅，请使用 [https://docs.aws.amazon.com/cli/latest/reference/sns/list-subscriptions.html](https://docs.aws.amazon.com/cli/latest/reference/sns/list-subscriptions.html) 命令以确认该 ARN 不再显示在列表中。

```
$ aws sns list-subscriptions
```

## 删除主题
<a name="cli-delete-sns-topic"></a>

要删除主题，请运行 [https://docs.aws.amazon.com/cli/latest/reference/sns/delete-topic.html](https://docs.aws.amazon.com/cli/latest/reference/sns/delete-topic.html) 命令。

```
$ aws sns delete-topic --topic-arn arn:aws:sns:us-west-2:123456789012:my-topic
```

要验证 AWS 是否已成功删除主题，请使用 [https://docs.aws.amazon.com/cli/latest/reference/sns/list-topics.html](https://docs.aws.amazon.com/cli/latest/reference/sns/list-topics.html) 命令以确认该主题不再显示在列表中。

```
$ aws sns list-topics
```