最近、RackspaceからAWSに切り替えて、 freegeopip を使用してシンプルな位置情報サーバーを設定しています。次のコマンドは新しいラックスペースサーバー(Ubuntu)で完全に機能しますが、AWS(Red HatとUbuntuを試してみました)では機能しません。設定に使用したコードは次のとおりです。
curl -s https://storage.googleapis.com/golang/go1.4.1.linux-AMD64.tar.gz | tar -C /opt -zx
export GOPATH=$HOME
export GOROOT=/opt/go
export PATH=$PATH:/opt/go/bin
go get github.com/fiorix/freegeoip/cmd/freegeoip
$GOPATH/bin/freegeoip -addr="<MY IP ADDRESS>:8080"
私が言ったように、これは私のRackspaceインスタンスで完全に機能しますが、AWSは私にこのエラーを与えます:
listen tcp <MY IP ADDRESS>:8080: bind: cannot assign requested address
このポートをnetstatで確認したところ、何も実行されていません。このエラーが発生する理由はわかりません。何か案は?
多くの場合、特定のアドレスにのみバインドする特別な理由がない限り、0.0.0.0へのバインドが最善の方法です。
ただし、インスタンスのパブリックIPアドレス(ifconfig
を介して)にバインドしようとしているため、IPスタックが認識していないため、実行していることが機能していないと思います。
AWSインスタンスは、ネイティブにプライベートIPアドレスのみを認識しています。これは、バインドする必要があるものです。
インスタンスに関連付けられているEC2(クラシックおよびVPC)インスタンスのパブリックアドレスは、1:1 NAT AWSネットワークインフラストラクチャによってプライベートアドレスに変換されます。
AWSは、インスタンスとインターネット間でネットワークアドレス変換を実行します。そのため、AWSインスタンスはIPアドレス08.08.08.0808で到達できる可能性がありますが、サーバーは実際には88.88.88.88を使用するように構成されています。私がしなければならないことは、ifconfigで見つけたサーバーの内部IPにバインドすることでした。