ENECHANGE Developer Blog

ENECHANGE開発者ブログ

eb ssh出来なくて焦った件

こんにちは、CTO室のkazです!2019年もいろんなところで焚き火してチルアウトしていく所存です。よろしくお願いします。 タイトルが若干釣り気味ですが、awsebcliの仕様変更により既存設定ではeb ssh出来なくなって焦った...というお話です。

ENECHANGEではElasticBeanstalkで運用しているプロジェクトが多いのですが、サーバへログインする際はBastion経由で環境配下のサーバに接続するようにしています。

~.ssh/configにはProxyCommandで任意のBastionを経由するよう下記のように記述して接続していました。 Host部はプライベートDNSを使用できるので汎用性があり、論理的に異なるNWのサーバに接続する際もHost部以外を変更して接続していました。

# Elastic-Beanstalk
Host *.ap-northeast-1.compute.internal
 User ec2-user
 IdentityFile ~/.ssh/xxxxxx.pem
 ProxyCommand ssh -W %h:%p xxxxxx-bastion

ところが、eb sshしても全くサーバに到達出来ない事象に遭遇しました。timed out...

$ eb ssh
INFO: Attempting to open port 22.
INFO: SSH port 22 open.
INFO: Running ssh -i /Users/kazumineigahara/.ssh/xxxxxx.pem ec2-user@172.36.xxx.xxx
ssh: connect to host 172.36.xxx.xxx port 22: Operation timed out

debugで見てみました。なるほど...わからん!

$ eb ssh --debug
2019-01-22 17:34:09,415 (DEBUG) cement.core.foundation : laying cement for the 'eb' application
2019-01-22 17:34:09,415 (DEBUG) cement.core.hook : defining hook 'pre_setup'
2019-01-22 17:34:09,415 (DEBUG) cement.core.hook : defining hook 'post_setup'
2019-01-22 17:34:09,416 (DEBUG) cement.core.hook : defining hook 'pre_run'
2019-01-22 17:34:09,416 (DEBUG) cement.core.hook : defining hook 'post_run'
(snip)
INFO: SSH port 22 open.
INFO: Running ssh -i /Users/kazumineigahara/.ssh/xxxxxxx.pem ec2-user@172.36.xxx.xxx
ssh: connect to host 172.36.xxx.xxx port 22: Operation timed out
2019-01-22 17:35:26,514 (DEBUG) ebcli.operations.sshops : ssh returned exitcode: 255
2019-01-22 17:35:26,514 (DEBUG) ebcli.lib.aws : Making api call: (ec2, revoke_security_group_ingress) to region: ap-northeast-1 with args:{'GroupId': 'sg-xxxxxxxxxxxx', 'IpProtocol': 'tcp', 'ToPort': 22, 'FromPort': 22, 'CidrIp': '0.0.0.0/0'}
2019-01-22 17:35:26,814 (DEBUG) ebcli.lib.aws : API call finished, status = 200
2019-01-22 17:35:26,814 (DEBUG) ebcli.lib.aws : Response: {'ResponseMetadata': {'RequestId': '3431ce51-3813-4ef8-a422-3a819cd32545', 'HTTPStatusCode': 200, 'date': 'Tue, 22 Jan 2019 08:35:26 GMT', 'RetryAttempts': 0}}
INFO: Closed port 22 on ec2 instance security group.
2019-01-22 17:35:26,820 (INFO) eb : Traceback (most recent call last):
(snip)

NW周りも見直しましたが、ちっとも解決しないので、サポートに調査依頼したところ、下記返答がありました。

「当方にて awsebcli の実装を確認いたしましたところ、バージョン 3.14.7 にて、eb ssh を使用してプライベートサブネットのインスタンスにアクセスした場合、 プライベート DNS ではなくプライベート IP を使うように仕様が変更されておりました。」

報告を受けて下記のように~.ssh/configのHost部にプライベートIPを指定する事ですんなりログインできるようになりました。

# Elastic-Beanstalk
Host 172.36.*
 User ec2-user
 IdentityFile ~/.ssh/xxxxxx.pem
 ProxyCommand ssh -W %h:%p xxxxxx-bastion

プロジェクト毎にネットワークを分けてるので、IP書くの手間だなぁと思ってましたが、1時間後には慣れてました^^;

ちゃんとリリースノート読みましょうね。っていう反省です...!

docs.aws.amazon.com