使用AWS-cli从外部获取EC2实例的公共IP地址

使用AWS-cli从外部获取EC2实例的公共IP地址

我正在尝试利用亚马逊的弹性,并使用AWS cli.但如您所知,每次您使系统脱机并将其重新启动时,它都会附带一个新的 IP 地址。我AWS-cli在位于其他地方的 Centos 6 服务器上安装了软件包。我已经研究这个问题好几天了,但无法找到一个有效的命令,我可以从我的 Centos 盒子发出该命令并获取 Amazon EC2 上实例的 IP 地址。 EC2 实例已启动并正在运行。

我找到的最相关的信息是

aws ec2 describe-instances

但是我从这个命令中得到的只是类似于使用语法输出的东西。我还找到了(并很快丢失了)一个开关,--query后面跟着一组关键字来提取这些信息。但该命令给了我一个响应,说--query不是可识别的参数。我检查了亚马逊的 cli 参考,它似乎只接受参数,--filter而示例根本没用。

有谁知道如何做到这一点?

编辑有关我周末发现的问题的更多信息。在尝试从实例获取公共 DNS 信息之前,我需要一种方法来连接到该实例。无论我做什么,我都无法获取有关我拥有的实例的信息:

$ ec2-describe-instances i-b78a096f
sanity-check: Your system clock is 50 seconds behind.
+----------------------------+---------------------------------------------+
|            Code            |                   Message                   |
+----------------------------+---------------------------------------------+
| InvalidInstanceID.NotFound | The instance ID 'i-b78a096f' does not exist |
+----------------------------+---------------------------------------------+

我知道 myAWS_ACCESS_KEYAWS_SECRET_KEY变量已正确分配给它们正确的变量名称。实例 ID 已从 AWS 管理控制台复制并粘贴。为了进行测试,我启动了一个新实例并对其测试了相同的命令,没有不同的结果。虽然,当我运行ec2-describe-regions命令时,我可以毫无问题地看到可用的区域列表。我现在就傻眼了。

答案1

ec2 实例可以通过其实例 ID 来标识,无论您停止和启动实例多少次,该实例 ID 都不会改变。因此,如果您有实例 ID 并且需要其 IP 地址,则可以尝试此操作。

对于公共 IP 地址:

aws ec2 describe-instances --instance-ids i-b78a096f | grep PublicIpAddress | awk -F ":" '{print $2}' | sed 's/[",]//g'

对于私有IP地址:

aws ec2 describe-instances --instance-ids i-b78a096f | grep PrivateIpAddress  | head -1 | awk -F ":" '{print $2}' | sed 's/[",]//g'

不过,我个人认为如果你在 python 中尝试同样的事情会好得多。我在以前的组织中使用 python boto 库实现了相同的逻辑,它更加简单和易于管理。

设置虚拟环境:

#!/usr/bin/env bash

set -e
HOME_DIR=/home/$(whoami)

#Dependencies
sudo apt-get install ncurses-devel patch openssl openssl-devel zlib-devel

# Install python locally
mkdir -p $HOME_DIR/src
mkdir -p $HOME_DIR/.localpython
cd $HOME_DIR/src
wget https://www.python.org/ftp/python/2.7.8/Python-2.7.8.tgz
tar -zxvf Python-2.7.8.tgz
cd Python-2.7.8
./configure --prefix=$HOME_DIR/.localpython 
make
make install

# Install virtualenv locally
cd $HOME_DIR/src
wget --no-check-certificate https://pypi.python.org/packages/source/v/virtualenv/virtualenv-1.11.6.tar.gz#md5=f61cdd983d2c4e6aeabb70b1060d6f49
tar -zxvf virtualenv-1.11.6.tar.gz
cd virtualenv-1.11.6/
~/.localpython/bin/python setup.py install 


# Create a test virtual environment
mkdir -p $HOME_DIR/virtualenvs
cd $HOME_DIR/virtualenvs
~/.localpython/bin/virtualenv my_virtual_env --python=$HOME_DIR/.localpython/bin/python2.7
cd my_virtual_env
source bin/activate
pip install awscli

答案2

您可以使用start-instances命令stop-instances来启动/停止实例,如下所示 -

aws ec2 stop-instances --instance-ids i-b78a096f
aws ec2 start-instances --instance-ids i-b78a096f

您将看到您没有在命令行上指定区域名称,因为从文件AWS cli中读取区域信息。<user_home_directory>/.aws/config该文件如下所示 -

[default]
output = json
region = us-east-1

该文件中区域属性的值很可能与您实例所在的区域不同。所以你打电话去的地区与你认为应该去的地区不同。我认为没有其他原因说明它不起作用。

为了检查 AWS cli 正在使用的区域值,只需aws configure从命令行调用即可。它会询问您有关 aws 密钥、秘密、区域和响应格式的信息。同时,如果您未指定任何值,它将显示将使用的值。

AWS cli我在这样的场景中使用,AWS从命令行进行管理要快得多。不过,我创建了一个开源工具,可以AWS同时可视化许多资源,您可能会发现它很有帮助 -

https://github.com/pistonportal/custom-turbine/wiki/Running-and-operating-Turbine-app 

例如,您可以VPC Designer在此工具中打开并查看 VPC 跨越的所有可用区、哪些子网位于哪些可用区以及哪些虚拟机位于哪些子网中。这要么需要在AWS控制台中多次点击,要么根本不可能。

目前它无法启动/停止实例,但这将在接下来的几天内可用。

相关内容