web-dev-qa-db-ja.com

AWS-cliを使用して外部からEC2インスタンスのパブリックIPアドレスを取得する

Amazonの弾力性を利用し、AWS cliを使用してインスタンスをオンラインまたはオフにしようとしています。しかし、ご存知のように、システムをオフラインにして、元に戻すたびに、新しいIPアドレスが割り当てられます。他の場所にあるCentos 6サーバーにAWS-cliパッケージをインストールしました。私はこれを何日も調査してきましたが、Centosボックスから発行してAmazon EC2でインスタンスのIPアドレスを取得できる有効なコマンドを見つけることができません。 EC2インスタンスが稼働しています。

私が見つけた最も関連する情報は

aws ec2 describe-instances

しかし、このコマンドから返されるのは、使用法の構文出力のようなものだけです。この情報を抽出するためのスイッチ--queryの後に一連のキーワードが続いていることも発見しました(すぐに失いました)。しかし、そのコマンドは私に--queryは認められた議論ではないと言って返答しました。私はこのコマンドについてAmazonのcliリファレンスを確認しましたが、それが受け入れると思われるパラメーターは--filterのみであり、例はあまり役に立ちません。

誰かがこれを達成する方法を知っていますか?

[〜#〜] edit [〜#〜]週末に発見した問題の詳細。インスタンスからパブリック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 |
+----------------------------+---------------------------------------------+

私のAWS_ACCESS_KEYおよびAWS_SECRET_KEY変数は、適切な変数名に正しく割り当てられています。インスタンスIDがAWS管理コンソールからコピーされて貼り付けられました。テストするために、私は新しいインスタンスをスピンアップし、同じコマンドをそれに対してテストしましたが、異なる結果はありませんでした。ただし、ec2-describe-regionsコマンドを実行すると、問題なく使用できるリージョンリストが表示されます。私は今、困惑しています。

7
MelBurslan

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
9
Gaurav Pundir

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を管理する方がはるかに高速であるこのようなシナリオでは、AWS cliを使用します。ただし、多くのAWSリソースを同時に視覚化するためのオープンソースツールを作成しました。

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

たとえば、このツールでVPC Designerを開き、VPCがまたがるすべてのアベイラビリティゾーン、どのサブネットがどのアベイラビリティゾーンにあり、どのVMがどのサブネットにあるかを確認できます。これは、AWSコンソールで多くのクリックを必要とするか、まったく不可能であるかのいずれかです。

現在、インスタンスを開始/停止する機能はありませんが、今後数日で利用可能になります。

1
shailendra