AWS 在命令行

Amazon Web Services (AWS) 是最大的公共云提供商,它发布了一套工具来帮助系统管理员和开发人员与他们的基础设施集成。

我们将在本文中讨论的三个工具是 AWS 最常用和知名的三个工具:

  • 博托核: 低级 Python 库
  • 博托3: 高级 Python 库
  • awscli: 用 Python 编写的命令行界面

所有这些工具目前都可以在 Fedora (22+) 和 EPEL (7)。

AWS CLI 入门

让我们开始分析这个 CLI 应用程序,它允许您从 Amazon Dashboard(以及更多)中做任何事情。

要安装它,请在终端中运行以下命令。

$ sudo dnf install awscli

由于该程序安装 bash 和 zsh shell 完成,您必须重新启动 shell 才能看到它工作,因为两个 shell 仅在启动时检查自动完成脚本。

此时,您需要设置您的帐户。 如果您没有 AWS 账户,您可以按照以下步骤轻松设置 官方指南 (他们确实有一个相当大的 免费套餐 对于新用户)。

如果您从控制面板登录到您的账户并转到 IAM 页面,您可以看到您的 AWS 访问密钥 ID 和您的 AWS 秘密访问密钥。 您还需要为用户关联权限集。

找到密钥并关联权限集后,您可以移动到终端并继续配置 AWS CLI。

$ aws configure
AWS Access Key ID [None]: copy-and-paste-your-access-key
AWS Secret Access Key [None]: copy-and-paste-your-secret-access-key-here
Default region name [None]:
Default output format [None]: 

为了 example, 我的是:

aws configure
AWS Access Key ID [None]: XXXXXXXXXXXXXXXXXXXX
AWS Secret Access Key [None]: XXXXXXX/XXXXXXXXXXXXXXXXXXXX/XXXXXXX
Default region name [None]: eu-central-1
Default output format [None]

我们可以通过运行此命令检查一切是否正常。

$ aws ec2 describe-instances --region eu-west-1

如果出现问题,您将收到类似以下的错误:

A client error (UnauthorizedOperation) occurred when calling the DescribeInstances operation: You are not authorized to perform this operation.

这意味着您提供给 AWS CLI 的凭证没有所需资源的权限(在这种情况下,请列出该区域正在使用的 EC2 实例

eu-west-1

)。

如果一切都按预期工作,您应该会收到如下信息:

{
    "Reservations": []
}

这是因为您还没有任何实例。

亚马逊网络服务网络

与其他提供商的情况不同,当您创建一个新的 AWS 账户时,您会收到一个已经有很多配置的账户。 这应该有助于最大限度地减少您在开始使用他们的服务之前必须做的事情的数量。 我们将查询 AWS CLI 界面以找出我们需要为我们的第一个实例创建的那些。

为了能够涉足 AWS 世界,了解一些有关 AWS 数据中心和网络的知识非常重要。

AWS 世界中的数据中心不会向用户显示。 用户只能看到可用区 (AZ) 和区域。 您可以将 AZ 视为单个数据中心。 实际上不知道它们是否是单独的数据中心(有些可能是单个数据中心,而另一些则不是),但它们的行为方式非常相似。 每个 AZ 应该独立于其他 AZ 以实现高可用性,但它们使用低延迟私有连接与同一区域中的其他 AZ 连接。 每个区域都是一个地理区域,完全独立于其他区域。 区域之间不直接连接,而是使用(半)公共连接。

至于网络,在 AWS 世界中,有可以与物理网络相媲美的虚拟专用网络 (VPC)。 您可以在每个区域中拥有多个 VPC,即使 IP 冲突,因为每个 VPC 都是完全断开的网络(除非您以这种方式配置它们)。 每个 VPC 都可以有一个或多个子网。 每个 VPC 不会跨区域,而子网络仅限于单个可用区。

要映射您当前的 VPC,您可以运行:

$ aws ec2 describe-vpcs --region eu-west-1

您将收到如下回复:

{
    "Vpcs": [
        {
            "VpcId": "vpc-f295b597",
            "CidrBlock": "172.31.0.0/16",
            "IsDefault": true,
            "State": "available",
            "DhcpOptionsId": "dopt-4700ee22",
            "InstanceTenancy": "default"
        }
    ]
}

区域中已经创建了一个 VPC,它使用类 172.31.0.0/16 中的 IP。 您还可以注意到这个 VPC 有一个 ID (vpc-xxxxxxxx)。 在 AWS 中,一切都有一个 ID,通常您需要引用对象(在 AWS 中,对象没有命名,因此引用对象的唯一方法是使用其 ID)。 ID 以半一致的方式组成,通常由 [type]-[8 characters].

要查看您在该地区拥有的子网络,您必须运行:

$ aws ec2 describe-subnets --region eu-west-1

您将收到类似以下消息的响应。

{
    "Subnets": [
        {
            "State": "available",
            "AvailabilityZone": "eu-west-1c",
            "CidrBlock": "172.31.32.0/20",
            "VpcId": "vpc-f295b597",
            "SubnetId": "subnet-66301d5c",
            "MapPublicIpOnLaunch": true,
            "DefaultForAz": true,
            "AvailableIpAddressCount": 4091
        },
        {
            "State": "available",
            "AvailabilityZone": "eu-west-1b",
            "CidrBlock": "172.31.16.0/20",
            "VpcId": "vpc-f295b597",
            "SubnetId": "subnet-f37eeeaa",
            "MapPublicIpOnLaunch": true,
            "DefaultForAz": true,
            "AvailableIpAddressCount": 4091
        },
        {
            "State": "available",
            "AvailabilityZone": "eu-west-1a",
            "CidrBlock": "172.31.0.0/20",
            "VpcId": "vpc-f295b597",
            "SubnetId": "subnet-ba89f4cd",
            "MapPublicIpOnLaunch": true,
            "DefaultForAz": true,
            "AvailableIpAddressCount": 4091
        }
    ]
}

如您所见,我们有多个子网(每个可用区一个)。 就像 VPC 一样,子网也有 ID (subnet-xxxxxxxx)。 子网 ID 对于创建 EC2 实例非常重要,因为当您创建 EC2 时,您必须告诉亚马逊您要将实例放置在哪个子网中。

通过 AWS CLI 运行您的第一个实例

如果你想运行一个 Amazon EC2 实例(一个计算节点),你可以免费做,感谢 AWS 免费套餐.

要从 CLI 界面执行此操作,您只需执行:

$ aws ec2 run-instances --image-id ami-cf0cd3bc --count 1 --instance-type t1.micro --region eu-west-1 --subnet-id subnet-ba89f4cd

API 将为您提供类似于以下格式的长而详细的响应。

{
    "OwnerId": "205092332101",
    "ReservationId": "r-020a8fbfb1f03e6d5",
    "Groups": [],
    "Instances": [
        {
            …
        }
    ]
}

完整的输出是从文章中删除的,但是当你运行命令时你会看到完整的输出。

API 为您提供了有关正在创建的实例的大量信息。 它提供了一个有趣的价值—— close 到响应结束 – 是国家。 在里面 example, 待定。 这是因为对命令的响应是立即的,但不会立即创建实例。

列出活动实例

现在您已经运行了一个实例,您可以重新运行我们在文章中使用的第一个命令:

$ aws ec2 describe-instances --region eu-west-1

你应该收到这样的东西:

{
    "Reservations": [
        {
            "ReservationId": "r-020a8fbfb1f03e6d5",
            "Groups": [],
            "Instances": [
                 …
            ],
            "OwnerId": "205092332101"
        }
    ]
}

同样,输出被修剪,但你的看起来会更长。

此响应可能有点令人困惑,因为它似乎列出了预订而不是实例。 这是因为 Amazon Web Services 管理实例发票的方式。

需要注意的重要一点是,Instance 的 ID 格式与我们目前看到的标准不同。 它看起来像

我-xxxxxxxxxxxxxxxxxx

.

使用 AWS CLI 终止实例

作为本教程的最后一项任务,我们将终止(删除)我们创建的实例。 为此,请运行以下命令。

$ aws ec2 terminate-instances --instance-ids i-02ea0ea7852a2ae86 --region eu-west-1

API 应如下响应。

{
    "TerminatingInstances": [
        {
            "PreviousState": {
                "Code": 16,
                "Name": "running"
            },
            "CurrentState": {
                "Code": 32,
                "Name": "shutting-down"
            },
            "InstanceId": "i-02ea0ea7852a2ae86"
        }
    ]
}

现在我们已经终止了实例,我们可以再次重新执行我们在文章中使用的第一个命令。

$ aws ec2 describe-instances --region eu-west-1

我们应该收到这样的东西。

{
    "Reservations": [
        {
            "ReservationId": "r-020a8fbfb1f03e6d5",
            "Groups": [],
            "OwnerId": "205092332101",
            "Instances": [
                {
                    "StateTransitionReason": "User initiated (2016-02-25 16:01:23 GMT)",
                    "PrivateDnsName": "",
                    "ImageId": "ami-cf0cd3bc",
                    "LaunchTime": "2016-02-25T14:34:22.000Z",
                    "State": {
                        "Code": 48,
                        "Name": "terminated"
                    },
                    "VirtualizationType": "paravirtual",
                    "Monitoring": {
                        "State": "disabled"
                    },
                    "AmiLaunchIndex": 0,
                    "NetworkInterfaces": [],
                    "RootDeviceName": "/dev/sda",
                    "Architecture": "x86_64",
                    "SecurityGroups": [],
                    "ClientToken": "",
                    "RootDeviceType": "ebs",
                    "Placement": {
                        "AvailabilityZone": "eu-west-1a",
                        "Tenancy": "default",
                        "GroupName": ""
                    },
                    "EbsOptimized": false,
                    "KernelId": "aki-52a34525",
                    "InstanceType": "t1.micro",
                    "PublicDnsName": "",
                    "ProductCodes": [],
                    "StateReason": {
                        "Message": "Client.UserInitiatedShutdown: User initiated shutdown",
                        "Code": "Client.UserInitiatedShutdown"
                    },
                    "BlockDeviceMappings": [],
                    "Hypervisor": "xen",
                    "InstanceId": "i-02ea0ea7852a2ae86"
                }
            ]
        }
    ]
}

您会注意到该实例并未处于“终止”状态(因此它处于死亡过程中)并且您没有支付它。 一段时间后,终止的实例将消失,您将回到我们第一次开始的地方。

图片礼貌 尼古拉斯·雷蒙德最初发布到 弗里克 作为 日落云 – HDR